noxctl 0.1.0 → 0.3.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 (155) hide show
  1. package/README.md +279 -29
  2. package/dist/auth.d.ts +15 -7
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +128 -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 +1640 -70
  9. package/dist/cli.js.map +1 -1
  10. package/dist/completions.d.ts +13 -0
  11. package/dist/completions.d.ts.map +1 -0
  12. package/dist/completions.js +150 -0
  13. package/dist/completions.js.map +1 -0
  14. package/dist/config-paths.d.ts +2 -0
  15. package/dist/config-paths.d.ts.map +1 -0
  16. package/dist/config-paths.js +7 -0
  17. package/dist/config-paths.js.map +1 -0
  18. package/dist/credentials-store.d.ts +13 -3
  19. package/dist/credentials-store.d.ts.map +1 -1
  20. package/dist/credentials-store.js +197 -62
  21. package/dist/credentials-store.js.map +1 -1
  22. package/dist/date-periods.d.ts +14 -0
  23. package/dist/date-periods.d.ts.map +1 -0
  24. package/dist/date-periods.js +103 -0
  25. package/dist/date-periods.js.map +1 -0
  26. package/dist/formatter.d.ts +11 -2
  27. package/dist/formatter.d.ts.map +1 -1
  28. package/dist/formatter.js +27 -4
  29. package/dist/formatter.js.map +1 -1
  30. package/dist/fortnox-client.d.ts +1 -0
  31. package/dist/fortnox-client.d.ts.map +1 -1
  32. package/dist/fortnox-client.js +28 -5
  33. package/dist/fortnox-client.js.map +1 -1
  34. package/dist/index.d.ts +15 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +92 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/keychain-target.d.ts +32 -0
  39. package/dist/keychain-target.d.ts.map +1 -0
  40. package/dist/keychain-target.js +349 -0
  41. package/dist/keychain-target.js.map +1 -0
  42. package/dist/operations/analytics.d.ts +84 -0
  43. package/dist/operations/analytics.d.ts.map +1 -0
  44. package/dist/operations/analytics.js +154 -0
  45. package/dist/operations/analytics.js.map +1 -0
  46. package/dist/operations/contracts.d.ts +23 -0
  47. package/dist/operations/contracts.d.ts.map +1 -0
  48. package/dist/operations/contracts.js +52 -0
  49. package/dist/operations/contracts.js.map +1 -0
  50. package/dist/operations/costcenters.d.ts +20 -0
  51. package/dist/operations/costcenters.d.ts.map +1 -0
  52. package/dist/operations/costcenters.js +38 -0
  53. package/dist/operations/costcenters.js.map +1 -0
  54. package/dist/operations/customers.d.ts.map +1 -1
  55. package/dist/operations/customers.js +12 -2
  56. package/dist/operations/customers.js.map +1 -1
  57. package/dist/operations/financial-years.d.ts +16 -0
  58. package/dist/operations/financial-years.d.ts.map +1 -0
  59. package/dist/operations/financial-years.js +32 -0
  60. package/dist/operations/financial-years.js.map +1 -0
  61. package/dist/operations/invoice-payments.d.ts +21 -0
  62. package/dist/operations/invoice-payments.d.ts.map +1 -0
  63. package/dist/operations/invoice-payments.js +40 -0
  64. package/dist/operations/invoice-payments.js.map +1 -0
  65. package/dist/operations/offers.d.ts +25 -0
  66. package/dist/operations/offers.d.ts.map +1 -0
  67. package/dist/operations/offers.js +48 -0
  68. package/dist/operations/offers.js.map +1 -0
  69. package/dist/operations/orders.d.ts +24 -0
  70. package/dist/operations/orders.d.ts.map +1 -0
  71. package/dist/operations/orders.js +44 -0
  72. package/dist/operations/orders.js.map +1 -0
  73. package/dist/operations/pricelists.d.ts +36 -0
  74. package/dist/operations/pricelists.d.ts.map +1 -0
  75. package/dist/operations/pricelists.js +52 -0
  76. package/dist/operations/pricelists.js.map +1 -0
  77. package/dist/operations/projects.d.ts +19 -0
  78. package/dist/operations/projects.d.ts.map +1 -0
  79. package/dist/operations/projects.js +33 -0
  80. package/dist/operations/projects.js.map +1 -0
  81. package/dist/operations/supplier-invoice-payments.d.ts +20 -0
  82. package/dist/operations/supplier-invoice-payments.d.ts.map +1 -0
  83. package/dist/operations/supplier-invoice-payments.js +34 -0
  84. package/dist/operations/supplier-invoice-payments.js.map +1 -0
  85. package/dist/operations/taxreductions.d.ts +19 -0
  86. package/dist/operations/taxreductions.d.ts.map +1 -0
  87. package/dist/operations/taxreductions.js +28 -0
  88. package/dist/operations/taxreductions.js.map +1 -0
  89. package/dist/operations/vouchers.d.ts +15 -0
  90. package/dist/operations/vouchers.d.ts.map +1 -1
  91. package/dist/operations/vouchers.js +97 -0
  92. package/dist/operations/vouchers.js.map +1 -1
  93. package/dist/profile-name.d.ts +9 -0
  94. package/dist/profile-name.d.ts.map +1 -0
  95. package/dist/profile-name.js +58 -0
  96. package/dist/profile-name.js.map +1 -0
  97. package/dist/profiles.d.ts +55 -0
  98. package/dist/profiles.d.ts.map +1 -0
  99. package/dist/profiles.js +210 -0
  100. package/dist/profiles.js.map +1 -0
  101. package/dist/tools/analytics.d.ts +3 -0
  102. package/dist/tools/analytics.d.ts.map +1 -0
  103. package/dist/tools/analytics.js +52 -0
  104. package/dist/tools/analytics.js.map +1 -0
  105. package/dist/tools/bookkeeping.d.ts.map +1 -1
  106. package/dist/tools/bookkeeping.js +38 -2
  107. package/dist/tools/bookkeeping.js.map +1 -1
  108. package/dist/tools/contracts.d.ts +3 -0
  109. package/dist/tools/contracts.d.ts.map +1 -0
  110. package/dist/tools/contracts.js +136 -0
  111. package/dist/tools/contracts.js.map +1 -0
  112. package/dist/tools/costcenters.d.ts +3 -0
  113. package/dist/tools/costcenters.d.ts.map +1 -0
  114. package/dist/tools/costcenters.js +79 -0
  115. package/dist/tools/costcenters.js.map +1 -0
  116. package/dist/tools/financial-years.d.ts +3 -0
  117. package/dist/tools/financial-years.d.ts.map +1 -0
  118. package/dist/tools/financial-years.js +33 -0
  119. package/dist/tools/financial-years.js.map +1 -0
  120. package/dist/tools/invoice-payments.d.ts +3 -0
  121. package/dist/tools/invoice-payments.d.ts.map +1 -0
  122. package/dist/tools/invoice-payments.js +60 -0
  123. package/dist/tools/invoice-payments.js.map +1 -0
  124. package/dist/tools/offers.d.ts +3 -0
  125. package/dist/tools/offers.d.ts.map +1 -0
  126. package/dist/tools/offers.js +130 -0
  127. package/dist/tools/offers.js.map +1 -0
  128. package/dist/tools/orders.d.ts +3 -0
  129. package/dist/tools/orders.d.ts.map +1 -0
  130. package/dist/tools/orders.js +114 -0
  131. package/dist/tools/orders.js.map +1 -0
  132. package/dist/tools/pricelists.d.ts +3 -0
  133. package/dist/tools/pricelists.d.ts.map +1 -0
  134. package/dist/tools/pricelists.js +104 -0
  135. package/dist/tools/pricelists.js.map +1 -0
  136. package/dist/tools/projects.d.ts +3 -0
  137. package/dist/tools/projects.d.ts.map +1 -0
  138. package/dist/tools/projects.js +80 -0
  139. package/dist/tools/projects.js.map +1 -0
  140. package/dist/tools/status.d.ts.map +1 -1
  141. package/dist/tools/status.js +6 -1
  142. package/dist/tools/status.js.map +1 -1
  143. package/dist/tools/supplier-invoice-payments.d.ts +3 -0
  144. package/dist/tools/supplier-invoice-payments.d.ts.map +1 -0
  145. package/dist/tools/supplier-invoice-payments.js +60 -0
  146. package/dist/tools/supplier-invoice-payments.js.map +1 -0
  147. package/dist/tools/taxreductions.d.ts +3 -0
  148. package/dist/tools/taxreductions.d.ts.map +1 -0
  149. package/dist/tools/taxreductions.js +51 -0
  150. package/dist/tools/taxreductions.js.map +1 -0
  151. package/dist/views.d.ts +28 -0
  152. package/dist/views.d.ts.map +1 -1
  153. package/dist/views.js +234 -0
  154. package/dist/views.js.map +1 -1
  155. package/package.json +1 -1
@@ -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"}
@@ -18,5 +18,20 @@ export interface ListVouchersParams {
18
18
  export declare function listVouchers(params?: ListVouchersParams): Promise<VouchersResponse>;
19
19
  export declare function getVoucher(series: string, voucherNumber: string, financialYear?: number): Promise<Record<string, unknown>>;
20
20
  export declare function createVoucher(params: Record<string, unknown>): Promise<Record<string, unknown>>;
21
+ export declare function uploadInboxFile(filePath: string): Promise<Record<string, unknown>>;
22
+ export declare function createVoucherFileConnection(series: string, voucherNumber: string, fileId: string, financialYear?: number): Promise<Record<string, unknown>>;
23
+ export interface AttachVoucherFilesParams {
24
+ series: string;
25
+ voucherNumber: string;
26
+ filePaths: string[];
27
+ financialYear?: number;
28
+ }
29
+ export interface VoucherFileAttachment {
30
+ fileName: string;
31
+ fileId: string;
32
+ voucherYear: number;
33
+ connection: Record<string, unknown>;
34
+ }
35
+ export declare function attachVoucherFiles(params: AttachVoucherFilesParams): Promise<VoucherFileAttachment[]>;
21
36
  export {};
22
37
  //# sourceMappingURL=vouchers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAOA,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,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB7F;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQlC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
1
+ {"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAUA,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,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB7F;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQlC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC;AA6BD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMxF;AAMD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAalC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAuBD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAyClC"}
@@ -1,5 +1,8 @@
1
+ import { readFileSync, existsSync, statSync } from 'node:fs';
2
+ import { basename, extname } from 'node:path';
1
3
  import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
4
  import { voucherSeriesSegment } from '../identifiers.js';
5
+ import { listFinancialYears } from './financial-years.js';
3
6
  export async function listVouchers(params = {}) {
4
7
  const subpath = params.series ? `sublist/${voucherSeriesSegment(params.series)}` : '';
5
8
  const endpoint = `vouchers/${subpath}`;
@@ -38,4 +41,98 @@ export async function createVoucher(params) {
38
41
  });
39
42
  return data.Voucher;
40
43
  }
44
+ const MIME_BY_EXT = {
45
+ '.pdf': 'application/pdf',
46
+ '.png': 'image/png',
47
+ '.jpg': 'image/jpeg',
48
+ '.jpeg': 'image/jpeg',
49
+ '.gif': 'image/gif',
50
+ '.webp': 'image/webp',
51
+ '.heic': 'image/heic',
52
+ '.tif': 'image/tiff',
53
+ '.tiff': 'image/tiff',
54
+ '.txt': 'text/plain',
55
+ '.csv': 'text/csv',
56
+ '.xml': 'application/xml',
57
+ };
58
+ function mimeForFile(filePath) {
59
+ return MIME_BY_EXT[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
60
+ }
61
+ // Upload a single file to the Fortnox inbox; returns the archived File object (has .Id).
62
+ export async function uploadInboxFile(filePath) {
63
+ const buf = readFileSync(filePath);
64
+ const form = new FormData();
65
+ form.append('file', new Blob([buf], { type: mimeForFile(filePath) }), basename(filePath));
66
+ const data = await fortnoxRequest('inbox', { method: 'POST', rawBody: form });
67
+ return data.File;
68
+ }
69
+ // Link an already-uploaded file (by id) to a voucher. The financial year goes in
70
+ // the `financialyear` query param, NOT the body: Fortnox treats VoucherYear in
71
+ // the body as read-only (rejects it with error 2000321) and derives it from the
72
+ // voucher itself.
73
+ export async function createVoucherFileConnection(series, voucherNumber, fileId, financialYear) {
74
+ const data = await fortnoxRequest('voucherfileconnections', {
75
+ method: 'POST',
76
+ body: {
77
+ VoucherFileConnection: {
78
+ FileId: fileId,
79
+ VoucherSeries: series,
80
+ VoucherNumber: voucherNumber,
81
+ },
82
+ },
83
+ params: financialYear !== undefined ? { financialyear: financialYear } : undefined,
84
+ });
85
+ return data.VoucherFileConnection;
86
+ }
87
+ // Resolve the financial year from the voucher's transaction date when not given.
88
+ // Throws (rather than silently leaving the year undefined) when it can't be
89
+ // determined, so the user knows to pass --year explicitly — e.g. for a voucher
90
+ // in a past financial year, which getVoucher can't fetch without the year.
91
+ async function resolveVoucherFinancialYear(series, voucherNumber) {
92
+ const voucher = await getVoucher(series, voucherNumber);
93
+ const date = voucher.TransactionDate;
94
+ if (!date) {
95
+ throw new Error(`Could not determine the financial year: voucher ${series}/${voucherNumber} has no TransactionDate. Pass --year explicitly.`);
96
+ }
97
+ const fy = await listFinancialYears({ date });
98
+ const list = (fy.FinancialYears ?? []);
99
+ if (!list.length) {
100
+ throw new Error(`No financial year found for voucher date ${date}. Pass --year explicitly.`);
101
+ }
102
+ return Number(list[0].Id);
103
+ }
104
+ // Orchestrate: resolve year if omitted, then upload+connect each file in order.
105
+ export async function attachVoucherFiles(params) {
106
+ // Pre-flight: confirm every file exists before uploading any of them, so a
107
+ // typo in a later path can't leave earlier files orphaned in the inbox.
108
+ for (const filePath of params.filePaths) {
109
+ if (!existsSync(filePath)) {
110
+ throw new Error(`File not found: ${filePath}`);
111
+ }
112
+ if (!statSync(filePath).isFile()) {
113
+ throw new Error(`Not a file: ${filePath}`);
114
+ }
115
+ }
116
+ const year = params.financialYear ??
117
+ (await resolveVoucherFinancialYear(params.series, params.voucherNumber));
118
+ const results = [];
119
+ for (const filePath of params.filePaths) {
120
+ try {
121
+ const file = await uploadInboxFile(filePath);
122
+ // Per Fortnox docs (best-practices/vouchers): use the uploaded file's
123
+ // `Id` as the VoucherFileConnection FileId — NOT ArchiveFileId.
124
+ const fileId = String(file.Id);
125
+ const connection = await createVoucherFileConnection(params.series, params.voucherNumber, fileId, year);
126
+ results.push({ fileName: basename(filePath), fileId, voucherYear: year, connection });
127
+ }
128
+ catch (err) {
129
+ // Surface what already succeeded so the user can locate/clean up any files
130
+ // uploaded to the inbox before this failure.
131
+ const done = results.map((r) => r.fileName).join(', ') || 'none';
132
+ const detail = err instanceof Error ? err.message : String(err);
133
+ throw new Error(`Failed attaching "${basename(filePath)}" to voucher ${params.series}/${params.voucherNumber}: ${detail}. Files already attached this run: ${done}.`);
134
+ }
135
+ }
136
+ return results;
137
+ }
41
138
  //# sourceMappingURL=vouchers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAqBzD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAA6B,EAAE;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,MAAM,QAAQ,GAAG,YAAY,OAAO,EAAE,CAAC;IACvC,MAAM,WAAW,GAAgD;QAC/D,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,QAAQ,EACR,UAAU,EACV,WAAW,CACZ,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,QAAQ,EAAE;QAChD,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,UAAU,CAC9B,MAAc,EACd,aAAqB,EACrB,aAAsB;IAEtB,MAAM,MAAM,GAAgD,EAAE,CAAC;IAC/D,IAAI,aAAa;QAAE,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,YAAY,oBAAoB,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAC/E,EAAE,MAAM,EAAE,CACX,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;YACJ,OAAO,EAAE;gBACP,GAAG,MAAM;gBACT,aAAa,EAAG,MAAM,CAAC,aAAwB,IAAI,GAAG;aACvD;SACF;KACF,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"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"}
@@ -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"}