@eide/foir-cli 0.1.28 → 0.1.30
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAetD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA6NN"}
|
|
@@ -2,7 +2,8 @@ import { withErrorHandler } from '../lib/errors.js';
|
|
|
2
2
|
import { createClient } from '../lib/client.js';
|
|
3
3
|
import { formatOutput, formatList, success } from '../lib/output.js';
|
|
4
4
|
import { parseInputData, isUUID } from '../lib/input.js';
|
|
5
|
-
import { ListExtensionsDocument, GetExtensionDocument, GetExtensionByKeyDocument, RegisterExtensionDocument, TriggerExtensionSyncDocument, InstallExtensionDocument,
|
|
5
|
+
import { ListExtensionsDocument, GetExtensionDocument, GetExtensionByKeyDocument, RegisterExtensionDocument, TriggerExtensionSyncDocument, InstallExtensionDocument, UnregisterExtensionDocument, // Still used by uninstall command
|
|
6
|
+
} from '../graphql/generated.js';
|
|
6
7
|
export function registerExtensionsCommands(program, globalOpts) {
|
|
7
8
|
const extensions = program
|
|
8
9
|
.command('extensions')
|
|
@@ -80,10 +81,11 @@ export function registerExtensionsCommands(program, globalOpts) {
|
|
|
80
81
|
.option('-d, --data <json>', 'Extension manifest as JSON')
|
|
81
82
|
.option('-f, --file <path>', 'Read manifest from file (.ts, .js, or .json)')
|
|
82
83
|
.option('-k, --key <key>', 'Extension key (overrides manifest)')
|
|
84
|
+
.option('--force', 'Uninstall existing extension before installing (fresh install)')
|
|
83
85
|
.addHelpText('after', `
|
|
84
86
|
Examples:
|
|
85
87
|
$ foir extensions install -f install.config.ts
|
|
86
|
-
$ foir extensions install -f install.json
|
|
88
|
+
$ foir extensions install -f install.json --force
|
|
87
89
|
$ foir extensions install -d '{"key":"my-ext","name":"My Extension",...}'
|
|
88
90
|
`)
|
|
89
91
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
@@ -94,6 +96,10 @@ Examples:
|
|
|
94
96
|
if (cmdOpts.key) {
|
|
95
97
|
input.key = cmdOpts.key;
|
|
96
98
|
}
|
|
99
|
+
// Add force flag to input if --force is specified
|
|
100
|
+
if (cmdOpts.force) {
|
|
101
|
+
input.force = true;
|
|
102
|
+
}
|
|
97
103
|
const data = await client.request(InstallExtensionDocument, { input });
|
|
98
104
|
const result = data.installExtension;
|
|
99
105
|
if (opts.json || opts.jsonl || opts.quiet) {
|
|
@@ -125,6 +131,52 @@ Examples:
|
|
|
125
131
|
}
|
|
126
132
|
}
|
|
127
133
|
}));
|
|
134
|
+
// uninstall
|
|
135
|
+
extensions
|
|
136
|
+
.command('uninstall <keyOrId>')
|
|
137
|
+
.description('Uninstall an extension by key or ID')
|
|
138
|
+
.addHelpText('after', `
|
|
139
|
+
Examples:
|
|
140
|
+
$ foir extensions uninstall tilly
|
|
141
|
+
$ foir extensions uninstall c7a3f8b0-1234-5678-90ab-cdef12345678
|
|
142
|
+
`)
|
|
143
|
+
.action(withErrorHandler(globalOpts, async (keyOrId) => {
|
|
144
|
+
const opts = globalOpts();
|
|
145
|
+
const client = await createClient(opts);
|
|
146
|
+
// Resolve key to ID if needed
|
|
147
|
+
let extensionId;
|
|
148
|
+
let extensionKey;
|
|
149
|
+
if (isUUID(keyOrId)) {
|
|
150
|
+
extensionId = keyOrId;
|
|
151
|
+
const data = await client.request(GetExtensionDocument, { id: keyOrId });
|
|
152
|
+
if (!data.extension) {
|
|
153
|
+
throw new Error(`Extension "${keyOrId}" not found.`);
|
|
154
|
+
}
|
|
155
|
+
extensionKey = data.extension.key;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const data = await client.request(GetExtensionByKeyDocument, {
|
|
159
|
+
key: keyOrId,
|
|
160
|
+
});
|
|
161
|
+
if (!data.extensionByKey) {
|
|
162
|
+
throw new Error(`Extension "${keyOrId}" not found.`);
|
|
163
|
+
}
|
|
164
|
+
extensionId = data.extensionByKey.id;
|
|
165
|
+
extensionKey = data.extensionByKey.key;
|
|
166
|
+
}
|
|
167
|
+
// Unregister the extension
|
|
168
|
+
await client.request(UnregisterExtensionDocument, { id: extensionId });
|
|
169
|
+
if (opts.json || opts.jsonl) {
|
|
170
|
+
formatOutput({ success: true, extensionId, extensionKey }, opts);
|
|
171
|
+
}
|
|
172
|
+
else if (opts.quiet) {
|
|
173
|
+
console.log(extensionId);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
success(`Uninstalled extension "${extensionKey}"`);
|
|
177
|
+
console.log(` Extension ID: ${extensionId}`);
|
|
178
|
+
}
|
|
179
|
+
}));
|
|
128
180
|
// sync
|
|
129
181
|
extensions
|
|
130
182
|
.command('sync <id>')
|
|
@@ -1859,6 +1859,8 @@ export type InstallExtensionInput = {
|
|
|
1859
1859
|
description?: InputMaybe<Scalars['String']['input']>;
|
|
1860
1860
|
direction?: InputMaybe<Scalars['String']['input']>;
|
|
1861
1861
|
extensionType?: InputMaybe<Scalars['String']['input']>;
|
|
1862
|
+
/** If true, delete existing extension before installing (force reinstall) */
|
|
1863
|
+
force?: InputMaybe<Scalars['Boolean']['input']>;
|
|
1862
1864
|
key: Scalars['String']['input'];
|
|
1863
1865
|
models?: InputMaybe<Array<InstallExtensionModelInput>>;
|
|
1864
1866
|
name: Scalars['String']['input'];
|
|
@@ -6674,6 +6676,12 @@ export type InstallExtensionMutation = {
|
|
|
6674
6676
|
} | null;
|
|
6675
6677
|
};
|
|
6676
6678
|
};
|
|
6679
|
+
export type UnregisterExtensionMutationVariables = Exact<{
|
|
6680
|
+
id: Scalars['ID']['input'];
|
|
6681
|
+
}>;
|
|
6682
|
+
export type UnregisterExtensionMutation = {
|
|
6683
|
+
unregisterExtension: boolean;
|
|
6684
|
+
};
|
|
6677
6685
|
export type ListFilesQueryVariables = Exact<{
|
|
6678
6686
|
folder?: InputMaybe<Scalars['String']['input']>;
|
|
6679
6687
|
mimeType?: InputMaybe<Scalars['String']['input']>;
|
|
@@ -8168,6 +8176,7 @@ export declare const GetExtensionByKeyDocument: DocumentNode<GetExtensionByKeyQu
|
|
|
8168
8176
|
export declare const RegisterExtensionDocument: DocumentNode<RegisterExtensionMutation, RegisterExtensionMutationVariables>;
|
|
8169
8177
|
export declare const TriggerExtensionSyncDocument: DocumentNode<TriggerExtensionSyncMutation, TriggerExtensionSyncMutationVariables>;
|
|
8170
8178
|
export declare const InstallExtensionDocument: DocumentNode<InstallExtensionMutation, InstallExtensionMutationVariables>;
|
|
8179
|
+
export declare const UnregisterExtensionDocument: DocumentNode<UnregisterExtensionMutation, UnregisterExtensionMutationVariables>;
|
|
8171
8180
|
export declare const ListFilesDocument: DocumentNode<ListFilesQuery, ListFilesQueryVariables>;
|
|
8172
8181
|
export declare const GetFileDocument: DocumentNode<GetFileQuery, GetFileQueryVariables>;
|
|
8173
8182
|
export declare const FileStorageUsageDocument: DocumentNode<FileStorageUsageQuery, FileStorageUsageQueryVariables>;
|