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.
- package/README.md +50 -4
- package/dist/auth.d.ts +18 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +129 -15
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +144 -33
- package/dist/cli.js.map +1 -1
- package/dist/credentials-store.d.ts +3 -0
- package/dist/credentials-store.d.ts.map +1 -1
- package/dist/credentials-store.js +54 -10
- package/dist/credentials-store.js.map +1 -1
- package/dist/embedded.d.ts +15 -0
- package/dist/embedded.d.ts.map +1 -0
- package/dist/embedded.js +11 -0
- package/dist/embedded.js.map +1 -0
- package/dist/fortnox-client.d.ts +40 -25
- package/dist/fortnox-client.d.ts.map +1 -1
- package/dist/fortnox-client.js +165 -51
- package/dist/fortnox-client.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -35
- package/dist/index.js.map +1 -1
- package/dist/keychain-target.d.ts +3 -0
- package/dist/keychain-target.d.ts.map +1 -1
- package/dist/keychain-target.js +28 -7
- package/dist/keychain-target.js.map +1 -1
- package/dist/operations/absencetransactions.d.ts +9 -6
- package/dist/operations/absencetransactions.d.ts.map +1 -1
- package/dist/operations/absencetransactions.js +42 -33
- package/dist/operations/absencetransactions.js.map +1 -1
- package/dist/operations/accounts.d.ts +6 -3
- package/dist/operations/accounts.d.ts.map +1 -1
- package/dist/operations/accounts.js +28 -24
- package/dist/operations/accounts.js.map +1 -1
- package/dist/operations/analytics.d.ts +35 -0
- package/dist/operations/analytics.d.ts.map +1 -1
- package/dist/operations/analytics.js +59 -35
- package/dist/operations/analytics.js.map +1 -1
- package/dist/operations/articles.d.ts +9 -6
- package/dist/operations/articles.d.ts.map +1 -1
- package/dist/operations/articles.js +36 -32
- package/dist/operations/articles.js.map +1 -1
- package/dist/operations/attendancetransactions.d.ts +9 -6
- package/dist/operations/attendancetransactions.d.ts.map +1 -1
- package/dist/operations/attendancetransactions.js +45 -36
- package/dist/operations/attendancetransactions.js.map +1 -1
- package/dist/operations/company.d.ts +5 -1
- package/dist/operations/company.d.ts.map +1 -1
- package/dist/operations/company.js +8 -4
- package/dist/operations/company.js.map +1 -1
- package/dist/operations/contracts.d.ts +12 -9
- package/dist/operations/contracts.d.ts.map +1 -1
- package/dist/operations/contracts.js +59 -47
- package/dist/operations/contracts.js.map +1 -1
- package/dist/operations/costcenters.d.ts +10 -7
- package/dist/operations/costcenters.d.ts.map +1 -1
- package/dist/operations/costcenters.js +39 -35
- package/dist/operations/costcenters.js.map +1 -1
- package/dist/operations/customers.d.ts +9 -6
- package/dist/operations/customers.d.ts.map +1 -1
- package/dist/operations/customers.js +46 -42
- package/dist/operations/customers.js.map +1 -1
- package/dist/operations/employees.d.ts +9 -6
- package/dist/operations/employees.d.ts.map +1 -1
- package/dist/operations/employees.js +35 -31
- package/dist/operations/employees.js.map +1 -1
- package/dist/operations/financial-reports.d.ts +7 -2
- package/dist/operations/financial-reports.d.ts.map +1 -1
- package/dist/operations/financial-reports.js +169 -165
- package/dist/operations/financial-reports.js.map +1 -1
- package/dist/operations/financial-years.d.ts +8 -5
- package/dist/operations/financial-years.d.ts.map +1 -1
- package/dist/operations/financial-years.js +33 -29
- package/dist/operations/financial-years.js.map +1 -1
- package/dist/operations/index.d.ts +311 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +64 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/invoice-payments.d.ts +10 -7
- package/dist/operations/invoice-payments.d.ts.map +1 -1
- package/dist/operations/invoice-payments.js +45 -35
- package/dist/operations/invoice-payments.js.map +1 -1
- package/dist/operations/invoices.d.ts +34 -30
- package/dist/operations/invoices.d.ts.map +1 -1
- package/dist/operations/invoices.js +225 -113
- package/dist/operations/invoices.js.map +1 -1
- package/dist/operations/offers.d.ts +11 -8
- package/dist/operations/offers.d.ts.map +1 -1
- package/dist/operations/offers.js +54 -43
- package/dist/operations/offers.js.map +1 -1
- package/dist/operations/orders.d.ts +10 -7
- package/dist/operations/orders.d.ts.map +1 -1
- package/dist/operations/orders.js +43 -39
- package/dist/operations/orders.js.map +1 -1
- package/dist/operations/pricelists.d.ts +16 -10
- package/dist/operations/pricelists.d.ts.map +1 -1
- package/dist/operations/pricelists.js +56 -48
- package/dist/operations/pricelists.js.map +1 -1
- package/dist/operations/projects.d.ts +9 -6
- package/dist/operations/projects.d.ts.map +1 -1
- package/dist/operations/projects.js +34 -30
- package/dist/operations/projects.js.map +1 -1
- package/dist/operations/recurrings.d.ts +14 -10
- package/dist/operations/recurrings.d.ts.map +1 -1
- package/dist/operations/recurrings.js +74 -59
- package/dist/operations/recurrings.js.map +1 -1
- package/dist/operations/salarytransactions.d.ts +9 -6
- package/dist/operations/salarytransactions.d.ts.map +1 -1
- package/dist/operations/salarytransactions.js +41 -32
- package/dist/operations/salarytransactions.js.map +1 -1
- package/dist/operations/scheduletimes.d.ts +7 -3
- package/dist/operations/scheduletimes.d.ts.map +1 -1
- package/dist/operations/scheduletimes.js +26 -22
- package/dist/operations/scheduletimes.js.map +1 -1
- package/dist/operations/supplier-invoice-payments.d.ts +9 -6
- package/dist/operations/supplier-invoice-payments.d.ts.map +1 -1
- package/dist/operations/supplier-invoice-payments.js +38 -29
- package/dist/operations/supplier-invoice-payments.js.map +1 -1
- package/dist/operations/supplier-invoices.d.ts +9 -6
- package/dist/operations/supplier-invoices.d.ts.map +1 -1
- package/dist/operations/supplier-invoices.js +41 -32
- package/dist/operations/supplier-invoices.js.map +1 -1
- package/dist/operations/suppliers.d.ts +9 -6
- package/dist/operations/suppliers.d.ts.map +1 -1
- package/dist/operations/suppliers.js +36 -32
- package/dist/operations/suppliers.js.map +1 -1
- package/dist/operations/tax.d.ts +5 -1
- package/dist/operations/tax.d.ts.map +1 -1
- package/dist/operations/tax.js +43 -39
- package/dist/operations/tax.js.map +1 -1
- package/dist/operations/taxreductions.d.ts +8 -5
- package/dist/operations/taxreductions.d.ts.map +1 -1
- package/dist/operations/taxreductions.js +28 -24
- package/dist/operations/taxreductions.js.map +1 -1
- package/dist/operations/vouchers.d.ts +26 -8
- package/dist/operations/vouchers.d.ts.map +1 -1
- package/dist/operations/vouchers.js +174 -122
- package/dist/operations/vouchers.js.map +1 -1
- package/dist/schema-audit-mappings.d.ts +9 -0
- package/dist/schema-audit-mappings.d.ts.map +1 -0
- package/dist/schema-audit-mappings.js +45 -0
- package/dist/schema-audit-mappings.js.map +1 -0
- package/dist/schema-audit.d.ts +45 -0
- package/dist/schema-audit.d.ts.map +1 -0
- package/dist/schema-audit.js +132 -0
- package/dist/schema-audit.js.map +1 -0
- package/dist/scope-probes.d.ts.map +1 -1
- package/dist/scope-probes.js +1 -0
- package/dist/scope-probes.js.map +1 -1
- package/dist/strict-mcp-server.d.ts +17 -0
- package/dist/strict-mcp-server.d.ts.map +1 -0
- package/dist/strict-mcp-server.js +35 -0
- package/dist/strict-mcp-server.js.map +1 -0
- package/dist/tools/absencetransactions.d.ts +2 -1
- package/dist/tools/absencetransactions.d.ts.map +1 -1
- package/dist/tools/absencetransactions.js +3 -2
- package/dist/tools/absencetransactions.js.map +1 -1
- package/dist/tools/analytics.d.ts +2 -1
- package/dist/tools/analytics.d.ts.map +1 -1
- package/dist/tools/analytics.js +3 -2
- package/dist/tools/analytics.js.map +1 -1
- package/dist/tools/articles.d.ts +2 -1
- package/dist/tools/articles.d.ts.map +1 -1
- package/dist/tools/articles.js +3 -2
- package/dist/tools/articles.js.map +1 -1
- package/dist/tools/attendancetransactions.d.ts +2 -1
- package/dist/tools/attendancetransactions.d.ts.map +1 -1
- package/dist/tools/attendancetransactions.js +3 -2
- package/dist/tools/attendancetransactions.js.map +1 -1
- package/dist/tools/bookkeeping.d.ts +2 -1
- package/dist/tools/bookkeeping.d.ts.map +1 -1
- package/dist/tools/bookkeeping.js +83 -5
- package/dist/tools/bookkeeping.js.map +1 -1
- package/dist/tools/company.d.ts +2 -1
- package/dist/tools/company.d.ts.map +1 -1
- package/dist/tools/company.js +3 -2
- package/dist/tools/company.js.map +1 -1
- package/dist/tools/contracts.d.ts +2 -1
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +3 -2
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/costcenters.d.ts +2 -1
- package/dist/tools/costcenters.d.ts.map +1 -1
- package/dist/tools/costcenters.js +3 -2
- package/dist/tools/costcenters.js.map +1 -1
- package/dist/tools/customers.d.ts +2 -1
- package/dist/tools/customers.d.ts.map +1 -1
- package/dist/tools/customers.js +3 -2
- package/dist/tools/customers.js.map +1 -1
- package/dist/tools/employees.d.ts +2 -1
- package/dist/tools/employees.d.ts.map +1 -1
- package/dist/tools/employees.js +3 -2
- package/dist/tools/employees.js.map +1 -1
- package/dist/tools/financial-reports.d.ts +2 -1
- package/dist/tools/financial-reports.d.ts.map +1 -1
- package/dist/tools/financial-reports.js +3 -2
- package/dist/tools/financial-reports.js.map +1 -1
- package/dist/tools/financial-years.d.ts +2 -1
- package/dist/tools/financial-years.d.ts.map +1 -1
- package/dist/tools/financial-years.js +3 -2
- package/dist/tools/financial-years.js.map +1 -1
- package/dist/tools/invoice-payments.d.ts +2 -1
- package/dist/tools/invoice-payments.d.ts.map +1 -1
- package/dist/tools/invoice-payments.js +3 -2
- package/dist/tools/invoice-payments.js.map +1 -1
- package/dist/tools/invoices.d.ts +2 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +100 -21
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/offers.d.ts +2 -1
- package/dist/tools/offers.d.ts.map +1 -1
- package/dist/tools/offers.js +50 -19
- package/dist/tools/offers.js.map +1 -1
- package/dist/tools/orders.d.ts +2 -1
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +58 -18
- package/dist/tools/orders.js.map +1 -1
- package/dist/tools/pricelists.d.ts +2 -1
- package/dist/tools/pricelists.d.ts.map +1 -1
- package/dist/tools/pricelists.js +3 -2
- package/dist/tools/pricelists.js.map +1 -1
- package/dist/tools/projects.d.ts +2 -1
- package/dist/tools/projects.d.ts.map +1 -1
- package/dist/tools/projects.js +3 -2
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/recurrings.d.ts +2 -1
- package/dist/tools/recurrings.d.ts.map +1 -1
- package/dist/tools/recurrings.js +3 -2
- package/dist/tools/recurrings.js.map +1 -1
- package/dist/tools/salarytransactions.d.ts +2 -1
- package/dist/tools/salarytransactions.d.ts.map +1 -1
- package/dist/tools/salarytransactions.js +3 -2
- package/dist/tools/salarytransactions.js.map +1 -1
- package/dist/tools/scheduletimes.d.ts +2 -1
- package/dist/tools/scheduletimes.d.ts.map +1 -1
- package/dist/tools/scheduletimes.js +3 -2
- package/dist/tools/scheduletimes.js.map +1 -1
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +5 -4
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/supplier-invoice-payments.d.ts +2 -1
- package/dist/tools/supplier-invoice-payments.d.ts.map +1 -1
- package/dist/tools/supplier-invoice-payments.js +3 -2
- package/dist/tools/supplier-invoice-payments.js.map +1 -1
- package/dist/tools/supplier-invoices.d.ts +2 -1
- package/dist/tools/supplier-invoices.d.ts.map +1 -1
- package/dist/tools/supplier-invoices.js +47 -6
- package/dist/tools/supplier-invoices.js.map +1 -1
- package/dist/tools/suppliers.d.ts +2 -1
- package/dist/tools/suppliers.d.ts.map +1 -1
- package/dist/tools/suppliers.js +3 -2
- package/dist/tools/suppliers.js.map +1 -1
- package/dist/tools/tax.d.ts +2 -1
- package/dist/tools/tax.d.ts.map +1 -1
- package/dist/tools/tax.js +3 -2
- package/dist/tools/tax.js.map +1 -1
- package/dist/tools/taxreductions.d.ts +2 -1
- package/dist/tools/taxreductions.d.ts.map +1 -1
- package/dist/tools/taxreductions.js +3 -2
- package/dist/tools/taxreductions.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/views.d.ts +2 -0
- package/dist/views.d.ts.map +1 -1
- package/dist/views.js +11 -0
- package/dist/views.js.map +1 -1
- package/docs/embedded.md +60 -0
- package/package.json +23 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials-store.d.ts","sourceRoot":"","sources":["../src/credentials-store.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,SAAS,qBAAqB;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACpD,CAAC;AACD,SAAS,4BAA4B;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACrD,CAAC;AACD,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,KAAK,eAAe,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,eAAe,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,6EAA6E;AAC7E,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AA4BvC,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAG7B,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,OAAe,EACf,UAAkB;IAElB,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7D,IAAI,CAAC,KAAK,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAM,CAAC;IACjB,MAAM,CAAC,GAAG,KAAM,CAAC;IACjB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACvE,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC/D,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACrE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,mEAAmE;IACnE,wEAAwE;IACxE,sDAAsD;IACtD,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,8EAA8E;IAC9E,6EAA6E;IAC7E,qEAAqE;IACrE,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,IAAI,SAAS;QAAE,OAAO,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CACtB,UAAU,EACV,CAAC,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,EAClE,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC,IAAI,EAAE,CAAC;QACT,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,MAAc;IACpD,0EAA0E;IAC1E,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IAElF,uEAAuE;IACvE,6EAA6E;IAC7E,2DAA2D;IAC3D,MAAM,YAAY,GAAG,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAEhD,kFAAkF;IAClF,kFAAkF;IAClF,MAAM,WAAW,GAAG;;;;;;;iBAOL,YAAY;iBACZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BvB,CAAC;IAEA,IAAI,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;YAC5D,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,8BAA8B,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yEAAyE;QACzE,uEAAuE;QACvE,0EAA0E;QAC1E,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,2EAA2E,MAAM,KAAK;YACpF,kFAAkF;YAClF,yFAAyF;YACzF,gBAAgB,CACnB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;YAC1F,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc;IACtD,YAAY,CACV,aAAa,EACb,CAAC,OAAO,EAAE,iCAAiC,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,EACzF,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,OAAO,YAAY,CACjB,YAAY,EACZ;YACE,YAAY;YACZ,iBAAiB;YACjB,UAAU;YACV;gBACE,oEAAoE;gBACpE,wCAAwC;gBACxC,wCAAwC;gBACxC,wBAAwB,IAAI,gBAAgB;gBAC5C,oEAAoE,IAAI,KAAK;gBAC7E,sJAAsJ;gBACtJ,yCAAyC;aAC1C,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,EACD,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAc;IACrD,uEAAuE;IACvE,kEAAkE;IAClE,MAAM,MAAM,GAAG,SAAS,CACtB,YAAY,EACZ;QACE,YAAY;QACZ,iBAAiB;QACjB,UAAU;QACV;YACE,oEAAoE;YACpE,wCAAwC;YACxC,wCAAwC;YACxC,oCAAoC,SAAS,EAAE,eAAe;YAC9D,oCAAoC;YACpC,iDAAiD;YACjD,oJAAoJ;YACpJ,4BAA4B,IAAI,kEAAkE;SACnG,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,EACD,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CACrC,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,EAAE,CAAC,qBAAqB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,WAAmB;IAC3D,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,eAAe;IAEjC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,MAAM,UAAU,GAAG,eAAe,CAAC,uBAAuB,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAE5F,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACzD,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB;YACzE,UAAU;SACX,CAAC;IACJ,CAAC;IACD,IAAI,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvE,IAAI,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAE1E,MAAM,SAAS,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACpD,IAAI,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,WAAmB,EAAE,MAAc;IAC1E,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,UAAkB,eAAe,EACjC,UAAiC,EAAE;IAEnC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5D,oEAAoE;IACpE,qEAAqE;IACrE,+BAA+B;IAC/B,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAExF,yEAAyE;IACzE,0EAA0E;IAC1E,yEAAyE;IACzE,4EAA4E;IAC5E,kEAAkE;IAClE,IAAI,iBAAiB,IAAI,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,cAAc,CAAC,uBAAuB,EAAE,4BAA4B,EAAE,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,yDAAyD,GAAG,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,2BAA2B,EAAE,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,YAAY,CAAC,UAAU,EAAE;YACvB,yBAAyB;YACzB,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,YAAY;YACZ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,CAAC;QACH,YAAY,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,2EAA2E;QAC3E,sEAAsE;QACtE,wEAAwE;QACxE,iDAAiD;QACjD,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,WAAmB;IACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC1E,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAkB,eAAe;IAC1E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,aAAa,GAAG,MAAM,eAAe,CACzC,uBAAuB,EACvB,4BAA4B,EAAE,CAC/B,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,eAAe,CACtC,eAAe,CAAC,UAAU,CAAC,EAC3B,sBAAsB,CAAC,UAAU,CAAC,CACnC,CAAC;QACF,MAAM,2BAA2B,EAAE,CAAC;QACpC,OAAO,aAAa,IAAI,UAAU,CAAC;IACrC,CAAC;IAED,OAAO,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;AAC1F,CAAC"}
|
|
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"}
|
package/dist/embedded.js
ADDED
|
@@ -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"}
|
package/dist/fortnox-client.d.ts
CHANGED
|
@@ -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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"fortnox-client.d.ts","sourceRoot":"","sources":["../src/fortnox-client.ts"],"names":[],"mappings":"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"}
|
package/dist/fortnox-client.js
CHANGED
|
@@ -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
|
|
49
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|