@eide/foir-cli 0.1.34 → 0.1.36

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 (221) hide show
  1. package/dist/cli.js +7469 -81
  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/package.json +9 -7
  12. package/dist/auth/credentials.d.ts +0 -31
  13. package/dist/auth/credentials.d.ts.map +0 -1
  14. package/dist/auth/credentials.js +0 -139
  15. package/dist/cli.d.ts +0 -3
  16. package/dist/cli.d.ts.map +0 -1
  17. package/dist/codegen/fetch-customer-profile-schema.d.ts +0 -12
  18. package/dist/codegen/fetch-customer-profile-schema.d.ts.map +0 -1
  19. package/dist/codegen/fetch-customer-profile-schema.js +0 -21
  20. package/dist/codegen/fetch-models.d.ts +0 -58
  21. package/dist/codegen/fetch-models.d.ts.map +0 -1
  22. package/dist/codegen/fetch-models.js +0 -96
  23. package/dist/codegen/field-mapping.d.ts +0 -34
  24. package/dist/codegen/field-mapping.d.ts.map +0 -1
  25. package/dist/codegen/field-mapping.js +0 -250
  26. package/dist/codegen/generators/config.d.ts +0 -5
  27. package/dist/codegen/generators/config.d.ts.map +0 -1
  28. package/dist/codegen/generators/config.js +0 -82
  29. package/dist/codegen/generators/customer-profile-documents.d.ts +0 -5
  30. package/dist/codegen/generators/customer-profile-documents.d.ts.map +0 -1
  31. package/dist/codegen/generators/customer-profile-documents.js +0 -42
  32. package/dist/codegen/generators/customer-profile-hooks.d.ts +0 -5
  33. package/dist/codegen/generators/customer-profile-hooks.d.ts.map +0 -1
  34. package/dist/codegen/generators/customer-profile-hooks.js +0 -78
  35. package/dist/codegen/generators/customer-profile-loaders.d.ts +0 -5
  36. package/dist/codegen/generators/customer-profile-loaders.d.ts.map +0 -1
  37. package/dist/codegen/generators/customer-profile-loaders.js +0 -67
  38. package/dist/codegen/generators/customer-profile-operations.d.ts +0 -5
  39. package/dist/codegen/generators/customer-profile-operations.d.ts.map +0 -1
  40. package/dist/codegen/generators/customer-profile-operations.js +0 -126
  41. package/dist/codegen/generators/customer-profile-types.d.ts +0 -6
  42. package/dist/codegen/generators/customer-profile-types.d.ts.map +0 -1
  43. package/dist/codegen/generators/customer-profile-types.js +0 -45
  44. package/dist/codegen/generators/documents.d.ts +0 -12
  45. package/dist/codegen/generators/documents.d.ts.map +0 -1
  46. package/dist/codegen/generators/documents.js +0 -178
  47. package/dist/codegen/generators/field-types.d.ts +0 -5
  48. package/dist/codegen/generators/field-types.d.ts.map +0 -1
  49. package/dist/codegen/generators/field-types.js +0 -346
  50. package/dist/codegen/generators/model-index.d.ts +0 -6
  51. package/dist/codegen/generators/model-index.d.ts.map +0 -1
  52. package/dist/codegen/generators/model-index.js +0 -26
  53. package/dist/codegen/generators/model-types.d.ts +0 -12
  54. package/dist/codegen/generators/model-types.d.ts.map +0 -1
  55. package/dist/codegen/generators/model-types.js +0 -176
  56. package/dist/codegen/generators/public-schema-content.d.ts +0 -14
  57. package/dist/codegen/generators/public-schema-content.d.ts.map +0 -1
  58. package/dist/codegen/generators/public-schema-content.js +0 -22
  59. package/dist/codegen/generators/react-hooks-index.d.ts +0 -6
  60. package/dist/codegen/generators/react-hooks-index.d.ts.map +0 -1
  61. package/dist/codegen/generators/react-hooks-index.js +0 -20
  62. package/dist/codegen/generators/react-hooks.d.ts +0 -7
  63. package/dist/codegen/generators/react-hooks.d.ts.map +0 -1
  64. package/dist/codegen/generators/react-hooks.js +0 -139
  65. package/dist/codegen/generators/remix-loaders-index.d.ts +0 -6
  66. package/dist/codegen/generators/remix-loaders-index.d.ts.map +0 -1
  67. package/dist/codegen/generators/remix-loaders-index.js +0 -20
  68. package/dist/codegen/generators/remix-loaders.d.ts +0 -7
  69. package/dist/codegen/generators/remix-loaders.d.ts.map +0 -1
  70. package/dist/codegen/generators/remix-loaders.js +0 -107
  71. package/dist/codegen/generators/static-documents.d.ts +0 -14
  72. package/dist/codegen/generators/static-documents.d.ts.map +0 -1
  73. package/dist/codegen/generators/static-documents.js +0 -771
  74. package/dist/codegen/generators/swift-customer-profile.d.ts +0 -9
  75. package/dist/codegen/generators/swift-customer-profile.d.ts.map +0 -1
  76. package/dist/codegen/generators/swift-customer-profile.js +0 -152
  77. package/dist/codegen/generators/swift-field-types.d.ts +0 -5
  78. package/dist/codegen/generators/swift-field-types.d.ts.map +0 -1
  79. package/dist/codegen/generators/swift-field-types.js +0 -151
  80. package/dist/codegen/generators/swift-model-keys.d.ts +0 -6
  81. package/dist/codegen/generators/swift-model-keys.d.ts.map +0 -1
  82. package/dist/codegen/generators/swift-model-keys.js +0 -25
  83. package/dist/codegen/generators/swift-types.d.ts +0 -13
  84. package/dist/codegen/generators/swift-types.d.ts.map +0 -1
  85. package/dist/codegen/generators/swift-types.js +0 -188
  86. package/dist/codegen/generators/typed-operations-common.d.ts +0 -6
  87. package/dist/codegen/generators/typed-operations-common.d.ts.map +0 -1
  88. package/dist/codegen/generators/typed-operations-common.js +0 -84
  89. package/dist/codegen/generators/typed-operations-index.d.ts +0 -6
  90. package/dist/codegen/generators/typed-operations-index.d.ts.map +0 -1
  91. package/dist/codegen/generators/typed-operations-index.js +0 -22
  92. package/dist/codegen/generators/typed-operations.d.ts +0 -11
  93. package/dist/codegen/generators/typed-operations.d.ts.map +0 -1
  94. package/dist/codegen/generators/typed-operations.js +0 -263
  95. package/dist/codegen/swift-field-mapping.d.ts +0 -30
  96. package/dist/codegen/swift-field-mapping.d.ts.map +0 -1
  97. package/dist/codegen/swift-field-mapping.js +0 -150
  98. package/dist/codegen/write-files.d.ts +0 -15
  99. package/dist/codegen/write-files.d.ts.map +0 -1
  100. package/dist/codegen/write-files.js +0 -36
  101. package/dist/commands/api-keys.d.ts +0 -4
  102. package/dist/commands/api-keys.d.ts.map +0 -1
  103. package/dist/commands/api-keys.js +0 -129
  104. package/dist/commands/auth-config.d.ts +0 -4
  105. package/dist/commands/auth-config.d.ts.map +0 -1
  106. package/dist/commands/auth-config.js +0 -38
  107. package/dist/commands/auth-providers.d.ts +0 -4
  108. package/dist/commands/auth-providers.d.ts.map +0 -1
  109. package/dist/commands/auth-providers.js +0 -207
  110. package/dist/commands/context.d.ts +0 -4
  111. package/dist/commands/context.d.ts.map +0 -1
  112. package/dist/commands/context.js +0 -91
  113. package/dist/commands/create-extension.d.ts +0 -4
  114. package/dist/commands/create-extension.d.ts.map +0 -1
  115. package/dist/commands/create-extension.js +0 -60
  116. package/dist/commands/customer-profiles.d.ts +0 -4
  117. package/dist/commands/customer-profiles.d.ts.map +0 -1
  118. package/dist/commands/customer-profiles.js +0 -99
  119. package/dist/commands/customers.d.ts +0 -4
  120. package/dist/commands/customers.d.ts.map +0 -1
  121. package/dist/commands/customers.js +0 -126
  122. package/dist/commands/embeddings.d.ts +0 -4
  123. package/dist/commands/embeddings.d.ts.map +0 -1
  124. package/dist/commands/embeddings.js +0 -145
  125. package/dist/commands/experiments.d.ts +0 -4
  126. package/dist/commands/experiments.d.ts.map +0 -1
  127. package/dist/commands/experiments.js +0 -196
  128. package/dist/commands/extensions.d.ts +0 -4
  129. package/dist/commands/extensions.d.ts.map +0 -1
  130. package/dist/commands/extensions.js +0 -210
  131. package/dist/commands/files.d.ts +0 -4
  132. package/dist/commands/files.d.ts.map +0 -1
  133. package/dist/commands/files.js +0 -143
  134. package/dist/commands/hooks.d.ts +0 -4
  135. package/dist/commands/hooks.d.ts.map +0 -1
  136. package/dist/commands/hooks.js +0 -228
  137. package/dist/commands/locales.d.ts +0 -4
  138. package/dist/commands/locales.d.ts.map +0 -1
  139. package/dist/commands/locales.js +0 -140
  140. package/dist/commands/login.d.ts +0 -4
  141. package/dist/commands/login.d.ts.map +0 -1
  142. package/dist/commands/login.js +0 -124
  143. package/dist/commands/logout.d.ts +0 -4
  144. package/dist/commands/logout.d.ts.map +0 -1
  145. package/dist/commands/logout.js +0 -16
  146. package/dist/commands/media.d.ts +0 -4
  147. package/dist/commands/media.d.ts.map +0 -1
  148. package/dist/commands/media.js +0 -44
  149. package/dist/commands/models.d.ts +0 -4
  150. package/dist/commands/models.d.ts.map +0 -1
  151. package/dist/commands/models.js +0 -153
  152. package/dist/commands/notes.d.ts +0 -4
  153. package/dist/commands/notes.d.ts.map +0 -1
  154. package/dist/commands/notes.js +0 -132
  155. package/dist/commands/notifications.d.ts +0 -4
  156. package/dist/commands/notifications.d.ts.map +0 -1
  157. package/dist/commands/notifications.js +0 -73
  158. package/dist/commands/operations.d.ts +0 -4
  159. package/dist/commands/operations.d.ts.map +0 -1
  160. package/dist/commands/operations.js +0 -341
  161. package/dist/commands/pull.d.ts +0 -4
  162. package/dist/commands/pull.d.ts.map +0 -1
  163. package/dist/commands/pull.js +0 -300
  164. package/dist/commands/records.d.ts +0 -4
  165. package/dist/commands/records.d.ts.map +0 -1
  166. package/dist/commands/records.js +0 -314
  167. package/dist/commands/schedules.d.ts +0 -4
  168. package/dist/commands/schedules.d.ts.map +0 -1
  169. package/dist/commands/schedules.js +0 -155
  170. package/dist/commands/search.d.ts +0 -4
  171. package/dist/commands/search.d.ts.map +0 -1
  172. package/dist/commands/search.js +0 -60
  173. package/dist/commands/segments.d.ts +0 -4
  174. package/dist/commands/segments.d.ts.map +0 -1
  175. package/dist/commands/segments.js +0 -155
  176. package/dist/commands/select-project.d.ts +0 -4
  177. package/dist/commands/select-project.d.ts.map +0 -1
  178. package/dist/commands/select-project.js +0 -144
  179. package/dist/commands/settings.d.ts +0 -4
  180. package/dist/commands/settings.d.ts.map +0 -1
  181. package/dist/commands/settings.js +0 -115
  182. package/dist/commands/variant-catalog.d.ts +0 -4
  183. package/dist/commands/variant-catalog.d.ts.map +0 -1
  184. package/dist/commands/variant-catalog.js +0 -118
  185. package/dist/commands/whoami.d.ts +0 -4
  186. package/dist/commands/whoami.d.ts.map +0 -1
  187. package/dist/commands/whoami.js +0 -51
  188. package/dist/config/pull-config.d.ts +0 -33
  189. package/dist/config/pull-config.d.ts.map +0 -1
  190. package/dist/config/pull-config.js +0 -119
  191. package/dist/config/types.d.ts.map +0 -1
  192. package/dist/graphql/generated.d.ts +0 -8330
  193. package/dist/graphql/generated.d.ts.map +0 -1
  194. package/dist/graphql/generated.js +0 -135
  195. package/dist/lib/client.d.ts +0 -18
  196. package/dist/lib/client.d.ts.map +0 -1
  197. package/dist/lib/client.js +0 -64
  198. package/dist/lib/config-loader.d.ts +0 -28
  199. package/dist/lib/config-loader.d.ts.map +0 -1
  200. package/dist/lib/config-loader.js +0 -49
  201. package/dist/lib/config.d.ts +0 -12
  202. package/dist/lib/config.d.ts.map +0 -1
  203. package/dist/lib/config.js +0 -8
  204. package/dist/lib/errors.d.ts +0 -6
  205. package/dist/lib/errors.d.ts.map +0 -1
  206. package/dist/lib/errors.js +0 -76
  207. package/dist/lib/extension-helpers.d.ts.map +0 -1
  208. package/dist/lib/hook-helpers.d.ts.map +0 -1
  209. package/dist/lib/input.d.ts +0 -38
  210. package/dist/lib/input.d.ts.map +0 -1
  211. package/dist/lib/input.js +0 -108
  212. package/dist/lib/output.d.ts +0 -31
  213. package/dist/lib/output.d.ts.map +0 -1
  214. package/dist/lib/output.js +0 -107
  215. package/dist/lib/seed-helpers.d.ts.map +0 -1
  216. package/dist/scaffold/package-manager.d.ts +0 -12
  217. package/dist/scaffold/package-manager.d.ts.map +0 -1
  218. package/dist/scaffold/package-manager.js +0 -51
  219. package/dist/scaffold/scaffold.d.ts +0 -4
  220. package/dist/scaffold/scaffold.d.ts.map +0 -1
  221. package/dist/scaffold/scaffold.js +0 -462
@@ -1,18 +0,0 @@
1
- import { GraphQLClient } from 'graphql-request';
2
- import { type GlobalOptions } from './config.js';
3
- /**
4
- * Create an authenticated GraphQL client.
5
- * Auth priority:
6
- * 1. FOIR_API_KEY env var (CI / headless / LLM mode)
7
- * 2. Stored credentials from ~/.foir/credentials.json (interactive)
8
- * Project context is read from .foir/project.json in the current repo.
9
- */
10
- export declare function createClient(options?: GlobalOptions): Promise<GraphQLClient>;
11
- /**
12
- * Get the API URL + auth headers for REST calls (e.g., file upload).
13
- */
14
- export declare function getRestAuth(options?: GlobalOptions): Promise<{
15
- apiUrl: string;
16
- headers: Record<string, string>;
17
- }>;
18
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMhD,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CAkCxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CA4B9D"}
@@ -1,64 +0,0 @@
1
- import { GraphQLClient } from 'graphql-request';
2
- import { getCredentials, getProjectContext, isTokenExpired, } from '../auth/credentials.js';
3
- import { getApiUrl, getGraphQLEndpoint } from './config.js';
4
- /**
5
- * Create an authenticated GraphQL client.
6
- * Auth priority:
7
- * 1. FOIR_API_KEY env var (CI / headless / LLM mode)
8
- * 2. Stored credentials from ~/.foir/credentials.json (interactive)
9
- * Project context is read from .foir/project.json in the current repo.
10
- */
11
- export async function createClient(options) {
12
- const apiUrl = getApiUrl(options);
13
- const endpoint = getGraphQLEndpoint(apiUrl);
14
- const headers = {
15
- 'Content-Type': 'application/json',
16
- };
17
- // Path 1: API key from environment
18
- const envApiKey = process.env.FOIR_API_KEY;
19
- if (envApiKey) {
20
- headers['x-api-key'] = envApiKey;
21
- return new GraphQLClient(endpoint, { headers });
22
- }
23
- // Path 2: Stored credentials
24
- const credentials = await getCredentials();
25
- if (!credentials) {
26
- throw new Error('Not authenticated. Run `foir login` or set FOIR_API_KEY.');
27
- }
28
- if (isTokenExpired(credentials)) {
29
- throw new Error('Session expired. Run `foir login` to re-authenticate.');
30
- }
31
- headers['Authorization'] = `Bearer ${credentials.accessToken}`;
32
- const project = await getProjectContext();
33
- if (project) {
34
- headers['x-tenant-id'] = project.tenantId;
35
- headers['x-project-id'] = project.id;
36
- }
37
- return new GraphQLClient(endpoint, { headers });
38
- }
39
- /**
40
- * Get the API URL + auth headers for REST calls (e.g., file upload).
41
- */
42
- export async function getRestAuth(options) {
43
- const apiUrl = getApiUrl(options);
44
- const headers = {};
45
- const envApiKey = process.env.FOIR_API_KEY;
46
- if (envApiKey) {
47
- headers['x-api-key'] = envApiKey;
48
- return { apiUrl, headers };
49
- }
50
- const credentials = await getCredentials();
51
- if (!credentials) {
52
- throw new Error('Not authenticated. Run `foir login` or set FOIR_API_KEY.');
53
- }
54
- if (isTokenExpired(credentials)) {
55
- throw new Error('Session expired. Run `foir login` to re-authenticate.');
56
- }
57
- headers['Authorization'] = `Bearer ${credentials.accessToken}`;
58
- const project = await getProjectContext();
59
- if (project) {
60
- headers['x-tenant-id'] = project.tenantId;
61
- headers['x-project-id'] = project.id;
62
- }
63
- return { apiUrl, headers };
64
- }
@@ -1,28 +0,0 @@
1
- /**
2
- * Configuration file loader.
3
- *
4
- * Supports loading TypeScript (.ts), JavaScript (.js, .mjs), and JSON (.json) config files.
5
- * Uses dynamic imports for TypeScript/JavaScript and JSON.parse for JSON files.
6
- */
7
- /**
8
- * Load a configuration file from disk.
9
- *
10
- * Supports:
11
- * - TypeScript (.ts) - via dynamic import
12
- * - JavaScript (.js, .mjs) - via dynamic import
13
- * - JSON (.json) - via JSON.parse
14
- *
15
- * @param filePath - Path to the config file
16
- * @returns The default export from the config file
17
- *
18
- * @example
19
- * ```typescript
20
- * // Load TypeScript config
21
- * const config = await loadConfig('./install.config.ts');
22
- *
23
- * // Load JSON config (backward compatible)
24
- * const config = await loadConfig('./install.json');
25
- * ```
26
- */
27
- export declare function loadConfig<T = unknown>(filePath: string): Promise<T>;
28
- //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/lib/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAyB1E"}
@@ -1,49 +0,0 @@
1
- /**
2
- * Configuration file loader.
3
- *
4
- * Supports loading TypeScript (.ts), JavaScript (.js, .mjs), and JSON (.json) config files.
5
- * Uses dynamic imports for TypeScript/JavaScript and JSON.parse for JSON files.
6
- */
7
- import { readFile } from 'fs/promises';
8
- import { pathToFileURL } from 'url';
9
- import { resolve } from 'path';
10
- /**
11
- * Load a configuration file from disk.
12
- *
13
- * Supports:
14
- * - TypeScript (.ts) - via dynamic import
15
- * - JavaScript (.js, .mjs) - via dynamic import
16
- * - JSON (.json) - via JSON.parse
17
- *
18
- * @param filePath - Path to the config file
19
- * @returns The default export from the config file
20
- *
21
- * @example
22
- * ```typescript
23
- * // Load TypeScript config
24
- * const config = await loadConfig('./install.config.ts');
25
- *
26
- * // Load JSON config (backward compatible)
27
- * const config = await loadConfig('./install.json');
28
- * ```
29
- */
30
- export async function loadConfig(filePath) {
31
- const absPath = resolve(filePath);
32
- // TypeScript files (requires tsx or ts-node in user's environment)
33
- if (filePath.endsWith('.ts')) {
34
- const configModule = await import(pathToFileURL(absPath).href);
35
- return configModule.default;
36
- }
37
- // JavaScript files
38
- if (filePath.endsWith('.js') || filePath.endsWith('.mjs')) {
39
- const configModule = await import(pathToFileURL(absPath).href);
40
- return configModule.default;
41
- }
42
- // JSON files (backward compatible)
43
- if (filePath.endsWith('.json')) {
44
- const content = await readFile(absPath, 'utf-8');
45
- return JSON.parse(content);
46
- }
47
- throw new Error(`Unsupported file extension for "${filePath}". ` +
48
- `Supported: .ts, .js, .mjs, .json`);
49
- }
@@ -1,12 +0,0 @@
1
- export interface GlobalOptions {
2
- apiUrl?: string;
3
- json?: boolean;
4
- jsonl?: boolean;
5
- quiet?: boolean;
6
- confirm?: boolean;
7
- }
8
- export declare function getApiUrl(options?: {
9
- apiUrl?: string;
10
- }): string;
11
- export declare function getGraphQLEndpoint(apiUrl: string): string;
12
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGzD"}
@@ -1,8 +0,0 @@
1
- const DEFAULT_API_URL = 'https://api.foir.dev';
2
- export function getApiUrl(options) {
3
- return process.env.FOIR_API_URL ?? options?.apiUrl ?? DEFAULT_API_URL;
4
- }
5
- export function getGraphQLEndpoint(apiUrl) {
6
- const base = apiUrl.replace(/\/$/, '').replace(/\/graphql$/, '');
7
- return `${base}/graphql`;
8
- }
@@ -1,6 +0,0 @@
1
- import type { GlobalOptions } from './config.js';
2
- /**
3
- * Wrap an async command action with standardized error handling.
4
- */
5
- export declare function withErrorHandler<T extends unknown[]>(optsFn: () => GlobalOptions | undefined, fn: (...args: T) => Promise<void>): (...args: T) => Promise<void>;
6
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkBjD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,EAClD,MAAM,EAAE,MAAM,aAAa,GAAG,SAAS,EACvC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAChC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAoF/B"}
@@ -1,76 +0,0 @@
1
- import chalk from 'chalk';
2
- /**
3
- * Wrap an async command action with standardized error handling.
4
- */
5
- export function withErrorHandler(optsFn, fn) {
6
- return async (...args) => {
7
- try {
8
- await fn(...args);
9
- }
10
- catch (error) {
11
- const opts = optsFn();
12
- const gqlErr = error;
13
- // Extract GraphQL error details
14
- const gqlErrors = gqlErr?.response?.errors;
15
- if (gqlErrors && gqlErrors.length > 0) {
16
- const first = gqlErrors[0];
17
- const code = first.extensions?.code;
18
- const validationErrors = first.extensions?.validationErrors;
19
- if (opts?.json || opts?.jsonl) {
20
- console.error(JSON.stringify({
21
- error: {
22
- message: first.message,
23
- code: code ?? 'GRAPHQL_ERROR',
24
- ...(validationErrors ? { validationErrors } : {}),
25
- },
26
- }));
27
- }
28
- else {
29
- console.error(chalk.red('Error:'), first.message);
30
- if (validationErrors && Object.keys(validationErrors).length > 0) {
31
- console.error('');
32
- console.error(chalk.yellow('Field errors:'));
33
- for (const [field, messages] of Object.entries(validationErrors)) {
34
- for (const msg of messages) {
35
- console.error(chalk.gray(` • ${field}:`), msg);
36
- }
37
- }
38
- }
39
- if (code === 'UNAUTHENTICATED') {
40
- console.error(chalk.gray('Hint: Run `foir login` to authenticate.'));
41
- }
42
- else if (code === 'FORBIDDEN') {
43
- console.error(chalk.gray('Hint: You may not have permission. Check your API key scopes.'));
44
- }
45
- }
46
- // eslint-disable-next-line no-process-exit -- CLI error handler needs to exit process
47
- process.exit(1);
48
- }
49
- // HTTP-level errors
50
- const status = gqlErr?.response?.status;
51
- if (status === 401 || status === 403) {
52
- if (opts?.json || opts?.jsonl) {
53
- console.error(JSON.stringify({
54
- error: { message: 'Authentication failed', code: 'AUTH_ERROR' },
55
- }));
56
- }
57
- else {
58
- console.error(chalk.red('Error:'), 'Authentication failed.');
59
- console.error(chalk.gray('Hint: Run `foir login` or set FOIR_API_KEY.'));
60
- }
61
- // eslint-disable-next-line no-process-exit -- CLI error handler needs to exit process
62
- process.exit(1);
63
- }
64
- // Generic errors
65
- const message = error instanceof Error ? error.message : String(error);
66
- if (opts?.json || opts?.jsonl) {
67
- console.error(JSON.stringify({ error: { message } }));
68
- }
69
- else {
70
- console.error(chalk.red('Error:'), message);
71
- }
72
- // eslint-disable-next-line no-process-exit -- CLI error handler needs to exit process
73
- process.exit(1);
74
- }
75
- };
76
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/extension-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,qBAAqB,GAC5B,qBAAqB,CAEvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,0BAA0B,GAChC,0BAA0B,CAE5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAE7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,8BAA8B,GACxC,8BAA8B,CAEhC;AAGD,YAAY,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,8BAA8B,EAC9B,iCAAiC,EACjC,8BAA8B,EAC9B,0CAA0C,GAC3C,MAAM,yBAAyB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/hook-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,CAEjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAEvE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAEzE;AAGD,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,SAAS,GACV,MAAM,yBAAyB,CAAC"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Parse input data from --data, --file, or stdin.
3
- *
4
- * Supports TypeScript (.ts), JavaScript (.js, .mjs), and JSON (.json) files.
5
- */
6
- export declare function parseInputData(opts: {
7
- data?: string;
8
- file?: string;
9
- }): Promise<Record<string, unknown>>;
10
- /**
11
- * Detect whether a string is a UUID or CUID (→ ID lookup) vs a natural key.
12
- */
13
- export declare function isUUID(value: string): boolean;
14
- interface ParsedFilter {
15
- field: string;
16
- operator: string;
17
- value: unknown;
18
- }
19
- /**
20
- * Parse filter string: "status=active,name~%hello%"
21
- */
22
- export declare function parseFilters(filterStr: string): ParsedFilter[];
23
- interface ParsedSort {
24
- field: string;
25
- direction: string;
26
- }
27
- /**
28
- * Parse sort string: "createdAt:desc"
29
- */
30
- export declare function parseSort(sortStr: string): ParsedSort | undefined;
31
- /**
32
- * Prompt for confirmation unless --confirm flag is set.
33
- */
34
- export declare function confirmAction(message: string, opts?: {
35
- confirm?: boolean;
36
- }): Promise<boolean>;
37
- export {};
38
- //# sourceMappingURL=input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBnC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM7C;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CA8B9D;AAWD,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAQjE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,OAAO,CAAC,CAalB"}
package/dist/lib/input.js DELETED
@@ -1,108 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import { loadConfig } from './config-loader.js';
3
- /**
4
- * Parse input data from --data, --file, or stdin.
5
- *
6
- * Supports TypeScript (.ts), JavaScript (.js, .mjs), and JSON (.json) files.
7
- */
8
- export async function parseInputData(opts) {
9
- if (opts.data) {
10
- return JSON.parse(opts.data);
11
- }
12
- if (opts.file) {
13
- // Use config loader for TypeScript/JavaScript/JSON files
14
- return await loadConfig(opts.file);
15
- }
16
- // Check for stdin pipe
17
- if (!process.stdin.isTTY) {
18
- const chunks = [];
19
- for await (const chunk of process.stdin) {
20
- chunks.push(chunk);
21
- }
22
- const stdinContent = Buffer.concat(chunks).toString('utf-8').trim();
23
- if (stdinContent) {
24
- return JSON.parse(stdinContent);
25
- }
26
- }
27
- throw new Error('No input data provided. Use --data, --file, or pipe via stdin.');
28
- }
29
- /**
30
- * Detect whether a string is a UUID or CUID (→ ID lookup) vs a natural key.
31
- */
32
- export function isUUID(value) {
33
- return (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value) || /^c[a-z0-9]{24,}$/.test(value));
34
- }
35
- /**
36
- * Parse filter string: "status=active,name~%hello%"
37
- */
38
- export function parseFilters(filterStr) {
39
- if (!filterStr)
40
- return [];
41
- return filterStr.split(',').map((part) => {
42
- const trimmed = part.trim();
43
- // Order matters: check multi-char operators first
44
- for (const [op, gqlOp] of [
45
- ['!=', 'NE'],
46
- ['>=', 'GTE'],
47
- ['<=', 'LTE'],
48
- ['>', 'GT'],
49
- ['<', 'LT'],
50
- ['~', 'LIKE'],
51
- ['=', 'EQ'],
52
- ]) {
53
- const idx = trimmed.indexOf(op);
54
- if (idx > 0) {
55
- const field = trimmed.slice(0, idx);
56
- const rawValue = trimmed.slice(idx + op.length);
57
- return {
58
- field,
59
- operator: gqlOp,
60
- value: parseFilterValue(rawValue),
61
- };
62
- }
63
- }
64
- throw new Error(`Invalid filter expression: "${trimmed}"`);
65
- });
66
- }
67
- function parseFilterValue(raw) {
68
- if (raw === 'true')
69
- return true;
70
- if (raw === 'false')
71
- return false;
72
- if (raw === 'null')
73
- return null;
74
- const num = Number(raw);
75
- if (!isNaN(num) && raw !== '')
76
- return num;
77
- return raw;
78
- }
79
- /**
80
- * Parse sort string: "createdAt:desc"
81
- */
82
- export function parseSort(sortStr) {
83
- if (!sortStr)
84
- return undefined;
85
- const [field, dir] = sortStr.split(':');
86
- if (!field)
87
- return undefined;
88
- return {
89
- field,
90
- direction: (dir ?? 'asc').toUpperCase(),
91
- };
92
- }
93
- /**
94
- * Prompt for confirmation unless --confirm flag is set.
95
- */
96
- export async function confirmAction(message, opts) {
97
- if (opts?.confirm)
98
- return true;
99
- const { confirmed } = await inquirer.prompt([
100
- {
101
- type: 'confirm',
102
- name: 'confirmed',
103
- message,
104
- default: false,
105
- },
106
- ]);
107
- return confirmed;
108
- }
@@ -1,31 +0,0 @@
1
- import type { GlobalOptions } from './config.js';
2
- export interface ColumnDef {
3
- key: string;
4
- header: string;
5
- width?: number;
6
- format?: (value: unknown) => string;
7
- }
8
- /**
9
- * Format a single object for output.
10
- */
11
- export declare function formatOutput(data: unknown, options?: GlobalOptions): void;
12
- /**
13
- * Format a list of items as a table or structured output.
14
- */
15
- export declare function formatList(items: Record<string, unknown>[], options: GlobalOptions | undefined, config: {
16
- columns: ColumnDef[];
17
- total?: number;
18
- }): void;
19
- /**
20
- * Format a relative time string ("2h ago", "3d ago", etc.)
21
- */
22
- export declare function timeAgo(dateStr: string | null | undefined): string;
23
- /**
24
- * Print a success message.
25
- */
26
- export declare function success(message: string): void;
27
- /**
28
- * Print a warning message.
29
- */
30
- export declare function warn(message: string): void;
31
- //# sourceMappingURL=output.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAYzE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,MAAM,EAAE;IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,IAAI,CAkDN;AASD;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAmBlE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C"}
@@ -1,107 +0,0 @@
1
- import chalk from 'chalk';
2
- /**
3
- * Format a single object for output.
4
- */
5
- export function formatOutput(data, options) {
6
- if (options?.quiet)
7
- return;
8
- if (options?.json) {
9
- console.log(JSON.stringify(data, null, 2));
10
- return;
11
- }
12
- if (options?.jsonl) {
13
- console.log(JSON.stringify(data));
14
- return;
15
- }
16
- // Human-readable: pretty-print the object
17
- console.log(JSON.stringify(data, null, 2));
18
- }
19
- /**
20
- * Format a list of items as a table or structured output.
21
- */
22
- export function formatList(items, options, config) {
23
- if (options?.quiet) {
24
- for (const item of items) {
25
- console.log(item['id'] ?? '');
26
- }
27
- return;
28
- }
29
- if (options?.json) {
30
- console.log(JSON.stringify(items, null, 2));
31
- return;
32
- }
33
- if (options?.jsonl) {
34
- for (const item of items) {
35
- console.log(JSON.stringify(item));
36
- }
37
- return;
38
- }
39
- // Human-readable table
40
- if (items.length === 0) {
41
- console.log(chalk.gray('No results.'));
42
- return;
43
- }
44
- const { columns } = config;
45
- // Print header
46
- const headerLine = columns
47
- .map((col) => chalk.bold(pad(col.header, col.width ?? 20)))
48
- .join(' ');
49
- console.log(headerLine);
50
- console.log(columns.map((col) => '─'.repeat(col.width ?? 20)).join('──'));
51
- // Print rows
52
- for (const item of items) {
53
- const row = columns
54
- .map((col) => {
55
- const raw = item[col.key];
56
- const formatted = col.format ? col.format(raw) : String(raw ?? '');
57
- return pad(formatted, col.width ?? 20);
58
- })
59
- .join(' ');
60
- console.log(row);
61
- }
62
- if (config.total !== undefined) {
63
- console.log(chalk.gray(`\n${items.length} of ${config.total} shown`));
64
- }
65
- }
66
- function pad(str, width) {
67
- if (str.length > width) {
68
- return str.slice(0, width - 1) + '…';
69
- }
70
- return str.padEnd(width);
71
- }
72
- /**
73
- * Format a relative time string ("2h ago", "3d ago", etc.)
74
- */
75
- export function timeAgo(dateStr) {
76
- if (!dateStr)
77
- return '—';
78
- const date = new Date(dateStr);
79
- const now = Date.now();
80
- const diffMs = now - date.getTime();
81
- if (diffMs < 0)
82
- return 'future';
83
- const minutes = Math.floor(diffMs / 60000);
84
- if (minutes < 1)
85
- return 'just now';
86
- if (minutes < 60)
87
- return `${minutes}m ago`;
88
- const hours = Math.floor(minutes / 60);
89
- if (hours < 24)
90
- return `${hours}h ago`;
91
- const days = Math.floor(hours / 24);
92
- if (days < 30)
93
- return `${days}d ago`;
94
- return date.toLocaleDateString();
95
- }
96
- /**
97
- * Print a success message.
98
- */
99
- export function success(message) {
100
- console.log(chalk.green(`✓ ${message}`));
101
- }
102
- /**
103
- * Print a warning message.
104
- */
105
- export function warn(message) {
106
- console.log(chalk.yellow(`⚠ ${message}`));
107
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/seed-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAErE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAE3E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAEzE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,EAAE,GAC3B,iBAAiB,EAAE,CAErB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAE7E;AAGD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC"}
@@ -1,12 +0,0 @@
1
- export type PackageManager = 'pnpm' | 'yarn' | 'npm';
2
- export interface PackageManagerInfo {
3
- name: PackageManager;
4
- installCommand: string;
5
- execCommand: string;
6
- }
7
- /**
8
- * Detects the package manager by checking for lock files in the
9
- * current working directory and parent directories.
10
- */
11
- export declare function detectPackageManager(): PackageManagerInfo;
12
- //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/scaffold/package-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,CA0BzD"}
@@ -1,51 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- /**
4
- * Detects the package manager by checking for lock files in the
5
- * current working directory and parent directories.
6
- */
7
- export function detectPackageManager() {
8
- const lockFiles = [
9
- { file: 'pnpm-lock.yaml', manager: 'pnpm' },
10
- { file: 'yarn.lock', manager: 'yarn' },
11
- { file: 'package-lock.json', manager: 'npm' },
12
- ];
13
- let dir = process.cwd();
14
- // Walk up the directory tree looking for lock files
15
- while (true) {
16
- for (const { file, manager } of lockFiles) {
17
- if (fs.existsSync(path.join(dir, file))) {
18
- return getManagerInfo(manager);
19
- }
20
- }
21
- const parentDir = path.dirname(dir);
22
- if (parentDir === dir) {
23
- break;
24
- }
25
- dir = parentDir;
26
- }
27
- // Default to npm if no lock file found
28
- return getManagerInfo('npm');
29
- }
30
- function getManagerInfo(manager) {
31
- switch (manager) {
32
- case 'pnpm':
33
- return {
34
- name: 'pnpm',
35
- installCommand: 'pnpm install',
36
- execCommand: 'pnpm dlx',
37
- };
38
- case 'yarn':
39
- return {
40
- name: 'yarn',
41
- installCommand: 'yarn install',
42
- execCommand: 'yarn dlx',
43
- };
44
- case 'npm':
45
- return {
46
- name: 'npm',
47
- installCommand: 'npm install',
48
- execCommand: 'npx',
49
- };
50
- }
51
- }
@@ -1,4 +0,0 @@
1
- type ExtensionType = 'custom-editor' | 'workflow' | 'widget';
2
- export declare function scaffold(projectName: string, extensionType: ExtensionType, apiUrl: string): Promise<void>;
3
- export {};
4
- //# sourceMappingURL=scaffold.d.ts.map