@unifetch/fortnox 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patched.cjs","names":[],"sources":["../src/patched.ts"],"sourcesContent":["import type { Routes } from \"./types/official-routes\";\r\n\r\nconst METHODS = [\"get\", \"post\", \"put\", \"delete\", \"patch\"] as const;\r\n\r\ntype RequestMethod = (typeof METHODS)[number];\r\n\r\ntype RequestOptions = {\r\n path: string;\r\n method: RequestMethod;\r\n query?: Record<string, unknown>;\r\n params?: Record<string, unknown>;\r\n body?: unknown;\r\n};\r\n\r\ntype FortnoxErrorResponse = {\r\n ErrorInformation: {\r\n error: number;\r\n message: string;\r\n code: number;\r\n };\r\n};\r\n\r\ntype ErrorResponse = {\r\n ErrorSource: \"fortnox\" | \"unknown\";\r\n ErrorInformation: {\r\n error: number;\r\n message: string;\r\n code: number;\r\n };\r\n};\r\n\r\nexport type InitFortnoxOptions =\r\n | { accessToken: string }\r\n | { proxy: { baseUrl: string; apiKey: string; tenantId: string } };\r\n\r\ntype FortnoxInput<\r\n TPath extends keyof Routes,\r\n TMethod extends keyof Routes[TPath],\r\n> = Routes[TPath][TMethod] extends { request: infer R } ? R : never;\r\n\r\ntype OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };\r\n\r\ntype FortnoxInputCleaned<\r\n TPath extends keyof Routes,\r\n TMethod extends keyof Routes[TPath],\r\n> = OmitNever<FortnoxInput<TPath, TMethod>>;\r\n\r\ntype FortnoxOutput<\r\n TPath extends keyof Routes,\r\n TMethod extends keyof Routes[TPath],\r\n> = Routes[TPath][TMethod] extends { response: { body: infer B } } ? B : never;\r\n\r\ntype FortnoxResult<TData> = Promise<\r\n { error: ErrorResponse; data: null } | { error: null; data: TData }\r\n>;\r\n\r\ntype FortnoxMethods<TPath extends keyof Routes> = {\r\n [TMethod in keyof Routes[TPath]]: Routes[TPath][TMethod] extends {\r\n request: { params: never; body: never };\r\n }\r\n ? (\r\n options?: FortnoxInputCleaned<TPath, TMethod>,\r\n ) => FortnoxResult<FortnoxOutput<TPath, TMethod>>\r\n : (\r\n options: FortnoxInputCleaned<TPath, TMethod>,\r\n ) => FortnoxResult<FortnoxOutput<TPath, TMethod>>;\r\n};\r\n\r\nasync function request(\r\n reqOptions: RequestOptions,\r\n initOptions: InitFortnoxOptions,\r\n) {\r\n try {\r\n let headers: Record<string, string>;\r\n let baseUrl: string;\r\n\r\n if (\"accessToken\" in initOptions) {\r\n headers = {\r\n Authorization: `Bearer ${initOptions.accessToken}`,\r\n };\r\n baseUrl = \"https://api.fortnox.se\";\r\n } else {\r\n headers = {\r\n \"x-api-key\": initOptions.proxy.apiKey,\r\n \"x-tenant-id\": initOptions.proxy.tenantId,\r\n };\r\n baseUrl = initOptions.proxy.baseUrl;\r\n }\r\n\r\n const searchParams = new URLSearchParams();\r\n if (reqOptions.query) {\r\n Object.entries(reqOptions.query).forEach(([key, value]) => {\r\n searchParams.append(key, String(value));\r\n });\r\n }\r\n\r\n let path = reqOptions.path;\r\n if (reqOptions.params) {\r\n Object.entries(reqOptions.params).forEach(([key, value]) => {\r\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)));\r\n });\r\n }\r\n\r\n const url = `${baseUrl}${path}${searchParams.size > 0 ? `?${searchParams.toString()}` : \"\"}`;\r\n\r\n const response = await fetch(url, {\r\n method: reqOptions.method.toUpperCase(),\r\n body: reqOptions.body ? JSON.stringify(reqOptions.body) : null,\r\n headers,\r\n });\r\n\r\n const responseData = await response.json();\r\n\r\n if (response.status < 300) {\r\n return { error: null, data: responseData };\r\n } else {\r\n return {\r\n error: {\r\n ErrorSource: \"fortnox\" as const,\r\n ErrorInformation: (responseData as FortnoxErrorResponse)\r\n .ErrorInformation,\r\n } satisfies ErrorResponse,\r\n data: null,\r\n };\r\n }\r\n } catch (e: unknown) {\r\n return {\r\n error: {\r\n ErrorSource: \"unknown\" as const,\r\n ErrorInformation: {\r\n message: e instanceof Error ? e.message : String(e),\r\n error: -1,\r\n code: -1,\r\n },\r\n } satisfies ErrorResponse,\r\n data: null,\r\n };\r\n }\r\n}\r\n\r\ntype FortnoxFn = <TPath extends keyof Routes>(path: TPath) => FortnoxMethods<TPath>;\r\n\r\nexport function initFortnox(options: { accessToken: string }): FortnoxFn;\r\nexport function initFortnox(options: { proxy: { baseUrl: string; apiKey: string; tenantId: string } }): FortnoxFn;\r\nexport function initFortnox(initOptions: InitFortnoxOptions): FortnoxFn {\r\n return function fortnox<TPath extends keyof Routes>(\r\n path: TPath,\r\n ): FortnoxMethods<TPath> {\r\n return Object.fromEntries(\r\n METHODS.map((method) => [\r\n method,\r\n (options: Record<string, unknown>) =>\r\n request({ path, method, ...options }, initOptions),\r\n ]),\r\n ) as unknown as FortnoxMethods<TPath>;\r\n };\r\n}\r\n"],"mappings":";;;AAEA,MAAM,UAAU;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAQ;AAkEzD,eAAe,QACb,YACA,aACA;AACA,KAAI;EACF,IAAI;EACJ,IAAI;AAEJ,MAAI,iBAAiB,aAAa;AAChC,aAAU,EACR,eAAe,UAAU,YAAY,eACtC;AACD,aAAU;SACL;AACL,aAAU;IACR,aAAa,YAAY,MAAM;IAC/B,eAAe,YAAY,MAAM;IAClC;AACD,aAAU,YAAY,MAAM;;EAG9B,MAAM,eAAe,IAAI,iBAAiB;AAC1C,MAAI,WAAW,MACb,QAAO,QAAQ,WAAW,MAAM,CAAC,SAAS,CAAC,KAAK,WAAW;AACzD,gBAAa,OAAO,KAAK,OAAO,MAAM,CAAC;IACvC;EAGJ,IAAI,OAAO,WAAW;AACtB,MAAI,WAAW,OACb,QAAO,QAAQ,WAAW,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW;AAC1D,UAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,mBAAmB,OAAO,MAAM,CAAC,CAAC;IAClE;EAGJ,MAAM,MAAM,GAAG,UAAU,OAAO,aAAa,OAAO,IAAI,IAAI,aAAa,UAAU,KAAK;EAExF,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ,WAAW,OAAO,aAAa;GACvC,MAAM,WAAW,OAAO,KAAK,UAAU,WAAW,KAAK,GAAG;GAC1D;GACD,CAAC;EAEF,MAAM,eAAe,MAAM,SAAS,MAAM;AAE1C,MAAI,SAAS,SAAS,IACpB,QAAO;GAAE,OAAO;GAAM,MAAM;GAAc;MAE1C,QAAO;GACL,OAAO;IACL,aAAa;IACb,kBAAmB,aAChB;IACJ;GACD,MAAM;GACP;UAEI,GAAY;AACnB,SAAO;GACL,OAAO;IACL,aAAa;IACb,kBAAkB;KAChB,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;KACnD,OAAO;KACP,MAAM;KACP;IACF;GACD,MAAM;GACP;;;AAQL,SAAgB,YAAY,aAA4C;AACtE,QAAO,SAAS,QACd,MACuB;AACvB,SAAO,OAAO,YACZ,QAAQ,KAAK,WAAW,CACtB,SACC,YACC,QAAQ;GAAE;GAAM;GAAQ,GAAG;GAAS,EAAE,YAAY,CACrD,CAAC,CACH"}
@@ -0,0 +1,57 @@
1
+ import { t as Routes } from "./official-routes-UGPWNmls.cjs";
2
+
3
+ //#region src/patched.d.ts
4
+ type ErrorResponse = {
5
+ ErrorSource: "fortnox" | "unknown";
6
+ ErrorInformation: {
7
+ error: number;
8
+ message: string;
9
+ code: number;
10
+ };
11
+ };
12
+ type InitFortnoxOptions = {
13
+ accessToken: string;
14
+ } | {
15
+ proxy: {
16
+ baseUrl: string;
17
+ apiKey: string;
18
+ tenantId: string;
19
+ };
20
+ };
21
+ type FortnoxInput<TPath extends keyof Routes, TMethod extends keyof Routes[TPath]> = Routes[TPath][TMethod] extends {
22
+ request: infer R;
23
+ } ? R : never;
24
+ type OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };
25
+ type FortnoxInputCleaned<TPath extends keyof Routes, TMethod extends keyof Routes[TPath]> = OmitNever<FortnoxInput<TPath, TMethod>>;
26
+ type FortnoxOutput<TPath extends keyof Routes, TMethod extends keyof Routes[TPath]> = Routes[TPath][TMethod] extends {
27
+ response: {
28
+ body: infer B;
29
+ };
30
+ } ? B : never;
31
+ type FortnoxResult<TData> = Promise<{
32
+ error: ErrorResponse;
33
+ data: null;
34
+ } | {
35
+ error: null;
36
+ data: TData;
37
+ }>;
38
+ type FortnoxMethods<TPath extends keyof Routes> = { [TMethod in keyof Routes[TPath]]: Routes[TPath][TMethod] extends {
39
+ request: {
40
+ params: never;
41
+ body: never;
42
+ };
43
+ } ? (options?: FortnoxInputCleaned<TPath, TMethod>) => FortnoxResult<FortnoxOutput<TPath, TMethod>> : (options: FortnoxInputCleaned<TPath, TMethod>) => FortnoxResult<FortnoxOutput<TPath, TMethod>> };
44
+ type FortnoxFn = <TPath extends keyof Routes>(path: TPath) => FortnoxMethods<TPath>;
45
+ declare function initFortnox(options: {
46
+ accessToken: string;
47
+ }): FortnoxFn;
48
+ declare function initFortnox(options: {
49
+ proxy: {
50
+ baseUrl: string;
51
+ apiKey: string;
52
+ tenantId: string;
53
+ };
54
+ }): FortnoxFn;
55
+ //#endregion
56
+ export { InitFortnoxOptions, initFortnox };
57
+ //# sourceMappingURL=patched.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patched.d.cts","names":[],"sources":["../src/patched.ts"],"mappings":";;;KAsBK,aAAA;EACH,WAAA;EACA,gBAAA;IACE,KAAA;IACA,OAAA;IACA,IAAA;EAAA;AAAA;AAAA,KAIQ,kBAAA;EACN,WAAA;AAAA;EACA,KAAA;IAAS,OAAA;IAAiB,MAAA;IAAgB,QAAA;EAAA;AAAA;AAAA,KAE3C,YAAA,qBACiB,MAAA,wBACE,MAAA,CAAO,KAAA,KAC3B,MAAA,CAAO,KAAA,EAAO,OAAA;EAAmB,OAAA;AAAA,IAAqB,CAAA;AAAA,KAErD,SAAA,oBAA6B,CAAA,IAAK,CAAA,CAAE,CAAA,0BAA2B,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,KAErE,mBAAA,qBACiB,MAAA,wBACE,MAAA,CAAO,KAAA,KAC3B,SAAA,CAAU,YAAA,CAAa,KAAA,EAAO,OAAA;AAAA,KAE7B,aAAA,qBACiB,MAAA,wBACE,MAAA,CAAO,KAAA,KAC3B,MAAA,CAAO,KAAA,EAAO,OAAA;EAAmB,QAAA;IAAY,IAAA;EAAA;AAAA,IAAoB,CAAA;AAAA,KAEhE,aAAA,UAAuB,OAAA;EACxB,KAAA,EAAO,aAAA;EAAe,IAAA;AAAA;EAAiB,KAAA;EAAa,IAAA,EAAM,KAAA;AAAA;AAAA,KAGzD,cAAA,qBAAmC,MAAA,wBACpB,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,EAAO,OAAA;EAC9C,OAAA;IAAW,MAAA;IAAe,IAAA;EAAA;AAAA,KAG1B,OAAA,GAAU,mBAAA,CAAoB,KAAA,EAAO,OAAA,MAClC,aAAA,CAAc,aAAA,CAAc,KAAA,EAAO,OAAA,MAEtC,OAAA,EAAS,mBAAA,CAAoB,KAAA,EAAO,OAAA,MACjC,aAAA,CAAc,aAAA,CAAc,KAAA,EAAO,OAAA;AAAA,KA2ErC,SAAA,wBAAiC,MAAA,EAAQ,IAAA,EAAM,KAAA,KAAU,cAAA,CAAe,KAAA;AAAA,iBAE7D,WAAA,CAAY,OAAA;EAAW,WAAA;AAAA,IAAwB,SAAA;AAAA,iBAC/C,WAAA,CAAY,OAAA;EAAW,KAAA;IAAS,OAAA;IAAiB,MAAA;IAAgB,QAAA;EAAA;AAAA,IAAuB,SAAA"}
@@ -0,0 +1,57 @@
1
+ import { t as Routes } from "./official-routes-CO9qO54b.mjs";
2
+
3
+ //#region src/patched.d.ts
4
+ type ErrorResponse = {
5
+ ErrorSource: "fortnox" | "unknown";
6
+ ErrorInformation: {
7
+ error: number;
8
+ message: string;
9
+ code: number;
10
+ };
11
+ };
12
+ type InitFortnoxOptions = {
13
+ accessToken: string;
14
+ } | {
15
+ proxy: {
16
+ baseUrl: string;
17
+ apiKey: string;
18
+ tenantId: string;
19
+ };
20
+ };
21
+ type FortnoxInput<TPath extends keyof Routes, TMethod extends keyof Routes[TPath]> = Routes[TPath][TMethod] extends {
22
+ request: infer R;
23
+ } ? R : never;
24
+ type OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };
25
+ type FortnoxInputCleaned<TPath extends keyof Routes, TMethod extends keyof Routes[TPath]> = OmitNever<FortnoxInput<TPath, TMethod>>;
26
+ type FortnoxOutput<TPath extends keyof Routes, TMethod extends keyof Routes[TPath]> = Routes[TPath][TMethod] extends {
27
+ response: {
28
+ body: infer B;
29
+ };
30
+ } ? B : never;
31
+ type FortnoxResult<TData> = Promise<{
32
+ error: ErrorResponse;
33
+ data: null;
34
+ } | {
35
+ error: null;
36
+ data: TData;
37
+ }>;
38
+ type FortnoxMethods<TPath extends keyof Routes> = { [TMethod in keyof Routes[TPath]]: Routes[TPath][TMethod] extends {
39
+ request: {
40
+ params: never;
41
+ body: never;
42
+ };
43
+ } ? (options?: FortnoxInputCleaned<TPath, TMethod>) => FortnoxResult<FortnoxOutput<TPath, TMethod>> : (options: FortnoxInputCleaned<TPath, TMethod>) => FortnoxResult<FortnoxOutput<TPath, TMethod>> };
44
+ type FortnoxFn = <TPath extends keyof Routes>(path: TPath) => FortnoxMethods<TPath>;
45
+ declare function initFortnox(options: {
46
+ accessToken: string;
47
+ }): FortnoxFn;
48
+ declare function initFortnox(options: {
49
+ proxy: {
50
+ baseUrl: string;
51
+ apiKey: string;
52
+ tenantId: string;
53
+ };
54
+ }): FortnoxFn;
55
+ //#endregion
56
+ export { InitFortnoxOptions, initFortnox };
57
+ //# sourceMappingURL=patched.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patched.d.mts","names":[],"sources":["../src/patched.ts"],"mappings":";;;KAsBK,aAAA;EACH,WAAA;EACA,gBAAA;IACE,KAAA;IACA,OAAA;IACA,IAAA;EAAA;AAAA;AAAA,KAIQ,kBAAA;EACN,WAAA;AAAA;EACA,KAAA;IAAS,OAAA;IAAiB,MAAA;IAAgB,QAAA;EAAA;AAAA;AAAA,KAE3C,YAAA,qBACiB,MAAA,wBACE,MAAA,CAAO,KAAA,KAC3B,MAAA,CAAO,KAAA,EAAO,OAAA;EAAmB,OAAA;AAAA,IAAqB,CAAA;AAAA,KAErD,SAAA,oBAA6B,CAAA,IAAK,CAAA,CAAE,CAAA,0BAA2B,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,KAErE,mBAAA,qBACiB,MAAA,wBACE,MAAA,CAAO,KAAA,KAC3B,SAAA,CAAU,YAAA,CAAa,KAAA,EAAO,OAAA;AAAA,KAE7B,aAAA,qBACiB,MAAA,wBACE,MAAA,CAAO,KAAA,KAC3B,MAAA,CAAO,KAAA,EAAO,OAAA;EAAmB,QAAA;IAAY,IAAA;EAAA;AAAA,IAAoB,CAAA;AAAA,KAEhE,aAAA,UAAuB,OAAA;EACxB,KAAA,EAAO,aAAA;EAAe,IAAA;AAAA;EAAiB,KAAA;EAAa,IAAA,EAAM,KAAA;AAAA;AAAA,KAGzD,cAAA,qBAAmC,MAAA,wBACpB,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,EAAO,OAAA;EAC9C,OAAA;IAAW,MAAA;IAAe,IAAA;EAAA;AAAA,KAG1B,OAAA,GAAU,mBAAA,CAAoB,KAAA,EAAO,OAAA,MAClC,aAAA,CAAc,aAAA,CAAc,KAAA,EAAO,OAAA,MAEtC,OAAA,EAAS,mBAAA,CAAoB,KAAA,EAAO,OAAA,MACjC,aAAA,CAAc,aAAA,CAAc,KAAA,EAAO,OAAA;AAAA,KA2ErC,SAAA,wBAAiC,MAAA,EAAQ,IAAA,EAAM,KAAA,KAAU,cAAA,CAAe,KAAA;AAAA,iBAE7D,WAAA,CAAY,OAAA;EAAW,WAAA;AAAA,IAAwB,SAAA;AAAA,iBAC/C,WAAA,CAAY,OAAA;EAAW,KAAA;IAAS,OAAA;IAAiB,MAAA;IAAgB,QAAA;EAAA;AAAA,IAAuB,SAAA"}
@@ -0,0 +1,75 @@
1
+ //#region src/patched.ts
2
+ const METHODS = [
3
+ "get",
4
+ "post",
5
+ "put",
6
+ "delete",
7
+ "patch"
8
+ ];
9
+ async function request(reqOptions, initOptions) {
10
+ try {
11
+ let headers;
12
+ let baseUrl;
13
+ if ("accessToken" in initOptions) {
14
+ headers = { Authorization: `Bearer ${initOptions.accessToken}` };
15
+ baseUrl = "https://api.fortnox.se";
16
+ } else {
17
+ headers = {
18
+ "x-api-key": initOptions.proxy.apiKey,
19
+ "x-tenant-id": initOptions.proxy.tenantId
20
+ };
21
+ baseUrl = initOptions.proxy.baseUrl;
22
+ }
23
+ const searchParams = new URLSearchParams();
24
+ if (reqOptions.query) Object.entries(reqOptions.query).forEach(([key, value]) => {
25
+ searchParams.append(key, String(value));
26
+ });
27
+ let path = reqOptions.path;
28
+ if (reqOptions.params) Object.entries(reqOptions.params).forEach(([key, value]) => {
29
+ path = path.replace(`{${key}}`, encodeURIComponent(String(value)));
30
+ });
31
+ const url = `${baseUrl}${path}${searchParams.size > 0 ? `?${searchParams.toString()}` : ""}`;
32
+ const response = await fetch(url, {
33
+ method: reqOptions.method.toUpperCase(),
34
+ body: reqOptions.body ? JSON.stringify(reqOptions.body) : null,
35
+ headers
36
+ });
37
+ const responseData = await response.json();
38
+ if (response.status < 300) return {
39
+ error: null,
40
+ data: responseData
41
+ };
42
+ else return {
43
+ error: {
44
+ ErrorSource: "fortnox",
45
+ ErrorInformation: responseData.ErrorInformation
46
+ },
47
+ data: null
48
+ };
49
+ } catch (e) {
50
+ return {
51
+ error: {
52
+ ErrorSource: "unknown",
53
+ ErrorInformation: {
54
+ message: e instanceof Error ? e.message : String(e),
55
+ error: -1,
56
+ code: -1
57
+ }
58
+ },
59
+ data: null
60
+ };
61
+ }
62
+ }
63
+ function initFortnox(initOptions) {
64
+ return function fortnox(path) {
65
+ return Object.fromEntries(METHODS.map((method) => [method, (options) => request({
66
+ path,
67
+ method,
68
+ ...options
69
+ }, initOptions)]));
70
+ };
71
+ }
72
+
73
+ //#endregion
74
+ export { initFortnox };
75
+ //# sourceMappingURL=patched.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patched.mjs","names":[],"sources":["../src/patched.ts"],"sourcesContent":["import type { Routes } from \"./types/official-routes\";\r\n\r\nconst METHODS = [\"get\", \"post\", \"put\", \"delete\", \"patch\"] as const;\r\n\r\ntype RequestMethod = (typeof METHODS)[number];\r\n\r\ntype RequestOptions = {\r\n path: string;\r\n method: RequestMethod;\r\n query?: Record<string, unknown>;\r\n params?: Record<string, unknown>;\r\n body?: unknown;\r\n};\r\n\r\ntype FortnoxErrorResponse = {\r\n ErrorInformation: {\r\n error: number;\r\n message: string;\r\n code: number;\r\n };\r\n};\r\n\r\ntype ErrorResponse = {\r\n ErrorSource: \"fortnox\" | \"unknown\";\r\n ErrorInformation: {\r\n error: number;\r\n message: string;\r\n code: number;\r\n };\r\n};\r\n\r\nexport type InitFortnoxOptions =\r\n | { accessToken: string }\r\n | { proxy: { baseUrl: string; apiKey: string; tenantId: string } };\r\n\r\ntype FortnoxInput<\r\n TPath extends keyof Routes,\r\n TMethod extends keyof Routes[TPath],\r\n> = Routes[TPath][TMethod] extends { request: infer R } ? R : never;\r\n\r\ntype OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };\r\n\r\ntype FortnoxInputCleaned<\r\n TPath extends keyof Routes,\r\n TMethod extends keyof Routes[TPath],\r\n> = OmitNever<FortnoxInput<TPath, TMethod>>;\r\n\r\ntype FortnoxOutput<\r\n TPath extends keyof Routes,\r\n TMethod extends keyof Routes[TPath],\r\n> = Routes[TPath][TMethod] extends { response: { body: infer B } } ? B : never;\r\n\r\ntype FortnoxResult<TData> = Promise<\r\n { error: ErrorResponse; data: null } | { error: null; data: TData }\r\n>;\r\n\r\ntype FortnoxMethods<TPath extends keyof Routes> = {\r\n [TMethod in keyof Routes[TPath]]: Routes[TPath][TMethod] extends {\r\n request: { params: never; body: never };\r\n }\r\n ? (\r\n options?: FortnoxInputCleaned<TPath, TMethod>,\r\n ) => FortnoxResult<FortnoxOutput<TPath, TMethod>>\r\n : (\r\n options: FortnoxInputCleaned<TPath, TMethod>,\r\n ) => FortnoxResult<FortnoxOutput<TPath, TMethod>>;\r\n};\r\n\r\nasync function request(\r\n reqOptions: RequestOptions,\r\n initOptions: InitFortnoxOptions,\r\n) {\r\n try {\r\n let headers: Record<string, string>;\r\n let baseUrl: string;\r\n\r\n if (\"accessToken\" in initOptions) {\r\n headers = {\r\n Authorization: `Bearer ${initOptions.accessToken}`,\r\n };\r\n baseUrl = \"https://api.fortnox.se\";\r\n } else {\r\n headers = {\r\n \"x-api-key\": initOptions.proxy.apiKey,\r\n \"x-tenant-id\": initOptions.proxy.tenantId,\r\n };\r\n baseUrl = initOptions.proxy.baseUrl;\r\n }\r\n\r\n const searchParams = new URLSearchParams();\r\n if (reqOptions.query) {\r\n Object.entries(reqOptions.query).forEach(([key, value]) => {\r\n searchParams.append(key, String(value));\r\n });\r\n }\r\n\r\n let path = reqOptions.path;\r\n if (reqOptions.params) {\r\n Object.entries(reqOptions.params).forEach(([key, value]) => {\r\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)));\r\n });\r\n }\r\n\r\n const url = `${baseUrl}${path}${searchParams.size > 0 ? `?${searchParams.toString()}` : \"\"}`;\r\n\r\n const response = await fetch(url, {\r\n method: reqOptions.method.toUpperCase(),\r\n body: reqOptions.body ? JSON.stringify(reqOptions.body) : null,\r\n headers,\r\n });\r\n\r\n const responseData = await response.json();\r\n\r\n if (response.status < 300) {\r\n return { error: null, data: responseData };\r\n } else {\r\n return {\r\n error: {\r\n ErrorSource: \"fortnox\" as const,\r\n ErrorInformation: (responseData as FortnoxErrorResponse)\r\n .ErrorInformation,\r\n } satisfies ErrorResponse,\r\n data: null,\r\n };\r\n }\r\n } catch (e: unknown) {\r\n return {\r\n error: {\r\n ErrorSource: \"unknown\" as const,\r\n ErrorInformation: {\r\n message: e instanceof Error ? e.message : String(e),\r\n error: -1,\r\n code: -1,\r\n },\r\n } satisfies ErrorResponse,\r\n data: null,\r\n };\r\n }\r\n}\r\n\r\ntype FortnoxFn = <TPath extends keyof Routes>(path: TPath) => FortnoxMethods<TPath>;\r\n\r\nexport function initFortnox(options: { accessToken: string }): FortnoxFn;\r\nexport function initFortnox(options: { proxy: { baseUrl: string; apiKey: string; tenantId: string } }): FortnoxFn;\r\nexport function initFortnox(initOptions: InitFortnoxOptions): FortnoxFn {\r\n return function fortnox<TPath extends keyof Routes>(\r\n path: TPath,\r\n ): FortnoxMethods<TPath> {\r\n return Object.fromEntries(\r\n METHODS.map((method) => [\r\n method,\r\n (options: Record<string, unknown>) =>\r\n request({ path, method, ...options }, initOptions),\r\n ]),\r\n ) as unknown as FortnoxMethods<TPath>;\r\n };\r\n}\r\n"],"mappings":";AAEA,MAAM,UAAU;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAQ;AAkEzD,eAAe,QACb,YACA,aACA;AACA,KAAI;EACF,IAAI;EACJ,IAAI;AAEJ,MAAI,iBAAiB,aAAa;AAChC,aAAU,EACR,eAAe,UAAU,YAAY,eACtC;AACD,aAAU;SACL;AACL,aAAU;IACR,aAAa,YAAY,MAAM;IAC/B,eAAe,YAAY,MAAM;IAClC;AACD,aAAU,YAAY,MAAM;;EAG9B,MAAM,eAAe,IAAI,iBAAiB;AAC1C,MAAI,WAAW,MACb,QAAO,QAAQ,WAAW,MAAM,CAAC,SAAS,CAAC,KAAK,WAAW;AACzD,gBAAa,OAAO,KAAK,OAAO,MAAM,CAAC;IACvC;EAGJ,IAAI,OAAO,WAAW;AACtB,MAAI,WAAW,OACb,QAAO,QAAQ,WAAW,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW;AAC1D,UAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,mBAAmB,OAAO,MAAM,CAAC,CAAC;IAClE;EAGJ,MAAM,MAAM,GAAG,UAAU,OAAO,aAAa,OAAO,IAAI,IAAI,aAAa,UAAU,KAAK;EAExF,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ,WAAW,OAAO,aAAa;GACvC,MAAM,WAAW,OAAO,KAAK,UAAU,WAAW,KAAK,GAAG;GAC1D;GACD,CAAC;EAEF,MAAM,eAAe,MAAM,SAAS,MAAM;AAE1C,MAAI,SAAS,SAAS,IACpB,QAAO;GAAE,OAAO;GAAM,MAAM;GAAc;MAE1C,QAAO;GACL,OAAO;IACL,aAAa;IACb,kBAAmB,aAChB;IACJ;GACD,MAAM;GACP;UAEI,GAAY;AACnB,SAAO;GACL,OAAO;IACL,aAAa;IACb,kBAAkB;KAChB,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;KACnD,OAAO;KACP,MAAM;KACP;IACF;GACD,MAAM;GACP;;;AAQL,SAAgB,YAAY,aAA4C;AACtE,QAAO,SAAS,QACd,MACuB;AACvB,SAAO,OAAO,YACZ,QAAQ,KAAK,WAAW,CACtB,SACC,YACC,QAAQ;GAAE;GAAM;GAAQ,GAAG;GAAS,EAAE,YAAY,CACrD,CAAC,CACH"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@unifetch/fortnox",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript SDK for the Fortnox API, with full type safety generated from the official OpenAPI specification.",
5
+ "type": "module",
6
+ "keywords": [
7
+ "fortnox",
8
+ "api",
9
+ "openapi",
10
+ "typescript",
11
+ "sdk"
12
+ ],
13
+ "author": "Rajorshi Roy",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/royz/fortnox"
17
+ },
18
+ "license": "ISC",
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "devDependencies": {
23
+ "@biomejs/biome": "^2.4.10",
24
+ "@changesets/cli": "^2.30.0",
25
+ "@types/node": "^25.5.0",
26
+ "dotenv": "^17.3.1",
27
+ "json-schema-to-typescript": "^15.0.4",
28
+ "openapi-types": "^12.1.3",
29
+ "tsdown": "^0.21.7",
30
+ "tsx": "^4.21.0",
31
+ "typescript": "^5.9.3"
32
+ },
33
+ "exports": {
34
+ ".": {
35
+ "import": "./dist/index.mjs",
36
+ "require": "./dist/index.cjs"
37
+ },
38
+ "./official": {
39
+ "import": "./dist/official.mjs",
40
+ "require": "./dist/official.cjs"
41
+ },
42
+ "./patched": {
43
+ "import": "./dist/patched.mjs",
44
+ "require": "./dist/patched.cjs"
45
+ }
46
+ },
47
+ "main": "./dist/index.cjs",
48
+ "module": "./dist/index.mjs",
49
+ "types": "./dist/index.d.cts",
50
+ "publishConfig": {
51
+ "access": "public"
52
+ },
53
+ "scripts": {
54
+ "generate": "tsx lib/generate.ts",
55
+ "postgenerate": "biome check --write ./src/types",
56
+ "build": "tsdown",
57
+ "biome:check": "biome check --write",
58
+ "changeset": "changeset",
59
+ "version": "changeset version",
60
+ "ship": "tsx scripts/release.ts"
61
+ }
62
+ }