noxctl 0.7.4 → 0.9.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 (272) hide show
  1. package/README.md +50 -4
  2. package/dist/auth.d.ts +18 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +129 -15
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +144 -33
  8. package/dist/cli.js.map +1 -1
  9. package/dist/credentials-store.d.ts +3 -0
  10. package/dist/credentials-store.d.ts.map +1 -1
  11. package/dist/credentials-store.js +54 -10
  12. package/dist/credentials-store.js.map +1 -1
  13. package/dist/embedded.d.ts +15 -0
  14. package/dist/embedded.d.ts.map +1 -0
  15. package/dist/embedded.js +11 -0
  16. package/dist/embedded.js.map +1 -0
  17. package/dist/fortnox-client.d.ts +40 -25
  18. package/dist/fortnox-client.d.ts.map +1 -1
  19. package/dist/fortnox-client.js +165 -51
  20. package/dist/fortnox-client.js.map +1 -1
  21. package/dist/index.d.ts +7 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +50 -35
  24. package/dist/index.js.map +1 -1
  25. package/dist/keychain-target.d.ts +3 -0
  26. package/dist/keychain-target.d.ts.map +1 -1
  27. package/dist/keychain-target.js +28 -7
  28. package/dist/keychain-target.js.map +1 -1
  29. package/dist/operations/absencetransactions.d.ts +9 -6
  30. package/dist/operations/absencetransactions.d.ts.map +1 -1
  31. package/dist/operations/absencetransactions.js +42 -33
  32. package/dist/operations/absencetransactions.js.map +1 -1
  33. package/dist/operations/accounts.d.ts +6 -3
  34. package/dist/operations/accounts.d.ts.map +1 -1
  35. package/dist/operations/accounts.js +28 -24
  36. package/dist/operations/accounts.js.map +1 -1
  37. package/dist/operations/analytics.d.ts +35 -0
  38. package/dist/operations/analytics.d.ts.map +1 -1
  39. package/dist/operations/analytics.js +59 -35
  40. package/dist/operations/analytics.js.map +1 -1
  41. package/dist/operations/articles.d.ts +9 -6
  42. package/dist/operations/articles.d.ts.map +1 -1
  43. package/dist/operations/articles.js +36 -32
  44. package/dist/operations/articles.js.map +1 -1
  45. package/dist/operations/attendancetransactions.d.ts +9 -6
  46. package/dist/operations/attendancetransactions.d.ts.map +1 -1
  47. package/dist/operations/attendancetransactions.js +45 -36
  48. package/dist/operations/attendancetransactions.js.map +1 -1
  49. package/dist/operations/company.d.ts +5 -1
  50. package/dist/operations/company.d.ts.map +1 -1
  51. package/dist/operations/company.js +8 -4
  52. package/dist/operations/company.js.map +1 -1
  53. package/dist/operations/contracts.d.ts +12 -9
  54. package/dist/operations/contracts.d.ts.map +1 -1
  55. package/dist/operations/contracts.js +59 -47
  56. package/dist/operations/contracts.js.map +1 -1
  57. package/dist/operations/costcenters.d.ts +10 -7
  58. package/dist/operations/costcenters.d.ts.map +1 -1
  59. package/dist/operations/costcenters.js +39 -35
  60. package/dist/operations/costcenters.js.map +1 -1
  61. package/dist/operations/customers.d.ts +9 -6
  62. package/dist/operations/customers.d.ts.map +1 -1
  63. package/dist/operations/customers.js +46 -42
  64. package/dist/operations/customers.js.map +1 -1
  65. package/dist/operations/employees.d.ts +9 -6
  66. package/dist/operations/employees.d.ts.map +1 -1
  67. package/dist/operations/employees.js +35 -31
  68. package/dist/operations/employees.js.map +1 -1
  69. package/dist/operations/financial-reports.d.ts +7 -2
  70. package/dist/operations/financial-reports.d.ts.map +1 -1
  71. package/dist/operations/financial-reports.js +169 -165
  72. package/dist/operations/financial-reports.js.map +1 -1
  73. package/dist/operations/financial-years.d.ts +8 -5
  74. package/dist/operations/financial-years.d.ts.map +1 -1
  75. package/dist/operations/financial-years.js +33 -29
  76. package/dist/operations/financial-years.js.map +1 -1
  77. package/dist/operations/index.d.ts +311 -0
  78. package/dist/operations/index.d.ts.map +1 -0
  79. package/dist/operations/index.js +64 -0
  80. package/dist/operations/index.js.map +1 -0
  81. package/dist/operations/invoice-payments.d.ts +10 -7
  82. package/dist/operations/invoice-payments.d.ts.map +1 -1
  83. package/dist/operations/invoice-payments.js +45 -35
  84. package/dist/operations/invoice-payments.js.map +1 -1
  85. package/dist/operations/invoices.d.ts +34 -30
  86. package/dist/operations/invoices.d.ts.map +1 -1
  87. package/dist/operations/invoices.js +225 -113
  88. package/dist/operations/invoices.js.map +1 -1
  89. package/dist/operations/offers.d.ts +11 -8
  90. package/dist/operations/offers.d.ts.map +1 -1
  91. package/dist/operations/offers.js +54 -43
  92. package/dist/operations/offers.js.map +1 -1
  93. package/dist/operations/orders.d.ts +10 -7
  94. package/dist/operations/orders.d.ts.map +1 -1
  95. package/dist/operations/orders.js +43 -39
  96. package/dist/operations/orders.js.map +1 -1
  97. package/dist/operations/pricelists.d.ts +16 -10
  98. package/dist/operations/pricelists.d.ts.map +1 -1
  99. package/dist/operations/pricelists.js +56 -48
  100. package/dist/operations/pricelists.js.map +1 -1
  101. package/dist/operations/projects.d.ts +9 -6
  102. package/dist/operations/projects.d.ts.map +1 -1
  103. package/dist/operations/projects.js +34 -30
  104. package/dist/operations/projects.js.map +1 -1
  105. package/dist/operations/recurrings.d.ts +14 -10
  106. package/dist/operations/recurrings.d.ts.map +1 -1
  107. package/dist/operations/recurrings.js +74 -59
  108. package/dist/operations/recurrings.js.map +1 -1
  109. package/dist/operations/salarytransactions.d.ts +9 -6
  110. package/dist/operations/salarytransactions.d.ts.map +1 -1
  111. package/dist/operations/salarytransactions.js +41 -32
  112. package/dist/operations/salarytransactions.js.map +1 -1
  113. package/dist/operations/scheduletimes.d.ts +7 -3
  114. package/dist/operations/scheduletimes.d.ts.map +1 -1
  115. package/dist/operations/scheduletimes.js +26 -22
  116. package/dist/operations/scheduletimes.js.map +1 -1
  117. package/dist/operations/supplier-invoice-payments.d.ts +9 -6
  118. package/dist/operations/supplier-invoice-payments.d.ts.map +1 -1
  119. package/dist/operations/supplier-invoice-payments.js +38 -29
  120. package/dist/operations/supplier-invoice-payments.js.map +1 -1
  121. package/dist/operations/supplier-invoices.d.ts +9 -6
  122. package/dist/operations/supplier-invoices.d.ts.map +1 -1
  123. package/dist/operations/supplier-invoices.js +41 -32
  124. package/dist/operations/supplier-invoices.js.map +1 -1
  125. package/dist/operations/suppliers.d.ts +9 -6
  126. package/dist/operations/suppliers.d.ts.map +1 -1
  127. package/dist/operations/suppliers.js +36 -32
  128. package/dist/operations/suppliers.js.map +1 -1
  129. package/dist/operations/tax.d.ts +5 -1
  130. package/dist/operations/tax.d.ts.map +1 -1
  131. package/dist/operations/tax.js +43 -39
  132. package/dist/operations/tax.js.map +1 -1
  133. package/dist/operations/taxreductions.d.ts +8 -5
  134. package/dist/operations/taxreductions.d.ts.map +1 -1
  135. package/dist/operations/taxreductions.js +28 -24
  136. package/dist/operations/taxreductions.js.map +1 -1
  137. package/dist/operations/vouchers.d.ts +26 -8
  138. package/dist/operations/vouchers.d.ts.map +1 -1
  139. package/dist/operations/vouchers.js +174 -122
  140. package/dist/operations/vouchers.js.map +1 -1
  141. package/dist/schema-audit-mappings.d.ts +9 -0
  142. package/dist/schema-audit-mappings.d.ts.map +1 -0
  143. package/dist/schema-audit-mappings.js +45 -0
  144. package/dist/schema-audit-mappings.js.map +1 -0
  145. package/dist/schema-audit.d.ts +45 -0
  146. package/dist/schema-audit.d.ts.map +1 -0
  147. package/dist/schema-audit.js +132 -0
  148. package/dist/schema-audit.js.map +1 -0
  149. package/dist/scope-probes.d.ts.map +1 -1
  150. package/dist/scope-probes.js +1 -0
  151. package/dist/scope-probes.js.map +1 -1
  152. package/dist/strict-mcp-server.d.ts +17 -0
  153. package/dist/strict-mcp-server.d.ts.map +1 -0
  154. package/dist/strict-mcp-server.js +35 -0
  155. package/dist/strict-mcp-server.js.map +1 -0
  156. package/dist/tools/absencetransactions.d.ts +2 -1
  157. package/dist/tools/absencetransactions.d.ts.map +1 -1
  158. package/dist/tools/absencetransactions.js +3 -2
  159. package/dist/tools/absencetransactions.js.map +1 -1
  160. package/dist/tools/analytics.d.ts +2 -1
  161. package/dist/tools/analytics.d.ts.map +1 -1
  162. package/dist/tools/analytics.js +3 -2
  163. package/dist/tools/analytics.js.map +1 -1
  164. package/dist/tools/articles.d.ts +2 -1
  165. package/dist/tools/articles.d.ts.map +1 -1
  166. package/dist/tools/articles.js +3 -2
  167. package/dist/tools/articles.js.map +1 -1
  168. package/dist/tools/attendancetransactions.d.ts +2 -1
  169. package/dist/tools/attendancetransactions.d.ts.map +1 -1
  170. package/dist/tools/attendancetransactions.js +3 -2
  171. package/dist/tools/attendancetransactions.js.map +1 -1
  172. package/dist/tools/bookkeeping.d.ts +2 -1
  173. package/dist/tools/bookkeeping.d.ts.map +1 -1
  174. package/dist/tools/bookkeeping.js +83 -5
  175. package/dist/tools/bookkeeping.js.map +1 -1
  176. package/dist/tools/company.d.ts +2 -1
  177. package/dist/tools/company.d.ts.map +1 -1
  178. package/dist/tools/company.js +3 -2
  179. package/dist/tools/company.js.map +1 -1
  180. package/dist/tools/contracts.d.ts +2 -1
  181. package/dist/tools/contracts.d.ts.map +1 -1
  182. package/dist/tools/contracts.js +3 -2
  183. package/dist/tools/contracts.js.map +1 -1
  184. package/dist/tools/costcenters.d.ts +2 -1
  185. package/dist/tools/costcenters.d.ts.map +1 -1
  186. package/dist/tools/costcenters.js +3 -2
  187. package/dist/tools/costcenters.js.map +1 -1
  188. package/dist/tools/customers.d.ts +2 -1
  189. package/dist/tools/customers.d.ts.map +1 -1
  190. package/dist/tools/customers.js +3 -2
  191. package/dist/tools/customers.js.map +1 -1
  192. package/dist/tools/employees.d.ts +2 -1
  193. package/dist/tools/employees.d.ts.map +1 -1
  194. package/dist/tools/employees.js +3 -2
  195. package/dist/tools/employees.js.map +1 -1
  196. package/dist/tools/financial-reports.d.ts +2 -1
  197. package/dist/tools/financial-reports.d.ts.map +1 -1
  198. package/dist/tools/financial-reports.js +3 -2
  199. package/dist/tools/financial-reports.js.map +1 -1
  200. package/dist/tools/financial-years.d.ts +2 -1
  201. package/dist/tools/financial-years.d.ts.map +1 -1
  202. package/dist/tools/financial-years.js +3 -2
  203. package/dist/tools/financial-years.js.map +1 -1
  204. package/dist/tools/invoice-payments.d.ts +2 -1
  205. package/dist/tools/invoice-payments.d.ts.map +1 -1
  206. package/dist/tools/invoice-payments.js +3 -2
  207. package/dist/tools/invoice-payments.js.map +1 -1
  208. package/dist/tools/invoices.d.ts +2 -1
  209. package/dist/tools/invoices.d.ts.map +1 -1
  210. package/dist/tools/invoices.js +100 -21
  211. package/dist/tools/invoices.js.map +1 -1
  212. package/dist/tools/offers.d.ts +2 -1
  213. package/dist/tools/offers.d.ts.map +1 -1
  214. package/dist/tools/offers.js +50 -19
  215. package/dist/tools/offers.js.map +1 -1
  216. package/dist/tools/orders.d.ts +2 -1
  217. package/dist/tools/orders.d.ts.map +1 -1
  218. package/dist/tools/orders.js +58 -18
  219. package/dist/tools/orders.js.map +1 -1
  220. package/dist/tools/pricelists.d.ts +2 -1
  221. package/dist/tools/pricelists.d.ts.map +1 -1
  222. package/dist/tools/pricelists.js +3 -2
  223. package/dist/tools/pricelists.js.map +1 -1
  224. package/dist/tools/projects.d.ts +2 -1
  225. package/dist/tools/projects.d.ts.map +1 -1
  226. package/dist/tools/projects.js +3 -2
  227. package/dist/tools/projects.js.map +1 -1
  228. package/dist/tools/recurrings.d.ts +2 -1
  229. package/dist/tools/recurrings.d.ts.map +1 -1
  230. package/dist/tools/recurrings.js +3 -2
  231. package/dist/tools/recurrings.js.map +1 -1
  232. package/dist/tools/salarytransactions.d.ts +2 -1
  233. package/dist/tools/salarytransactions.d.ts.map +1 -1
  234. package/dist/tools/salarytransactions.js +3 -2
  235. package/dist/tools/salarytransactions.js.map +1 -1
  236. package/dist/tools/scheduletimes.d.ts +2 -1
  237. package/dist/tools/scheduletimes.d.ts.map +1 -1
  238. package/dist/tools/scheduletimes.js +3 -2
  239. package/dist/tools/scheduletimes.js.map +1 -1
  240. package/dist/tools/status.d.ts.map +1 -1
  241. package/dist/tools/status.js +5 -4
  242. package/dist/tools/status.js.map +1 -1
  243. package/dist/tools/supplier-invoice-payments.d.ts +2 -1
  244. package/dist/tools/supplier-invoice-payments.d.ts.map +1 -1
  245. package/dist/tools/supplier-invoice-payments.js +3 -2
  246. package/dist/tools/supplier-invoice-payments.js.map +1 -1
  247. package/dist/tools/supplier-invoices.d.ts +2 -1
  248. package/dist/tools/supplier-invoices.d.ts.map +1 -1
  249. package/dist/tools/supplier-invoices.js +47 -6
  250. package/dist/tools/supplier-invoices.js.map +1 -1
  251. package/dist/tools/suppliers.d.ts +2 -1
  252. package/dist/tools/suppliers.d.ts.map +1 -1
  253. package/dist/tools/suppliers.js +3 -2
  254. package/dist/tools/suppliers.js.map +1 -1
  255. package/dist/tools/tax.d.ts +2 -1
  256. package/dist/tools/tax.d.ts.map +1 -1
  257. package/dist/tools/tax.js +3 -2
  258. package/dist/tools/tax.js.map +1 -1
  259. package/dist/tools/taxreductions.d.ts +2 -1
  260. package/dist/tools/taxreductions.d.ts.map +1 -1
  261. package/dist/tools/taxreductions.js +3 -2
  262. package/dist/tools/taxreductions.js.map +1 -1
  263. package/dist/version.d.ts +2 -0
  264. package/dist/version.d.ts.map +1 -0
  265. package/dist/version.js +3 -0
  266. package/dist/version.js.map +1 -0
  267. package/dist/views.d.ts +2 -0
  268. package/dist/views.d.ts.map +1 -1
  269. package/dist/views.js +11 -0
  270. package/dist/views.js.map +1 -1
  271. package/docs/embedded.md +60 -0
  272. package/package.json +23 -4
@@ -1 +1 @@
1
- {"version":3,"file":"credentials-store.d.ts","sourceRoot":"","sources":["../src/credentials-store.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,MAAM,MAAM,UAAU,GACpB,KAAK,GAAG,QAAQ,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IAKnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IAKpC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA4PD,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,MAAwB,GAChC,OAAO,CAAC,wBAAwB,CAAC,CAyBnC;AAYD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAwB,EACjC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAyBf;AA+CD,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,MAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB9F"}
1
+ {"version":3,"file":"credentials-store.d.ts","sourceRoot":"","sources":["../src/credentials-store.ts"],"names":[],"mappings":"AAuBA,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AA4CD,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,MAAM,MAAM,UAAU,GACpB,KAAK,GAAG,QAAQ,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IAKnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IAKpC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiRD,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,MAAwB,GAChC,OAAO,CAAC,wBAAwB,CAAC,CAyBnC;AAYD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAwB,EACjC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAyBf;AA+CD,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,MAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB9F"}
@@ -5,7 +5,7 @@ import path from 'node:path';
5
5
  import { execFileSync, spawnSync } from 'node:child_process';
6
6
  import { DEFAULT_PROFILE, LEGACY_KEYCHAIN_ACCOUNT, keychainAccount, sanitizeForFilename, validateProfileName, } from './profile-name.js';
7
7
  import { configDir } from './config-paths.js';
8
- import { activeKeychainPath, readDedicatedSecret } from './keychain-target.js';
8
+ import { activeKeychainPath, KeychainAccessError, readDedicatedSecret } from './keychain-target.js';
9
9
  function legacyCredentialsFile() {
10
10
  return path.join(configDir(), 'credentials.json');
11
11
  }
@@ -13,6 +13,32 @@ function legacyWindowsCredentialsFile() {
13
13
  return path.join(configDir(), 'credentials.dpapi');
14
14
  }
15
15
  const SERVICE_NAME = 'fortnox-mcp';
16
+ export class CredentialStoreAccessError extends Error {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = 'CredentialStoreAccessError';
20
+ }
21
+ }
22
+ function commandFailureDetail(err) {
23
+ if (typeof err !== 'object' || err === null)
24
+ return String(err);
25
+ const e = err;
26
+ const stderr = e.stderr?.toString().trim();
27
+ return stderr || e.message || e.code || `exit ${e.status ?? 'unknown'}`;
28
+ }
29
+ function isMissingSecretError(err) {
30
+ if (typeof err !== 'object' || err === null)
31
+ return false;
32
+ const e = err;
33
+ const detail = `${e.message ?? ''}\n${e.stderr?.toString() ?? ''}`;
34
+ return (e.status === 44 || /not found|could not be found|no keychain item|no matching/i.test(detail));
35
+ }
36
+ function isEmptyExitOne(err) {
37
+ if (typeof err !== 'object' || err === null)
38
+ return false;
39
+ const e = err;
40
+ return e.status === 1 && !(e.stderr?.toString().trim() ?? '');
41
+ }
16
42
  function normalizeProfile(profile) {
17
43
  const validated = validateProfileName(profile).toLowerCase();
18
44
  return { normalized: validated, isDefault: validated === DEFAULT_PROFILE };
@@ -80,14 +106,25 @@ function loadMacSecret(account) {
80
106
  // A locked keychain throws KeychainLockedError (propagated so the caller can
81
107
  // tell the user to run `noxctl keychain unlock`), not a silent null.
82
108
  const dedicated = activeKeychainPath();
83
- if (dedicated)
84
- return readDedicatedSecret(account, dedicated);
109
+ if (dedicated) {
110
+ try {
111
+ return readDedicatedSecret(account, dedicated);
112
+ }
113
+ catch (err) {
114
+ if (err instanceof KeychainAccessError) {
115
+ throw new CredentialStoreAccessError(err.message);
116
+ }
117
+ throw err;
118
+ }
119
+ }
85
120
  try {
86
- const raw = execFileSync('security', ['find-generic-password', '-a', account, '-s', SERVICE_NAME, '-w'], { encoding: 'utf-8' }).trim();
121
+ const raw = execFileSync('security', ['find-generic-password', '-a', account, '-s', SERVICE_NAME, '-w'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
87
122
  return decodeHexIfNeeded(raw);
88
123
  }
89
- catch {
90
- return null;
124
+ catch (err) {
125
+ if (isMissingSecretError(err))
126
+ return null;
127
+ throw new CredentialStoreAccessError(`macOS Keychain could not be inspected (${commandFailureDetail(err)})`);
91
128
  }
92
129
  }
93
130
  function saveMacSecret(account, secret) {
@@ -177,14 +214,21 @@ function loadLinuxSecret(account) {
177
214
  encoding: 'utf-8',
178
215
  }).trim();
179
216
  }
180
- catch {
181
- return null;
217
+ catch (err) {
218
+ // `secret-tool lookup` uses exit 1 with no stderr when no matching item
219
+ // exists. Transport/session failures include diagnostic stderr (and a
220
+ // missing binary reports ENOENT), so those remain inaccessible.
221
+ if (isMissingSecretError(err) || isEmptyExitOne(err))
222
+ return null;
223
+ throw new CredentialStoreAccessError(`Linux Secret Service could not be inspected (${commandFailureDetail(err)})`);
182
224
  }
183
225
  }
184
226
  function saveLinuxSecret(account, secret) {
185
227
  execFileSync('secret-tool', ['store', '--label=Fortnox MCP credentials', 'service', SERVICE_NAME, 'account', account], { input: secret });
186
228
  }
187
229
  function loadWindowsSecret(file) {
230
+ if (!fsSync.existsSync(file))
231
+ return null;
188
232
  try {
189
233
  return execFileSync('powershell', [
190
234
  '-NoProfile',
@@ -201,8 +245,8 @@ function loadWindowsSecret(file) {
201
245
  ].join('; '),
202
246
  ], { encoding: 'utf-8' }).trim();
203
247
  }
204
- catch {
205
- return null;
248
+ catch (err) {
249
+ throw new CredentialStoreAccessError(`Windows DPAPI credential store could not be inspected (${commandFailureDetail(err)})`);
206
250
  }
207
251
  }
208
252
  function saveWindowsSecret(file, secret) {
@@ -1 +1 @@
1
- {"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../src/credentials-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../src/credentials-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Supported API for hosts that bind one authorized Fortnox transport context
3
+ * before exposing MCP tools. Model-controlled tool arguments cannot select it.
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import type { FortnoxTransport } from './fortnox-client.js';
7
+ export { createFortnoxClient, FortnoxApiError, FortnoxRequestTimeoutError, type CreateFortnoxClientOptions, type FortnoxRateLimitOptions, type FortnoxResponse, type FortnoxTransport, type RequestOptions, } from './fortnox-client.js';
8
+ export { createFortnoxOperations, type FortnoxOperations } from './operations/index.js';
9
+ export interface CreateServerOptions {
10
+ /** Host-authorized transport for exactly one tenant context. */
11
+ transport: FortnoxTransport;
12
+ }
13
+ /** Create an MCP server that fails closed unless one tenant transport is bound. */
14
+ export declare function createServer(options: CreateServerOptions): McpServer;
15
+ //# sourceMappingURL=embedded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedded.d.ts","sourceRoot":"","sources":["../src/embedded.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,0BAA0B,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAKpE"}
@@ -0,0 +1,11 @@
1
+ import { createServer as createLocalServer } from './index.js';
2
+ export { createFortnoxClient, FortnoxApiError, FortnoxRequestTimeoutError, } from './fortnox-client.js';
3
+ export { createFortnoxOperations } from './operations/index.js';
4
+ /** Create an MCP server that fails closed unless one tenant transport is bound. */
5
+ export function createServer(options) {
6
+ if (!options?.transport) {
7
+ throw new Error('The embedded MCP server requires a tenant-bound transport.');
8
+ }
9
+ return createLocalServer({ transport: options.transport });
10
+ }
11
+ //# sourceMappingURL=embedded.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedded.js","sourceRoot":"","sources":["../src/embedded.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,0BAA0B,GAM3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAA0B,MAAM,uBAAuB,CAAC;AAOxF,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,iBAAiB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -9,7 +9,10 @@ export declare class FortnoxApiError extends Error {
9
9
  readonly details?: string | undefined;
10
10
  readonly retryAfterMs?: number | undefined;
11
11
  readonly hint?: string;
12
- constructor(statusCode: number, fortnoxMessage: string, details?: string | undefined, endpoint?: string, retryAfterMs?: number | undefined);
12
+ constructor(statusCode: number, fortnoxMessage: string, details?: string | undefined, endpoint?: string, retryAfterMs?: number | undefined, diagnosticContext?: {
13
+ kind: 'context' | 'profile';
14
+ label: string;
15
+ });
13
16
  }
14
17
  export declare class FortnoxRequestTimeoutError extends Error {
15
18
  readonly outcomeUnknown: boolean;
@@ -30,39 +33,51 @@ export interface RequestOptions {
30
33
  */
31
34
  mutation?: boolean;
32
35
  }
33
- export declare function fortnoxRequest<T>(endpoint: string, options?: RequestOptions): Promise<T>;
36
+ export interface FortnoxRateLimitOptions {
37
+ /** Maximum number of requests admitted during one window. Defaults to 25. */
38
+ limit?: number;
39
+ /** Sliding-window duration in milliseconds. Defaults to 5000. */
40
+ windowMs?: number;
41
+ }
42
+ export interface CreateFortnoxClientOptions {
43
+ /** Supplies a valid access token for this client instance. */
44
+ getAccessToken: () => Promise<string>;
45
+ /** Optional fetch implementation, primarily for hosts and tests. */
46
+ fetch?: typeof globalThis.fetch;
47
+ /** Non-secret label used only to distinguish this client's errors. */
48
+ contextLabel?: string | (() => string | undefined);
49
+ /** Per-client Fortnox request budget. */
50
+ rateLimit?: FortnoxRateLimitOptions;
51
+ }
52
+ export interface FortnoxTransport {
53
+ request<T>(endpoint: string, options?: RequestOptions): Promise<T>;
54
+ requestWithMetadata<T>(endpoint: string, options?: RequestOptions): Promise<FortnoxResponse<T>>;
55
+ requestPdf(endpoint: string, options?: RequestOptions): Promise<Buffer>;
56
+ requestPdfFromMutation(endpoint: string, options?: RequestOptions): Promise<Buffer | undefined>;
57
+ requestFile(endpoint: string, options?: RequestOptions): Promise<FortnoxFile>;
58
+ fetchAllPages<T extends Record<string, unknown>>(endpoint: string, dataKey: string, params?: Record<string, string | number | undefined>): Promise<{
59
+ items: T[];
60
+ totalResources: number;
61
+ }>;
62
+ }
34
63
  /** JSON response together with the conditional metadata returned by newer APIs. */
35
64
  export interface FortnoxResponse<T> {
36
65
  data: T;
37
66
  etag?: string;
38
67
  lastModified?: string;
39
68
  }
69
+ export interface FortnoxFile {
70
+ buffer: Buffer;
71
+ contentType: string;
72
+ }
73
+ /** Create an isolated Fortnox transport for one host-authorized context. */
74
+ export declare function createFortnoxClient(options: CreateFortnoxClientOptions): FortnoxTransport;
75
+ export declare const defaultFortnoxTransport: FortnoxTransport;
76
+ export declare function fortnoxRequest<T>(endpoint: string, options?: RequestOptions): Promise<T>;
40
77
  export declare function fortnoxRequestWithMetadata<T>(endpoint: string, options?: RequestOptions): Promise<FortnoxResponse<T>>;
41
- /**
42
- * Fetch a PDF from one of Fortnox's document endpoints. Shares rate limiting,
43
- * retries, timeouts and error mapping with `fortnoxRequest`.
44
- *
45
- * The returned bytes are validated by their magic number rather than by the
46
- * Content-Type header: Fortnox can answer 200 with a JSON error envelope, and a
47
- * proxy can return an HTML error page, either of which would otherwise be saved
48
- * as `invoice-1001.pdf` and look like success until someone opened the file.
49
- */
50
78
  export declare function fortnoxRequestPdf(endpoint: string, options?: RequestOptions): Promise<Buffer>;
51
- /**
52
- * For endpoints where the PDF is a by-product of a state change — Fortnox's
53
- * `/print` both returns the document and sets `Sent`.
54
- *
55
- * Once the server has answered 2xx the mutation has happened, so nothing about
56
- * the body may raise: a truncated or malformed payload is reported as "no PDF"
57
- * rather than as an error, because throwing here would turn a completed
58
- * accounting change into a reported failure. Always treated as a mutation, so
59
- * it is never auto-retried.
60
- */
61
79
  export declare function fortnoxRequestPdfFromMutation(endpoint: string, options?: RequestOptions): Promise<Buffer | undefined>;
62
- /**
63
- * Fetch all pages of a paginated Fortnox list endpoint.
64
- * `dataKey` is the envelope key (e.g. "Invoices", "Customers").
65
- */
80
+ export declare function fortnoxRequestFile(endpoint: string, options?: RequestOptions): Promise<FortnoxFile>;
66
81
  export declare function fetchAllPages<T extends Record<string, unknown>>(endpoint: string, dataKey: string, params?: Record<string, string | number | undefined>): Promise<{
67
82
  items: T[];
68
83
  totalResources: number;
@@ -1 +1 @@
1
- {"version":3,"file":"fortnox-client.d.ts","sourceRoot":"","sources":["../src/fortnox-client.ts"],"names":[],"mappings":"AA6CA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,KAAK;aAItB,UAAU,EAAE,MAAM;aAClB,cAAc,EAAE,MAAM;aACtB,OAAO,CAAC,EAAE,MAAM;aAEhB,YAAY,CAAC,EAAE,MAAM;IAPvC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAGZ,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,MAAM,YAAA,EAChC,QAAQ,CAAC,EAAE,MAAM,EACD,YAAY,CAAC,EAAE,MAAM,YAAA;CAWxC;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,SAAgB,cAAc,EAAE,OAAO,CAAC;gBAE5B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO;CAStF;AA4ID,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IACrD,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgHD,wBAAsB,cAAc,CAAC,CAAC,EACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,CAAC,CAAC,CAQZ;AAED,mFAAmF;AACnF,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,0BAA0B,CAAC,CAAC,EAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAS7B;AAsDD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgC7B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAM,GACvD,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBjD"}
1
+ {"version":3,"file":"fortnox-client.d.ts","sourceRoot":"","sources":["../src/fortnox-client.ts"],"names":[],"mappings":"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"}
@@ -9,45 +9,16 @@ const MAX_RETRY_DELAY_MS = 30_000;
9
9
  // Rate limiter: max 25 requests per 5 seconds
10
10
  const RATE_WINDOW_MS = 5000;
11
11
  const RATE_LIMIT = 25;
12
- const requestTimestamps = [];
13
- let rateLimitTail = Promise.resolve();
14
- async function waitForRateLimit() {
15
- let release;
16
- const previous = rateLimitTail;
17
- rateLimitTail = new Promise((resolve) => {
18
- release = resolve;
19
- });
20
- await previous;
21
- try {
22
- while (true) {
23
- const now = Date.now();
24
- while (requestTimestamps.length > 0 && requestTimestamps[0] <= now - RATE_WINDOW_MS) {
25
- requestTimestamps.shift();
26
- }
27
- if (requestTimestamps.length < RATE_LIMIT) {
28
- requestTimestamps.push(now);
29
- return;
30
- }
31
- const oldestInWindow = requestTimestamps[0];
32
- const waitMs = Math.max(1, oldestInWindow + RATE_WINDOW_MS - now + 50);
33
- await new Promise((resolve) => setTimeout(resolve, waitMs));
34
- }
35
- }
36
- finally {
37
- release();
38
- }
39
- }
40
12
  export class FortnoxApiError extends Error {
41
13
  statusCode;
42
14
  fortnoxMessage;
43
15
  details;
44
16
  retryAfterMs;
45
17
  hint;
46
- constructor(statusCode, fortnoxMessage, details, endpoint, retryAfterMs) {
18
+ constructor(statusCode, fortnoxMessage, details, endpoint, retryAfterMs, diagnosticContext) {
47
19
  const hint = getErrorHint(statusCode, fortnoxMessage, endpoint);
48
- const profile = getResolvedProfile();
49
- const profileTag = profile.toLowerCase() !== DEFAULT_PROFILE ? `[profile: ${profile}] ` : '';
50
- const parts = [`${profileTag}Fortnox API error (${statusCode}): ${fortnoxMessage}`];
20
+ const contextTag = formatDiagnosticContext(diagnosticContext);
21
+ const parts = [`${contextTag}Fortnox API error (${statusCode}): ${fortnoxMessage}`];
51
22
  if (hint)
52
23
  parts.push(`Hint: ${hint}`);
53
24
  super(parts.join('\n'));
@@ -59,6 +30,17 @@ export class FortnoxApiError extends Error {
59
30
  this.hint = hint;
60
31
  }
61
32
  }
33
+ function formatDiagnosticContext(context) {
34
+ if (!context)
35
+ return '';
36
+ const label = context.label
37
+ .trim()
38
+ .replace(/[\r\n\[\]]+/g, ' ')
39
+ .slice(0, 128);
40
+ if (!label || (context.kind === 'profile' && label.toLowerCase() === DEFAULT_PROFILE))
41
+ return '';
42
+ return `[${context.kind}: ${label}] `;
43
+ }
62
44
  export class FortnoxRequestTimeoutError extends Error {
63
45
  outcomeUnknown;
64
46
  constructor(method, endpoint, timeoutMs, isMutation) {
@@ -102,7 +84,13 @@ function getErrorHint(statusCode, message, endpoint) {
102
84
  }
103
85
  }
104
86
  function endpointToScope(endpoint) {
105
- const path = endpoint.split('?')[0].toLowerCase();
87
+ // Endpoints that select the API root directly (a leading "/3/..." or
88
+ // "/api/...", used by newer product APIs alongside the classic relative
89
+ // "vouchers"-style paths) carry that prefix into the 403 hint lookup below,
90
+ // so strip it before matching against the bare resource-name mapping.
91
+ let path = endpoint.split('?')[0].toLowerCase();
92
+ if (path.startsWith('/3/'))
93
+ path = path.slice(3);
106
94
  const mapping = {
107
95
  articles: 'article',
108
96
  customers: 'customer',
@@ -201,9 +189,9 @@ async function retryWithBackoff(fn, retryable, maxRetries = MAX_RETRIES) {
201
189
  }
202
190
  // Issue the HTTP request and translate a non-2xx answer into a FortnoxApiError.
203
191
  // Returns the raw Response so callers can decide how to read the body.
204
- async function sendRequest(endpoint, options, method, timeoutMs) {
205
- await waitForRateLimit();
206
- const token = await getValidToken();
192
+ async function sendRequest(runtime, endpoint, options, method, timeoutMs) {
193
+ await runtime.waitForRateLimit();
194
+ const token = await runtime.getAccessToken();
207
195
  // The original REST API is rooted at /3, while newer product APIs are rooted
208
196
  // directly at /api. A leading slash deliberately selects the API root.
209
197
  const url = endpoint.startsWith('/')
@@ -246,7 +234,7 @@ async function sendRequest(endpoint, options, method, timeoutMs) {
246
234
  fetchOptions.body = JSON.stringify(options.body);
247
235
  }
248
236
  }
249
- const response = await fetch(url.toString(), fetchOptions);
237
+ const response = await runtime.fetch(url.toString(), fetchOptions);
250
238
  if (!response.ok) {
251
239
  let errorMessage = `HTTP ${response.status}`;
252
240
  let details;
@@ -260,18 +248,18 @@ async function sendRequest(endpoint, options, method, timeoutMs) {
260
248
  catch {
261
249
  // ignore parse errors
262
250
  }
263
- throw new FortnoxApiError(response.status, errorMessage, details, endpoint, retryAfterDelay(response));
251
+ throw new FortnoxApiError(response.status, errorMessage, details, endpoint, retryAfterDelay(response), runtime.getDiagnosticContext());
264
252
  }
265
253
  return response;
266
254
  }
267
255
  // Shared retry/timeout envelope; `readBody` turns a successful Response into T.
268
- async function request(endpoint, options, readBody) {
256
+ async function request(runtime, endpoint, options, readBody) {
269
257
  const method = (options.method || 'GET').toUpperCase();
270
258
  const isMutation = options.mutation ?? !(method === 'GET' || method === 'HEAD' || method === 'OPTIONS');
271
259
  const retryable = !isMutation;
272
260
  const timeoutMs = options.rawBody === undefined ? REQUEST_TIMEOUT_MS : UPLOAD_TIMEOUT_MS;
273
261
  try {
274
- return await retryWithBackoff(async () => readBody(await sendRequest(endpoint, options, method, timeoutMs)), retryable);
262
+ return await retryWithBackoff(async () => readBody(await sendRequest(runtime, endpoint, options, method, timeoutMs)), retryable);
275
263
  }
276
264
  catch (err) {
277
265
  if (isTimeoutError(err)) {
@@ -280,8 +268,8 @@ async function request(endpoint, options, readBody) {
280
268
  throw err;
281
269
  }
282
270
  }
283
- export async function fortnoxRequest(endpoint, options = {}) {
284
- return request(endpoint, options, async (response) => {
271
+ async function requestJson(runtime, endpoint, options = {}) {
272
+ return request(runtime, endpoint, options, async (response) => {
285
273
  // Some endpoints return empty responses (e.g., DELETE)
286
274
  const text = await response.text();
287
275
  if (!text)
@@ -289,8 +277,8 @@ export async function fortnoxRequest(endpoint, options = {}) {
289
277
  return JSON.parse(text);
290
278
  });
291
279
  }
292
- export async function fortnoxRequestWithMetadata(endpoint, options = {}) {
293
- return request(endpoint, options, async (response) => {
280
+ async function requestWithMetadata(runtime, endpoint, options = {}) {
281
+ return request(runtime, endpoint, options, async (response) => {
294
282
  const text = await response.text();
295
283
  return {
296
284
  data: text ? JSON.parse(text) : undefined,
@@ -355,8 +343,8 @@ function fortnoxErrorInBody(buf) {
355
343
  * proxy can return an HTML error page, either of which would otherwise be saved
356
344
  * as `invoice-1001.pdf` and look like success until someone opened the file.
357
345
  */
358
- export async function fortnoxRequestPdf(endpoint, options = {}) {
359
- return request(endpoint, options, async (response) => {
346
+ async function requestPdf(runtime, endpoint, options = {}) {
347
+ return request(runtime, endpoint, options, async (response) => {
360
348
  const buf = Buffer.from(await response.arrayBuffer());
361
349
  if (!startsWithPdfMagic(buf)) {
362
350
  const contentType = response.headers?.get?.('content-type') || 'an unknown content type';
@@ -375,8 +363,8 @@ export async function fortnoxRequestPdf(endpoint, options = {}) {
375
363
  * accounting change into a reported failure. Always treated as a mutation, so
376
364
  * it is never auto-retried.
377
365
  */
378
- export async function fortnoxRequestPdfFromMutation(endpoint, options = {}) {
379
- return request(endpoint, { ...options, mutation: true }, async (response) => {
366
+ async function requestPdfFromMutation(runtime, endpoint, options = {}) {
367
+ return request(runtime, endpoint, { ...options, mutation: true }, async (response) => {
380
368
  let buf;
381
369
  try {
382
370
  buf = Buffer.from(await response.arrayBuffer());
@@ -394,7 +382,7 @@ export async function fortnoxRequestPdfFromMutation(endpoint, options = {}) {
394
382
  // rather than left to the status code.
395
383
  const failure = fortnoxErrorInBody(buf);
396
384
  if (failure) {
397
- throw new FortnoxApiError(response.status, failure.message, `Error code: ${failure.code}`, endpoint);
385
+ throw new FortnoxApiError(response.status, failure.message, `Error code: ${failure.code}`, endpoint, undefined, runtime.getDiagnosticContext());
398
386
  }
399
387
  // Something else came back — an incomplete PDF, or a payload we cannot
400
388
  // interpret. Inconclusive, so treat the action as done but offer no
@@ -402,17 +390,39 @@ export async function fortnoxRequestPdfFromMutation(endpoint, options = {}) {
402
390
  return undefined;
403
391
  });
404
392
  }
393
+ /**
394
+ * Fetch an arbitrary binary file from one of Fortnox's file endpoints (inbox,
395
+ * archive) — the read counterpart to the raw-body uploads elsewhere in this
396
+ * file. Unlike requestPdf this makes no assumption about the file type:
397
+ * voucher/invoice attachments can be PDF, JPEG, PNG, etc., so the caller's
398
+ * Content-Type is trusted rather than checked against a magic number. Still
399
+ * guards against a 2xx response that is actually a JSON error envelope, which
400
+ * would otherwise be saved to disk and look like a valid file.
401
+ */
402
+ async function requestFile(runtime, endpoint, options = {}) {
403
+ return request(runtime, endpoint, options, async (response) => {
404
+ const buffer = Buffer.from(await response.arrayBuffer());
405
+ const error = fortnoxErrorInBody(buffer);
406
+ if (error) {
407
+ throw new FortnoxApiError(response.status, error.message, error.code !== undefined ? `Error code: ${error.code}` : undefined, endpoint, undefined, runtime.getDiagnosticContext());
408
+ }
409
+ const contentType = (response.headers?.get?.('content-type') || 'application/octet-stream')
410
+ .split(';')[0]
411
+ .trim();
412
+ return { buffer, contentType };
413
+ });
414
+ }
405
415
  /**
406
416
  * Fetch all pages of a paginated Fortnox list endpoint.
407
417
  * `dataKey` is the envelope key (e.g. "Invoices", "Customers").
408
418
  */
409
- export async function fetchAllPages(endpoint, dataKey, params = {}) {
419
+ async function fetchPages(runtime, endpoint, dataKey, params = {}) {
410
420
  const all = [];
411
421
  let page = 1;
412
422
  let totalPages = 1;
413
423
  let totalResources = 0;
414
424
  do {
415
- const data = await fortnoxRequest(endpoint, {
425
+ const data = await requestJson(runtime, endpoint, {
416
426
  params: { ...params, page, limit: 100 },
417
427
  });
418
428
  const items = data[dataKey] ?? [];
@@ -424,4 +434,108 @@ export async function fetchAllPages(endpoint, dataKey, params = {}) {
424
434
  } while (page <= totalPages);
425
435
  return { items: all, totalResources };
426
436
  }
437
+ function positiveInteger(value, name) {
438
+ if (!Number.isInteger(value) || value <= 0) {
439
+ throw new TypeError(`${name} must be a positive integer`);
440
+ }
441
+ return value;
442
+ }
443
+ function createRateLimiter(options = {}) {
444
+ const limit = positiveInteger(options.limit ?? RATE_LIMIT, 'rateLimit.limit');
445
+ const windowMs = positiveInteger(options.windowMs ?? RATE_WINDOW_MS, 'rateLimit.windowMs');
446
+ const requestTimestamps = [];
447
+ let tail = Promise.resolve();
448
+ return async () => {
449
+ let release;
450
+ const previous = tail;
451
+ tail = new Promise((resolve) => {
452
+ release = resolve;
453
+ });
454
+ await previous;
455
+ try {
456
+ while (true) {
457
+ const now = Date.now();
458
+ while (requestTimestamps.length > 0 && requestTimestamps[0] <= now - windowMs) {
459
+ requestTimestamps.shift();
460
+ }
461
+ if (requestTimestamps.length < limit) {
462
+ requestTimestamps.push(now);
463
+ return;
464
+ }
465
+ const oldestInWindow = requestTimestamps[0];
466
+ const waitMs = Math.max(1, oldestInWindow + windowMs - now + 50);
467
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
468
+ }
469
+ }
470
+ finally {
471
+ release();
472
+ }
473
+ };
474
+ }
475
+ function createFortnoxClientInternal(options, contextKind) {
476
+ const fetchImpl = options.fetch ??
477
+ ((input, init) => globalThis.fetch(input, init));
478
+ const contextLabel = options.contextLabel;
479
+ const contextProvider = typeof contextLabel === 'function' ? contextLabel : () => contextLabel;
480
+ const runtime = {
481
+ getAccessToken: options.getAccessToken,
482
+ fetch: fetchImpl,
483
+ waitForRateLimit: createRateLimiter(options.rateLimit),
484
+ getDiagnosticContext: () => {
485
+ try {
486
+ const label = contextProvider();
487
+ return label ? { kind: contextKind, label } : undefined;
488
+ }
489
+ catch {
490
+ return undefined;
491
+ }
492
+ },
493
+ };
494
+ return Object.freeze({
495
+ request(endpoint, requestOptions = {}) {
496
+ return requestJson(runtime, endpoint, requestOptions);
497
+ },
498
+ requestWithMetadata(endpoint, requestOptions = {}) {
499
+ return requestWithMetadata(runtime, endpoint, requestOptions);
500
+ },
501
+ requestPdf(endpoint, requestOptions = {}) {
502
+ return requestPdf(runtime, endpoint, requestOptions);
503
+ },
504
+ requestPdfFromMutation(endpoint, requestOptions = {}) {
505
+ return requestPdfFromMutation(runtime, endpoint, requestOptions);
506
+ },
507
+ requestFile(endpoint, requestOptions = {}) {
508
+ return requestFile(runtime, endpoint, requestOptions);
509
+ },
510
+ fetchAllPages(endpoint, dataKey, params = {}) {
511
+ return fetchPages(runtime, endpoint, dataKey, params);
512
+ },
513
+ });
514
+ }
515
+ /** Create an isolated Fortnox transport for one host-authorized context. */
516
+ export function createFortnoxClient(options) {
517
+ return createFortnoxClientInternal(options, 'context');
518
+ }
519
+ export const defaultFortnoxTransport = createFortnoxClientInternal({
520
+ getAccessToken: getValidToken,
521
+ contextLabel: () => getResolvedProfile(),
522
+ }, 'profile');
523
+ export async function fortnoxRequest(endpoint, options = {}) {
524
+ return defaultFortnoxTransport.request(endpoint, options);
525
+ }
526
+ export async function fortnoxRequestWithMetadata(endpoint, options = {}) {
527
+ return defaultFortnoxTransport.requestWithMetadata(endpoint, options);
528
+ }
529
+ export async function fortnoxRequestPdf(endpoint, options = {}) {
530
+ return defaultFortnoxTransport.requestPdf(endpoint, options);
531
+ }
532
+ export async function fortnoxRequestPdfFromMutation(endpoint, options = {}) {
533
+ return defaultFortnoxTransport.requestPdfFromMutation(endpoint, options);
534
+ }
535
+ export async function fortnoxRequestFile(endpoint, options = {}) {
536
+ return defaultFortnoxTransport.requestFile(endpoint, options);
537
+ }
538
+ export async function fetchAllPages(endpoint, dataKey, params = {}) {
539
+ return defaultFortnoxTransport.fetchAllPages(endpoint, dataKey, params);
540
+ }
427
541
  //# sourceMappingURL=fortnox-client.js.map