noxctl 0.1.0 → 0.2.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 (101) hide show
  1. package/README.md +186 -29
  2. package/dist/auth.d.ts +15 -7
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +123 -22
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli.d.ts +2 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +948 -16
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config-paths.d.ts +2 -0
  11. package/dist/config-paths.d.ts.map +1 -0
  12. package/dist/config-paths.js +7 -0
  13. package/dist/config-paths.js.map +1 -0
  14. package/dist/credentials-store.d.ts +13 -3
  15. package/dist/credentials-store.d.ts.map +1 -1
  16. package/dist/credentials-store.js +154 -48
  17. package/dist/credentials-store.js.map +1 -1
  18. package/dist/fortnox-client.d.ts.map +1 -1
  19. package/dist/fortnox-client.js +14 -2
  20. package/dist/fortnox-client.js.map +1 -1
  21. package/dist/index.d.ts +15 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +86 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/operations/costcenters.d.ts +20 -0
  26. package/dist/operations/costcenters.d.ts.map +1 -0
  27. package/dist/operations/costcenters.js +38 -0
  28. package/dist/operations/costcenters.js.map +1 -0
  29. package/dist/operations/invoice-payments.d.ts +21 -0
  30. package/dist/operations/invoice-payments.d.ts.map +1 -0
  31. package/dist/operations/invoice-payments.js +40 -0
  32. package/dist/operations/invoice-payments.js.map +1 -0
  33. package/dist/operations/offers.d.ts +25 -0
  34. package/dist/operations/offers.d.ts.map +1 -0
  35. package/dist/operations/offers.js +48 -0
  36. package/dist/operations/offers.js.map +1 -0
  37. package/dist/operations/orders.d.ts +24 -0
  38. package/dist/operations/orders.d.ts.map +1 -0
  39. package/dist/operations/orders.js +44 -0
  40. package/dist/operations/orders.js.map +1 -0
  41. package/dist/operations/pricelists.d.ts +36 -0
  42. package/dist/operations/pricelists.d.ts.map +1 -0
  43. package/dist/operations/pricelists.js +52 -0
  44. package/dist/operations/pricelists.js.map +1 -0
  45. package/dist/operations/projects.d.ts +19 -0
  46. package/dist/operations/projects.d.ts.map +1 -0
  47. package/dist/operations/projects.js +33 -0
  48. package/dist/operations/projects.js.map +1 -0
  49. package/dist/operations/supplier-invoice-payments.d.ts +20 -0
  50. package/dist/operations/supplier-invoice-payments.d.ts.map +1 -0
  51. package/dist/operations/supplier-invoice-payments.js +34 -0
  52. package/dist/operations/supplier-invoice-payments.js.map +1 -0
  53. package/dist/operations/taxreductions.d.ts +19 -0
  54. package/dist/operations/taxreductions.d.ts.map +1 -0
  55. package/dist/operations/taxreductions.js +28 -0
  56. package/dist/operations/taxreductions.js.map +1 -0
  57. package/dist/profile-name.d.ts +9 -0
  58. package/dist/profile-name.d.ts.map +1 -0
  59. package/dist/profile-name.js +58 -0
  60. package/dist/profile-name.js.map +1 -0
  61. package/dist/profiles.d.ts +55 -0
  62. package/dist/profiles.d.ts.map +1 -0
  63. package/dist/profiles.js +210 -0
  64. package/dist/profiles.js.map +1 -0
  65. package/dist/tools/costcenters.d.ts +3 -0
  66. package/dist/tools/costcenters.d.ts.map +1 -0
  67. package/dist/tools/costcenters.js +79 -0
  68. package/dist/tools/costcenters.js.map +1 -0
  69. package/dist/tools/invoice-payments.d.ts +3 -0
  70. package/dist/tools/invoice-payments.d.ts.map +1 -0
  71. package/dist/tools/invoice-payments.js +60 -0
  72. package/dist/tools/invoice-payments.js.map +1 -0
  73. package/dist/tools/offers.d.ts +3 -0
  74. package/dist/tools/offers.d.ts.map +1 -0
  75. package/dist/tools/offers.js +130 -0
  76. package/dist/tools/offers.js.map +1 -0
  77. package/dist/tools/orders.d.ts +3 -0
  78. package/dist/tools/orders.d.ts.map +1 -0
  79. package/dist/tools/orders.js +114 -0
  80. package/dist/tools/orders.js.map +1 -0
  81. package/dist/tools/pricelists.d.ts +3 -0
  82. package/dist/tools/pricelists.d.ts.map +1 -0
  83. package/dist/tools/pricelists.js +104 -0
  84. package/dist/tools/pricelists.js.map +1 -0
  85. package/dist/tools/projects.d.ts +3 -0
  86. package/dist/tools/projects.d.ts.map +1 -0
  87. package/dist/tools/projects.js +80 -0
  88. package/dist/tools/projects.js.map +1 -0
  89. package/dist/tools/supplier-invoice-payments.d.ts +3 -0
  90. package/dist/tools/supplier-invoice-payments.d.ts.map +1 -0
  91. package/dist/tools/supplier-invoice-payments.js +60 -0
  92. package/dist/tools/supplier-invoice-payments.js.map +1 -0
  93. package/dist/tools/taxreductions.d.ts +3 -0
  94. package/dist/tools/taxreductions.d.ts.map +1 -0
  95. package/dist/tools/taxreductions.js +51 -0
  96. package/dist/tools/taxreductions.js.map +1 -0
  97. package/dist/views.d.ts +20 -0
  98. package/dist/views.d.ts.map +1 -1
  99. package/dist/views.js +177 -0
  100. package/dist/views.js.map +1 -1
  101. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricelists.d.ts","sourceRoot":"","sources":["../../src/operations/pricelists.ts"],"names":[],"mappings":"AAQA,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,cAAc,CAClC,MAAM,GAAE,oBAAyB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAGjF;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOlC;AAQD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAQlF;AAED,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,YAAY,SAAI,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,YAAY,SAAI,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASlC"}
@@ -0,0 +1,52 @@
1
+ import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
+ export async function listPriceLists(params = {}) {
3
+ if (params.all) {
4
+ const { items, totalResources } = await fetchAllPages('pricelists', 'PriceLists');
5
+ return {
6
+ PriceLists: items,
7
+ MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
8
+ };
9
+ }
10
+ return fortnoxRequest('pricelists', {
11
+ params: { page: params.page || 1, limit: params.limit || 100 },
12
+ });
13
+ }
14
+ export async function getPriceList(code) {
15
+ const data = await fortnoxRequest(`pricelists/${encodeURIComponent(code)}`);
16
+ return data.PriceList;
17
+ }
18
+ export async function createPriceList(params) {
19
+ const data = await fortnoxRequest('pricelists', {
20
+ method: 'POST',
21
+ body: { PriceList: params },
22
+ });
23
+ return data.PriceList;
24
+ }
25
+ export async function updatePriceList(code, fields) {
26
+ const { Code: _, ...body } = fields;
27
+ const data = await fortnoxRequest(`pricelists/${encodeURIComponent(code)}`, {
28
+ method: 'PUT',
29
+ body: { PriceList: body },
30
+ });
31
+ return data.PriceList;
32
+ }
33
+ export async function listPrices(params) {
34
+ const endpoint = params.articleNumber
35
+ ? `prices/sublist/${encodeURIComponent(params.priceListCode)}/${encodeURIComponent(params.articleNumber)}`
36
+ : `prices/sublist/${encodeURIComponent(params.priceListCode)}`;
37
+ return fortnoxRequest(endpoint, {
38
+ params: { page: params.page || 1, limit: params.limit || 100 },
39
+ });
40
+ }
41
+ export async function getPrice(priceListCode, articleNumber, fromQuantity = 0) {
42
+ const data = await fortnoxRequest(`prices/${encodeURIComponent(priceListCode)}/${encodeURIComponent(articleNumber)}/${fromQuantity}`);
43
+ return data.Price;
44
+ }
45
+ export async function updatePrice(priceListCode, articleNumber, fields, fromQuantity = 0) {
46
+ const data = await fortnoxRequest(`prices/${encodeURIComponent(priceListCode)}/${encodeURIComponent(articleNumber)}/${fromQuantity}`, {
47
+ method: 'PUT',
48
+ body: { Price: fields },
49
+ });
50
+ return data.Price;
51
+ }
52
+ //# sourceMappingURL=pricelists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricelists.js","sourceRoot":"","sources":["../../src/operations/pricelists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ interface ProjectsResponse {
2
+ Projects: Record<string, unknown>[];
3
+ MetaInformation?: {
4
+ '@TotalResources': number;
5
+ '@TotalPages': number;
6
+ '@CurrentPage': number;
7
+ };
8
+ }
9
+ export interface ListProjectsParams {
10
+ page?: number;
11
+ limit?: number;
12
+ all?: boolean;
13
+ }
14
+ export declare function listProjects(params?: ListProjectsParams): Promise<ProjectsResponse>;
15
+ export declare function getProject(projectNumber: string): Promise<Record<string, unknown>>;
16
+ export declare function createProject(params: Record<string, unknown>): Promise<Record<string, unknown>>;
17
+ export declare function updateProject(projectNumber: string, fields: Record<string, unknown>): Promise<Record<string, unknown>>;
18
+ export {};
19
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe7F;AAED,wBAAsB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKxF;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC"}
@@ -0,0 +1,33 @@
1
+ import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
+ export async function listProjects(params = {}) {
3
+ if (params.all) {
4
+ const { items, totalResources } = await fetchAllPages('projects', 'Projects');
5
+ return {
6
+ Projects: items,
7
+ MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
8
+ };
9
+ }
10
+ return fortnoxRequest('projects', {
11
+ params: { page: params.page || 1, limit: params.limit || 100 },
12
+ });
13
+ }
14
+ export async function getProject(projectNumber) {
15
+ const data = await fortnoxRequest(`projects/${encodeURIComponent(projectNumber)}`);
16
+ return data.Project;
17
+ }
18
+ export async function createProject(params) {
19
+ const data = await fortnoxRequest('projects', {
20
+ method: 'POST',
21
+ body: { Project: params },
22
+ });
23
+ return data.Project;
24
+ }
25
+ export async function updateProject(projectNumber, fields) {
26
+ const { ProjectNumber: _, ...body } = fields;
27
+ const data = await fortnoxRequest(`projects/${encodeURIComponent(projectNumber)}`, {
28
+ method: 'PUT',
29
+ body: { Project: body },
30
+ });
31
+ return data.Project;
32
+ }
33
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAiBrE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAA6B,EAAE;IAChE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,UAAU,EACV,UAAU,CACX,CAAC;QACF,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAmB,UAAU,EAAE;QAClD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAqB;IACpD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,YAAY,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAChD,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAkB,UAAU,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,MAA+B;IAE/B,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,YAAY,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAC/C;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KACxB,CACF,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
@@ -0,0 +1,20 @@
1
+ interface SupplierInvoicePaymentsResponse {
2
+ SupplierInvoicePayments: Record<string, unknown>[];
3
+ MetaInformation?: {
4
+ '@TotalResources': number;
5
+ '@TotalPages': number;
6
+ '@CurrentPage': number;
7
+ };
8
+ }
9
+ export interface ListSupplierInvoicePaymentsParams {
10
+ invoiceNumber?: string;
11
+ page?: number;
12
+ limit?: number;
13
+ all?: boolean;
14
+ }
15
+ export declare function listSupplierInvoicePayments(params?: ListSupplierInvoicePaymentsParams): Promise<SupplierInvoicePaymentsResponse>;
16
+ export declare function getSupplierInvoicePayment(paymentNumber: string): Promise<Record<string, unknown>>;
17
+ export declare function createSupplierInvoicePayment(params: Record<string, unknown>): Promise<Record<string, unknown>>;
18
+ export declare function deleteSupplierInvoicePayment(paymentNumber: string): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=supplier-invoice-payments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplier-invoice-payments.d.ts","sourceRoot":"","sources":["../../src/operations/supplier-invoice-payments.ts"],"names":[],"mappings":"AAOA,UAAU,+BAA+B;IACvC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnD,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,iCAAiC;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,GAAE,iCAAsC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CAoB1C;AAED,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF"}
@@ -0,0 +1,34 @@
1
+ import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
+ import { documentSegment } from '../identifiers.js';
3
+ export async function listSupplierInvoicePayments(params = {}) {
4
+ const queryParams = {
5
+ invoicenumber: params.invoiceNumber,
6
+ };
7
+ if (params.all) {
8
+ const { items, totalResources } = await fetchAllPages('supplierinvoicepayments', 'SupplierInvoicePayments', queryParams);
9
+ return {
10
+ SupplierInvoicePayments: items,
11
+ MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
12
+ };
13
+ }
14
+ return fortnoxRequest('supplierinvoicepayments', {
15
+ params: { ...queryParams, page: params.page || 1, limit: params.limit || 100 },
16
+ });
17
+ }
18
+ export async function getSupplierInvoicePayment(paymentNumber) {
19
+ const data = await fortnoxRequest(`supplierinvoicepayments/${documentSegment(paymentNumber)}`);
20
+ return data.SupplierInvoicePayment;
21
+ }
22
+ export async function createSupplierInvoicePayment(params) {
23
+ const data = await fortnoxRequest('supplierinvoicepayments', {
24
+ method: 'POST',
25
+ body: { SupplierInvoicePayment: params },
26
+ });
27
+ return data.SupplierInvoicePayment;
28
+ }
29
+ export async function deleteSupplierInvoicePayment(paymentNumber) {
30
+ await fortnoxRequest(`supplierinvoicepayments/${documentSegment(paymentNumber)}`, {
31
+ method: 'DELETE',
32
+ });
33
+ }
34
+ //# sourceMappingURL=supplier-invoice-payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplier-invoice-payments.js","sourceRoot":"","sources":["../../src/operations/supplier-invoice-payments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkBpD,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,SAA4C,EAAE;IAE9C,MAAM,WAAW,GAAgD;QAC/D,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,CACZ,CAAC;QACF,OAAO;YACL,uBAAuB,EAAE,KAAK;YAC9B,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAkC,yBAAyB,EAAE;QAChF,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,2BAA2B,eAAe,CAAC,aAAa,CAAC,EAAE,CAC5D,CAAC;IACF,OAAO,IAAI,CAAC,sBAAsB,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAiC,yBAAyB,EAAE;QAC3F,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE;KACzC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,sBAAsB,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,aAAqB;IACtE,MAAM,cAAc,CAAC,2BAA2B,eAAe,CAAC,aAAa,CAAC,EAAE,EAAE;QAChF,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ interface TaxReductionsResponse {
2
+ TaxReductions: Record<string, unknown>[];
3
+ MetaInformation?: {
4
+ '@TotalResources': number;
5
+ '@TotalPages': number;
6
+ '@CurrentPage': number;
7
+ };
8
+ }
9
+ export interface ListTaxReductionsParams {
10
+ filter?: string;
11
+ page?: number;
12
+ limit?: number;
13
+ all?: boolean;
14
+ }
15
+ export declare function listTaxReductions(params?: ListTaxReductionsParams): Promise<TaxReductionsResponse>;
16
+ export declare function getTaxReduction(id: number): Promise<Record<string, unknown>>;
17
+ export declare function createTaxReduction(params: Record<string, unknown>): Promise<Record<string, unknown>>;
18
+ export {};
19
+ //# sourceMappingURL=taxreductions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxreductions.d.ts","sourceRoot":"","sources":["../../src/operations/taxreductions.ts"],"names":[],"mappings":"AAMA,UAAU,qBAAqB;IAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACzC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,MAAM,GAAE,uBAA4B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAoBhC;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAGlF;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC"}
@@ -0,0 +1,28 @@
1
+ import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
+ export async function listTaxReductions(params = {}) {
3
+ const queryParams = {
4
+ ...(params.filter ? { filter: params.filter } : {}),
5
+ };
6
+ if (params.all) {
7
+ const { items, totalResources } = await fetchAllPages('taxreductions', 'TaxReductions', queryParams);
8
+ return {
9
+ TaxReductions: items,
10
+ MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
11
+ };
12
+ }
13
+ return fortnoxRequest('taxreductions', {
14
+ params: { ...queryParams, page: params.page || 1, limit: params.limit || 100 },
15
+ });
16
+ }
17
+ export async function getTaxReduction(id) {
18
+ const data = await fortnoxRequest(`taxreductions/${id}`);
19
+ return data.TaxReduction;
20
+ }
21
+ export async function createTaxReduction(params) {
22
+ const data = await fortnoxRequest('taxreductions', {
23
+ method: 'POST',
24
+ body: { TaxReduction: params },
25
+ });
26
+ return data.TaxReduction;
27
+ }
28
+ //# sourceMappingURL=taxreductions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxreductions.js","sourceRoot":"","sources":["../../src/operations/taxreductions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAkBrE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAkC,EAAE;IAEpC,MAAM,WAAW,GAAgD;QAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,eAAe,EACf,eAAe,EACf,WAAW,CACZ,CAAC;QACF,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAwB,eAAe,EAAE;QAC5D,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU;IAC9C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAuB,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC/E,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAuB,eAAe,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;KAC/B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare class InvalidProfileNameError extends Error {
2
+ constructor(name: string, reason: string);
3
+ }
4
+ export declare function validateProfileName(name: unknown): string;
5
+ export declare function sanitizeForFilename(name: string): string;
6
+ export declare function keychainAccount(profile: string): string;
7
+ export declare const LEGACY_KEYCHAIN_ACCOUNT = "default";
8
+ export declare const DEFAULT_PROFILE = "default";
9
+ //# sourceMappingURL=profile-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-name.d.ts","sourceRoot":"","sources":["../src/profile-name.ts"],"names":[],"mappings":"AA6BA,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAIzC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAiBzD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,eAAO,MAAM,uBAAuB,YAAY,CAAC;AACjD,eAAO,MAAM,eAAe,YAAY,CAAC"}
@@ -0,0 +1,58 @@
1
+ const PROFILE_NAME_PATTERN = /^[a-z0-9][a-z0-9._-]{0,31}$/i;
2
+ // Windows reserved device names (case-insensitive). Used on all platforms for
3
+ // consistency so `noxctl --profile con` is rejected up front, not only on Windows.
4
+ const WINDOWS_RESERVED = new Set([
5
+ 'con',
6
+ 'prn',
7
+ 'aux',
8
+ 'nul',
9
+ 'com1',
10
+ 'com2',
11
+ 'com3',
12
+ 'com4',
13
+ 'com5',
14
+ 'com6',
15
+ 'com7',
16
+ 'com8',
17
+ 'com9',
18
+ 'lpt1',
19
+ 'lpt2',
20
+ 'lpt3',
21
+ 'lpt4',
22
+ 'lpt5',
23
+ 'lpt6',
24
+ 'lpt7',
25
+ 'lpt8',
26
+ 'lpt9',
27
+ ]);
28
+ export class InvalidProfileNameError extends Error {
29
+ constructor(name, reason) {
30
+ super(`Invalid profile name "${name}": ${reason}`);
31
+ this.name = 'InvalidProfileNameError';
32
+ }
33
+ }
34
+ export function validateProfileName(name) {
35
+ if (typeof name !== 'string' || name.length === 0) {
36
+ throw new InvalidProfileNameError(String(name), 'must be a non-empty string');
37
+ }
38
+ if (name.length > 32) {
39
+ throw new InvalidProfileNameError(name, 'must be at most 32 characters');
40
+ }
41
+ if (!PROFILE_NAME_PATTERN.test(name)) {
42
+ throw new InvalidProfileNameError(name, 'must start with a letter or digit and contain only letters, digits, dot, underscore, or dash');
43
+ }
44
+ if (WINDOWS_RESERVED.has(name.toLowerCase())) {
45
+ throw new InvalidProfileNameError(name, 'is a reserved device name');
46
+ }
47
+ return name;
48
+ }
49
+ export function sanitizeForFilename(name) {
50
+ return validateProfileName(name).toLowerCase();
51
+ }
52
+ export function keychainAccount(profile) {
53
+ const validated = validateProfileName(profile);
54
+ return `profile:${validated.toLowerCase()}`;
55
+ }
56
+ export const LEGACY_KEYCHAIN_ACCOUNT = 'default';
57
+ export const DEFAULT_PROFILE = 'default';
58
+ //# sourceMappingURL=profile-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-name.js","sourceRoot":"","sources":["../src/profile-name.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D,8EAA8E;AAC9E,mFAAmF;AACnF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,IAAY,EAAE,MAAc;QACtC,KAAK,CAAC,yBAAyB,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,uBAAuB,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,uBAAuB,CAC/B,IAAI,EACJ,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,WAAW,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC"}
@@ -0,0 +1,55 @@
1
+ export declare const PROFILE_INDEX_SCHEMA_VERSION = 1;
2
+ export interface ProfileIndexEntry {
3
+ name: string;
4
+ tenant_id?: string;
5
+ company_name?: string;
6
+ created_at: string;
7
+ schema_version: 2;
8
+ }
9
+ export interface ProfileIndex {
10
+ schema_version: typeof PROFILE_INDEX_SCHEMA_VERSION;
11
+ profiles: ProfileIndexEntry[];
12
+ }
13
+ export type ProfileSource = 'flag' | 'env' | 'pointer' | 'default';
14
+ export interface ResolvedProfile {
15
+ name: string;
16
+ source: ProfileSource;
17
+ }
18
+ export declare function readProfileIndex(): Promise<ProfileIndex>;
19
+ export declare function writeProfileIndex(idx: ProfileIndex): Promise<void>;
20
+ export declare function upsertProfile(entry: ProfileIndexEntry): Promise<void>;
21
+ export declare function removeProfile(name: string): Promise<void>;
22
+ export type PointerOutcome = {
23
+ kind: 'missing';
24
+ } | {
25
+ kind: 'valid';
26
+ name: string;
27
+ } | {
28
+ kind: 'invalid-content';
29
+ raw: string;
30
+ } | {
31
+ kind: 'read-error';
32
+ error: Error;
33
+ } | {
34
+ kind: 'timeout';
35
+ };
36
+ export interface ReadActivePointerOptions {
37
+ timeoutMs?: number;
38
+ }
39
+ export declare function readActivePointerOutcome(options?: ReadActivePointerOptions): Promise<PointerOutcome>;
40
+ export declare function readActivePointer(): Promise<string | null>;
41
+ export declare function writeActivePointer(name: string): Promise<void>;
42
+ export declare function deleteActivePointer(): Promise<void>;
43
+ export interface ResolveInputs {
44
+ flag?: string | null | undefined;
45
+ env?: string | null | undefined;
46
+ pointer?: string | null | undefined;
47
+ }
48
+ export declare function resolveProfile(inputs: ResolveInputs): ResolvedProfile;
49
+ export declare function migrateLegacyIfNeeded(legacyBlob: string | null): Promise<boolean>;
50
+ export declare const paths: {
51
+ readonly configDir: string;
52
+ readonly profilesIndexFile: string;
53
+ readonly activePointerFile: string;
54
+ };
55
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,OAAO,4BAA4B,CAAC;IACpD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;CACvB;AA8BD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAmB9D;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,MAAM,WAAW,wBAAwB;IAKvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBhE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAWrE;AAOD,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BvF;AAED,eAAO,MAAM,KAAK;wBACC,MAAM;gCAGE,MAAM;gCAGN,MAAM;CAGhC,CAAC"}
@@ -0,0 +1,210 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { randomBytes } from 'node:crypto';
4
+ import { DEFAULT_PROFILE, validateProfileName } from './profile-name.js';
5
+ import { configDir } from './config-paths.js';
6
+ function profilesIndexFile() {
7
+ return path.join(configDir(), 'profiles.json');
8
+ }
9
+ function activePointerFile() {
10
+ return path.join(configDir(), 'active-profile');
11
+ }
12
+ export const PROFILE_INDEX_SCHEMA_VERSION = 1;
13
+ function emptyIndex() {
14
+ return { schema_version: PROFILE_INDEX_SCHEMA_VERSION, profiles: [] };
15
+ }
16
+ function canonicalName(name) {
17
+ return validateProfileName(name).toLowerCase();
18
+ }
19
+ function isMissingFileError(err) {
20
+ return (typeof err === 'object' &&
21
+ err !== null &&
22
+ 'code' in err &&
23
+ err.code === 'ENOENT');
24
+ }
25
+ async function ensureConfigDir() {
26
+ await fs.mkdir(configDir(), { recursive: true, mode: 0o700 });
27
+ }
28
+ async function atomicWrite(target, contents, mode = 0o600) {
29
+ await ensureConfigDir();
30
+ const tmp = `${target}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`;
31
+ await fs.writeFile(tmp, contents, { mode });
32
+ await fs.rename(tmp, target);
33
+ }
34
+ export async function readProfileIndex() {
35
+ let raw;
36
+ try {
37
+ raw = await fs.readFile(profilesIndexFile(), 'utf-8');
38
+ }
39
+ catch (err) {
40
+ if (isMissingFileError(err))
41
+ return emptyIndex();
42
+ throw err;
43
+ }
44
+ try {
45
+ const parsed = JSON.parse(raw);
46
+ if (!parsed || !Array.isArray(parsed.profiles))
47
+ return emptyIndex();
48
+ return {
49
+ schema_version: PROFILE_INDEX_SCHEMA_VERSION,
50
+ profiles: parsed.profiles,
51
+ };
52
+ }
53
+ catch {
54
+ // Corrupt JSON — degrade to empty so Chunk C's migration can recover.
55
+ return emptyIndex();
56
+ }
57
+ }
58
+ export async function writeProfileIndex(idx) {
59
+ await atomicWrite(profilesIndexFile(), JSON.stringify(idx, null, 2) + '\n');
60
+ }
61
+ export async function upsertProfile(entry) {
62
+ const canonical = canonicalName(entry.name);
63
+ const idx = await readProfileIndex();
64
+ const existing = idx.profiles.findIndex((p) => p.name.toLowerCase() === canonical);
65
+ if (existing >= 0) {
66
+ idx.profiles[existing] = { ...idx.profiles[existing], ...entry };
67
+ }
68
+ else {
69
+ idx.profiles.push(entry);
70
+ }
71
+ await writeProfileIndex(idx);
72
+ }
73
+ export async function removeProfile(name) {
74
+ const canonical = canonicalName(name);
75
+ const idx = await readProfileIndex();
76
+ const before = idx.profiles.length;
77
+ idx.profiles = idx.profiles.filter((p) => p.name.toLowerCase() !== canonical);
78
+ if (idx.profiles.length !== before) {
79
+ await writeProfileIndex(idx);
80
+ }
81
+ }
82
+ export async function readActivePointerOutcome(options = {}) {
83
+ const controller = new AbortController();
84
+ let timer;
85
+ if (options.timeoutMs && options.timeoutMs > 0) {
86
+ timer = setTimeout(() => controller.abort(), options.timeoutMs);
87
+ }
88
+ let raw;
89
+ try {
90
+ raw = await fs.readFile(activePointerFile(), {
91
+ encoding: 'utf-8',
92
+ signal: controller.signal,
93
+ });
94
+ }
95
+ catch (err) {
96
+ const e = err;
97
+ if (isMissingFileError(err))
98
+ return { kind: 'missing' };
99
+ if (e.name === 'AbortError' || e.code === 'ABORT_ERR')
100
+ return { kind: 'timeout' };
101
+ return { kind: 'read-error', error: err instanceof Error ? err : new Error(String(err)) };
102
+ }
103
+ finally {
104
+ if (timer)
105
+ clearTimeout(timer);
106
+ }
107
+ const trimmed = raw.trim();
108
+ if (!trimmed)
109
+ return { kind: 'missing' };
110
+ try {
111
+ return { kind: 'valid', name: validateProfileName(trimmed) };
112
+ }
113
+ catch {
114
+ return { kind: 'invalid-content', raw: trimmed };
115
+ }
116
+ }
117
+ export async function readActivePointer() {
118
+ const outcome = await readActivePointerOutcome();
119
+ switch (outcome.kind) {
120
+ case 'valid':
121
+ return outcome.name;
122
+ case 'missing':
123
+ case 'invalid-content':
124
+ // Corrupt content is degraded to absent so callers that use this
125
+ // loose API (init, logout, doctor) continue to function. Strict
126
+ // callers should use readActivePointerOutcome directly.
127
+ return null;
128
+ case 'read-error':
129
+ throw outcome.error;
130
+ case 'timeout':
131
+ // The loose API has no timeout, so this branch is only reachable from
132
+ // callers who passed options — none today. Rethrow defensively.
133
+ throw Object.assign(new Error('Active pointer read timed out'), { code: 'ETIMEDOUT' });
134
+ }
135
+ }
136
+ export async function writeActivePointer(name) {
137
+ const validated = validateProfileName(name);
138
+ await atomicWrite(activePointerFile(), `${validated}\n`);
139
+ }
140
+ export async function deleteActivePointer() {
141
+ try {
142
+ await fs.rm(activePointerFile(), { force: true });
143
+ }
144
+ catch {
145
+ // ignore
146
+ }
147
+ }
148
+ export function resolveProfile(inputs) {
149
+ if (inputs.flag) {
150
+ return { name: validateProfileName(inputs.flag), source: 'flag' };
151
+ }
152
+ if (inputs.env) {
153
+ return { name: validateProfileName(inputs.env), source: 'env' };
154
+ }
155
+ if (inputs.pointer) {
156
+ return { name: validateProfileName(inputs.pointer), source: 'pointer' };
157
+ }
158
+ return { name: DEFAULT_PROFILE, source: 'default' };
159
+ }
160
+ // Seeds the profile index with a `default` entry when a legacy (pre-0.2)
161
+ // credential blob is observed for the default profile and no `default` entry
162
+ // exists yet. Returns true when a new entry was written. Errors are swallowed
163
+ // so a broken filesystem can't break the auth path — Chunk D's `doctor` will
164
+ // surface the underlying issue.
165
+ export async function migrateLegacyIfNeeded(legacyBlob) {
166
+ if (!legacyBlob)
167
+ return false;
168
+ try {
169
+ const idx = await readProfileIndex();
170
+ if (idx.profiles.some((p) => p.name.toLowerCase() === DEFAULT_PROFILE)) {
171
+ return false;
172
+ }
173
+ let tenant_id;
174
+ let company_name;
175
+ try {
176
+ const parsed = JSON.parse(legacyBlob);
177
+ if (typeof parsed.tenant_id === 'string')
178
+ tenant_id = parsed.tenant_id;
179
+ if (typeof parsed.company_name === 'string')
180
+ company_name = parsed.company_name;
181
+ }
182
+ catch {
183
+ // Unparseable blob — still seed a bare default entry so later mutations
184
+ // have something to attach to.
185
+ }
186
+ await upsertProfile({
187
+ name: DEFAULT_PROFILE,
188
+ tenant_id,
189
+ company_name,
190
+ created_at: new Date().toISOString(),
191
+ schema_version: 2,
192
+ });
193
+ return true;
194
+ }
195
+ catch {
196
+ return false;
197
+ }
198
+ }
199
+ export const paths = {
200
+ get configDir() {
201
+ return configDir();
202
+ },
203
+ get profilesIndexFile() {
204
+ return profilesIndexFile();
205
+ },
206
+ get activePointerFile() {
207
+ return activePointerFile();
208
+ },
209
+ };
210
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCostCenterTools(server: McpServer): void;
3
+ //# sourceMappingURL=costcenters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costcenters.d.ts","sourceRoot":"","sources":["../../src/tools/costcenters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4G/D"}