epismo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -0
- package/dist/api.js +37 -0
- package/dist/api.js.map +1 -0
- package/dist/assets.js +85 -0
- package/dist/assets.js.map +1 -0
- package/dist/auth.js +330 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +14 -0
- package/dist/context.js.map +1 -0
- package/dist/credits.js +48 -0
- package/dist/credits.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/input.js +124 -0
- package/dist/input.js.map +1 -0
- package/dist/output.js +7 -0
- package/dist/output.js.map +1 -0
- package/dist/program.js +401 -0
- package/dist/program.js.map +1 -0
- package/dist/tracks.js +55 -0
- package/dist/tracks.js.map +1 -0
- package/package.json +28 -0
package/dist/program.js
ADDED
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { clearWorkspace, getCurrentWorkspace, listAvailableWorkspaces, login, logout, useWorkspace, whoami } from "./auth.js";
|
|
3
|
+
import { resolveExecutionContext } from "./context.js";
|
|
4
|
+
import { mergeDefined, parseJsonArrayOption, parseJsonObjectOption, parseOptionalInteger, parseStringArrayInput, readJsonObjectInput } from "./input.js";
|
|
5
|
+
import { printJson, printText } from "./output.js";
|
|
6
|
+
import { deleteTrack, getTrack, searchTracks, upsertTrack } from "./tracks.js";
|
|
7
|
+
import { deleteAsset, getAsset, importAssets, likeAsset, searchAssets, upsertAsset } from "./assets.js";
|
|
8
|
+
import { creditBalance, creditCheckout } from "./credits.js";
|
|
9
|
+
function printResult(payload, options) {
|
|
10
|
+
if (options.json) {
|
|
11
|
+
printJson(payload);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (options.summary) {
|
|
15
|
+
printText(options.summary);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
printJson(payload);
|
|
19
|
+
}
|
|
20
|
+
async function resolveInput(options, overrides) {
|
|
21
|
+
const base = await readJsonObjectInput(options.input);
|
|
22
|
+
return mergeDefined(base, overrides);
|
|
23
|
+
}
|
|
24
|
+
function parseBooleanLiteral(value, label) {
|
|
25
|
+
if (value === undefined) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
if (typeof value === "boolean") {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value !== "string") {
|
|
32
|
+
throw new Error(`${label} must be true or false.`);
|
|
33
|
+
}
|
|
34
|
+
const normalized = value.trim().toLowerCase();
|
|
35
|
+
if (normalized === "true") {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (normalized === "false") {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`${label} must be true or false.`);
|
|
42
|
+
}
|
|
43
|
+
export function buildProgram() {
|
|
44
|
+
const program = new Command();
|
|
45
|
+
program.name("epismo").description("Epismo CLI").version("0.1.0");
|
|
46
|
+
program
|
|
47
|
+
.command("login")
|
|
48
|
+
.description("log in and save credentials to ~/.epismo/credentials")
|
|
49
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
50
|
+
.option("--browser", "Open a browser for OAuth login")
|
|
51
|
+
.option("--email <email>", "Email address (used with default OTP login)")
|
|
52
|
+
.option("--pin <pin>", "OTP code (used with default OTP login)")
|
|
53
|
+
.option("--otp-id <otpId>", "Existing OTP id to verify (used with default OTP login)")
|
|
54
|
+
.option("--json", "Print JSON output")
|
|
55
|
+
.action(async (options) => {
|
|
56
|
+
const payload = await resolveInput({ input: options.input, json: options.json }, {
|
|
57
|
+
email: options.email,
|
|
58
|
+
pin: options.pin,
|
|
59
|
+
otpId: options.otpId
|
|
60
|
+
});
|
|
61
|
+
const result = await login({
|
|
62
|
+
browser: options.browser === true,
|
|
63
|
+
email: typeof payload.email === "string" ? payload.email : undefined,
|
|
64
|
+
pin: typeof payload.pin === "string" ? payload.pin : undefined,
|
|
65
|
+
otpId: typeof payload.otpId === "string" ? payload.otpId : undefined
|
|
66
|
+
});
|
|
67
|
+
printResult({
|
|
68
|
+
loggedIn: true,
|
|
69
|
+
userId: result.userId,
|
|
70
|
+
expiresAt: result.expiresAt
|
|
71
|
+
}, {
|
|
72
|
+
json: options.json,
|
|
73
|
+
summary: `Logged in as ${result.lastLoginEmail ?? result.userId}. Token expires at ${result.expiresAt}.`
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
program
|
|
77
|
+
.command("logout")
|
|
78
|
+
.description("revoke credentials and clear ~/.epismo/credentials")
|
|
79
|
+
.option("--json", "Print JSON output")
|
|
80
|
+
.action(async (options) => {
|
|
81
|
+
const result = await logout();
|
|
82
|
+
printResult(result, {
|
|
83
|
+
json: options.json,
|
|
84
|
+
summary: result.hadCredentials ? "Logged out." : "No saved credentials."
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
program
|
|
88
|
+
.command("whoami")
|
|
89
|
+
.description("show the currently authenticated user")
|
|
90
|
+
.option("--workspace-id <workspaceId>", "Workspace context override")
|
|
91
|
+
.option("--json", "Print JSON output")
|
|
92
|
+
.action(async (options) => {
|
|
93
|
+
const payload = await whoami({
|
|
94
|
+
workspaceId: options.workspaceId
|
|
95
|
+
});
|
|
96
|
+
printResult(payload, { json: options.json });
|
|
97
|
+
});
|
|
98
|
+
const workspace = program.command("workspace").description("manage the default workspace");
|
|
99
|
+
workspace
|
|
100
|
+
.command("list")
|
|
101
|
+
.description("list accessible workspaces")
|
|
102
|
+
.option("--json", "Print JSON output")
|
|
103
|
+
.action(async (options) => {
|
|
104
|
+
const payload = await listAvailableWorkspaces();
|
|
105
|
+
printResult(payload, { json: options.json });
|
|
106
|
+
});
|
|
107
|
+
workspace
|
|
108
|
+
.command("current")
|
|
109
|
+
.description("show the saved default workspace")
|
|
110
|
+
.option("--json", "Print JSON output")
|
|
111
|
+
.action(async (options) => {
|
|
112
|
+
const payload = await getCurrentWorkspace();
|
|
113
|
+
printResult(payload, {
|
|
114
|
+
json: options.json,
|
|
115
|
+
summary: payload.currentWorkspace
|
|
116
|
+
? `Current workspace: ${payload.currentWorkspace.name} (${payload.currentWorkspace.id})`
|
|
117
|
+
: "No default workspace set."
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
workspace
|
|
121
|
+
.command("use")
|
|
122
|
+
.description("set the default workspace")
|
|
123
|
+
.argument("<workspaceId>", "Workspace id")
|
|
124
|
+
.option("--json", "Print JSON output")
|
|
125
|
+
.action(async (workspaceId, options) => {
|
|
126
|
+
const payload = await useWorkspace({ workspaceId });
|
|
127
|
+
printResult(payload, {
|
|
128
|
+
json: options.json,
|
|
129
|
+
summary: `Default workspace set to ${payload.workspace.name} (${payload.workspace.id}).`
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
workspace
|
|
133
|
+
.command("clear")
|
|
134
|
+
.description("clear the saved default workspace")
|
|
135
|
+
.option("--json", "Print JSON output")
|
|
136
|
+
.action(async (options) => {
|
|
137
|
+
const payload = await clearWorkspace();
|
|
138
|
+
printResult(payload, {
|
|
139
|
+
json: options.json,
|
|
140
|
+
summary: "Default workspace cleared."
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
const track = program.command("track").description("manage track resources");
|
|
144
|
+
track
|
|
145
|
+
.command("upsert")
|
|
146
|
+
.description("create or update a task, note, or goal")
|
|
147
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
148
|
+
.option("--type <type>", "task | note | goal")
|
|
149
|
+
.option("--id <id>", "Existing item id")
|
|
150
|
+
.option("--title <title>", "Title")
|
|
151
|
+
.option("--content <content>", "Markdown content")
|
|
152
|
+
.option("--projects <projects>", "JSON array or comma-separated project ids")
|
|
153
|
+
.option("--task <task>", "Task fields as JSON object")
|
|
154
|
+
.option("--goal <goal>", "Goal fields as JSON object")
|
|
155
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
156
|
+
.option("--json", "Print JSON output")
|
|
157
|
+
.action(async (options) => {
|
|
158
|
+
const context = await resolveExecutionContext({
|
|
159
|
+
workspaceId: options.workspaceId
|
|
160
|
+
});
|
|
161
|
+
const payload = await resolveInput(options, {
|
|
162
|
+
type: options.type,
|
|
163
|
+
id: options.id,
|
|
164
|
+
title: options.title,
|
|
165
|
+
content: options.content,
|
|
166
|
+
projects: parseStringArrayInput(options.projects, "--projects"),
|
|
167
|
+
task: parseJsonObjectOption(options.task, "--task"),
|
|
168
|
+
goal: parseJsonObjectOption(options.goal, "--goal")
|
|
169
|
+
});
|
|
170
|
+
printResult(await upsertTrack(context, payload), { json: options.json });
|
|
171
|
+
});
|
|
172
|
+
track
|
|
173
|
+
.command("get")
|
|
174
|
+
.description("fetch one track")
|
|
175
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
176
|
+
.option("--type <type>", "task | note | goal")
|
|
177
|
+
.option("--id <id>", "Item id")
|
|
178
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
179
|
+
.option("--json", "Print JSON output")
|
|
180
|
+
.action(async (options) => {
|
|
181
|
+
const context = await resolveExecutionContext({
|
|
182
|
+
workspaceId: options.workspaceId
|
|
183
|
+
});
|
|
184
|
+
const payload = await resolveInput(options, {
|
|
185
|
+
type: options.type,
|
|
186
|
+
id: options.id
|
|
187
|
+
});
|
|
188
|
+
printResult(await getTrack(context, payload), { json: options.json });
|
|
189
|
+
});
|
|
190
|
+
track
|
|
191
|
+
.command("search")
|
|
192
|
+
.description("search tracks")
|
|
193
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
194
|
+
.option("--type <type>", "task | note | goal")
|
|
195
|
+
.option("--query <query>", "Free-text query")
|
|
196
|
+
.option("--page <page>", "1-based page number")
|
|
197
|
+
.option("--view <view>", "full | summary")
|
|
198
|
+
.option("--projects <projects>", "JSON array or comma-separated project ids")
|
|
199
|
+
.option("--filter <filter>", "Filter as JSON object")
|
|
200
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
201
|
+
.option("--json", "Print JSON output")
|
|
202
|
+
.action(async (options) => {
|
|
203
|
+
const context = await resolveExecutionContext({
|
|
204
|
+
workspaceId: options.workspaceId
|
|
205
|
+
});
|
|
206
|
+
const payload = await resolveInput(options, {
|
|
207
|
+
type: options.type,
|
|
208
|
+
query: options.query,
|
|
209
|
+
page: parseOptionalInteger(options.page, "--page"),
|
|
210
|
+
view: options.view,
|
|
211
|
+
projects: parseStringArrayInput(options.projects, "--projects"),
|
|
212
|
+
filter: parseJsonObjectOption(options.filter, "--filter")
|
|
213
|
+
});
|
|
214
|
+
printResult(await searchTracks(context, payload), { json: options.json });
|
|
215
|
+
});
|
|
216
|
+
track
|
|
217
|
+
.command("delete")
|
|
218
|
+
.description("delete one track")
|
|
219
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
220
|
+
.option("--type <type>", "task | note | goal")
|
|
221
|
+
.option("--id <id>", "Item id")
|
|
222
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
223
|
+
.option("--json", "Print JSON output")
|
|
224
|
+
.action(async (options) => {
|
|
225
|
+
const context = await resolveExecutionContext({
|
|
226
|
+
workspaceId: options.workspaceId
|
|
227
|
+
});
|
|
228
|
+
const payload = await resolveInput(options, {
|
|
229
|
+
type: options.type,
|
|
230
|
+
id: options.id
|
|
231
|
+
});
|
|
232
|
+
printResult(await deleteTrack(context, payload), { json: options.json });
|
|
233
|
+
});
|
|
234
|
+
const asset = program.command("asset").description("manage asset resources");
|
|
235
|
+
asset
|
|
236
|
+
.command("upsert")
|
|
237
|
+
.description("create or update an asset")
|
|
238
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
239
|
+
.option("--type <type>", "Asset type (e.g. workflow)")
|
|
240
|
+
.option("--id <id>", "Existing asset id")
|
|
241
|
+
.option("--title <title>", "Title")
|
|
242
|
+
.option("--content <content>", "Markdown overview")
|
|
243
|
+
.option("--category <category>", "Asset category")
|
|
244
|
+
.option("--visibility <visibility>", "public | private")
|
|
245
|
+
.option("--projects <projects>", "JSON array or comma-separated project ids")
|
|
246
|
+
.option("--workflow <workflow>", "Workflow steps as JSON array")
|
|
247
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
248
|
+
.option("--json", "Print JSON output")
|
|
249
|
+
.action(async (options) => {
|
|
250
|
+
const context = await resolveExecutionContext({
|
|
251
|
+
workspaceId: options.workspaceId
|
|
252
|
+
});
|
|
253
|
+
const payload = await resolveInput(options, {
|
|
254
|
+
type: options.type,
|
|
255
|
+
id: options.id,
|
|
256
|
+
title: options.title,
|
|
257
|
+
content: options.content,
|
|
258
|
+
category: options.category,
|
|
259
|
+
visibility: options.visibility,
|
|
260
|
+
projects: parseStringArrayInput(options.projects, "--projects"),
|
|
261
|
+
workflow: parseJsonArrayOption(options.workflow, "--workflow")
|
|
262
|
+
});
|
|
263
|
+
printResult(await upsertAsset(context, payload), { json: options.json });
|
|
264
|
+
});
|
|
265
|
+
asset
|
|
266
|
+
.command("get")
|
|
267
|
+
.description("fetch one asset")
|
|
268
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
269
|
+
.option("--type <type>", "Asset type (e.g. workflow)")
|
|
270
|
+
.option("--id <id>", "Asset id")
|
|
271
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
272
|
+
.option("--json", "Print JSON output")
|
|
273
|
+
.action(async (options) => {
|
|
274
|
+
const context = await resolveExecutionContext({
|
|
275
|
+
workspaceId: options.workspaceId
|
|
276
|
+
});
|
|
277
|
+
const payload = await resolveInput(options, {
|
|
278
|
+
type: options.type,
|
|
279
|
+
id: options.id
|
|
280
|
+
});
|
|
281
|
+
printResult(await getAsset(context, payload), { json: options.json });
|
|
282
|
+
});
|
|
283
|
+
asset
|
|
284
|
+
.command("search")
|
|
285
|
+
.description("search assets")
|
|
286
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
287
|
+
.option("--type <type>", "Asset type (e.g. workflow)")
|
|
288
|
+
.option("--query <query>", "Free-text query")
|
|
289
|
+
.option("--page <page>", "1-based page number")
|
|
290
|
+
.option("--view <view>", "full | summary")
|
|
291
|
+
.option("--filter <filter>", "Filter as JSON object")
|
|
292
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
293
|
+
.option("--json", "Print JSON output")
|
|
294
|
+
.action(async (options) => {
|
|
295
|
+
const context = await resolveExecutionContext({
|
|
296
|
+
workspaceId: options.workspaceId
|
|
297
|
+
});
|
|
298
|
+
const payload = await resolveInput(options, {
|
|
299
|
+
type: options.type,
|
|
300
|
+
query: options.query,
|
|
301
|
+
page: parseOptionalInteger(options.page, "--page"),
|
|
302
|
+
view: options.view,
|
|
303
|
+
filter: parseJsonObjectOption(options.filter, "--filter")
|
|
304
|
+
});
|
|
305
|
+
printResult(await searchAssets(context, payload), { json: options.json });
|
|
306
|
+
});
|
|
307
|
+
asset
|
|
308
|
+
.command("like")
|
|
309
|
+
.description("like or unlike an asset")
|
|
310
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
311
|
+
.option("--type <type>", "Asset type (e.g. workflow)")
|
|
312
|
+
.option("--id <id>", "Asset id")
|
|
313
|
+
.option("--liked <liked>", "true | false")
|
|
314
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
315
|
+
.option("--json", "Print JSON output")
|
|
316
|
+
.action(async (options) => {
|
|
317
|
+
const context = await resolveExecutionContext({
|
|
318
|
+
workspaceId: options.workspaceId
|
|
319
|
+
});
|
|
320
|
+
const payload = await resolveInput(options, {
|
|
321
|
+
type: options.type,
|
|
322
|
+
id: options.id,
|
|
323
|
+
liked: parseBooleanLiteral(options.liked, "--liked")
|
|
324
|
+
});
|
|
325
|
+
printResult(await likeAsset(context, payload), { json: options.json });
|
|
326
|
+
});
|
|
327
|
+
asset
|
|
328
|
+
.command("import")
|
|
329
|
+
.description("import asset workflow steps into a project")
|
|
330
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
331
|
+
.option("--project-id <projectId>", "Target project id")
|
|
332
|
+
.option("--asset-ids <assetIds>", "JSON array or comma-separated asset ids")
|
|
333
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
334
|
+
.option("--json", "Print JSON output")
|
|
335
|
+
.action(async (options) => {
|
|
336
|
+
const context = await resolveExecutionContext({
|
|
337
|
+
workspaceId: options.workspaceId
|
|
338
|
+
});
|
|
339
|
+
const payload = await resolveInput(options, {
|
|
340
|
+
projectId: options.projectId,
|
|
341
|
+
artifactIds: parseStringArrayInput(options.assetIds, "--asset-ids")
|
|
342
|
+
});
|
|
343
|
+
printResult(await importAssets(context, payload), { json: options.json });
|
|
344
|
+
});
|
|
345
|
+
asset
|
|
346
|
+
.command("delete")
|
|
347
|
+
.description("delete one asset")
|
|
348
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
349
|
+
.option("--type <type>", "Asset type (e.g. workflow)")
|
|
350
|
+
.option("--id <id>", "Asset id")
|
|
351
|
+
.option("--workspace-id <workspaceId>", "Workspace context")
|
|
352
|
+
.option("--json", "Print JSON output")
|
|
353
|
+
.action(async (options) => {
|
|
354
|
+
const context = await resolveExecutionContext({
|
|
355
|
+
workspaceId: options.workspaceId
|
|
356
|
+
});
|
|
357
|
+
const payload = await resolveInput(options, {
|
|
358
|
+
type: options.type,
|
|
359
|
+
id: options.id
|
|
360
|
+
});
|
|
361
|
+
printResult(await deleteAsset(context, payload), { json: options.json });
|
|
362
|
+
});
|
|
363
|
+
const credit = program.command("credit").description("view balance and purchase credits");
|
|
364
|
+
credit
|
|
365
|
+
.command("balance")
|
|
366
|
+
.description("show current credit balance and active grants")
|
|
367
|
+
.option("--workspace-id <workspaceId>", "Workspace context (omit for personal balance)")
|
|
368
|
+
.option("--json", "Print JSON output")
|
|
369
|
+
.action(async (options) => {
|
|
370
|
+
const result = await creditBalance(options.workspaceId);
|
|
371
|
+
printResult(result, {
|
|
372
|
+
json: options.json,
|
|
373
|
+
summary: [
|
|
374
|
+
`Balance: ${result.balance}`,
|
|
375
|
+
result.shortfall > 0 ? `Shortfall: ${result.shortfall}` : null
|
|
376
|
+
]
|
|
377
|
+
.filter(Boolean)
|
|
378
|
+
.join("\n")
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
credit
|
|
382
|
+
.command("checkout")
|
|
383
|
+
.description("start a credit purchase and get a Stripe checkout URL")
|
|
384
|
+
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
385
|
+
.option("--allocations <allocations>", 'JSON array of { userId, quantity } e.g. \'[{"userId":"u_1","quantity":10}]\'')
|
|
386
|
+
.option("--workspace-id <workspaceId>", "Workspace to purchase credits for")
|
|
387
|
+
.option("--json", "Print JSON output")
|
|
388
|
+
.action(async (options) => {
|
|
389
|
+
const payload = await resolveInput({ input: options.input, json: options.json }, {
|
|
390
|
+
workspaceId: options.workspaceId,
|
|
391
|
+
allocations: parseJsonArrayOption(options.allocations, "--allocations")
|
|
392
|
+
});
|
|
393
|
+
const result = await creditCheckout({ workspaceId: options.workspaceId }, payload);
|
|
394
|
+
printResult(result, {
|
|
395
|
+
json: options.json,
|
|
396
|
+
summary: `Checkout URL: ${result.url}`
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
return program;
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
package/dist/tracks.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { requestJson } from "./api.js";
|
|
2
|
+
import { resolveApiUrl } from "./config.js";
|
|
3
|
+
function withWorkspaceQuery(pathname, workspaceId) {
|
|
4
|
+
if (!workspaceId?.trim()) {
|
|
5
|
+
return pathname;
|
|
6
|
+
}
|
|
7
|
+
const params = new URLSearchParams({ workspaceId: workspaceId.trim() });
|
|
8
|
+
return `${pathname}?${params.toString()}`;
|
|
9
|
+
}
|
|
10
|
+
function readRequiredString(input, key) {
|
|
11
|
+
if (!input || typeof input !== "object") {
|
|
12
|
+
throw new Error(`${key} is required.`);
|
|
13
|
+
}
|
|
14
|
+
const value = input[key];
|
|
15
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
16
|
+
throw new Error(`${key} is required.`);
|
|
17
|
+
}
|
|
18
|
+
return value.trim();
|
|
19
|
+
}
|
|
20
|
+
export async function upsertTrack(context, input) {
|
|
21
|
+
return requestJson(resolveApiUrl(), "/v1/tracks", {
|
|
22
|
+
method: "PUT",
|
|
23
|
+
authToken: context.auth.accessToken,
|
|
24
|
+
body: {
|
|
25
|
+
...(input && typeof input === "object" ? input : {}),
|
|
26
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {})
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export async function getTrack(context, input) {
|
|
31
|
+
const type = readRequiredString(input, "type");
|
|
32
|
+
const id = readRequiredString(input, "id");
|
|
33
|
+
return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/tracks/${encodeURIComponent(type)}/${encodeURIComponent(id)}`, context.workspaceId), {
|
|
34
|
+
authToken: context.auth.accessToken
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function searchTracks(context, input) {
|
|
38
|
+
return requestJson(resolveApiUrl(), withWorkspaceQuery("/v1/tracks/search", context.workspaceId), {
|
|
39
|
+
method: "POST",
|
|
40
|
+
authToken: context.auth.accessToken,
|
|
41
|
+
body: {
|
|
42
|
+
...(input && typeof input === "object" ? input : {}),
|
|
43
|
+
...(context.workspaceId ? { workspaceId: context.workspaceId } : {})
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export async function deleteTrack(context, input) {
|
|
48
|
+
const type = readRequiredString(input, "type");
|
|
49
|
+
const id = readRequiredString(input, "id");
|
|
50
|
+
return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/tracks/${encodeURIComponent(type)}/${encodeURIComponent(id)}`, context.workspaceId), {
|
|
51
|
+
method: "DELETE",
|
|
52
|
+
authToken: context.auth.accessToken
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=tracks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracks.js","sourceRoot":"","sources":["../src/tracks.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "epismo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"epismo": "dist/bin.js"
|
|
7
|
+
},
|
|
8
|
+
"files": ["dist", "README.md"],
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
14
|
+
"start": "node dist/bin.js",
|
|
15
|
+
"dev": "tsx watch src/index.ts",
|
|
16
|
+
"build": "npm run clean && tsc -p tsconfig.json && chmod +x dist/bin.js",
|
|
17
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
18
|
+
"lint": "eslint ."
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@bufbuild/protobuf": "^2.2.3",
|
|
22
|
+
"@grpc/grpc-js": "^1.13.2",
|
|
23
|
+
"commander": "^14.0.1",
|
|
24
|
+
"google-auth-library": "^10.1.0",
|
|
25
|
+
"tsx": "^4.20.6",
|
|
26
|
+
"zod": "^3.25.76"
|
|
27
|
+
}
|
|
28
|
+
}
|