@eide/foir-cli 0.1.35 → 0.1.37

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 (228) hide show
  1. package/dist/cli.js +7467 -42
  2. package/dist/config/types.d.ts +7 -6
  3. package/dist/config/types.js +6 -14
  4. package/dist/generated-CPsQ9jfu.d.ts +195 -0
  5. package/dist/lib/extension-helpers.d.ts +10 -7
  6. package/dist/lib/extension-helpers.js +15 -85
  7. package/dist/lib/hook-helpers.d.ts +9 -6
  8. package/dist/lib/hook-helpers.js +12 -105
  9. package/dist/lib/seed-helpers.d.ts +10 -8
  10. package/dist/lib/seed-helpers.js +18 -124
  11. package/dist/schema.graphql +6062 -0
  12. package/package.json +9 -8
  13. package/dist/auth/credentials.d.ts +0 -31
  14. package/dist/auth/credentials.d.ts.map +0 -1
  15. package/dist/auth/credentials.js +0 -139
  16. package/dist/cli.d.ts +0 -3
  17. package/dist/cli.d.ts.map +0 -1
  18. package/dist/codegen/fetch-customer-profile-schema.d.ts +0 -12
  19. package/dist/codegen/fetch-customer-profile-schema.d.ts.map +0 -1
  20. package/dist/codegen/fetch-customer-profile-schema.js +0 -21
  21. package/dist/codegen/fetch-models.d.ts +0 -58
  22. package/dist/codegen/fetch-models.d.ts.map +0 -1
  23. package/dist/codegen/fetch-models.js +0 -96
  24. package/dist/codegen/field-mapping.d.ts +0 -34
  25. package/dist/codegen/field-mapping.d.ts.map +0 -1
  26. package/dist/codegen/field-mapping.js +0 -250
  27. package/dist/codegen/generators/config.d.ts +0 -5
  28. package/dist/codegen/generators/config.d.ts.map +0 -1
  29. package/dist/codegen/generators/config.js +0 -82
  30. package/dist/codegen/generators/customer-profile-documents.d.ts +0 -5
  31. package/dist/codegen/generators/customer-profile-documents.d.ts.map +0 -1
  32. package/dist/codegen/generators/customer-profile-documents.js +0 -42
  33. package/dist/codegen/generators/customer-profile-hooks.d.ts +0 -5
  34. package/dist/codegen/generators/customer-profile-hooks.d.ts.map +0 -1
  35. package/dist/codegen/generators/customer-profile-hooks.js +0 -78
  36. package/dist/codegen/generators/customer-profile-loaders.d.ts +0 -5
  37. package/dist/codegen/generators/customer-profile-loaders.d.ts.map +0 -1
  38. package/dist/codegen/generators/customer-profile-loaders.js +0 -67
  39. package/dist/codegen/generators/customer-profile-operations.d.ts +0 -5
  40. package/dist/codegen/generators/customer-profile-operations.d.ts.map +0 -1
  41. package/dist/codegen/generators/customer-profile-operations.js +0 -126
  42. package/dist/codegen/generators/customer-profile-types.d.ts +0 -6
  43. package/dist/codegen/generators/customer-profile-types.d.ts.map +0 -1
  44. package/dist/codegen/generators/customer-profile-types.js +0 -45
  45. package/dist/codegen/generators/documents.d.ts +0 -12
  46. package/dist/codegen/generators/documents.d.ts.map +0 -1
  47. package/dist/codegen/generators/documents.js +0 -178
  48. package/dist/codegen/generators/field-types.d.ts +0 -5
  49. package/dist/codegen/generators/field-types.d.ts.map +0 -1
  50. package/dist/codegen/generators/field-types.js +0 -346
  51. package/dist/codegen/generators/model-index.d.ts +0 -6
  52. package/dist/codegen/generators/model-index.d.ts.map +0 -1
  53. package/dist/codegen/generators/model-index.js +0 -26
  54. package/dist/codegen/generators/model-types.d.ts +0 -12
  55. package/dist/codegen/generators/model-types.d.ts.map +0 -1
  56. package/dist/codegen/generators/model-types.js +0 -177
  57. package/dist/codegen/generators/public-schema-content.d.ts +0 -14
  58. package/dist/codegen/generators/public-schema-content.d.ts.map +0 -1
  59. package/dist/codegen/generators/public-schema-content.js +0 -22
  60. package/dist/codegen/generators/react-hooks-index.d.ts +0 -6
  61. package/dist/codegen/generators/react-hooks-index.d.ts.map +0 -1
  62. package/dist/codegen/generators/react-hooks-index.js +0 -20
  63. package/dist/codegen/generators/react-hooks.d.ts +0 -7
  64. package/dist/codegen/generators/react-hooks.d.ts.map +0 -1
  65. package/dist/codegen/generators/react-hooks.js +0 -139
  66. package/dist/codegen/generators/remix-loaders-index.d.ts +0 -6
  67. package/dist/codegen/generators/remix-loaders-index.d.ts.map +0 -1
  68. package/dist/codegen/generators/remix-loaders-index.js +0 -20
  69. package/dist/codegen/generators/remix-loaders.d.ts +0 -7
  70. package/dist/codegen/generators/remix-loaders.d.ts.map +0 -1
  71. package/dist/codegen/generators/remix-loaders.js +0 -107
  72. package/dist/codegen/generators/static-documents.d.ts +0 -14
  73. package/dist/codegen/generators/static-documents.d.ts.map +0 -1
  74. package/dist/codegen/generators/static-documents.js +0 -771
  75. package/dist/codegen/generators/swift-customer-profile.d.ts +0 -9
  76. package/dist/codegen/generators/swift-customer-profile.d.ts.map +0 -1
  77. package/dist/codegen/generators/swift-customer-profile.js +0 -152
  78. package/dist/codegen/generators/swift-field-types.d.ts +0 -5
  79. package/dist/codegen/generators/swift-field-types.d.ts.map +0 -1
  80. package/dist/codegen/generators/swift-field-types.js +0 -151
  81. package/dist/codegen/generators/swift-model-keys.d.ts +0 -6
  82. package/dist/codegen/generators/swift-model-keys.d.ts.map +0 -1
  83. package/dist/codegen/generators/swift-model-keys.js +0 -25
  84. package/dist/codegen/generators/swift-types.d.ts +0 -13
  85. package/dist/codegen/generators/swift-types.d.ts.map +0 -1
  86. package/dist/codegen/generators/swift-types.js +0 -188
  87. package/dist/codegen/generators/typed-operations-common.d.ts +0 -6
  88. package/dist/codegen/generators/typed-operations-common.d.ts.map +0 -1
  89. package/dist/codegen/generators/typed-operations-common.js +0 -84
  90. package/dist/codegen/generators/typed-operations-index.d.ts +0 -6
  91. package/dist/codegen/generators/typed-operations-index.d.ts.map +0 -1
  92. package/dist/codegen/generators/typed-operations-index.js +0 -22
  93. package/dist/codegen/generators/typed-operations.d.ts +0 -11
  94. package/dist/codegen/generators/typed-operations.d.ts.map +0 -1
  95. package/dist/codegen/generators/typed-operations.js +0 -263
  96. package/dist/codegen/swift-field-mapping.d.ts +0 -30
  97. package/dist/codegen/swift-field-mapping.d.ts.map +0 -1
  98. package/dist/codegen/swift-field-mapping.js +0 -150
  99. package/dist/codegen/write-files.d.ts +0 -15
  100. package/dist/codegen/write-files.d.ts.map +0 -1
  101. package/dist/codegen/write-files.js +0 -36
  102. package/dist/commands/api-keys.d.ts +0 -4
  103. package/dist/commands/api-keys.d.ts.map +0 -1
  104. package/dist/commands/api-keys.js +0 -129
  105. package/dist/commands/auth-config.d.ts +0 -4
  106. package/dist/commands/auth-config.d.ts.map +0 -1
  107. package/dist/commands/auth-config.js +0 -38
  108. package/dist/commands/auth-providers.d.ts +0 -4
  109. package/dist/commands/auth-providers.d.ts.map +0 -1
  110. package/dist/commands/auth-providers.js +0 -207
  111. package/dist/commands/context.d.ts +0 -4
  112. package/dist/commands/context.d.ts.map +0 -1
  113. package/dist/commands/context.js +0 -91
  114. package/dist/commands/create-extension.d.ts +0 -4
  115. package/dist/commands/create-extension.d.ts.map +0 -1
  116. package/dist/commands/create-extension.js +0 -60
  117. package/dist/commands/customer-profiles.d.ts +0 -4
  118. package/dist/commands/customer-profiles.d.ts.map +0 -1
  119. package/dist/commands/customer-profiles.js +0 -99
  120. package/dist/commands/customers.d.ts +0 -4
  121. package/dist/commands/customers.d.ts.map +0 -1
  122. package/dist/commands/customers.js +0 -126
  123. package/dist/commands/embeddings.d.ts +0 -4
  124. package/dist/commands/embeddings.d.ts.map +0 -1
  125. package/dist/commands/embeddings.js +0 -145
  126. package/dist/commands/experiments.d.ts +0 -4
  127. package/dist/commands/experiments.d.ts.map +0 -1
  128. package/dist/commands/experiments.js +0 -196
  129. package/dist/commands/extensions.d.ts +0 -4
  130. package/dist/commands/extensions.d.ts.map +0 -1
  131. package/dist/commands/extensions.js +0 -210
  132. package/dist/commands/files.d.ts +0 -4
  133. package/dist/commands/files.d.ts.map +0 -1
  134. package/dist/commands/files.js +0 -143
  135. package/dist/commands/hooks.d.ts +0 -4
  136. package/dist/commands/hooks.d.ts.map +0 -1
  137. package/dist/commands/hooks.js +0 -228
  138. package/dist/commands/locales.d.ts +0 -4
  139. package/dist/commands/locales.d.ts.map +0 -1
  140. package/dist/commands/locales.js +0 -140
  141. package/dist/commands/login.d.ts +0 -4
  142. package/dist/commands/login.d.ts.map +0 -1
  143. package/dist/commands/login.js +0 -124
  144. package/dist/commands/logout.d.ts +0 -4
  145. package/dist/commands/logout.d.ts.map +0 -1
  146. package/dist/commands/logout.js +0 -16
  147. package/dist/commands/media.d.ts +0 -4
  148. package/dist/commands/media.d.ts.map +0 -1
  149. package/dist/commands/media.js +0 -44
  150. package/dist/commands/models.d.ts +0 -4
  151. package/dist/commands/models.d.ts.map +0 -1
  152. package/dist/commands/models.js +0 -153
  153. package/dist/commands/notes.d.ts +0 -4
  154. package/dist/commands/notes.d.ts.map +0 -1
  155. package/dist/commands/notes.js +0 -132
  156. package/dist/commands/notifications.d.ts +0 -4
  157. package/dist/commands/notifications.d.ts.map +0 -1
  158. package/dist/commands/notifications.js +0 -73
  159. package/dist/commands/operations.d.ts +0 -4
  160. package/dist/commands/operations.d.ts.map +0 -1
  161. package/dist/commands/operations.js +0 -341
  162. package/dist/commands/playground.d.ts +0 -4
  163. package/dist/commands/playground.d.ts.map +0 -1
  164. package/dist/commands/playground.js +0 -270
  165. package/dist/commands/pull.d.ts +0 -4
  166. package/dist/commands/pull.d.ts.map +0 -1
  167. package/dist/commands/pull.js +0 -300
  168. package/dist/commands/records.d.ts +0 -4
  169. package/dist/commands/records.d.ts.map +0 -1
  170. package/dist/commands/records.js +0 -314
  171. package/dist/commands/register-commands.d.ts +0 -7
  172. package/dist/commands/register-commands.d.ts.map +0 -1
  173. package/dist/commands/register-commands.js +0 -259
  174. package/dist/commands/schedules.d.ts +0 -4
  175. package/dist/commands/schedules.d.ts.map +0 -1
  176. package/dist/commands/schedules.js +0 -155
  177. package/dist/commands/search.d.ts +0 -4
  178. package/dist/commands/search.d.ts.map +0 -1
  179. package/dist/commands/search.js +0 -60
  180. package/dist/commands/segments.d.ts +0 -4
  181. package/dist/commands/segments.d.ts.map +0 -1
  182. package/dist/commands/segments.js +0 -155
  183. package/dist/commands/select-project.d.ts +0 -4
  184. package/dist/commands/select-project.d.ts.map +0 -1
  185. package/dist/commands/select-project.js +0 -144
  186. package/dist/commands/settings.d.ts +0 -4
  187. package/dist/commands/settings.d.ts.map +0 -1
  188. package/dist/commands/settings.js +0 -115
  189. package/dist/commands/variant-catalog.d.ts +0 -4
  190. package/dist/commands/variant-catalog.d.ts.map +0 -1
  191. package/dist/commands/variant-catalog.js +0 -118
  192. package/dist/commands/whoami.d.ts +0 -4
  193. package/dist/commands/whoami.d.ts.map +0 -1
  194. package/dist/commands/whoami.js +0 -51
  195. package/dist/config/pull-config.d.ts +0 -33
  196. package/dist/config/pull-config.d.ts.map +0 -1
  197. package/dist/config/pull-config.js +0 -119
  198. package/dist/config/types.d.ts.map +0 -1
  199. package/dist/graphql/generated.d.ts +0 -6074
  200. package/dist/graphql/generated.d.ts.map +0 -1
  201. package/dist/graphql/generated.js +0 -355
  202. package/dist/lib/client.d.ts +0 -18
  203. package/dist/lib/client.d.ts.map +0 -1
  204. package/dist/lib/client.js +0 -64
  205. package/dist/lib/config-loader.d.ts +0 -28
  206. package/dist/lib/config-loader.d.ts.map +0 -1
  207. package/dist/lib/config-loader.js +0 -49
  208. package/dist/lib/config.d.ts +0 -12
  209. package/dist/lib/config.d.ts.map +0 -1
  210. package/dist/lib/config.js +0 -8
  211. package/dist/lib/errors.d.ts +0 -6
  212. package/dist/lib/errors.d.ts.map +0 -1
  213. package/dist/lib/errors.js +0 -76
  214. package/dist/lib/extension-helpers.d.ts.map +0 -1
  215. package/dist/lib/hook-helpers.d.ts.map +0 -1
  216. package/dist/lib/input.d.ts +0 -38
  217. package/dist/lib/input.d.ts.map +0 -1
  218. package/dist/lib/input.js +0 -108
  219. package/dist/lib/output.d.ts +0 -31
  220. package/dist/lib/output.d.ts.map +0 -1
  221. package/dist/lib/output.js +0 -107
  222. package/dist/lib/seed-helpers.d.ts.map +0 -1
  223. package/dist/scaffold/package-manager.d.ts +0 -12
  224. package/dist/scaffold/package-manager.d.ts.map +0 -1
  225. package/dist/scaffold/package-manager.js +0 -51
  226. package/dist/scaffold/scaffold.d.ts +0 -4
  227. package/dist/scaffold/scaffold.d.ts.map +0 -1
  228. package/dist/scaffold/scaffold.js +0 -462
@@ -1,155 +0,0 @@
1
- import { withErrorHandler } from '../lib/errors.js';
2
- import { createClient } from '../lib/client.js';
3
- import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
4
- import { parseInputData, confirmAction } from '../lib/input.js';
5
- import { ListSchedulesDocument, GetScheduleDocument, CreateScheduleDocument, UpdateScheduleDocument, DeleteScheduleDocument, PauseScheduleDocument, ResumeScheduleDocument, TriggerScheduleDocument, } from '../graphql/generated.js';
6
- export function registerSchedulesCommands(program, globalOpts) {
7
- const schedules = program
8
- .command('schedules')
9
- .description('Manage schedules');
10
- // list
11
- schedules
12
- .command('list')
13
- .description('List schedules')
14
- .option('--active', 'Only active schedules')
15
- .option('--limit <n>', 'Max results', '50')
16
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
17
- const opts = globalOpts();
18
- const client = await createClient(opts);
19
- const data = await client.request(ListSchedulesDocument, {
20
- isActive: cmdOpts.active ? true : undefined,
21
- limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
22
- });
23
- formatList(data.schedules.items, opts, {
24
- columns: [
25
- { key: 'key', header: 'Key', width: 20 },
26
- { key: 'name', header: 'Name', width: 24 },
27
- { key: 'cron', header: 'Cron', width: 16 },
28
- {
29
- key: 'isActive',
30
- header: 'Active',
31
- width: 8,
32
- format: (v) => (v ? 'yes' : 'no'),
33
- },
34
- { key: 'lastRunStatus', header: 'Last Run', width: 10 },
35
- {
36
- key: 'nextRunAt',
37
- header: 'Next Run',
38
- width: 12,
39
- format: (v) => timeAgo(v),
40
- },
41
- ],
42
- total: data.schedules.total,
43
- });
44
- }));
45
- // get
46
- schedules
47
- .command('get <key>')
48
- .description('Get a schedule by key')
49
- .action(withErrorHandler(globalOpts, async (key) => {
50
- const opts = globalOpts();
51
- const client = await createClient(opts);
52
- const data = await client.request(GetScheduleDocument, { key });
53
- if (!data.schedule)
54
- throw new Error(`Schedule "${key}" not found.`);
55
- formatOutput(data.schedule, opts);
56
- }));
57
- // create
58
- schedules
59
- .command('create')
60
- .description('Create a new schedule')
61
- .option('-d, --data <json>', 'Schedule data as JSON')
62
- .option('-f, --file <path>', 'Read data from file')
63
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
64
- const opts = globalOpts();
65
- const client = await createClient(opts);
66
- const input = await parseInputData(cmdOpts);
67
- const data = await client.request(CreateScheduleDocument, {
68
- input,
69
- });
70
- formatOutput(data.createSchedule, opts);
71
- if (!(opts.json || opts.jsonl || opts.quiet))
72
- success(`Created schedule ${data.createSchedule.key}`);
73
- }));
74
- // update
75
- schedules
76
- .command('update <key>')
77
- .description('Update an existing schedule')
78
- .option('-d, --data <json>', 'Schedule data as JSON')
79
- .option('-f, --file <path>', 'Read data from file')
80
- .action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
81
- const opts = globalOpts();
82
- const client = await createClient(opts);
83
- const input = await parseInputData(cmdOpts);
84
- const data = await client.request(UpdateScheduleDocument, {
85
- key,
86
- input,
87
- });
88
- formatOutput(data.updateSchedule, opts);
89
- if (!(opts.json || opts.jsonl || opts.quiet))
90
- success(`Updated schedule "${key}"`);
91
- }));
92
- // trigger
93
- schedules
94
- .command('trigger <key>')
95
- .description('Trigger a schedule immediately')
96
- .action(withErrorHandler(globalOpts, async (key) => {
97
- const opts = globalOpts();
98
- const client = await createClient(opts);
99
- const data = await client.request(TriggerScheduleDocument, { key });
100
- if (opts.json || opts.jsonl) {
101
- formatOutput(data.triggerSchedule, opts);
102
- }
103
- else if (data.triggerSchedule.success) {
104
- success(`Triggered schedule "${key}" (job: ${data.triggerSchedule.jobId ?? 'n/a'})`);
105
- }
106
- else {
107
- throw new Error(data.triggerSchedule.error ?? 'Trigger failed');
108
- }
109
- }));
110
- // pause
111
- schedules
112
- .command('pause <key>')
113
- .description('Pause a schedule')
114
- .action(withErrorHandler(globalOpts, async (key) => {
115
- const opts = globalOpts();
116
- const client = await createClient(opts);
117
- const data = await client.request(PauseScheduleDocument, { key });
118
- formatOutput(data.pauseSchedule, opts);
119
- if (!(opts.json || opts.jsonl || opts.quiet))
120
- success(`Paused schedule "${key}"`);
121
- }));
122
- // resume
123
- schedules
124
- .command('resume <key>')
125
- .description('Resume a paused schedule')
126
- .action(withErrorHandler(globalOpts, async (key) => {
127
- const opts = globalOpts();
128
- const client = await createClient(opts);
129
- const data = await client.request(ResumeScheduleDocument, { key });
130
- formatOutput(data.resumeSchedule, opts);
131
- if (!(opts.json || opts.jsonl || opts.quiet))
132
- success(`Resumed schedule "${key}"`);
133
- }));
134
- // delete
135
- schedules
136
- .command('delete <key>')
137
- .description('Delete a schedule')
138
- .option('--confirm', 'Skip confirmation prompt')
139
- .action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
140
- const opts = globalOpts();
141
- const confirmed = await confirmAction(`Delete schedule "${key}"?`, {
142
- confirm: !!cmdOpts.confirm,
143
- });
144
- if (!confirmed) {
145
- console.log('Aborted.');
146
- return;
147
- }
148
- const client = await createClient(opts);
149
- await client.request(DeleteScheduleDocument, { key });
150
- if (opts.json || opts.jsonl)
151
- formatOutput({ deleted: true, key }, opts);
152
- else
153
- success(`Deleted schedule "${key}"`);
154
- }));
155
- }
@@ -1,4 +0,0 @@
1
- import type { Command } from 'commander';
2
- import type { GlobalOptions } from '../lib/config.js';
3
- export declare function registerSearchCommands(program: Command, globalOpts: () => GlobalOptions): void;
4
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMtD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAgFN"}
@@ -1,60 +0,0 @@
1
- import { withErrorHandler } from '../lib/errors.js';
2
- import { createClient } from '../lib/client.js';
3
- import { formatOutput, formatList, timeAgo } from '../lib/output.js';
4
- import { GlobalSearchDocument } from '../graphql/generated.js';
5
- export function registerSearchCommands(program, globalOpts) {
6
- program
7
- .command('search <query>')
8
- .description('Search across all records and media')
9
- .option('--models <keys>', 'Filter to specific model keys (comma-separated)')
10
- .option('--limit <n>', 'Max results', '20')
11
- .option('--no-media', 'Exclude media results')
12
- .action(withErrorHandler(globalOpts, async (query, cmdOpts) => {
13
- const opts = globalOpts();
14
- const client = await createClient(opts);
15
- const modelKeys = typeof cmdOpts.models === 'string'
16
- ? cmdOpts.models.split(',').map((k) => k.trim())
17
- : undefined;
18
- const data = await client.request(GlobalSearchDocument, {
19
- query,
20
- limit: parseInt(String(cmdOpts.limit ?? '20'), 10),
21
- modelKeys,
22
- includeMedia: cmdOpts.media !== false,
23
- });
24
- if (opts.json || opts.jsonl) {
25
- formatOutput(data.globalSearch, opts);
26
- return;
27
- }
28
- if (data.globalSearch.records.length > 0) {
29
- console.log(`\nRecords (${data.globalSearch.records.length}):`);
30
- formatList(data.globalSearch.records, opts, {
31
- columns: [
32
- { key: 'id', header: 'ID', width: 28 },
33
- { key: 'modelKey', header: 'Model', width: 18 },
34
- { key: 'title', header: 'Title', width: 28 },
35
- { key: 'naturalKey', header: 'Key', width: 20 },
36
- {
37
- key: 'updatedAt',
38
- header: 'Updated',
39
- width: 12,
40
- format: (v) => timeAgo(v),
41
- },
42
- ],
43
- });
44
- }
45
- if (data.globalSearch.media.length > 0) {
46
- console.log(`\nMedia (${data.globalSearch.media.length}):`);
47
- formatList(data.globalSearch.media, opts, {
48
- columns: [
49
- { key: 'id', header: 'ID', width: 28 },
50
- { key: 'fileName', header: 'File', width: 30 },
51
- { key: 'altText', header: 'Alt', width: 24 },
52
- ],
53
- });
54
- }
55
- if (data.globalSearch.records.length === 0 &&
56
- data.globalSearch.media.length === 0) {
57
- console.log('No results found.');
58
- }
59
- }));
60
- }
@@ -1,4 +0,0 @@
1
- import type { Command } from 'commander';
2
- import type { GlobalOptions } from '../lib/config.js';
3
- export declare function registerSegmentsCommands(program: Command, globalOpts: () => GlobalOptions): void;
4
- //# sourceMappingURL=segments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../src/commands/segments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAgBtD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAsLN"}
@@ -1,155 +0,0 @@
1
- import { withErrorHandler } from '../lib/errors.js';
2
- import { createClient } from '../lib/client.js';
3
- import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
4
- import { parseInputData, isUUID, confirmAction } from '../lib/input.js';
5
- import { ListSegmentsDocument, GetSegmentDocument, GetSegmentByKeyDocument, CreateSegmentDocument, UpdateSegmentDocument, DeleteSegmentDocument, PreviewSegmentRulesDocument, TestSegmentEvaluationDocument, } from '../graphql/generated.js';
6
- export function registerSegmentsCommands(program, globalOpts) {
7
- const segments = program.command('segments').description('Manage segments');
8
- // list
9
- segments
10
- .command('list')
11
- .description('List segments')
12
- .option('--active', 'Only active segments')
13
- .option('--limit <n>', 'Max results', '50')
14
- .option('--offset <n>', 'Skip results', '0')
15
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
16
- const opts = globalOpts();
17
- const client = await createClient(opts);
18
- const data = await client.request(ListSegmentsDocument, {
19
- isActive: cmdOpts.active ? true : undefined,
20
- limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
21
- offset: parseInt(String(cmdOpts.offset ?? '0'), 10),
22
- });
23
- formatList(data.segments, opts, {
24
- columns: [
25
- { key: 'id', header: 'ID', width: 28 },
26
- { key: 'key', header: 'Key', width: 20 },
27
- { key: 'name', header: 'Name', width: 24 },
28
- { key: 'memberCount', header: 'Members', width: 10 },
29
- {
30
- key: 'isActive',
31
- header: 'Active',
32
- width: 8,
33
- format: (v) => (v ? 'yes' : 'no'),
34
- },
35
- {
36
- key: 'updatedAt',
37
- header: 'Updated',
38
- width: 12,
39
- format: (v) => timeAgo(v),
40
- },
41
- ],
42
- });
43
- }));
44
- // get
45
- segments
46
- .command('get <idOrKey>')
47
- .description('Get a segment by ID or key')
48
- .action(withErrorHandler(globalOpts, async (idOrKey) => {
49
- const opts = globalOpts();
50
- const client = await createClient(opts);
51
- let result;
52
- if (isUUID(idOrKey)) {
53
- const data = await client.request(GetSegmentDocument, {
54
- id: idOrKey,
55
- });
56
- result = data.segment;
57
- }
58
- else {
59
- const data = await client.request(GetSegmentByKeyDocument, {
60
- key: idOrKey,
61
- });
62
- result = data.segmentByKey;
63
- }
64
- if (!result)
65
- throw new Error(`Segment "${idOrKey}" not found.`);
66
- formatOutput(result, opts);
67
- }));
68
- // create
69
- segments
70
- .command('create')
71
- .description('Create a new segment')
72
- .option('-d, --data <json>', 'Segment data as JSON')
73
- .option('-f, --file <path>', 'Read data from file')
74
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
75
- const opts = globalOpts();
76
- const client = await createClient(opts);
77
- const input = await parseInputData(cmdOpts);
78
- const data = await client.request(CreateSegmentDocument, {
79
- input,
80
- });
81
- formatOutput(data.createSegment, opts);
82
- if (!(opts.json || opts.jsonl || opts.quiet))
83
- success(`Created segment ${data.createSegment.key}`);
84
- }));
85
- // update
86
- segments
87
- .command('update <id>')
88
- .description('Update a segment')
89
- .option('-d, --data <json>', 'Segment data as JSON')
90
- .option('-f, --file <path>', 'Read data from file')
91
- .action(withErrorHandler(globalOpts, async (id, cmdOpts) => {
92
- const opts = globalOpts();
93
- const client = await createClient(opts);
94
- const input = await parseInputData(cmdOpts);
95
- const data = await client.request(UpdateSegmentDocument, {
96
- id,
97
- input,
98
- });
99
- formatOutput(data.updateSegment, opts);
100
- if (!(opts.json || opts.jsonl || opts.quiet))
101
- success(`Updated segment ${id}`);
102
- }));
103
- // delete
104
- segments
105
- .command('delete <id>')
106
- .description('Delete a segment')
107
- .option('--confirm', 'Skip confirmation prompt')
108
- .action(withErrorHandler(globalOpts, async (id, cmdOpts) => {
109
- const opts = globalOpts();
110
- const confirmed = await confirmAction(`Delete segment ${id}?`, {
111
- confirm: !!cmdOpts.confirm,
112
- });
113
- if (!confirmed) {
114
- console.log('Aborted.');
115
- return;
116
- }
117
- const client = await createClient(opts);
118
- await client.request(DeleteSegmentDocument, { id });
119
- if (opts.json || opts.jsonl)
120
- formatOutput({ deleted: true, id }, opts);
121
- else
122
- success(`Deleted segment ${id}`);
123
- }));
124
- // preview
125
- segments
126
- .command('preview')
127
- .description('Preview segment rules against sample customers')
128
- .option('-f, --file <path>', 'Rules JSON file')
129
- .option('-d, --data <json>', 'Rules as inline JSON')
130
- .option('--sample-size <n>', 'Sample size', '100')
131
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
132
- const opts = globalOpts();
133
- const client = await createClient(opts);
134
- const inputData = await parseInputData(cmdOpts);
135
- const rules = inputData.rules ?? inputData;
136
- const data = await client.request(PreviewSegmentRulesDocument, {
137
- rules,
138
- sampleSize: parseInt(cmdOpts.sampleSize ?? '100', 10),
139
- });
140
- formatOutput(data.previewSegmentRules, opts);
141
- }));
142
- // test
143
- segments
144
- .command('test <segmentId> <customerId>')
145
- .description('Test whether a customer matches a segment')
146
- .action(withErrorHandler(globalOpts, async (segmentId, customerId) => {
147
- const opts = globalOpts();
148
- const client = await createClient(opts);
149
- const data = await client.request(TestSegmentEvaluationDocument, {
150
- segmentId,
151
- customerId,
152
- });
153
- formatOutput(data.testSegmentEvaluation, opts);
154
- }));
155
- }
@@ -1,4 +0,0 @@
1
- import type { Command } from 'commander';
2
- import { type GlobalOptions } from '../lib/config.js';
3
- export declare function registerSelectProjectCommand(program: Command, globalOpts: () => GlobalOptions): void;
4
- //# sourceMappingURL=select-project.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-project.d.ts","sourceRoot":"","sources":["../../src/commands/select-project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAgL1B,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAmGN"}
@@ -1,144 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import { getCredentials, writeProjectContext } from '../auth/credentials.js';
3
- import { getApiUrl, getGraphQLEndpoint, } from '../lib/config.js';
4
- import { withErrorHandler } from '../lib/errors.js';
5
- const CLI_API_KEY_NAME = 'Foir CLI';
6
- const CLI_API_KEY_SCOPES = [
7
- 'records:read',
8
- 'records:write',
9
- 'records:delete',
10
- 'records:publish',
11
- 'files:read',
12
- 'files:write',
13
- 'extensions:read',
14
- 'operations:read',
15
- 'operations:execute',
16
- ];
17
- async function gqlRequest(apiUrl, accessToken, query, variables, extraHeaders) {
18
- const response = await fetch(getGraphQLEndpoint(apiUrl), {
19
- method: 'POST',
20
- headers: {
21
- 'Content-Type': 'application/json',
22
- Authorization: `Bearer ${accessToken}`,
23
- ...extraHeaders,
24
- },
25
- body: JSON.stringify({ query, variables }),
26
- });
27
- if (!response.ok) {
28
- throw new Error(`GraphQL request failed: ${response.statusText}`);
29
- }
30
- const result = (await response.json());
31
- if (result.errors?.length) {
32
- throw new Error(`GraphQL error: ${result.errors[0].message}`);
33
- }
34
- return result.data;
35
- }
36
- async function fetchSessionContext(apiUrl, accessToken) {
37
- const data = await gqlRequest(apiUrl, accessToken, `query { sessionContext { tenantId projectId availableTenants { id name } availableProjects { id name tenantId } } }`);
38
- return data.sessionContext;
39
- }
40
- async function fetchApiKeys(apiUrl, accessToken, projectId, tenantId) {
41
- const data = await gqlRequest(apiUrl, accessToken, `query { listApiKeys(includeInactive: false, limit: 100) { items { id name isActive } } }`, undefined, { 'x-tenant-id': tenantId, 'x-project-id': projectId });
42
- return data.listApiKeys?.items ?? [];
43
- }
44
- async function createApiKey(apiUrl, accessToken, projectId, tenantId) {
45
- const data = await gqlRequest(apiUrl, accessToken, `mutation($input: CreateApiKeyInput!) { createApiKey(input: $input) { apiKey { id name isActive } plainKey } }`, {
46
- input: {
47
- name: CLI_API_KEY_NAME,
48
- projectId,
49
- keyType: 'SECRET',
50
- scopes: CLI_API_KEY_SCOPES,
51
- },
52
- }, { 'x-tenant-id': tenantId, 'x-project-id': projectId });
53
- return data.createApiKey;
54
- }
55
- async function rotateApiKey(apiUrl, accessToken, projectId, tenantId, keyId) {
56
- const data = await gqlRequest(apiUrl, accessToken, `mutation($id: ID!) { rotateApiKey(id: $id) { apiKey { id name isActive } plainKey } }`, { id: keyId }, { 'x-tenant-id': tenantId, 'x-project-id': projectId });
57
- return data.rotateApiKey;
58
- }
59
- async function provisionApiKey(apiUrl, accessToken, projectId, tenantId) {
60
- const apiKeys = await fetchApiKeys(apiUrl, accessToken, projectId, tenantId);
61
- const existing = apiKeys.find((k) => k.name === CLI_API_KEY_NAME && k.isActive);
62
- if (existing) {
63
- console.log(' Rotating existing CLI API key...');
64
- const rotated = await rotateApiKey(apiUrl, accessToken, projectId, tenantId, existing.id);
65
- return { apiKey: rotated.plainKey, apiKeyId: rotated.apiKey.id };
66
- }
67
- console.log(' Creating CLI API key...');
68
- const created = await createApiKey(apiUrl, accessToken, projectId, tenantId);
69
- return { apiKey: created.plainKey, apiKeyId: created.apiKey.id };
70
- }
71
- export function registerSelectProjectCommand(program, globalOpts) {
72
- program
73
- .command('select-project')
74
- .description('Choose which project to work with')
75
- .option('--project-id <id>', 'Project ID to select directly')
76
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
77
- const opts = globalOpts();
78
- const apiUrl = getApiUrl(opts);
79
- const credentials = await getCredentials();
80
- if (!credentials) {
81
- console.log('Not logged in. Run `foir login` first.');
82
- throw new Error('Not authenticated');
83
- }
84
- console.log('Fetching your projects...\n');
85
- const sessionContext = await fetchSessionContext(apiUrl, credentials.accessToken);
86
- const { availableTenants: tenants, availableProjects: projects } = sessionContext;
87
- if (projects.length === 0) {
88
- console.log('No projects found. Create one in the platform first.');
89
- throw new Error('No projects available');
90
- }
91
- const tenantNameMap = new Map(tenants.map((t) => [t.id, t.name]));
92
- let selectedProject;
93
- if (cmdOpts.projectId) {
94
- const found = projects.find((p) => p.id === cmdOpts.projectId);
95
- if (!found) {
96
- console.log(`Project with ID "${cmdOpts.projectId}" not found.`);
97
- console.log('Available projects:');
98
- for (const p of projects) {
99
- console.log(` - ${p.name} (${p.id})`);
100
- }
101
- throw new Error('Project not found');
102
- }
103
- selectedProject = found;
104
- }
105
- else {
106
- const byTenant = projects.reduce((acc, p) => {
107
- const key = tenantNameMap.get(p.tenantId) ?? 'Unknown';
108
- if (!acc[key])
109
- acc[key] = [];
110
- acc[key].push(p);
111
- return acc;
112
- }, {});
113
- const choices = Object.entries(byTenant).flatMap(([tenantName, tenantProjects]) => [
114
- new inquirer.Separator(`── ${tenantName} ──`),
115
- ...tenantProjects.map((p) => ({
116
- name: ` ${p.name}`,
117
- value: p.id,
118
- short: p.name,
119
- })),
120
- ]);
121
- const { projectId } = await inquirer.prompt([
122
- {
123
- type: 'list',
124
- name: 'projectId',
125
- message: 'Select a project:',
126
- choices,
127
- },
128
- ]);
129
- selectedProject = projects.find((p) => p.id === projectId);
130
- }
131
- console.log('\nProvisioning API key for CLI access...');
132
- const { apiKey, apiKeyId } = await provisionApiKey(apiUrl, credentials.accessToken, selectedProject.id, selectedProject.tenantId);
133
- await writeProjectContext({
134
- id: selectedProject.id,
135
- name: selectedProject.name,
136
- tenantId: selectedProject.tenantId,
137
- apiKey,
138
- apiKeyId,
139
- });
140
- console.log(`\n✓ Selected project: ${selectedProject.name}`);
141
- console.log('✓ API key provisioned for CLI access');
142
- console.log(' (stored in .foir/project.json for this repository)');
143
- }));
144
- }
@@ -1,4 +0,0 @@
1
- import type { Command } from 'commander';
2
- import type { GlobalOptions } from '../lib/config.js';
3
- export declare function registerSettingsCommands(program: Command, globalOpts: () => GlobalOptions): void;
4
- //# sourceMappingURL=settings.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA0BtD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAkHN"}
@@ -1,115 +0,0 @@
1
- import { withErrorHandler } from '../lib/errors.js';
2
- import { createClient } from '../lib/client.js';
3
- import { formatOutput, formatList, success } from '../lib/output.js';
4
- import { AllSettingsDocument, SettingsByCategoryDocument, GetSettingDocument, SetSettingDocument, DeleteSettingDocument, } from '../graphql/generated.js';
5
- function inferDataType(value) {
6
- if (value === 'true' || value === 'false')
7
- return { dataType: 'BOOLEAN', parsed: value === 'true' };
8
- const num = Number(value);
9
- if (!isNaN(num) && value !== '')
10
- return { dataType: 'NUMBER', parsed: num };
11
- try {
12
- const parsed = JSON.parse(value);
13
- if (typeof parsed === 'object')
14
- return { dataType: 'JSON', parsed };
15
- }
16
- catch {
17
- /* not JSON */
18
- }
19
- return { dataType: 'STRING', parsed: value };
20
- }
21
- export function registerSettingsCommands(program, globalOpts) {
22
- const settings = program.command('settings').description('Manage settings');
23
- // list
24
- settings
25
- .command('list')
26
- .description('List all settings')
27
- .option('--category <cat>', 'Filter by category')
28
- .action(withErrorHandler(globalOpts, async (cmdOpts) => {
29
- const opts = globalOpts();
30
- const client = await createClient(opts);
31
- let items;
32
- if (cmdOpts.category) {
33
- const data = await client.request(SettingsByCategoryDocument, {
34
- category: cmdOpts.category,
35
- });
36
- items = data.settingsByCategory;
37
- }
38
- else {
39
- const data = await client.request(AllSettingsDocument);
40
- items = data.allSettings;
41
- }
42
- formatList(items, opts, {
43
- columns: [
44
- { key: 'key', header: 'Key', width: 28 },
45
- {
46
- key: 'value',
47
- header: 'Value',
48
- width: 28,
49
- format: (v) => typeof v === 'object' ? JSON.stringify(v) : String(v ?? ''),
50
- },
51
- { key: 'category', header: 'Category', width: 16 },
52
- { key: 'dataType', header: 'Type', width: 10 },
53
- {
54
- key: 'isPublic',
55
- header: 'Public',
56
- width: 8,
57
- format: (v) => (v ? 'yes' : 'no'),
58
- },
59
- ],
60
- });
61
- }));
62
- // get
63
- settings
64
- .command('get <key>')
65
- .description('Get a setting by key')
66
- .action(withErrorHandler(globalOpts, async (key) => {
67
- const opts = globalOpts();
68
- const client = await createClient(opts);
69
- const data = await client.request(GetSettingDocument, { key });
70
- if (!data.setting)
71
- throw new Error(`Setting "${key}" not found.`);
72
- formatOutput(data.setting, opts);
73
- }));
74
- // set
75
- settings
76
- .command('set <key> <value>')
77
- .description('Set a setting value')
78
- .option('--category <cat>', 'Category (required for new settings)')
79
- .option('--data-type <type>', 'Data type (STRING, NUMBER, BOOLEAN, JSON)')
80
- .action(withErrorHandler(globalOpts, async (key, value, cmdOpts) => {
81
- const opts = globalOpts();
82
- const client = await createClient(opts);
83
- // Try to fetch existing to get category/dataType
84
- const existing = await client.request(GetSettingDocument, { key });
85
- const inferred = inferDataType(value);
86
- const category = cmdOpts.category ?? existing.setting?.category;
87
- if (!category)
88
- throw new Error('--category is required for new settings.');
89
- const dataType = cmdOpts.dataType ?? existing.setting?.dataType ?? inferred.dataType;
90
- const data = await client.request(SetSettingDocument, {
91
- input: {
92
- key,
93
- value: inferred.parsed,
94
- category,
95
- dataType: dataType,
96
- },
97
- });
98
- formatOutput(data.setSetting, opts);
99
- if (!(opts.json || opts.jsonl || opts.quiet))
100
- success(`Set ${key} = ${value}`);
101
- }));
102
- // reset (delete)
103
- settings
104
- .command('reset <key>')
105
- .description('Delete a setting (reset to default)')
106
- .action(withErrorHandler(globalOpts, async (key) => {
107
- const opts = globalOpts();
108
- const client = await createClient(opts);
109
- await client.request(DeleteSettingDocument, { key });
110
- if (opts.json || opts.jsonl)
111
- formatOutput({ deleted: true, key }, opts);
112
- else
113
- success(`Deleted setting ${key}`);
114
- }));
115
- }
@@ -1,4 +0,0 @@
1
- import type { Command } from 'commander';
2
- import type { GlobalOptions } from '../lib/config.js';
3
- export declare function registerVariantCatalogCommands(program: Command, globalOpts: () => GlobalOptions): void;
4
- //# sourceMappingURL=variant-catalog.d.ts.map