flingit 0.0.11 → 0.0.13

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.
Files changed (93) hide show
  1. package/README.md +8 -1
  2. package/dist/cli/commands/db.d.ts +11 -0
  3. package/dist/cli/commands/db.d.ts.map +1 -1
  4. package/dist/cli/commands/db.js +60 -48
  5. package/dist/cli/commands/db.js.map +1 -1
  6. package/dist/cli/commands/dev.d.ts +9 -0
  7. package/dist/cli/commands/dev.d.ts.map +1 -1
  8. package/dist/cli/commands/dev.js +96 -100
  9. package/dist/cli/commands/dev.js.map +1 -1
  10. package/dist/cli/commands/feedback.d.ts +23 -0
  11. package/dist/cli/commands/feedback.d.ts.map +1 -1
  12. package/dist/cli/commands/feedback.js +60 -73
  13. package/dist/cli/commands/feedback.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts +9 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -1
  16. package/dist/cli/commands/init.js +96 -107
  17. package/dist/cli/commands/init.js.map +1 -1
  18. package/dist/cli/commands/launch.d.ts +11 -1
  19. package/dist/cli/commands/launch.d.ts.map +1 -1
  20. package/dist/cli/commands/launch.js +32 -36
  21. package/dist/cli/commands/launch.js.map +1 -1
  22. package/dist/cli/commands/login.d.ts +30 -0
  23. package/dist/cli/commands/login.d.ts.map +1 -1
  24. package/dist/cli/commands/login.js +71 -58
  25. package/dist/cli/commands/login.js.map +1 -1
  26. package/dist/cli/commands/logs.d.ts +39 -0
  27. package/dist/cli/commands/logs.d.ts.map +1 -1
  28. package/dist/cli/commands/logs.js +121 -90
  29. package/dist/cli/commands/logs.js.map +1 -1
  30. package/dist/cli/commands/onboard.d.ts +1 -1
  31. package/dist/cli/commands/onboard.d.ts.map +1 -1
  32. package/dist/cli/commands/onboard.js +94 -41
  33. package/dist/cli/commands/onboard.js.map +1 -1
  34. package/dist/cli/commands/plugin.d.ts +43 -0
  35. package/dist/cli/commands/plugin.d.ts.map +1 -1
  36. package/dist/cli/commands/plugin.js +229 -211
  37. package/dist/cli/commands/plugin.js.map +1 -1
  38. package/dist/cli/commands/project.d.ts +27 -0
  39. package/dist/cli/commands/project.d.ts.map +1 -1
  40. package/dist/cli/commands/project.js +101 -85
  41. package/dist/cli/commands/project.js.map +1 -1
  42. package/dist/cli/commands/push.d.ts +39 -0
  43. package/dist/cli/commands/push.d.ts.map +1 -1
  44. package/dist/cli/commands/push.js +152 -118
  45. package/dist/cli/commands/push.js.map +1 -1
  46. package/dist/cli/commands/storage.d.ts +32 -0
  47. package/dist/cli/commands/storage.d.ts.map +1 -1
  48. package/dist/cli/commands/storage.js +180 -140
  49. package/dist/cli/commands/storage.js.map +1 -1
  50. package/dist/cli/commands/tunnel.d.ts +41 -0
  51. package/dist/cli/commands/tunnel.d.ts.map +1 -0
  52. package/dist/cli/commands/tunnel.js +210 -0
  53. package/dist/cli/commands/tunnel.js.map +1 -0
  54. package/dist/cli/commands/upgrade.d.ts +15 -0
  55. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  56. package/dist/cli/commands/upgrade.js +82 -0
  57. package/dist/cli/commands/upgrade.js.map +1 -0
  58. package/dist/cli/index.js +35 -4
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/utils/cli-io-impl.d.ts +64 -0
  61. package/dist/cli/utils/cli-io-impl.d.ts.map +1 -0
  62. package/dist/cli/utils/cli-io-impl.js +521 -0
  63. package/dist/cli/utils/cli-io-impl.js.map +1 -0
  64. package/dist/cli/utils/cli-io.d.ts +350 -0
  65. package/dist/cli/utils/cli-io.d.ts.map +1 -0
  66. package/dist/cli/utils/cli-io.js +13 -0
  67. package/dist/cli/utils/cli-io.js.map +1 -0
  68. package/dist/cli/utils/config.d.ts +60 -2
  69. package/dist/cli/utils/config.d.ts.map +1 -1
  70. package/dist/cli/utils/config.js +158 -37
  71. package/dist/cli/utils/config.js.map +1 -1
  72. package/dist/cli/utils/project.d.ts +60 -0
  73. package/dist/cli/utils/project.d.ts.map +1 -1
  74. package/dist/cli/utils/project.js +112 -2
  75. package/dist/cli/utils/project.js.map +1 -1
  76. package/dist/cli/utils/prompt-new-project.d.ts +7 -3
  77. package/dist/cli/utils/prompt-new-project.d.ts.map +1 -1
  78. package/dist/cli/utils/prompt-new-project.js +12 -17
  79. package/dist/cli/utils/prompt-new-project.js.map +1 -1
  80. package/dist/cli/utils/registry.d.ts +2 -2
  81. package/dist/cli/utils/registry.d.ts.map +1 -1
  82. package/dist/cli/utils/registry.js +13 -3
  83. package/dist/cli/utils/registry.js.map +1 -1
  84. package/dist/runtime/log.d.ts.map +1 -1
  85. package/dist/runtime/log.js +8 -4
  86. package/dist/runtime/log.js.map +1 -1
  87. package/dist/runtime/storage.js +1 -1
  88. package/dist/runtime/storage.js.map +1 -1
  89. package/package.json +3 -2
  90. package/templates/default/CLAUDE.md +1 -0
  91. package/templates/default/skills/fling/.hash +1 -0
  92. package/templates/default/skills/fling/SKILL.md +12 -4
  93. /package/templates/default/skills/{discord/SKILL.md → fling/DISCORD.md} +0 -0
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Consolidated I/O abstraction interfaces for CLI commands.
3
+ *
4
+ * These interfaces allow CLI command logic to be tested without mocking
5
+ * individual modules. Tests can provide fake implementations.
6
+ *
7
+ * Interface hierarchy:
8
+ * - Shared base interfaces (ConsoleIO, ProcessIO, FileIO) are used across commands
9
+ * - Command-specific interfaces extend the base where needed
10
+ * - Each command defines its own combined IO interface using these building blocks
11
+ */
12
+ import type Database from "better-sqlite3";
13
+ import type { ChildProcess, SpawnOptions as NodeSpawnOptions } from "node:child_process";
14
+ import type { BuildContext, BuildOptions } from "esbuild";
15
+ /**
16
+ * Base console output interface for CLI commands.
17
+ * All methods take single string messages.
18
+ */
19
+ export interface ConsoleIO {
20
+ log(message: string): void;
21
+ error(message: string): void;
22
+ warn(message: string): void;
23
+ }
24
+ /**
25
+ * Console interface with writeProgress() for progress indicators.
26
+ * Used by: admin usage command
27
+ */
28
+ export interface ConsoleIOWithProgress extends ConsoleIO {
29
+ /** Write to stderr without newline (for progress indicators) */
30
+ writeProgress(message: string): void;
31
+ }
32
+ /**
33
+ * Base process interface with core functionality.
34
+ * Used by: most CLI commands
35
+ */
36
+ export interface ProcessIO {
37
+ exit(code: number): never;
38
+ cwd(): string;
39
+ env: Record<string, string | undefined>;
40
+ }
41
+ /**
42
+ * Process interface with stdio streams.
43
+ * Used by: login, project, feedback
44
+ */
45
+ export interface ProcessIOWithStdio extends ProcessIO {
46
+ stdin: NodeJS.ReadStream;
47
+ stdout: NodeJS.WriteStream;
48
+ }
49
+ /**
50
+ * Process interface with platform and stdio.
51
+ * Used by: plugin
52
+ */
53
+ export interface ProcessIOWithPlatformAndStdio extends ProcessIOWithStdio {
54
+ platform: NodeJS.Platform;
55
+ }
56
+ /**
57
+ * Process interface with signal handlers.
58
+ * Used by: tunnel
59
+ */
60
+ export interface ProcessIOWithSignals extends ProcessIO {
61
+ on(event: "SIGINT" | "SIGTERM", listener: () => void): void;
62
+ }
63
+ /**
64
+ * Full process interface with all extensions (for launch, dev, etc.).
65
+ * Extends ProcessIOWithStdio (which includes stdio, cwd, env, exit) and
66
+ * ProcessIOWithSignals (which includes signal handlers).
67
+ */
68
+ export interface ProcessIOFull extends ProcessIOWithStdio, ProcessIOWithSignals {
69
+ chdir(dir: string): void;
70
+ execPath?: string;
71
+ platform: NodeJS.Platform;
72
+ }
73
+ /**
74
+ * Base file system interface - just exists check.
75
+ * Used by: logs, tunnel
76
+ */
77
+ export interface FileIO {
78
+ exists(path: string): boolean;
79
+ }
80
+ /**
81
+ * File interface with sync reading.
82
+ * Used by: push
83
+ */
84
+ export interface FileIOWithRead extends FileIO {
85
+ readFileSync(path: string, encoding: BufferEncoding): string;
86
+ }
87
+ export interface ReadFileString {
88
+ readFileString(path: string): string | null;
89
+ }
90
+ export interface ReadFileBuffer {
91
+ readFileBuffer(path: string): Buffer | null;
92
+ }
93
+ export interface WriteFileString {
94
+ writeFileString(path: string, data: string, options?: {
95
+ mode?: number;
96
+ }): void;
97
+ }
98
+ export interface WriteFileBuffer {
99
+ writeFileBuffer(path: string, data: Buffer): void;
100
+ }
101
+ export interface Mkdir {
102
+ mkdir(path: string, options?: {
103
+ recursive?: boolean;
104
+ }): void;
105
+ }
106
+ export interface DbFileIO extends FileIO, Mkdir {
107
+ remove(path: string, options?: {
108
+ force?: boolean;
109
+ }): void;
110
+ }
111
+ export interface StorageFileIO extends FileIO, ReadFileBuffer, WriteFileBuffer {
112
+ stat(path: string): {
113
+ size: number;
114
+ };
115
+ }
116
+ export interface LaunchFileIO extends FileIO, Mkdir {
117
+ isProjectRoot(path: string): boolean;
118
+ isDirEmpty(path: string): boolean;
119
+ }
120
+ export interface OnboardingFileIO extends FileIO, Mkdir, ReadFileString, WriteFileString {
121
+ delete(path: string): void;
122
+ }
123
+ export interface InitFileIO extends FileIO, Mkdir, ReadFileString, WriteFileString {
124
+ copy(src: string, dest: string, options?: {
125
+ recursive?: boolean;
126
+ }): void;
127
+ readdir(path: string): string[];
128
+ }
129
+ export interface DevFileIO extends FileIO, Mkdir, WriteFileString {
130
+ }
131
+ export interface ConfigFileIO extends FileIO, Mkdir, ReadFileString, WriteFileString {
132
+ delete(path: string): void;
133
+ rename(src: string, dest: string): void;
134
+ }
135
+ export interface SpinnerIO {
136
+ start(message: string): void;
137
+ stop(message: string, exitCode?: number): void;
138
+ }
139
+ export interface UserIO {
140
+ select<T extends string>(opts: {
141
+ message: string;
142
+ options: Array<{
143
+ value: T;
144
+ label: string;
145
+ hint?: string;
146
+ }>;
147
+ }): Promise<T | symbol>;
148
+ text(opts: {
149
+ message: string;
150
+ placeholder?: string;
151
+ validate?: (value: string) => string | undefined;
152
+ }): Promise<string | symbol>;
153
+ isCancel(value: unknown): value is symbol;
154
+ intro?(message: string): void;
155
+ outro?(message: string): void;
156
+ cancel?(message: string): void;
157
+ password?(opts: {
158
+ message: string;
159
+ validate?: (value: string) => string | undefined;
160
+ }): Promise<string | symbol>;
161
+ confirm?(opts: {
162
+ message: string;
163
+ initialValue?: boolean;
164
+ }): Promise<boolean | symbol>;
165
+ spinner?(): SpinnerIO;
166
+ log?: {
167
+ info(message: string): void;
168
+ warn(message: string): void;
169
+ message(message: string): void;
170
+ };
171
+ }
172
+ /**
173
+ * Simple readline-based prompt.
174
+ * Used by: login, plugin
175
+ */
176
+ export interface SimplePromptIO {
177
+ prompt(question: string): Promise<string>;
178
+ }
179
+ /**
180
+ * Simple readline-based confirm.
181
+ * Used by: project
182
+ */
183
+ export interface SimpleConfirmIO {
184
+ confirm(question: string): Promise<boolean>;
185
+ }
186
+ /**
187
+ * Simple prompt with multiline support.
188
+ * Used by: feedback
189
+ */
190
+ export interface SimplePromptIOWithMultiline extends SimplePromptIO {
191
+ promptMultiline(): Promise<string>;
192
+ }
193
+ export interface NetworkIO {
194
+ fetch(url: string, options?: RequestInit): Promise<Response>;
195
+ }
196
+ export interface BrowserIO {
197
+ open(url: string): void;
198
+ }
199
+ export interface TimingIO {
200
+ sleep(ms: number): Promise<void>;
201
+ }
202
+ /**
203
+ * Readable stream interface for spawn stdout/stderr.
204
+ */
205
+ export interface SpawnReadableStream {
206
+ on(event: "data", listener: (data: Buffer) => void): this;
207
+ }
208
+ /**
209
+ * Result of spawning a child process.
210
+ * Properties like stdout/stderr are optional depending on stdio options.
211
+ */
212
+ export interface SpawnResult {
213
+ stdout: SpawnReadableStream | null;
214
+ stderr: SpawnReadableStream | null;
215
+ on(event: "error", listener: (error: Error) => void): this;
216
+ on(event: "close" | "exit", listener: (code: number | null) => void): this;
217
+ kill(signal?: NodeJS.Signals | number): boolean;
218
+ unref(): void;
219
+ }
220
+ export type StdioOption = "inherit" | "pipe" | "ignore";
221
+ export interface SpawnOptions {
222
+ cwd?: string;
223
+ stdio?: StdioOption | [StdioOption, StdioOption, StdioOption];
224
+ env?: Record<string, string | undefined>;
225
+ detached?: boolean;
226
+ }
227
+ export type SpawnFn = (command: string, args: string[], options: SpawnOptions) => SpawnResult;
228
+ export interface ClaudeCodeIO {
229
+ isInstalled(): boolean;
230
+ getNotInstalledError(): string;
231
+ }
232
+ export interface DatabaseIO {
233
+ open(path: string, options?: Database.Options): Database.Database;
234
+ }
235
+ export interface LaunchPaths {
236
+ flingHome: string;
237
+ cwd: string;
238
+ homedir: string;
239
+ }
240
+ export interface InitPaths {
241
+ flingRoot: string;
242
+ templateDir: string;
243
+ }
244
+ export interface InitMeta {
245
+ packageName: string;
246
+ packageVersion: string;
247
+ isDevelopmentMode: boolean;
248
+ }
249
+ export interface DbIO {
250
+ file: DbFileIO;
251
+ process: ProcessIO;
252
+ database: DatabaseIO;
253
+ console: ConsoleIO;
254
+ }
255
+ export interface StorageIO {
256
+ file: StorageFileIO;
257
+ process: ProcessIOWithStdio;
258
+ console: ConsoleIO;
259
+ }
260
+ export interface LaunchIO {
261
+ user: UserIO;
262
+ file: LaunchFileIO;
263
+ paths: LaunchPaths;
264
+ process: ProcessIO & {
265
+ chdir(dir: string): void;
266
+ };
267
+ console: ConsoleIO;
268
+ spawn: SpawnFn;
269
+ claudeCode: ClaudeCodeIO;
270
+ }
271
+ export interface OnboardingIO {
272
+ user: UserIO & {
273
+ intro(message: string): void;
274
+ outro(message: string): void;
275
+ cancel(message: string): void;
276
+ password(opts: {
277
+ message: string;
278
+ validate?: (value: string) => string | undefined;
279
+ }): Promise<string | symbol>;
280
+ confirm(opts: {
281
+ message: string;
282
+ initialValue?: boolean;
283
+ }): Promise<boolean | symbol>;
284
+ spinner(): SpinnerIO;
285
+ log: {
286
+ info(message: string): void;
287
+ warn(message: string): void;
288
+ message(message: string): void;
289
+ };
290
+ };
291
+ file: OnboardingFileIO;
292
+ network: NetworkIO;
293
+ }
294
+ export interface InitIO {
295
+ file: InitFileIO;
296
+ process: ProcessIO;
297
+ console: ConsoleIO;
298
+ paths: InitPaths;
299
+ meta: InitMeta;
300
+ registry: {
301
+ register(path: string): void;
302
+ };
303
+ }
304
+ export interface UpgradeIO {
305
+ file: InitFileIO;
306
+ process: ProcessIO;
307
+ console: ConsoleIO;
308
+ paths: InitPaths;
309
+ project: {
310
+ findEnclosingProject(startDir: string): string | null;
311
+ hasSymlinkInPath(targetPath: string, basePath: string): boolean;
312
+ };
313
+ }
314
+ export interface DevPaths {
315
+ nodeRuntimePath: string;
316
+ honoNodeServerPath: string;
317
+ }
318
+ export interface DevIO {
319
+ file: DevFileIO;
320
+ process: ProcessIOWithStdio & ProcessIOWithSignals & {
321
+ execPath: string;
322
+ };
323
+ console: ConsoleIO;
324
+ paths: DevPaths;
325
+ project: {
326
+ hasWorkerEntry(cwd: string): boolean;
327
+ getWorkerEntryPath(cwd: string): string;
328
+ };
329
+ spawn(command: string, args: string[], options?: NodeSpawnOptions): ChildProcess;
330
+ esbuild: {
331
+ context(options: BuildOptions): Promise<BuildContext>;
332
+ };
333
+ }
334
+ export interface ConfigIO {
335
+ file: ConfigFileIO;
336
+ env: {
337
+ homedir(): string;
338
+ get(name: string): string | undefined;
339
+ };
340
+ console: {
341
+ error(message: string): void;
342
+ };
343
+ }
344
+ /**
345
+ * Result from promptNewProject.
346
+ * - string: path to project directory (existing or new)
347
+ * - null: user cancelled
348
+ */
349
+ export type PromptNewProjectResult = string | null;
350
+ //# sourceMappingURL=cli-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-io.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cli-io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM1D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,SAAS;IACtD,gEAAgE;IAChE,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAMD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,GAAG,IAAI,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA8B,SAAQ,kBAAkB;IACvE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC7D;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAc,SAAQ,kBAAkB,EAAE,oBAAoB;IAC7E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC3B;AAMD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,MAAM;IAC5C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC;CAC9D;AAID,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChF;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9D;AAID,MAAM,WAAW,QAAS,SAAQ,MAAM,EAAE,KAAK;IAC7C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,EAAE,cAAc,EAAE,eAAe;IAC5E,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtC;AAED,MAAM,WAAW,YAAa,SAAQ,MAAM,EAAE,KAAK;IACjD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,gBAAiB,SAAQ,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe;IACtF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAW,SAAQ,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe;IAChF,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAU,SAAQ,MAAM,EAAE,KAAK,EAAE,eAAe;CAAG;AAEpE,MAAM,WAAW,YAAa,SAAQ,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe;IAClF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAMD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC5D,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IAExB,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;KAClD,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAE7B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC;IAG1C,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,CAAC,IAAI,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;KAClD,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,IAAI,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,SAAS,CAAC;IACtB,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;CACH;AAMD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,cAAc;IACjE,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACpC;AAMD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC9D;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAMD,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3D;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,YAAY,KAClB,WAAW,CAAC;AAMjB,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC;IACvB,oBAAoB,IAAI,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;CACnE;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAMD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG;QACnB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG;QACb,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,QAAQ,CAAC,IAAI,EAAE;YACb,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;SAClD,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,EAAE;YACZ,OAAO,EAAE,MAAM,CAAC;YAChB,YAAY,CAAC,EAAE,OAAO,CAAC;SACxB,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,SAAS,CAAC;QACrB,GAAG,EAAE;YACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;SAChC,CAAC;KACH,CAAC;IACF,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE;QACR,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE;QACP,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QACtD,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;KACjE,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,kBAAkB,GAAG,oBAAoB,GAAG;QACnD,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE;QACP,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACzC,CAAC;IACF,KAAK,CACH,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,gBAAgB,GACzB,YAAY,CAAC;IAChB,OAAO,EAAE;QACP,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;KACvD,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE;QACH,OAAO,IAAI,MAAM,CAAC;QAClB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACvC,CAAC;IACF,OAAO,EAAE;QACP,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;CACH;AAMD;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Consolidated I/O abstraction interfaces for CLI commands.
3
+ *
4
+ * These interfaces allow CLI command logic to be tested without mocking
5
+ * individual modules. Tests can provide fake implementations.
6
+ *
7
+ * Interface hierarchy:
8
+ * - Shared base interfaces (ConsoleIO, ProcessIO, FileIO) are used across commands
9
+ * - Command-specific interfaces extend the base where needed
10
+ * - Each command defines its own combined IO interface using these building blocks
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=cli-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-io.js","sourceRoot":"","sources":["../../../src/cli/utils/cli-io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1,7 +1,65 @@
1
1
  /**
2
2
  * Platform configuration utilities.
3
- * Stores token and API URL in ~/.fling/ (or FLING_CONFIG_DIR if set)
3
+ * Stores token and API URL in ~/.config/fling/ (XDG Base Directory spec).
4
+ *
5
+ * Priority for config directory:
6
+ * 1. FLING_CONFIG_DIR environment variable (explicit override)
7
+ * 2. XDG_CONFIG_HOME/fling (if XDG_CONFIG_HOME is set)
8
+ * 3. ~/.config/fling (XDG default)
9
+ *
10
+ * Automatic migration: If ~/.fling exists but the new location doesn't,
11
+ * config is automatically migrated with a one-time notice.
4
12
  */
13
+ import type { ConfigIO } from "./cli-io.js";
14
+ /**
15
+ * Get the legacy config directory path (~/.fling).
16
+ */
17
+ export declare function getLegacyConfigDir(io: ConfigIO): string;
18
+ /**
19
+ * Get the XDG-compliant config directory path.
20
+ * Respects XDG_CONFIG_HOME if set, otherwise defaults to ~/.config/fling.
21
+ */
22
+ export declare function getXdgConfigDir(io: ConfigIO): string;
23
+ /**
24
+ * Migrate config from legacy ~/.fling to XDG location if needed.
25
+ * Returns true if migration was performed, false otherwise.
26
+ */
27
+ export declare function migrateConfig(io: ConfigIO): boolean;
28
+ /**
29
+ * Get the configuration directory.
30
+ * Priority: FLING_CONFIG_DIR > XDG_CONFIG_HOME/fling > ~/.config/fling
31
+ */
32
+ export declare function getConfigDirWithIO(io: ConfigIO, attemptMigration?: boolean): string;
33
+ /**
34
+ * Get the stored API token, or null if not logged in.
35
+ * Empty or whitespace-only tokens are treated as null.
36
+ */
37
+ export declare function getTokenWithIO(io: ConfigIO, configDir: string): string | null;
38
+ /**
39
+ * Store the API token.
40
+ */
41
+ export declare function setTokenWithIO(io: ConfigIO, configDir: string, token: string): void;
42
+ /**
43
+ * Remove the stored token.
44
+ */
45
+ export declare function clearTokenWithIO(io: ConfigIO, configDir: string): void;
46
+ /**
47
+ * Get the API URL.
48
+ * Priority: FLING_API_URL env var > config file > default
49
+ */
50
+ export declare function getApiUrlWithIO(io: ConfigIO, configDir: string): string;
51
+ /**
52
+ * Set the API URL (for development/testing).
53
+ */
54
+ export declare function setApiUrlWithIO(io: ConfigIO, configDir: string, url: string): void;
55
+ /**
56
+ * Reset the migration flag. Used for testing.
57
+ */
58
+ export declare function resetMigrationFlag(): void;
59
+ /**
60
+ * Reset the cached config dir. Used for testing.
61
+ */
62
+ export declare function resetConfigDirCache(): void;
5
63
  /**
6
64
  * Get the stored API token, or null if not logged in.
7
65
  */
@@ -24,7 +82,7 @@ export declare function isLoggedIn(): boolean;
24
82
  export declare function configDirExists(): boolean;
25
83
  /**
26
84
  * Get the API URL.
27
- * Priority: FLING_API_URL env var > ~/.fling/api-url file > default
85
+ * Priority: FLING_API_URL env var > ~/.config/fling/api-url file > default
28
86
  */
29
87
  export declare function getApiUrl(): string;
30
88
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAKxC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CASlC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG3C;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AA2BzF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAEnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAS5C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAMpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CA8BnD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,gBAAgB,GAAE,OAAc,GAAG,MAAM,CAYzF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAInF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAWvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAIlF;AASD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAqBD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAMD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AA2BzF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAEnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}