@andie/openlist 0.0.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.
- package/README.md +27 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.js +93 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/share-create.d.ts +16 -0
- package/dist/commands/share-create.js +284 -0
- package/dist/commands/share-create.js.map +1 -0
- package/dist/commands/shared.d.ts +10 -0
- package/dist/commands/shared.js +33 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/config/redact.d.ts +5 -0
- package/dist/config/redact.js +22 -0
- package/dist/config/redact.js.map +1 -0
- package/dist/config/store.d.ts +36 -0
- package/dist/config/store.js +173 -0
- package/dist/config/store.js.map +1 -0
- package/dist/help.d.ts +3 -0
- package/dist/help.js +105 -0
- package/dist/help.js.map +1 -0
- package/dist/model/result.d.ts +24 -0
- package/dist/model/result.js +48 -0
- package/dist/model/result.js.map +1 -0
- package/dist/openlist/client.d.ts +47 -0
- package/dist/openlist/client.js +77 -0
- package/dist/openlist/client.js.map +1 -0
- package/dist/run-openlist.d.ts +17 -0
- package/dist/run-openlist.js +153 -0
- package/dist/run-openlist.js.map +1 -0
- package/package.json +40 -0
- package/skills/openlist/SKILL.md +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# OpenList CLI and Skill
|
|
2
|
+
|
|
3
|
+
This repository ships the `@andie/openlist` CLI and the `skills/openlist` Agent Skill.
|
|
4
|
+
|
|
5
|
+
## CLI
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npx @andie/openlist config set endpoint https://openlist.example
|
|
9
|
+
npx @andie/openlist config set admin-token <admin-token>
|
|
10
|
+
npx @andie/openlist share create /test/a.txt
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`share create` only accepts existing OpenList paths. It reads each path first with OpenList and creates one share only after all paths are readable.
|
|
14
|
+
|
|
15
|
+
Defaults:
|
|
16
|
+
|
|
17
|
+
- Share code is enabled unless `--no-code` is passed.
|
|
18
|
+
- Expiration is 3 days unless `--expires` or `--no-expire` is passed.
|
|
19
|
+
- Multiple paths create one share bundle.
|
|
20
|
+
|
|
21
|
+
Config precedence:
|
|
22
|
+
|
|
23
|
+
1. CLI flags: `--endpoint`, `--admin-token`
|
|
24
|
+
2. Environment: `OPENLIST_ENDPOINT`, `OPENLIST_ADMIN_TOKEN`
|
|
25
|
+
3. User config: `~/.config/openlist/config.json`
|
|
26
|
+
|
|
27
|
+
CLI commands write stable JSON Agent Results to stdout. Diagnostics are written to stderr.
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const run_openlist_1 = require("./run-openlist");
|
|
5
|
+
void (0, run_openlist_1.runOpenList)(process.argv.slice(2)).then((exitCode) => {
|
|
6
|
+
process.exitCode = exitCode;
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,iDAA6C;AAE7C,KAAK,IAAA,0BAAW,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;IACxD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ConfigFlags, type Env } from "../config/store";
|
|
2
|
+
import type { CommandDeps } from "./shared";
|
|
3
|
+
export declare function runConfigCommand(args: string[], env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<import("../model/result").AgentSuccess<{
|
|
4
|
+
path: string;
|
|
5
|
+
}>>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runConfigCommand = runConfigCommand;
|
|
4
|
+
const redact_1 = require("../config/redact");
|
|
5
|
+
const store_1 = require("../config/store");
|
|
6
|
+
const result_1 = require("../model/result");
|
|
7
|
+
async function runConfigCommand(args, env, flags, deps) {
|
|
8
|
+
const subcommand = args[0];
|
|
9
|
+
if (!subcommand) {
|
|
10
|
+
throw new result_1.OpenListError("USAGE_CONFIG_COMMAND_REQUIRED", "Missing config command", 2);
|
|
11
|
+
}
|
|
12
|
+
if (subcommand === "set") {
|
|
13
|
+
return runConfigSet(args.slice(1), env, deps);
|
|
14
|
+
}
|
|
15
|
+
if (subcommand === "get") {
|
|
16
|
+
assertNoExtraArgs(args.slice(1), "config get");
|
|
17
|
+
const stored = await (0, store_1.readUserConfig)(env, deps);
|
|
18
|
+
return (0, result_1.success)("config get", (0, store_1.resolveEffectiveConfig)(env, flags, stored));
|
|
19
|
+
}
|
|
20
|
+
if (subcommand === "unset") {
|
|
21
|
+
return runConfigUnset(args.slice(1), env, deps);
|
|
22
|
+
}
|
|
23
|
+
if (subcommand === "path") {
|
|
24
|
+
assertNoExtraArgs(args.slice(1), "config path");
|
|
25
|
+
return (0, result_1.success)("config path", {
|
|
26
|
+
path: (0, store_1.resolveConfigPath)(env)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
throw new result_1.OpenListError("USAGE_UNKNOWN_CONFIG_COMMAND", `Unknown config command: ${subcommand}`, 2, {
|
|
30
|
+
command: subcommand
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function runConfigSet(args, env, deps) {
|
|
34
|
+
const [key, value, ...extra] = args;
|
|
35
|
+
if (!key || !value || extra.length > 0) {
|
|
36
|
+
throw new result_1.OpenListError("USAGE_CONFIG_SET", "Usage: openlist config set endpoint <url> | openlist config set admin-token <token>", 2);
|
|
37
|
+
}
|
|
38
|
+
const config = await (0, store_1.readUserConfig)(env, deps);
|
|
39
|
+
if (key === "endpoint") {
|
|
40
|
+
const next = {
|
|
41
|
+
...config,
|
|
42
|
+
endpoint: value
|
|
43
|
+
};
|
|
44
|
+
await (0, store_1.writeUserConfig)(env, next, deps);
|
|
45
|
+
return (0, result_1.success)("config set", {
|
|
46
|
+
key: "endpoint",
|
|
47
|
+
path: (0, store_1.resolveConfigPath)(env),
|
|
48
|
+
value
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (key === "admin-token") {
|
|
52
|
+
const next = {
|
|
53
|
+
...config,
|
|
54
|
+
adminToken: value
|
|
55
|
+
};
|
|
56
|
+
await (0, store_1.writeUserConfig)(env, next, deps);
|
|
57
|
+
return (0, result_1.success)("config set", {
|
|
58
|
+
key: "admin-token",
|
|
59
|
+
path: (0, store_1.resolveConfigPath)(env),
|
|
60
|
+
adminToken: (0, redact_1.redactSecret)(value)
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
throw new result_1.OpenListError("USAGE_CONFIG_KEY", `Unknown config key: ${key}`, 2, {
|
|
64
|
+
key
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function runConfigUnset(args, env, deps) {
|
|
68
|
+
const [key, ...extra] = args;
|
|
69
|
+
if (key !== "admin-token" || extra.length > 0) {
|
|
70
|
+
throw new result_1.OpenListError("USAGE_CONFIG_UNSET", "Usage: openlist config unset admin-token", 2);
|
|
71
|
+
}
|
|
72
|
+
const config = await (0, store_1.readUserConfig)(env, deps);
|
|
73
|
+
const removed = Boolean(config.adminToken);
|
|
74
|
+
const next = {
|
|
75
|
+
...config
|
|
76
|
+
};
|
|
77
|
+
delete next.adminToken;
|
|
78
|
+
await (0, store_1.writeUserConfig)(env, next, deps);
|
|
79
|
+
return (0, result_1.success)("config unset", {
|
|
80
|
+
key: "admin-token",
|
|
81
|
+
path: (0, store_1.resolveConfigPath)(env),
|
|
82
|
+
removed
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function assertNoExtraArgs(args, command) {
|
|
86
|
+
if (args.length > 0) {
|
|
87
|
+
throw new result_1.OpenListError("USAGE_EXTRA_ARGS", `Unexpected arguments for ${command}`, 2, {
|
|
88
|
+
command,
|
|
89
|
+
extra: args
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type CommandDeps } from "./shared";
|
|
2
|
+
import type { ConfigFlags, Env } from "../config/store";
|
|
3
|
+
export type ShareCreateResult = {
|
|
4
|
+
id: string;
|
|
5
|
+
paths: string[];
|
|
6
|
+
accessUrl: string;
|
|
7
|
+
url: string;
|
|
8
|
+
code: string | null;
|
|
9
|
+
expires: string | null;
|
|
10
|
+
maxAccessed: number | null;
|
|
11
|
+
remark: string | null;
|
|
12
|
+
readme: string | null;
|
|
13
|
+
header: string | null;
|
|
14
|
+
creator: string | null;
|
|
15
|
+
};
|
|
16
|
+
export declare function runShareCreateCommand(args: string[], env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<import("../model/result").AgentSuccess<ShareCreateResult>>;
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runShareCreateCommand = runShareCreateCommand;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const result_1 = require("../model/result");
|
|
6
|
+
const client_1 = require("../openlist/client");
|
|
7
|
+
const shared_1 = require("./shared");
|
|
8
|
+
const DEFAULT_EXPIRATION_MS = 3 * 24 * 60 * 60 * 1000;
|
|
9
|
+
const SHARE_CODE_ALPHABET = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
10
|
+
const DURATION_MULTIPLIER = {
|
|
11
|
+
s: 1000,
|
|
12
|
+
m: 60 * 1000,
|
|
13
|
+
h: 60 * 60 * 1000,
|
|
14
|
+
d: 24 * 60 * 60 * 1000,
|
|
15
|
+
w: 7 * 24 * 60 * 60 * 1000
|
|
16
|
+
};
|
|
17
|
+
async function runShareCreateCommand(args, env, flags, deps) {
|
|
18
|
+
const parsed = parseShareCreateArgs(args, deps);
|
|
19
|
+
const connection = await (0, shared_1.resolveConnectionForCommand)(env, flags, deps);
|
|
20
|
+
const client = deps.openListFactory?.(connection) ?? (0, client_1.createOpenListClient)(connection, deps);
|
|
21
|
+
for (const path of parsed.paths) {
|
|
22
|
+
try {
|
|
23
|
+
await client.getPath(path);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof result_1.OpenListError) {
|
|
27
|
+
if (!isPathReadApiFailure(error)) {
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
throw new result_1.OpenListError("OPENLIST_PATH_UNREADABLE", `OpenList path is not readable: ${path}`, error.exitCode, {
|
|
31
|
+
path,
|
|
32
|
+
cause: {
|
|
33
|
+
code: error.code,
|
|
34
|
+
message: error.message,
|
|
35
|
+
details: error.details
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const request = toOpenListCreateShareRequest(parsed);
|
|
43
|
+
const share = await client.createShare(request);
|
|
44
|
+
const result = toShareCreateResult(connection.endpoint, parsed, request, share);
|
|
45
|
+
return (0, result_1.success)("share create", result);
|
|
46
|
+
}
|
|
47
|
+
function parseShareCreateArgs(args, deps) {
|
|
48
|
+
const paths = [];
|
|
49
|
+
let explicitCode;
|
|
50
|
+
let noCode = false;
|
|
51
|
+
let explicitExpires;
|
|
52
|
+
let noExpire = false;
|
|
53
|
+
let id;
|
|
54
|
+
let maxAccessed;
|
|
55
|
+
let remark;
|
|
56
|
+
let readme;
|
|
57
|
+
let header;
|
|
58
|
+
let positionalOnly = false;
|
|
59
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
60
|
+
const arg = args[index];
|
|
61
|
+
if (positionalOnly) {
|
|
62
|
+
paths.push(arg);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (arg === "--") {
|
|
66
|
+
positionalOnly = true;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (arg === "--code") {
|
|
70
|
+
explicitCode = requiredFlagValue(args, index, "--code");
|
|
71
|
+
index += 1;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (arg.startsWith("--code=")) {
|
|
75
|
+
explicitCode = valueFromEqualsFlag(arg, "--code");
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (arg === "--no-code") {
|
|
79
|
+
noCode = true;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (arg === "--expires") {
|
|
83
|
+
explicitExpires = requiredFlagValue(args, index, "--expires");
|
|
84
|
+
index += 1;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (arg.startsWith("--expires=")) {
|
|
88
|
+
explicitExpires = valueFromEqualsFlag(arg, "--expires");
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (arg === "--no-expire") {
|
|
92
|
+
noExpire = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (arg === "--id") {
|
|
96
|
+
id = requiredFlagValue(args, index, "--id");
|
|
97
|
+
index += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (arg.startsWith("--id=")) {
|
|
101
|
+
id = valueFromEqualsFlag(arg, "--id");
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (arg === "--max-accessed") {
|
|
105
|
+
maxAccessed = parseNonNegativeInt(requiredFlagValue(args, index, "--max-accessed"), "--max-accessed");
|
|
106
|
+
index += 1;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (arg.startsWith("--max-accessed=")) {
|
|
110
|
+
maxAccessed = parseNonNegativeInt(valueFromEqualsFlag(arg, "--max-accessed"), "--max-accessed");
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (arg === "--remark") {
|
|
114
|
+
remark = requiredFlagValue(args, index, "--remark");
|
|
115
|
+
index += 1;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (arg.startsWith("--remark=")) {
|
|
119
|
+
remark = valueFromEqualsFlag(arg, "--remark");
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (arg === "--readme") {
|
|
123
|
+
readme = requiredFlagValue(args, index, "--readme");
|
|
124
|
+
index += 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (arg.startsWith("--readme=")) {
|
|
128
|
+
readme = valueFromEqualsFlag(arg, "--readme");
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (arg === "--header") {
|
|
132
|
+
header = requiredFlagValue(args, index, "--header");
|
|
133
|
+
index += 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (arg.startsWith("--header=")) {
|
|
137
|
+
header = valueFromEqualsFlag(arg, "--header");
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (arg.startsWith("-")) {
|
|
141
|
+
throw new result_1.OpenListError("USAGE_UNKNOWN_FLAG", `Unknown share create flag: ${arg}`, 2, {
|
|
142
|
+
flag: arg
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
paths.push(arg);
|
|
146
|
+
}
|
|
147
|
+
if (paths.length === 0) {
|
|
148
|
+
throw new result_1.OpenListError("USAGE_SHARE_PATH_REQUIRED", "Usage: openlist share create <openlist-path> [more-openlist-paths...]", 2);
|
|
149
|
+
}
|
|
150
|
+
for (const path of paths) {
|
|
151
|
+
assertOpenListPath(path);
|
|
152
|
+
}
|
|
153
|
+
if (explicitCode !== undefined && noCode) {
|
|
154
|
+
throw new result_1.OpenListError("USAGE_CODE_CONFLICT", "Use either --code or --no-code, not both", 2);
|
|
155
|
+
}
|
|
156
|
+
if (explicitExpires !== undefined && noExpire) {
|
|
157
|
+
throw new result_1.OpenListError("USAGE_EXPIRES_CONFLICT", "Use either --expires or --no-expire, not both", 2);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
paths,
|
|
161
|
+
code: noCode ? null : explicitCode ?? (deps.randomCode ?? randomShareCode)(),
|
|
162
|
+
expires: noExpire
|
|
163
|
+
? null
|
|
164
|
+
: explicitExpires
|
|
165
|
+
? parseExpiration(explicitExpires, deps.now ?? (() => new Date()))
|
|
166
|
+
: new Date((deps.now ?? (() => new Date()))().getTime() + DEFAULT_EXPIRATION_MS).toISOString(),
|
|
167
|
+
id,
|
|
168
|
+
maxAccessed,
|
|
169
|
+
remark,
|
|
170
|
+
readme,
|
|
171
|
+
header
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function toOpenListCreateShareRequest(parsed) {
|
|
175
|
+
const request = {
|
|
176
|
+
files: parsed.paths,
|
|
177
|
+
expires: parsed.expires,
|
|
178
|
+
pwd: parsed.code ?? ""
|
|
179
|
+
};
|
|
180
|
+
if (parsed.id !== undefined) {
|
|
181
|
+
request.id = parsed.id;
|
|
182
|
+
}
|
|
183
|
+
if (parsed.maxAccessed !== undefined) {
|
|
184
|
+
request.max_accessed = parsed.maxAccessed;
|
|
185
|
+
}
|
|
186
|
+
if (parsed.remark !== undefined) {
|
|
187
|
+
request.remark = parsed.remark;
|
|
188
|
+
}
|
|
189
|
+
if (parsed.readme !== undefined) {
|
|
190
|
+
request.readme = parsed.readme;
|
|
191
|
+
}
|
|
192
|
+
if (parsed.header !== undefined) {
|
|
193
|
+
request.header = parsed.header;
|
|
194
|
+
}
|
|
195
|
+
return request;
|
|
196
|
+
}
|
|
197
|
+
function toShareCreateResult(endpoint, parsed, request, share) {
|
|
198
|
+
const id = share.id;
|
|
199
|
+
const url = `${endpoint}/@s/${encodeURIComponent(id)}`;
|
|
200
|
+
const code = share.pwd || request.pwd || null;
|
|
201
|
+
const accessUrl = code ? `${url}?pwd=${encodeURIComponent(code)}` : url;
|
|
202
|
+
return {
|
|
203
|
+
id,
|
|
204
|
+
paths: share.files ?? parsed.paths,
|
|
205
|
+
accessUrl,
|
|
206
|
+
url,
|
|
207
|
+
code,
|
|
208
|
+
expires: share.expires ?? request.expires ?? null,
|
|
209
|
+
maxAccessed: share.max_accessed ?? request.max_accessed ?? null,
|
|
210
|
+
remark: share.remark ?? request.remark ?? null,
|
|
211
|
+
readme: share.readme ?? request.readme ?? null,
|
|
212
|
+
header: share.header ?? request.header ?? null,
|
|
213
|
+
creator: share.creator ?? null
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function parseExpiration(value, now) {
|
|
217
|
+
const duration = /^(\d+)(s|m|h|d|w)$/.exec(value);
|
|
218
|
+
if (duration) {
|
|
219
|
+
const amount = Number(duration[1]);
|
|
220
|
+
const unit = duration[2];
|
|
221
|
+
const multiplier = DURATION_MULTIPLIER[unit];
|
|
222
|
+
return new Date(now().getTime() + amount * multiplier).toISOString();
|
|
223
|
+
}
|
|
224
|
+
const parsed = new Date(value);
|
|
225
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
226
|
+
throw new result_1.OpenListError("USAGE_EXPIRES_INVALID", "--expires must be an ISO datetime or duration like 3d, 12h, or 30m", 2, {
|
|
227
|
+
value
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return parsed.toISOString();
|
|
231
|
+
}
|
|
232
|
+
function parseNonNegativeInt(value, flag) {
|
|
233
|
+
if (!/^\d+$/.test(value)) {
|
|
234
|
+
throw new result_1.OpenListError("USAGE_INTEGER_FLAG", `${flag} must be a non-negative integer`, 2, {
|
|
235
|
+
flag,
|
|
236
|
+
value
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return Number(value);
|
|
240
|
+
}
|
|
241
|
+
function assertOpenListPath(path) {
|
|
242
|
+
if (!path.startsWith("/") || path.startsWith("//")) {
|
|
243
|
+
throw new result_1.OpenListError("USAGE_OPENLIST_PATH", "Share paths must be OpenList paths that begin with /", 2, {
|
|
244
|
+
path
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function isPathReadApiFailure(error) {
|
|
249
|
+
if (error.code !== "OPENLIST_API_ERROR") {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
const apiPath = error.details.apiPath;
|
|
253
|
+
const apiCode = error.details.apiCode;
|
|
254
|
+
if (apiPath !== "/api/fs/get") {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
return apiCode !== 401 && apiCode !== 403;
|
|
258
|
+
}
|
|
259
|
+
function randomShareCode() {
|
|
260
|
+
let code = "";
|
|
261
|
+
for (let index = 0; index < 8; index += 1) {
|
|
262
|
+
code += SHARE_CODE_ALPHABET[(0, node_crypto_1.randomInt)(SHARE_CODE_ALPHABET.length)];
|
|
263
|
+
}
|
|
264
|
+
return code;
|
|
265
|
+
}
|
|
266
|
+
function requiredFlagValue(args, index, flag) {
|
|
267
|
+
const value = args[index + 1];
|
|
268
|
+
if (!value || value.startsWith("--")) {
|
|
269
|
+
throw new result_1.OpenListError("USAGE_FLAG_VALUE_REQUIRED", `${flag} requires a value`, 2, {
|
|
270
|
+
flag
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
function valueFromEqualsFlag(arg, flag) {
|
|
276
|
+
const value = arg.slice(`${flag}=`.length);
|
|
277
|
+
if (!value) {
|
|
278
|
+
throw new result_1.OpenListError("USAGE_FLAG_VALUE_REQUIRED", `${flag} requires a value`, 2, {
|
|
279
|
+
flag
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return value;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=share-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-create.js","sourceRoot":"","sources":["../../src/commands/share-create.ts"],"names":[],"mappings":";;AA2CA,sDA4CC;AAvFD,6CAAwC;AAExC,4CAAyD;AAEzD,+CAA0D;AAC1D,qCAAyE;AA4BzE,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACtD,MAAM,mBAAmB,GAAG,2DAA2D,CAAC;AACxF,MAAM,mBAAmB,GAAG;IAC1B,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,EAAE,GAAG,IAAI;IACZ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACjB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IACtB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CAClB,CAAC;AAEJ,KAAK,UAAU,qBAAqB,CACzC,IAAc,EACd,GAAQ,EACR,KAAkB,EAClB,IAAiB;IAEjB,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,IAAA,oCAA2B,EAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACvE,MAAM,MAAM,GACV,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,IAAI,IAAA,6BAAoB,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE/E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,sBAAa,EAAE,CAAC;gBACnC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,IAAI,sBAAa,CACrB,0BAA0B,EAC1B,kCAAkC,IAAI,EAAE,EACxC,KAAK,CAAC,QAAQ,EACd;oBACE,IAAI;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF,CACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAEhF,OAAO,IAAA,gBAAO,EAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAc,EACd,IAAiB;IAEjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,YAAgC,CAAC;IACrC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,eAAmC,CAAC;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,EAAsB,CAAC;IAC3B,IAAI,WAA+B,CAAC;IACpC,IAAI,MAA0B,CAAC;IAC/B,IAAI,MAA0B,CAAC;IAC/B,IAAI,MAA0B,CAAC;IAC/B,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,cAAc,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,cAAc,GAAG,IAAI,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,eAAe,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAC9D,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,eAAe,GAAG,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YAC1B,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5C,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,GAAG,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,WAAW,GAAG,mBAAmB,CAC/B,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAChD,gBAAgB,CACjB,CAAC;YACF,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,WAAW,GAAG,mBAAmB,CAC/B,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAC1C,gBAAgB,CACjB,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACpD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACpD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACpD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAa,CAAC,oBAAoB,EAAE,8BAA8B,GAAG,EAAE,EAAE,CAAC,EAAE;gBACpF,IAAI,EAAE,GAAG;aACV,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAa,CACrB,2BAA2B,EAC3B,uEAAuE,EACvE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,YAAY,KAAK,SAAS,IAAI,MAAM,EAAE,CAAC;QACzC,MAAM,IAAI,sBAAa,CAAC,qBAAqB,EAAE,0CAA0C,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,eAAe,KAAK,SAAS,IAAI,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,sBAAa,CACrB,wBAAwB,EACxB,+CAA+C,EAC/C,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,EAAE;QAC5E,OAAO,EAAE,QAAQ;YACf,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,eAAe;gBACf,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,qBAAqB,CAAC,CAAC,WAAW,EAAE;QAClG,EAAE;QACF,WAAW;QACX,MAAM;QACN,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,MAA6B;IAE7B,MAAM,OAAO,GAA+B;QAC1C,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;KACvB,CAAC;IAEF,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,MAA6B,EAC7B,OAAmC,EACnC,KAAoB;IAEpB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,GAAG,QAAQ,OAAO,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAExE,OAAO;QACL,EAAE;QACF,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;QAClC,SAAS;QACT,GAAG;QACH,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI;QACjD,WAAW,EAAE,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI;QAC/D,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9C,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9C,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,GAAe;IACrD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAqC,CAAC;QAC7D,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,sBAAa,CACrB,uBAAuB,EACvB,oEAAoE,EACpE,CAAC,EACD;YACE,KAAK;SACN,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,IAAY;IACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,sBAAa,CAAC,oBAAoB,EAAE,GAAG,IAAI,iCAAiC,EAAE,CAAC,EAAE;YACzF,IAAI;YACJ,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,sBAAa,CACrB,qBAAqB,EACrB,sDAAsD,EACtD,CAAC,EACD;YACE,IAAI;SACL,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAoB;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IAEtC,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,mBAAmB,CAAC,IAAA,uBAAS,EAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc,EAAE,KAAa,EAAE,IAAY;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,sBAAa,CAAC,2BAA2B,EAAE,GAAG,IAAI,mBAAmB,EAAE,CAAC,EAAE;YAClF,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,sBAAa,CAAC,2BAA2B,EAAE,GAAG,IAAI,mBAAmB,EAAE,CAAC,EAAE;YAClF,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ConfigDeps, type ConfigFlags, type Env } from "../config/store";
|
|
2
|
+
import { type OpenListClient, type OpenListConnection } from "../openlist/client";
|
|
3
|
+
export type CommandDeps = ConfigDeps & {
|
|
4
|
+
fetch?: typeof fetch;
|
|
5
|
+
now?: () => Date;
|
|
6
|
+
randomCode?: () => string;
|
|
7
|
+
openListFactory?: (connection: OpenListConnection) => OpenListClient;
|
|
8
|
+
};
|
|
9
|
+
export declare function createOpenListForCommand(env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<OpenListClient>;
|
|
10
|
+
export declare function resolveConnectionForCommand(env: Env, flags: ConfigFlags, deps: CommandDeps): Promise<OpenListConnection>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOpenListForCommand = createOpenListForCommand;
|
|
4
|
+
exports.resolveConnectionForCommand = resolveConnectionForCommand;
|
|
5
|
+
const store_1 = require("../config/store");
|
|
6
|
+
const result_1 = require("../model/result");
|
|
7
|
+
const client_1 = require("../openlist/client");
|
|
8
|
+
async function createOpenListForCommand(env, flags, deps) {
|
|
9
|
+
const connection = await resolveConnectionForCommand(env, flags, deps);
|
|
10
|
+
return (deps.openListFactory ?? ((conn) => (0, client_1.createOpenListClient)(conn, deps)))(connection);
|
|
11
|
+
}
|
|
12
|
+
async function resolveConnectionForCommand(env, flags, deps) {
|
|
13
|
+
const stored = await (0, store_1.readUserConfig)(env, deps);
|
|
14
|
+
const resolved = (0, store_1.resolveEffectiveConfig)(env, flags, stored);
|
|
15
|
+
const endpoint = resolved.effective.endpoint.value;
|
|
16
|
+
const adminToken = resolved.effective.adminToken.configured
|
|
17
|
+
? resolveAdminToken(env, flags, stored.adminToken)
|
|
18
|
+
: null;
|
|
19
|
+
if (!endpoint) {
|
|
20
|
+
throw new result_1.OpenListError("CONFIG_ENDPOINT_REQUIRED", "OpenList endpoint is not configured. Run: npx @andie/openlist config set endpoint <url>", 2);
|
|
21
|
+
}
|
|
22
|
+
if (!adminToken) {
|
|
23
|
+
throw new result_1.OpenListError("CONFIG_ADMIN_TOKEN_REQUIRED", "OpenList admin token is not configured. Run: npx @andie/openlist config set admin-token <token>", 2);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
endpoint: (0, client_1.normalizeEndpoint)(endpoint),
|
|
27
|
+
adminToken
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function resolveAdminToken(env, flags, storedToken) {
|
|
31
|
+
return flags.adminToken ?? env.OPENLIST_ADMIN_TOKEN ?? storedToken ?? null;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":";;AAsBA,4DAUC;AAED,kEAgCC;AAlED,2CAMyB;AACzB,4CAAgD;AAChD,+CAK4B;AASrB,KAAK,UAAU,wBAAwB,CAC5C,GAAQ,EACR,KAAkB,EAClB,IAAiB;IAEjB,MAAM,UAAU,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEvE,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,6BAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAC3E,UAAU,CACX,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,2BAA2B,CAC/C,GAAQ,EACR,KAAkB,EAClB,IAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAA,8BAAsB,EAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU;QACzD,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,sBAAa,CACrB,0BAA0B,EAC1B,yFAAyF,EACzF,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,sBAAa,CACrB,6BAA6B,EAC7B,iGAAiG,EACjG,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAA,0BAAiB,EAAC,QAAQ,CAAC;QACrC,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAQ,EACR,KAAkB,EAClB,WAA+B;IAE/B,OAAO,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,oBAAoB,IAAI,WAAW,IAAI,IAAI,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redactSecret = redactSecret;
|
|
4
|
+
function redactSecret(value) {
|
|
5
|
+
if (!value) {
|
|
6
|
+
return {
|
|
7
|
+
configured: false,
|
|
8
|
+
redacted: null
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (value.length <= 8) {
|
|
12
|
+
return {
|
|
13
|
+
configured: true,
|
|
14
|
+
redacted: "<set>"
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
configured: true,
|
|
19
|
+
redacted: `${value.slice(0, 4)}...${value.slice(-4)}`
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/config/redact.ts"],"names":[],"mappings":";;AAKA,oCAmBC;AAnBD,SAAgB,YAAY,CAAC,KAAyB;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,OAAO;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;KACtD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as nodeFs from "node:fs/promises";
|
|
2
|
+
import { type RedactedSecret } from "./redact";
|
|
3
|
+
export type Env = Record<string, string | undefined>;
|
|
4
|
+
export type UserConfig = {
|
|
5
|
+
endpoint?: string;
|
|
6
|
+
adminToken?: string;
|
|
7
|
+
};
|
|
8
|
+
export type ConfigFlags = {
|
|
9
|
+
endpoint?: string;
|
|
10
|
+
adminToken?: string;
|
|
11
|
+
};
|
|
12
|
+
export type ConfigSource = "flag" | "env" | "config" | "unset";
|
|
13
|
+
export type ResolvedConfig = {
|
|
14
|
+
path: string;
|
|
15
|
+
stored: {
|
|
16
|
+
endpoint: string | null;
|
|
17
|
+
adminToken: RedactedSecret;
|
|
18
|
+
};
|
|
19
|
+
effective: {
|
|
20
|
+
endpoint: {
|
|
21
|
+
value: string | null;
|
|
22
|
+
source: ConfigSource;
|
|
23
|
+
};
|
|
24
|
+
adminToken: RedactedSecret & {
|
|
25
|
+
source: ConfigSource;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export type ConfigFs = Pick<typeof nodeFs, "readFile" | "writeFile" | "mkdir" | "chmod" | "rename">;
|
|
30
|
+
export type ConfigDeps = {
|
|
31
|
+
fs?: ConfigFs;
|
|
32
|
+
};
|
|
33
|
+
export declare function resolveConfigPath(env: Env): string;
|
|
34
|
+
export declare function readUserConfig(env: Env, deps?: ConfigDeps): Promise<UserConfig>;
|
|
35
|
+
export declare function writeUserConfig(env: Env, config: UserConfig, deps?: ConfigDeps): Promise<void>;
|
|
36
|
+
export declare function resolveEffectiveConfig(env: Env, flags: ConfigFlags, stored: UserConfig): ResolvedConfig;
|