boohee-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +207 -0
  2. package/bin/run.js +75 -0
  3. package/dist/base.d.ts +21 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +77 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/commands/auth/status.d.ts +7 -0
  8. package/dist/commands/auth/status.d.ts.map +1 -0
  9. package/dist/commands/auth/status.js +28 -0
  10. package/dist/commands/auth/status.js.map +1 -0
  11. package/dist/commands/batch.d.ts +15 -0
  12. package/dist/commands/batch.d.ts.map +1 -0
  13. package/dist/commands/batch.js +63 -0
  14. package/dist/commands/batch.js.map +1 -0
  15. package/dist/commands/categories.d.ts +7 -0
  16. package/dist/commands/categories.d.ts.map +1 -0
  17. package/dist/commands/categories.js +14 -0
  18. package/dist/commands/categories.js.map +1 -0
  19. package/dist/commands/config/get.d.ts +10 -0
  20. package/dist/commands/config/get.d.ts.map +1 -0
  21. package/dist/commands/config/get.js +29 -0
  22. package/dist/commands/config/get.js.map +1 -0
  23. package/dist/commands/config/init.d.ts +12 -0
  24. package/dist/commands/config/init.d.ts.map +1 -0
  25. package/dist/commands/config/init.js +38 -0
  26. package/dist/commands/config/init.js.map +1 -0
  27. package/dist/commands/config/list.d.ts +7 -0
  28. package/dist/commands/config/list.d.ts.map +1 -0
  29. package/dist/commands/config/list.js +19 -0
  30. package/dist/commands/config/list.js.map +1 -0
  31. package/dist/commands/config/reset.d.ts +7 -0
  32. package/dist/commands/config/reset.d.ts.map +1 -0
  33. package/dist/commands/config/reset.js +20 -0
  34. package/dist/commands/config/reset.js.map +1 -0
  35. package/dist/commands/config/set.d.ts +11 -0
  36. package/dist/commands/config/set.d.ts.map +1 -0
  37. package/dist/commands/config/set.js +43 -0
  38. package/dist/commands/config/set.js.map +1 -0
  39. package/dist/commands/detail.d.ts +10 -0
  40. package/dist/commands/detail.d.ts.map +1 -0
  41. package/dist/commands/detail.js +27 -0
  42. package/dist/commands/detail.js.map +1 -0
  43. package/dist/commands/food/categories.d.ts +13 -0
  44. package/dist/commands/food/categories.d.ts.map +1 -0
  45. package/dist/commands/food/categories.js +28 -0
  46. package/dist/commands/food/categories.js.map +1 -0
  47. package/dist/commands/food/detail.d.ts +18 -0
  48. package/dist/commands/food/detail.d.ts.map +1 -0
  49. package/dist/commands/food/detail.js +44 -0
  50. package/dist/commands/food/detail.js.map +1 -0
  51. package/dist/commands/food/image-recognize-detail.d.ts +13 -0
  52. package/dist/commands/food/image-recognize-detail.d.ts.map +1 -0
  53. package/dist/commands/food/image-recognize-detail.js +26 -0
  54. package/dist/commands/food/image-recognize-detail.js.map +1 -0
  55. package/dist/commands/food/image-recognize.d.ts +13 -0
  56. package/dist/commands/food/image-recognize.d.ts.map +1 -0
  57. package/dist/commands/food/image-recognize.js +29 -0
  58. package/dist/commands/food/image-recognize.js.map +1 -0
  59. package/dist/commands/food/index.d.ts +7 -0
  60. package/dist/commands/food/index.d.ts.map +1 -0
  61. package/dist/commands/food/index.js +10 -0
  62. package/dist/commands/food/index.js.map +1 -0
  63. package/dist/commands/food/ingredients.d.ts +13 -0
  64. package/dist/commands/food/ingredients.d.ts.map +1 -0
  65. package/dist/commands/food/ingredients.js +31 -0
  66. package/dist/commands/food/ingredients.js.map +1 -0
  67. package/dist/commands/food/list.d.ts +20 -0
  68. package/dist/commands/food/list.d.ts.map +1 -0
  69. package/dist/commands/food/list.js +37 -0
  70. package/dist/commands/food/list.js.map +1 -0
  71. package/dist/commands/food/ranks.d.ts +17 -0
  72. package/dist/commands/food/ranks.d.ts.map +1 -0
  73. package/dist/commands/food/ranks.js +39 -0
  74. package/dist/commands/food/ranks.js.map +1 -0
  75. package/dist/commands/food/search.d.ts +18 -0
  76. package/dist/commands/food/search.d.ts.map +1 -0
  77. package/dist/commands/food/search.js +57 -0
  78. package/dist/commands/food/search.js.map +1 -0
  79. package/dist/commands/food/text-recognize.d.ts +13 -0
  80. package/dist/commands/food/text-recognize.d.ts.map +1 -0
  81. package/dist/commands/food/text-recognize.js +26 -0
  82. package/dist/commands/food/text-recognize.js.map +1 -0
  83. package/dist/commands/food/units.d.ts +10 -0
  84. package/dist/commands/food/units.d.ts.map +1 -0
  85. package/dist/commands/food/units.js +23 -0
  86. package/dist/commands/food/units.js.map +1 -0
  87. package/dist/commands/index.d.ts +6 -0
  88. package/dist/commands/index.d.ts.map +1 -0
  89. package/dist/commands/index.js +62 -0
  90. package/dist/commands/index.js.map +1 -0
  91. package/dist/commands/meta.d.ts +11 -0
  92. package/dist/commands/meta.d.ts.map +1 -0
  93. package/dist/commands/meta.js +76 -0
  94. package/dist/commands/meta.js.map +1 -0
  95. package/dist/commands/rank.d.ts +10 -0
  96. package/dist/commands/rank.d.ts.map +1 -0
  97. package/dist/commands/rank.js +26 -0
  98. package/dist/commands/rank.js.map +1 -0
  99. package/dist/commands/raw.d.ts +19 -0
  100. package/dist/commands/raw.d.ts.map +1 -0
  101. package/dist/commands/raw.js +63 -0
  102. package/dist/commands/raw.js.map +1 -0
  103. package/dist/commands/recognize-image.d.ts +16 -0
  104. package/dist/commands/recognize-image.d.ts.map +1 -0
  105. package/dist/commands/recognize-image.js +106 -0
  106. package/dist/commands/recognize-image.js.map +1 -0
  107. package/dist/commands/recognize.d.ts +16 -0
  108. package/dist/commands/recognize.d.ts.map +1 -0
  109. package/dist/commands/recognize.js +43 -0
  110. package/dist/commands/recognize.js.map +1 -0
  111. package/dist/commands/search.d.ts +10 -0
  112. package/dist/commands/search.d.ts.map +1 -0
  113. package/dist/commands/search.js +28 -0
  114. package/dist/commands/search.js.map +1 -0
  115. package/dist/commands/version.d.ts +7 -0
  116. package/dist/commands/version.d.ts.map +1 -0
  117. package/dist/commands/version.js +10 -0
  118. package/dist/commands/version.js.map +1 -0
  119. package/dist/hooks/prerun.d.ts +4 -0
  120. package/dist/hooks/prerun.d.ts.map +1 -0
  121. package/dist/hooks/prerun.js +24 -0
  122. package/dist/hooks/prerun.js.map +1 -0
  123. package/dist/index.d.ts +2 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +3 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/lib/api/client.d.ts +25 -0
  128. package/dist/lib/api/client.d.ts.map +1 -0
  129. package/dist/lib/api/client.js +59 -0
  130. package/dist/lib/api/client.js.map +1 -0
  131. package/dist/lib/api/endpoints.d.ts +17 -0
  132. package/dist/lib/api/endpoints.d.ts.map +1 -0
  133. package/dist/lib/api/endpoints.js +18 -0
  134. package/dist/lib/api/endpoints.js.map +1 -0
  135. package/dist/lib/api/index.d.ts +4 -0
  136. package/dist/lib/api/index.d.ts.map +1 -0
  137. package/dist/lib/api/index.js +5 -0
  138. package/dist/lib/api/index.js.map +1 -0
  139. package/dist/lib/api/interceptors.d.ts +3 -0
  140. package/dist/lib/api/interceptors.d.ts.map +1 -0
  141. package/dist/lib/api/interceptors.js +44 -0
  142. package/dist/lib/api/interceptors.js.map +1 -0
  143. package/dist/lib/api/types.d.ts +65 -0
  144. package/dist/lib/api/types.d.ts.map +1 -0
  145. package/dist/lib/api/types.js +2 -0
  146. package/dist/lib/api/types.js.map +1 -0
  147. package/dist/lib/auth.d.ts +17 -0
  148. package/dist/lib/auth.d.ts.map +1 -0
  149. package/dist/lib/auth.js +51 -0
  150. package/dist/lib/auth.js.map +1 -0
  151. package/dist/lib/cache.d.ts +13 -0
  152. package/dist/lib/cache.d.ts.map +1 -0
  153. package/dist/lib/cache.js +64 -0
  154. package/dist/lib/cache.js.map +1 -0
  155. package/dist/lib/config.d.ts +22 -0
  156. package/dist/lib/config.d.ts.map +1 -0
  157. package/dist/lib/config.js +139 -0
  158. package/dist/lib/config.js.map +1 -0
  159. package/dist/lib/errors/api-error.d.ts +18 -0
  160. package/dist/lib/errors/api-error.d.ts.map +1 -0
  161. package/dist/lib/errors/api-error.js +24 -0
  162. package/dist/lib/errors/api-error.js.map +1 -0
  163. package/dist/lib/errors/auth-error.d.ts +16 -0
  164. package/dist/lib/errors/auth-error.d.ts.map +1 -0
  165. package/dist/lib/errors/auth-error.js +21 -0
  166. package/dist/lib/errors/auth-error.js.map +1 -0
  167. package/dist/lib/errors/base.d.ts +10 -0
  168. package/dist/lib/errors/base.d.ts.map +1 -0
  169. package/dist/lib/errors/base.js +21 -0
  170. package/dist/lib/errors/base.js.map +1 -0
  171. package/dist/lib/errors/config-error.d.ts +12 -0
  172. package/dist/lib/errors/config-error.d.ts.map +1 -0
  173. package/dist/lib/errors/config-error.js +20 -0
  174. package/dist/lib/errors/config-error.js.map +1 -0
  175. package/dist/lib/errors/index.d.ts +6 -0
  176. package/dist/lib/errors/index.d.ts.map +1 -0
  177. package/dist/lib/errors/index.js +7 -0
  178. package/dist/lib/errors/index.js.map +1 -0
  179. package/dist/lib/errors/validation-error.d.ts +13 -0
  180. package/dist/lib/errors/validation-error.d.ts.map +1 -0
  181. package/dist/lib/errors/validation-error.js +27 -0
  182. package/dist/lib/errors/validation-error.js.map +1 -0
  183. package/dist/lib/logger.d.ts +20 -0
  184. package/dist/lib/logger.d.ts.map +1 -0
  185. package/dist/lib/logger.js +63 -0
  186. package/dist/lib/logger.js.map +1 -0
  187. package/dist/lib/output/formatter.d.ts +9 -0
  188. package/dist/lib/output/formatter.d.ts.map +1 -0
  189. package/dist/lib/output/formatter.js +8 -0
  190. package/dist/lib/output/formatter.js.map +1 -0
  191. package/dist/lib/output/index.d.ts +8 -0
  192. package/dist/lib/output/index.d.ts.map +1 -0
  193. package/dist/lib/output/index.js +19 -0
  194. package/dist/lib/output/index.js.map +1 -0
  195. package/dist/lib/output/json.d.ts +8 -0
  196. package/dist/lib/output/json.d.ts.map +1 -0
  197. package/dist/lib/output/json.js +16 -0
  198. package/dist/lib/output/json.js.map +1 -0
  199. package/dist/lib/output/table.d.ts +17 -0
  200. package/dist/lib/output/table.d.ts.map +1 -0
  201. package/dist/lib/output/table.js +108 -0
  202. package/dist/lib/output/table.js.map +1 -0
  203. package/dist/lib/output/yaml.d.ts +8 -0
  204. package/dist/lib/output/yaml.d.ts.map +1 -0
  205. package/dist/lib/output/yaml.js +18 -0
  206. package/dist/lib/output/yaml.js.map +1 -0
  207. package/dist/types.d.ts +249 -0
  208. package/dist/types.d.ts.map +1 -0
  209. package/dist/types.js +3 -0
  210. package/dist/types.js.map +1 -0
  211. package/package.json +76 -0
  212. package/resources/config-template.json +17 -0
@@ -0,0 +1,106 @@
1
+ // src/commands/recognize-image.ts
2
+ import { Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../base.js';
4
+ import { ApiClient } from '../lib/api/index.js';
5
+ import { CliError } from '../lib/errors/index.js';
6
+ export default class RecognizeImage extends BaseCommand {
7
+ static description = 'Recognize food from image and wait for result';
8
+ static examples = [
9
+ '<%= config.bin %> recognize-image --url https://example.com/food.jpg',
10
+ '<%= config.bin %> recognize-image --url https://example.com/food.jpg --timeout 60',
11
+ ];
12
+ static flags = {
13
+ ...BaseCommand.baseFlags,
14
+ url: Flags.string({
15
+ description: 'Publicly accessible image URL',
16
+ required: true,
17
+ }),
18
+ timeout: Flags.integer({
19
+ description: 'Max wait time in seconds',
20
+ default: 60,
21
+ }),
22
+ interval: Flags.integer({
23
+ description: 'Poll interval in seconds',
24
+ default: 3,
25
+ }),
26
+ };
27
+ async run() {
28
+ const { flags } = await this.parse(RecognizeImage);
29
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
30
+ // Step 1: Submit image recognition request
31
+ this.debugLog('Submitting image recognition request...', { url: flags.url });
32
+ let submitResult;
33
+ try {
34
+ submitResult = await client.imageRecognize({
35
+ image_url: flags.url,
36
+ });
37
+ }
38
+ catch (error) {
39
+ if (error instanceof CliError) {
40
+ this.outputError(error);
41
+ }
42
+ else {
43
+ this.error(error instanceof Error ? error.message : String(error));
44
+ }
45
+ return;
46
+ }
47
+ const taskId = submitResult.task_id;
48
+ if (!taskId) {
49
+ // No task_id returned, output the result directly
50
+ this.output(submitResult);
51
+ return;
52
+ }
53
+ this.debugLog('Got task_id:', taskId);
54
+ // Step 2: Poll for result
55
+ const startTime = Date.now();
56
+ const timeoutMs = flags.timeout * 1000;
57
+ const intervalMs = flags.interval * 1000;
58
+ while (Date.now() - startTime < timeoutMs) {
59
+ await this.sleep(intervalMs);
60
+ this.debugLog('Polling for result...');
61
+ let result;
62
+ try {
63
+ result = await client.imageRecognizeDetail({
64
+ task_id: taskId,
65
+ });
66
+ }
67
+ catch (error) {
68
+ this.debugLog('Poll error:', error);
69
+ // Continue polling on error
70
+ continue;
71
+ }
72
+ const detail = result;
73
+ // Normalize status to string for comparison
74
+ const statusStr = String(detail.status);
75
+ // Status: 1=processing, 2=completed, 3=failed, 4=other
76
+ // Only return when status is '2' (completed) or '3' (failed)
77
+ if (statusStr === '2') {
78
+ this.output(result);
79
+ return;
80
+ }
81
+ // Check if recognition failed
82
+ if (statusStr === '3') {
83
+ this.output({
84
+ success: false,
85
+ task_id: taskId,
86
+ status: 'failed',
87
+ message: detail.err_message || 'Image recognition failed',
88
+ });
89
+ return;
90
+ }
91
+ // Still processing (status '1' or other)
92
+ this.debugLog('Still processing...', { status: detail.status, content: detail.content });
93
+ }
94
+ // Timeout
95
+ this.output({
96
+ success: false,
97
+ task_id: taskId,
98
+ status: 'timeout',
99
+ message: `Recognition did not complete within ${flags.timeout} seconds`,
100
+ });
101
+ }
102
+ sleep(ms) {
103
+ return new Promise(resolve => setTimeout(resolve, ms));
104
+ }
105
+ }
106
+ //# sourceMappingURL=recognize-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognize-image.js","sourceRoot":"","sources":["../../src/commands/recognize-image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from '../base.js';
2
+ export default class Recognize extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ text: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ image: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'machine-readable': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=recognize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognize.d.ts","sourceRoot":"","sources":["../../src/commands/recognize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,SAAiD;IAEnE,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAIV;IAED,MAAM,CAAC,KAAK;;;;;MAMX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB3B"}
@@ -0,0 +1,43 @@
1
+ // src/commands/recognize.ts
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../base.js';
4
+ import { ApiClient } from '../lib/api/index.js';
5
+ export default class Recognize extends BaseCommand {
6
+ static description = 'Recognize food from text or image (shortcut)';
7
+ static examples = [
8
+ '<%= config.bin %> recognize "早上喝了一杯牛奶"',
9
+ '<%= config.bin %> recognize --image https://example.com/food.jpg',
10
+ ];
11
+ static args = {
12
+ text: Args.string({
13
+ description: 'Natural language description',
14
+ }),
15
+ };
16
+ static flags = {
17
+ ...BaseCommand.baseFlags,
18
+ image: Flags.string({
19
+ description: 'Image URL for recognition',
20
+ exclusive: ['text'],
21
+ }),
22
+ };
23
+ async run() {
24
+ const { args, flags } = await this.parse(Recognize);
25
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
26
+ if (flags.image) {
27
+ const result = await client.imageRecognize({
28
+ image_url: flags.image,
29
+ });
30
+ this.output(result);
31
+ }
32
+ else if (args.text) {
33
+ const result = await client.textRecognize({
34
+ text: args.text,
35
+ });
36
+ this.output(result);
37
+ }
38
+ else {
39
+ this.error('Either provide text argument or --image flag');
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=recognize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../src/commands/recognize.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,GAAG,8CAA8C,CAAA;IAEnE,MAAM,CAAC,QAAQ,GAAG;QAChB,wCAAwC;QACxC,kEAAkE;KACnE,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,8BAA8B;SAC5C,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW,CAAC,SAAS;QACxB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,2BAA2B;YACxC,SAAS,EAAE,CAAC,MAAM,CAAC;SACpB,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAEnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;gBACzC,SAAS,EAAE,KAAK,CAAC,KAAK;aACvB,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBACxC,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../base.js';
2
+ export default class Search extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ keyword: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,MAAM,CAAC,WAAW,SAAgD;IAElE,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB3B"}
@@ -0,0 +1,28 @@
1
+ // src/commands/search.ts
2
+ import { Args } from '@oclif/core';
3
+ import { BaseCommand } from '../base.js';
4
+ import { ApiClient } from '../lib/api/index.js';
5
+ export default class Search extends BaseCommand {
6
+ static description = 'Search for foods (shortcut for food:search)';
7
+ static examples = [
8
+ '<%= config.bin %> search 苹果',
9
+ '<%= config.bin %> search 苹果 -o json',
10
+ ];
11
+ static args = {
12
+ keyword: Args.string({
13
+ description: 'Search keyword',
14
+ required: true,
15
+ }),
16
+ };
17
+ async run() {
18
+ const { args, flags } = await this.parse(Search);
19
+ const client = new ApiClient(this.getApiKey(), undefined, undefined, this.debugLog.bind(this));
20
+ const result = await client.foodSearch({
21
+ keyword: args.keyword,
22
+ page: 1,
23
+ per_page: 20,
24
+ });
25
+ this.output(result);
26
+ }
27
+ }
28
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,MAAM,CAAC,WAAW,GAAG,6CAA6C,CAAA;IAElE,MAAM,CAAC,QAAQ,GAAG;QAChB,6BAA6B;QAC7B,qCAAqC;KACtC,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,gBAAgB;YAC7B,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,EACT,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,EAAE;SACb,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Version extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAqB;IAEvC,MAAM,CAAC,QAAQ,WAAkC;IAE3C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAG3B"}
@@ -0,0 +1,10 @@
1
+ // src/commands/version.ts
2
+ import { Command } from '@oclif/core';
3
+ export default class Version extends Command {
4
+ static description = 'Show CLI version';
5
+ static examples = ['<%= config.bin %> --version'];
6
+ async run() {
7
+ this.log(this.config.version);
8
+ }
9
+ }
10
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAA;IAEvC,MAAM,CAAC,QAAQ,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAEjD,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hook } from '@oclif/core';
2
+ declare const hook: Hook<'prerun'>;
3
+ export default hook;
4
+ //# sourceMappingURL=prerun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerun.d.ts","sourceRoot":"","sources":["../../src/hooks/prerun.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAKlC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,QAAQ,CAqBxB,CAAA;AAED,eAAe,IAAI,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { getAuth } from '../lib/auth.js';
2
+ const AUTH_NOT_REQUIRED = ['auth:status', 'config:init', 'config:list', 'config:get', 'config:set', 'config:reset', 'help', '--help', '--version', 'meta'];
3
+ const hook = async function (options) {
4
+ const commandId = options.Command.id;
5
+ // Skip auth check for certain commands
6
+ if (AUTH_NOT_REQUIRED.some(cmd => commandId.includes(cmd))) {
7
+ return;
8
+ }
9
+ const auth = getAuth();
10
+ if (!auth.hasApiKey()) {
11
+ console.error(JSON.stringify({
12
+ success: false,
13
+ error: {
14
+ code: 'AUTH_MISSING',
15
+ message: 'API Key not found. Set BOOHEE_API_KEY environment variable.',
16
+ recoverable: true,
17
+ suggestion: 'Set BOOHEE_API_KEY environment variable'
18
+ }
19
+ }, null, 2));
20
+ process.exit(3);
21
+ }
22
+ };
23
+ export default hook;
24
+ //# sourceMappingURL=prerun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerun.js","sourceRoot":"","sources":["../../src/hooks/prerun.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,MAAM,iBAAiB,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;AAE1J,MAAM,IAAI,GAAmB,KAAK,WAAW,OAAO;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;IAEpC,uCAAuC;IACvC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAM;IACR,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,6DAA6D;gBACtE,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,yCAAyC;aACtD;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAA;AAED,eAAe,IAAI,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { run } from '@oclif/core';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // src/index.ts
2
+ export { run } from '@oclif/core';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { FoodSearchParams, FoodDetailParams, FoodCategoriesParams, FoodListParams, FoodUnitsParams, FoodIngredientsParams, FoodRanksParams, ImageRecognizeParams, ImageRecognizeDetailParams, TextRecognizeParams } from './types.js';
2
+ import { FoodSearchResult, FoodDetail, FoodCategoryResult, Food, FoodRankResult, IngredientsResult, ImageRecognizeResult, ImageRecognizeDetailResult, TextRecognizeResult } from '../../types.js';
3
+ export declare class ApiClient {
4
+ private client;
5
+ private debugFn?;
6
+ constructor(apiKey: string, baseUrl?: string, timeout?: number, debugFn?: (message: string, data?: unknown) => void);
7
+ foodSearch(params: FoodSearchParams): Promise<FoodSearchResult>;
8
+ foodDetail(params: FoodDetailParams): Promise<FoodDetail>;
9
+ foodCategories(params?: FoodCategoriesParams): Promise<FoodCategoryResult>;
10
+ foodList(params: FoodListParams): Promise<FoodSearchResult>;
11
+ foodUnits(params: FoodUnitsParams): Promise<{
12
+ code: string;
13
+ name: string;
14
+ calories: number;
15
+ image_url: string;
16
+ units: Food['units'];
17
+ }>;
18
+ foodIngredients(params: FoodIngredientsParams): Promise<IngredientsResult>;
19
+ foodRanks(params: FoodRanksParams): Promise<FoodRankResult>;
20
+ imageRecognize(params: ImageRecognizeParams): Promise<ImageRecognizeResult>;
21
+ imageRecognizeDetail(params: ImageRecognizeDetailParams): Promise<ImageRecognizeDetailResult>;
22
+ textRecognize(params: TextRecognizeParams): Promise<TextRecognizeResult>;
23
+ raw<T = unknown>(method: 'GET' | 'POST' | 'PUT' | 'DELETE', path: string, params?: Record<string, unknown>, data?: unknown): Promise<T>;
24
+ }
25
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/lib/api/client.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACpB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACpB,MAAM,gBAAgB,CAAA;AAEvB,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAC,CAA2C;gBAGzD,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI;IAgB/C,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI/D,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAIzD,cAAc,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI1E,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3D,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC;QAChD,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KACrB,CAAC;IAII,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI1E,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAI3D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI3E,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAI7F,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKxE,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;CAMd"}
@@ -0,0 +1,59 @@
1
+ // src/lib/api/client.ts
2
+ import axios from 'axios';
3
+ import { getConfig } from '../config.js';
4
+ import { endpoints } from './endpoints.js';
5
+ import { setupInterceptors } from './interceptors.js';
6
+ export class ApiClient {
7
+ client;
8
+ debugFn;
9
+ constructor(apiKey, baseUrl, timeout, debugFn) {
10
+ const config = getConfig();
11
+ this.debugFn = debugFn;
12
+ this.client = axios.create({
13
+ baseURL: baseUrl || config.get('api').baseUrl,
14
+ timeout: timeout || config.get('api').timeout,
15
+ headers: {
16
+ Accept: 'application/json',
17
+ },
18
+ });
19
+ setupInterceptors(this.client, apiKey, this.debugFn);
20
+ }
21
+ async foodSearch(params) {
22
+ return this.client.get(endpoints.food.search, { params });
23
+ }
24
+ async foodDetail(params) {
25
+ return this.client.get(endpoints.food.detail, { params });
26
+ }
27
+ async foodCategories(params) {
28
+ return this.client.get(endpoints.food.categories, { params });
29
+ }
30
+ async foodList(params) {
31
+ return this.client.get(endpoints.food.list, { params });
32
+ }
33
+ async foodUnits(params) {
34
+ return this.client.get(endpoints.food.units, { params });
35
+ }
36
+ async foodIngredients(params) {
37
+ return this.client.post(endpoints.food.ingredients, params);
38
+ }
39
+ async foodRanks(params) {
40
+ return this.client.get(endpoints.food.ranks, { params });
41
+ }
42
+ async imageRecognize(params) {
43
+ return this.client.post(endpoints.recognize.image, params);
44
+ }
45
+ async imageRecognizeDetail(params) {
46
+ return this.client.get(endpoints.recognize.imageDetail, { params });
47
+ }
48
+ async textRecognize(params) {
49
+ return this.client.post(endpoints.recognize.text, params);
50
+ }
51
+ // Raw API call for flexibility
52
+ async raw(method, path, params, data) {
53
+ if (method === 'GET') {
54
+ return this.client.get(path, { params });
55
+ }
56
+ return this.client.request({ method, url: path, params, data });
57
+ }
58
+ }
59
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const endpoints: {
2
+ readonly food: {
3
+ readonly search: "/v1/food/search";
4
+ readonly detail: "/v1/food/detail";
5
+ readonly categories: "/v1/food/categories";
6
+ readonly list: "/v1/food/list";
7
+ readonly units: "/v1/food/units";
8
+ readonly ingredients: "/v1/food/ingredients";
9
+ readonly ranks: "/v1/food/ranks";
10
+ };
11
+ readonly recognize: {
12
+ readonly image: "/v1/food/image_recognize";
13
+ readonly imageDetail: "/v1/food/image_recognize_detail";
14
+ readonly text: "/v1/food/text_recognize";
15
+ };
16
+ };
17
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../../src/lib/api/endpoints.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;CAeZ,CAAA"}
@@ -0,0 +1,18 @@
1
+ // src/lib/api/endpoints.ts
2
+ export const endpoints = {
3
+ food: {
4
+ search: '/v1/food/search',
5
+ detail: '/v1/food/detail',
6
+ categories: '/v1/food/categories',
7
+ list: '/v1/food/list',
8
+ units: '/v1/food/units',
9
+ ingredients: '/v1/food/ingredients',
10
+ ranks: '/v1/food/ranks',
11
+ },
12
+ recognize: {
13
+ image: '/v1/food/image_recognize',
14
+ imageDetail: '/v1/food/image_recognize_detail',
15
+ text: '/v1/food/text_recognize',
16
+ },
17
+ };
18
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../../src/lib/api/endpoints.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE;QACJ,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,iBAAiB;QACzB,UAAU,EAAE,qBAAqB;QACjC,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,sBAAsB;QACnC,KAAK,EAAE,gBAAgB;KACxB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,yBAAyB;KAChC;CACO,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { ApiClient } from './client.js';
2
+ export { endpoints } from './endpoints.js';
3
+ export * from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,cAAc,YAAY,CAAA"}
@@ -0,0 +1,5 @@
1
+ // src/lib/api/index.ts
2
+ export { ApiClient } from './client.js';
3
+ export { endpoints } from './endpoints.js';
4
+ export * from './types.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/api/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,cAAc,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { AxiosInstance } from 'axios';
2
+ export declare function setupInterceptors(client: AxiosInstance, apiKey: string, onDebug?: (message: string, data?: unknown) => void): void;
3
+ //# sourceMappingURL=interceptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptors.d.ts","sourceRoot":"","sources":["../../../src/lib/api/interceptors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAc,MAAM,OAAO,CAAA;AAEjD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,GAClD,IAAI,CAuDN"}
@@ -0,0 +1,44 @@
1
+ export function setupInterceptors(client, apiKey, onDebug) {
2
+ // Request interceptor
3
+ client.interceptors.request.use((config) => {
4
+ // Add auth header
5
+ config.headers['X-Api-Key'] = apiKey;
6
+ // Debug logging
7
+ if (onDebug) {
8
+ onDebug(`Request: ${config.method?.toUpperCase()} ${config.url}`, {
9
+ params: config.params,
10
+ data: config.data,
11
+ });
12
+ }
13
+ return config;
14
+ }, (error) => Promise.reject(error));
15
+ // Response interceptor
16
+ client.interceptors.response.use((response) => {
17
+ if (onDebug) {
18
+ onDebug(`Response: ${response.status}`, response.data);
19
+ }
20
+ // Check API-level error code
21
+ const { code, message } = response.data;
22
+ if (code !== 0) {
23
+ const error = new Error(message || 'API Error');
24
+ error.statusCode = response.status;
25
+ error.apiCode = code;
26
+ throw error;
27
+ }
28
+ return response.data.data;
29
+ }, (error) => {
30
+ if (error.code === 'ECONNABORTED') {
31
+ const timeoutError = new Error('Request timeout');
32
+ timeoutError.code = 'API_TIMEOUT';
33
+ throw timeoutError;
34
+ }
35
+ if (error.response?.status === 429) {
36
+ const rateLimitError = new Error('Rate limit exceeded');
37
+ rateLimitError.code = 'API_RATE_LIMIT';
38
+ throw rateLimitError;
39
+ }
40
+ const message = error.response?.data?.message || error.message;
41
+ throw new Error(message);
42
+ });
43
+ }
44
+ //# sourceMappingURL=interceptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../../src/lib/api/interceptors.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,MAAc,EACd,OAAmD;IAEnD,sBAAsB;IACtB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAC7B,CAAC,MAAM,EAAE,EAAE;QACT,kBAAkB;QAClB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;QAEpC,gBAAgB;QAChB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,EAAE;gBAChE,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CACjC,CAAA;IAED,uBAAuB;IACvB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,aAAa,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;QAED,6BAA6B;QAC7B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAA;QACvC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,IAAI,WAAW,CAAsD,CAAA;YACpG,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA;YAClC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;YACpB,MAAM,KAAK,CAAA;QACb,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAA;IAC3B,CAAC,EACD,CAAC,KAAiB,EAAE,EAAE;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAA8B,CAAA;YAC9E,YAAY,CAAC,IAAI,GAAG,aAAa,CAAA;YACjC,MAAM,YAAY,CAAA;QACpB,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAA8B,CAAA;YACpF,cAAc,CAAC,IAAI,GAAG,gBAAgB,CAAA;YACtC,MAAM,cAAc,CAAA;QACtB,CAAC;QAED,MAAM,OAAO,GAAI,KAAK,CAAC,QAAQ,EAAE,IAA6B,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAA;QACxF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { FoodSearchResult, FoodDetail, FoodCategoryResult, Food, FoodRankResult, IngredientsResult, ImageRecognizeResult, ImageRecognizeDetailResult, TextRecognizeResult } from '../../types.js';
2
+ export interface FoodSearchParams {
3
+ keyword?: string;
4
+ barcode?: string;
5
+ page?: number;
6
+ per_page?: number;
7
+ sort?: 'calorie_asc' | 'calorie_desc';
8
+ with_units?: boolean;
9
+ }
10
+ export interface FoodDetailParams {
11
+ code: string;
12
+ with_ingredients?: boolean;
13
+ with_units?: boolean;
14
+ with_materials?: boolean;
15
+ }
16
+ export interface FoodCategoriesParams {
17
+ kind?: 'group' | 'cooking';
18
+ }
19
+ export interface FoodListParams {
20
+ id: number;
21
+ kind: string;
22
+ with_units?: boolean;
23
+ }
24
+ export interface FoodUnitsParams {
25
+ code: string;
26
+ }
27
+ export interface FoodIngredientsParams {
28
+ foods: Array<{
29
+ code: string;
30
+ weight: number;
31
+ }>;
32
+ }
33
+ export interface FoodRanksParams {
34
+ ingredient: string;
35
+ sort?: '0' | '1';
36
+ tag?: string;
37
+ }
38
+ export interface ImageRecognizeParams {
39
+ image_url: string;
40
+ }
41
+ export interface ImageRecognizeDetailParams {
42
+ task_id: string;
43
+ }
44
+ export interface TextRecognizeParams {
45
+ text: string;
46
+ }
47
+ export interface ApiMethods {
48
+ foodSearch(params: FoodSearchParams): Promise<FoodSearchResult>;
49
+ foodDetail(params: FoodDetailParams): Promise<FoodDetail>;
50
+ foodCategories(params?: FoodCategoriesParams): Promise<FoodCategoryResult>;
51
+ foodList(params: FoodListParams): Promise<FoodSearchResult>;
52
+ foodUnits(params: FoodUnitsParams): Promise<{
53
+ code: string;
54
+ name: string;
55
+ calories: number;
56
+ image_url: string;
57
+ units: Food['units'];
58
+ }>;
59
+ foodIngredients(params: FoodIngredientsParams): Promise<IngredientsResult>;
60
+ foodRanks(params: FoodRanksParams): Promise<FoodRankResult>;
61
+ imageRecognize(params: ImageRecognizeParams): Promise<ImageRecognizeResult>;
62
+ imageRecognizeDetail(params: ImageRecognizeDetailParams): Promise<ImageRecognizeDetailResult>;
63
+ textRecognize(params: TextRecognizeParams): Promise<TextRecognizeResult>;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/api/types.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,IAAI,EACJ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACpB,MAAM,gBAAgB,CAAA;AAGvB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAAA;IACrC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAGD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAC3B;AAGD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAGD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;CACb;AAGD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C;AAGD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAGD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAA;CAClB;AAGD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAA;CAChB;AAGD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;CACb;AAGD,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC/D,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACzD,cAAc,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAC1E,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3D,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IACtI,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC1E,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC3D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC3E,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC7F,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACzE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/api/types.ts"],"names":[],"mappings":""}