facturas 0.12.3 → 0.13.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 (44) hide show
  1. package/README.md +41 -35
  2. package/dist/{chunk-QHYJ424J.mjs → chunk-BPBTQDCO.mjs} +18 -175
  3. package/dist/chunk-BPBTQDCO.mjs.map +1 -0
  4. package/dist/{chunk-ZOSNASXB.mjs → chunk-BYEP3ABS.mjs} +1 -1
  5. package/dist/chunk-BYEP3ABS.mjs.map +1 -0
  6. package/dist/{chunk-G7BWMDFT.mjs → chunk-KPWAQMR5.mjs} +881 -216
  7. package/dist/chunk-KPWAQMR5.mjs.map +1 -0
  8. package/dist/{chunk-GX5ERXT6.mjs → chunk-LQMNKQ2V.mjs} +1 -1
  9. package/dist/chunk-LQMNKQ2V.mjs.map +1 -0
  10. package/dist/{chunk-UDX6HLAU.mjs → chunk-PHXH34L6.mjs} +2 -2
  11. package/dist/{chunk-ZPVXXSUC.mjs → chunk-WN62NMUJ.mjs} +15 -15
  12. package/dist/chunk-WN62NMUJ.mjs.map +1 -0
  13. package/dist/{chunk-7LEKQ4P7.mjs → chunk-WVKVJTFG.mjs} +2 -2
  14. package/dist/cli.d.ts +5 -5
  15. package/dist/cli.mjs +7 -7
  16. package/dist/{client-BT_F1N8o.d.ts → client-bblLZeUb.d.ts} +87 -45
  17. package/dist/constants.d.ts +1 -1
  18. package/dist/constants.mjs +1 -1
  19. package/dist/errors.d.ts +2 -2
  20. package/dist/errors.mjs +1 -1
  21. package/dist/{fiscal-evidence-Dpj-Iao8.d.ts → fiscal-evidence-DaCyGd5o.d.ts} +3 -3
  22. package/dist/{index-CT1ffEAL.d.ts → index-DAC3edtw.d.ts} +1 -1
  23. package/dist/index.d.ts +6 -7
  24. package/dist/index.mjs +11 -17
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/padron.d.ts +2 -2
  27. package/dist/padron.mjs +2 -2
  28. package/dist/{types-SdBQAflw.d.ts → types-Su7QwloQ.d.ts} +1 -1
  29. package/dist/types.d.ts +1 -1
  30. package/dist/wsfe.d.ts +255 -31
  31. package/dist/wsfe.mjs +3 -10
  32. package/dist/wsmtxca.d.ts +6 -6
  33. package/dist/wsmtxca.mjs +3 -3
  34. package/package.json +1 -1
  35. package/dist/chunk-G7BWMDFT.mjs.map +0 -1
  36. package/dist/chunk-GX5ERXT6.mjs.map +0 -1
  37. package/dist/chunk-QHYJ424J.mjs.map +0 -1
  38. package/dist/chunk-VGNLXU4T.mjs +0 -169
  39. package/dist/chunk-VGNLXU4T.mjs.map +0 -1
  40. package/dist/chunk-ZOSNASXB.mjs.map +0 -1
  41. package/dist/chunk-ZPVXXSUC.mjs.map +0 -1
  42. package/dist/decimal-xie0oMOQ.d.ts +0 -272
  43. /package/dist/{chunk-UDX6HLAU.mjs.map → chunk-PHXH34L6.mjs.map} +0 -0
  44. /package/dist/{chunk-7LEKQ4P7.mjs.map → chunk-WVKVJTFG.mjs.map} +0 -0
package/dist/errors.mjs CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  ArcaTransportError,
10
10
  isArcaAuthenticationError,
11
11
  toArcaSafeErrorMetadata
12
- } from "./chunk-ZOSNASXB.mjs";
12
+ } from "./chunk-BYEP3ABS.mjs";
13
13
  export {
14
14
  ArcaAuthenticationError,
15
15
  ArcaConfigurationError,
@@ -1,4 +1,4 @@
1
- import { b as ArcaServiceName } from './types-SdBQAflw.js';
1
+ import { b as ArcaServiceName } from './types-Su7QwloQ.js';
2
2
 
3
3
  /** Base error class for all ARCA-related errors. */
4
4
  declare class ArcaError extends Error {
@@ -12,7 +12,7 @@ declare class ArcaConfigurationError extends ArcaError {
12
12
  constructor(message: string, options?: ErrorOptions);
13
13
  }
14
14
  /** Stable routing codes for caller-provided input failures. */
15
- type ArcaInputErrorCode = "ARCA_INPUT_IDEMPOTENCY_MISMATCH" | "ARCA_INPUT_INVALID_DATE" | "ARCA_INPUT_INVALID_AMOUNT" | "ARCA_INPUT_AMOUNT_PRECISION" | "ARCA_INPUT_AMOUNT_MISMATCH" | "ARCA_INPUT_INVALID_EXCHANGE_RATE" | "ARCA_INPUT_INVALID_VALUE" | "ARCA_INPUT_MISSING_FIELD" | "ARCA_INPUT_RESERVED_FIELD";
15
+ type ArcaInputErrorCode = "ARCA_INPUT_IDEMPOTENCY_MISMATCH" | "ARCA_INPUT_RESERVATION_NOT_FOUND" | "ARCA_INPUT_INVALID_DATE" | "ARCA_INPUT_INVALID_AMOUNT" | "ARCA_INPUT_AMOUNT_PRECISION" | "ARCA_INPUT_AMOUNT_MISMATCH" | "ARCA_INPUT_INVALID_EXCHANGE_RATE" | "ARCA_INPUT_INVALID_VALUE" | "ARCA_INPUT_MISSING_FIELD" | "ARCA_INPUT_RESERVED_FIELD";
16
16
  type ArcaInputErrorOptions = ErrorOptions & {
17
17
  code: ArcaInputErrorCode;
18
18
  field?: string;
@@ -194,4 +194,4 @@ type ArcaVoucherLookupResult<TVoucher, TService extends ArcaFiscalService = Arca
194
194
  raw: Record<string, unknown>;
195
195
  };
196
196
 
197
- export { type ArcaAuthorizationOutcome as A, type ArcaVoucherLookupResult as a, ArcaAuthenticationError as b, type ArcaAuthenticationErrorOptions as c, type ArcaAuthenticationEvidence as d, type ArcaAuthenticationReason as e, type ArcaAuthorizationIndeterminateReason as f, ArcaConfigurationError as g, ArcaError as h, type ArcaFiscalIssue as i, type ArcaFiscalResultLevel as j, type ArcaFiscalResults as k, type ArcaFiscalService as l, ArcaInputError as m, type ArcaInputErrorCode as n, type ArcaInputErrorOptions as o, ArcaInvalidSoapResponseError as p, type ArcaSafeErrorMetadata as q, ArcaServiceError as r, ArcaSoapFaultError as s, ArcaTransportError as t, isArcaAuthenticationError as u, toArcaSafeErrorMetadata as v };
197
+ export { ArcaAuthenticationError as A, type ArcaAuthenticationErrorOptions as a, type ArcaAuthenticationEvidence as b, type ArcaAuthenticationReason as c, type ArcaAuthorizationIndeterminateReason as d, type ArcaAuthorizationOutcome as e, ArcaConfigurationError as f, ArcaError as g, type ArcaFiscalIssue as h, type ArcaFiscalResultLevel as i, type ArcaFiscalResults as j, type ArcaFiscalService as k, ArcaInputError as l, type ArcaInputErrorCode as m, type ArcaInputErrorOptions as n, ArcaInvalidSoapResponseError as o, type ArcaSafeErrorMetadata as p, ArcaServiceError as q, ArcaSoapFaultError as r, ArcaTransportError as s, type ArcaVoucherLookupResult as t, isArcaAuthenticationError as u, toArcaSafeErrorMetadata as v };
@@ -1,4 +1,4 @@
1
- import { c as ArcaSoapExecutionOptions, d as ArcaSoapResponse, e as ArcaWsaaServiceId, f as ArcaAuthOptions, g as ArcaAuthCredentials } from './types-SdBQAflw.js';
1
+ import { c as ArcaSoapExecutionOptions, d as ArcaSoapResponse, e as ArcaWsaaServiceId, f as ArcaAuthOptions, g as ArcaAuthCredentials } from './types-Su7QwloQ.js';
2
2
 
3
3
  type SoapTransport = {
4
4
  execute<TBody, TResult>(request: ArcaSoapExecutionOptions<TBody>): Promise<ArcaSoapResponse<TResult>>;
package/dist/index.d.ts CHANGED
@@ -1,13 +1,12 @@
1
- export { a as AmountItem, A as ArcaClient, b as ArcaClientConfigView, C as CreditNoteInput, D as DebitNoteInput, E as ExactIssueInput, F as FceOptions, I as InvoiceFamily, c as IssuanceFields, d as IssuanceService, e as IssueAmounts, f as IssueCommon, g as IssueInput, h as IssueOptions, i as IssueOutcome, j as IssuePreview, k as IssuedVoucher, P as PeriodNoteInput, l as PreviewOptions, R as Receiver, m as RecoveryOptions, T as Tribute, V as VatItem, n as VatRate, o as VoucherAmounts, p as VoucherCoordinates, q as VoucherItemDetail, r as VoucherSummary, s as VouchersService, W as WsfeIdentityMatch, t as WsmtxcaIssueRequest, u as createArcaClient, v as matchWsfeVoucherIdentity } from './client-BT_F1N8o.js';
2
- import { h as ArcaEnvironment, a as ArcaClientConfig, i as ArcaStore, j as ArcaWsaaSessionStore } from './types-SdBQAflw.js';
3
- export { g as ArcaAuthCredentials, f as ArcaAuthOptions, A as ArcaClientConfig, k as ArcaLogLevel, l as ArcaLoggerConfig, m as ArcaPadronServiceName, n as ArcaRepresentedTaxId, b as ArcaServiceName, o as ArcaServiceTarget, e as ArcaWsaaServiceId, p as ArcaWsaaSessionKey } from './types-SdBQAflw.js';
1
+ export { a as AmountItem, A as ArcaClient, b as ArcaClientConfigView, C as CreditNoteInput, D as DebitNoteInput, F as FceOptions, I as InvoiceFamily, c as IssuanceFields, d as IssuanceService, e as IssueAmounts, f as IssueCommon, g as IssueInput, h as IssueOptions, i as IssueOutcome, j as IssuePreview, k as IssueRequest, l as IssuedVoucher, m as ItemLine, N as NotePreview, P as PeriodNoteInput, n as PreviewOptions, R as Receiver, o as RecoveryOptions, T as Tribute, V as VatItem, p as VatRate, q as VoucherAmounts, r as VoucherCoordinates, s as VoucherSummary, t as VouchersService, W as WsfeIdentityMatch, u as WsmtxcaIssueRequest, v as WsmtxcaLine, w as createArcaClient, x as matchWsfeVoucherIdentity } from './client-bblLZeUb.js';
2
+ import { h as ArcaEnvironment, a as ArcaClientConfig, i as ArcaStore, j as ArcaWsaaSessionStore } from './types-Su7QwloQ.js';
3
+ export { g as ArcaAuthCredentials, f as ArcaAuthOptions, A as ArcaClientConfig, k as ArcaLogLevel, l as ArcaLoggerConfig, m as ArcaPadronServiceName, n as ArcaRepresentedTaxId, b as ArcaServiceName, o as ArcaServiceTarget, e as ArcaWsaaServiceId, p as ArcaWsaaSessionKey } from './types-Su7QwloQ.js';
4
4
  export { ARCA_FINAL_CONSUMER_IDENTIFICATION_THRESHOLD_MINOR_UNITS, ARCA_INVOICE_CLASS_BY_ISSUER, ARCA_ISSUER_CONDITION_IDS, ARCA_RECEIVER_CONDITION_IDS, IssuerCondition, ReceiverCondition, VoucherClass } from './constants.js';
5
- export { b as ArcaAuthenticationError, c as ArcaAuthenticationErrorOptions, d as ArcaAuthenticationEvidence, e as ArcaAuthenticationReason, f as ArcaAuthorizationIndeterminateReason, A as ArcaAuthorizationOutcome, g as ArcaConfigurationError, h as ArcaError, i as ArcaFiscalIssue, j as ArcaFiscalResultLevel, k as ArcaFiscalResults, l as ArcaFiscalService, m as ArcaInputError, n as ArcaInputErrorCode, o as ArcaInputErrorOptions, p as ArcaInvalidSoapResponseError, q as ArcaSafeErrorMetadata, r as ArcaServiceError, s as ArcaSoapFaultError, t as ArcaTransportError, a as ArcaVoucherLookupResult, u as isArcaAuthenticationError, v as toArcaSafeErrorMetadata } from './fiscal-evidence-Dpj-Iao8.js';
5
+ export { A as ArcaAuthenticationError, a as ArcaAuthenticationErrorOptions, b as ArcaAuthenticationEvidence, c as ArcaAuthenticationReason, d as ArcaAuthorizationIndeterminateReason, e as ArcaAuthorizationOutcome, f as ArcaConfigurationError, g as ArcaError, h as ArcaFiscalIssue, i as ArcaFiscalResultLevel, j as ArcaFiscalResults, k as ArcaFiscalService, l as ArcaInputError, m as ArcaInputErrorCode, n as ArcaInputErrorOptions, o as ArcaInvalidSoapResponseError, p as ArcaSafeErrorMetadata, q as ArcaServiceError, r as ArcaSoapFaultError, s as ArcaTransportError, t as ArcaVoucherLookupResult, u as isArcaAuthenticationError, v as toArcaSafeErrorMetadata } from './fiscal-evidence-DaCyGd5o.js';
6
6
  export { CreatePadronServiceOptions, PadronService, PadronTaxIdLookupResult, PadronTaxpayerResult, createPadronService } from './padron.js';
7
- export { C as CreateWsfeServiceOptions, W as WsfeActivity, a as WsfeActivityType, b as WsfeAssociatedPeriod, c as WsfeAssociatedVoucher, d as WsfeAuthorizationOutcome, e as WsfeAuthorizeVoucherInput, f as WsfeBuyer, g as WsfeCatalogEntry, h as WsfeCurrencyType, i as WsfeDateInput, j as WsfeOptionalField, k as WsfeQuotation, l as WsfeReceiverVatCondition, m as WsfeSalesPoint, n as WsfeServerStatus, o as WsfeService, p as WsfeTax, q as WsfeVatRate, r as WsfeVoucherInfo, s as WsfeVoucherInput, t as WsfeVoucherLookupResult, u as createWsfeService } from './decimal-xie0oMOQ.js';
8
- export { BuildFacturaBInput, BuildFacturaCInput, WsfeBuilderCurrencyInput, WsfeBuilderVatRate, buildFacturaB, buildFacturaC } from './wsfe.js';
7
+ export { CreateWsfeServiceOptions, WsfeActivity, WsfeActivityType, WsfeAssociatedPeriod, WsfeAssociatedVoucher, WsfeAuthorizationOutcome, WsfeAuthorizeVoucherInput, WsfeBuyer, WsfeCatalogEntry, WsfeCurrencyType, WsfeDateInput, WsfeOptionalField, WsfeQuotation, WsfeReceiverVatCondition, WsfeSalesPoint, WsfeServerStatus, WsfeService, WsfeTax, WsfeVatRate, WsfeVoucherInfo, WsfeVoucherInput, WsfeVoucherLookupResult, createWsfeService } from './wsfe.js';
9
8
  export { CreateWsmtxcaServiceOptions, WsmtxcaAuthorizationOutcome, WsmtxcaAuthorizeVoucherInput, WsmtxcaLastAuthorizedVoucherResult, WsmtxcaSalesPoint, WsmtxcaSalesPointsResult, WsmtxcaService, WsmtxcaVoucherInfo, WsmtxcaVoucherLookupOutcome, WsmtxcaVoucherLookupResult, createWsmtxcaService } from './wsmtxca.js';
10
- import './index-CT1ffEAL.js';
9
+ import './index-DAC3edtw.js';
11
10
 
12
11
  /** Valid ARCA environment names. */
13
12
  declare const ARCA_ENVIRONMENTS: readonly ["production", "test"];
package/dist/index.mjs CHANGED
@@ -11,27 +11,23 @@ import {
11
11
  resolveArcaEnvironment,
12
12
  storeCall,
13
13
  withLease
14
- } from "./chunk-G7BWMDFT.mjs";
15
- import {
16
- createPadronService
17
- } from "./chunk-7LEKQ4P7.mjs";
18
- import {
19
- buildFacturaB,
20
- buildFacturaC
21
- } from "./chunk-VGNLXU4T.mjs";
22
- import {
23
- createWsfeService
24
- } from "./chunk-QHYJ424J.mjs";
14
+ } from "./chunk-KPWAQMR5.mjs";
25
15
  import {
26
16
  ARCA_FINAL_CONSUMER_IDENTIFICATION_THRESHOLD_MINOR_UNITS,
27
17
  ARCA_INVOICE_CLASS_BY_ISSUER,
28
18
  ARCA_ISSUER_CONDITION_IDS,
29
19
  ARCA_RECEIVER_CONDITION_IDS
30
- } from "./chunk-GX5ERXT6.mjs";
20
+ } from "./chunk-LQMNKQ2V.mjs";
21
+ import {
22
+ createPadronService
23
+ } from "./chunk-WVKVJTFG.mjs";
24
+ import {
25
+ createWsfeService
26
+ } from "./chunk-BPBTQDCO.mjs";
31
27
  import {
32
28
  createWsmtxcaService
33
- } from "./chunk-ZPVXXSUC.mjs";
34
- import "./chunk-UDX6HLAU.mjs";
29
+ } from "./chunk-WN62NMUJ.mjs";
30
+ import "./chunk-PHXH34L6.mjs";
35
31
  import {
36
32
  ArcaAuthenticationError,
37
33
  ArcaConfigurationError,
@@ -43,7 +39,7 @@ import {
43
39
  ArcaTransportError,
44
40
  isArcaAuthenticationError,
45
41
  toArcaSafeErrorMetadata
46
- } from "./chunk-ZOSNASXB.mjs";
42
+ } from "./chunk-BYEP3ABS.mjs";
47
43
 
48
44
  // src/store/memory.ts
49
45
  function createMemoryStore() {
@@ -236,8 +232,6 @@ export {
236
232
  ArcaSoapFaultError,
237
233
  ArcaTransportError,
238
234
  assertArcaClientConfig,
239
- buildFacturaB,
240
- buildFacturaC,
241
235
  createArcaClient,
242
236
  createArcaClientConfigFromEnv,
243
237
  createFileStore,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store/memory.ts","../src/store/postgres.ts","../src/store/redis.ts"],"sourcesContent":["import type { ArcaStore } from \"./types\";\n\n/** In-process store for tests; reservations do not survive a restart. */\nexport function createMemoryStore(): ArcaStore {\n const values = new Map<string, string>();\n const locks = new Map<string, Promise<void>>();\n return {\n get: (key) => Promise.resolve(values.get(key) ?? null),\n set(key, value) {\n values.set(key, value);\n return Promise.resolve();\n },\n add(key, value) {\n if (values.has(key)) {\n return Promise.resolve(false);\n }\n values.set(key, value);\n return Promise.resolve(true);\n },\n delete(key) {\n values.delete(key);\n return Promise.resolve();\n },\n async withLock(key, fn) {\n const previous = locks.get(key) ?? Promise.resolve();\n let release: () => void = () => undefined;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.catch(() => undefined).then(() => current);\n locks.set(key, queued);\n await previous.catch(() => undefined);\n try {\n return await fn();\n } finally {\n release();\n if (locks.get(key) === queued) {\n locks.delete(key);\n }\n }\n },\n };\n}\n","import { ArcaConfigurationError } from \"../errors\";\nimport { ARCA_LEASE_MS, withLease } from \"./lock\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\ntype Row = { key?: string; value?: string };\n/** Uses the caller's SQL client; provision the table before use. */\nexport function createPostgresStore({\n query,\n table = \"arca_store\",\n}: {\n query: (text: string, params: string[]) => Promise<Row[] | { rows: Row[] }>;\n table?: string;\n}): ArcaStore {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(table)) {\n throw new ArcaConfigurationError(\"Invalid ARCA store table identifier.\");\n }\n const name = `\"${table}\"`;\n const lease = Math.round(ARCA_LEASE_MS / 1000);\n const run = (text: string, params: string[]) =>\n storeCall(async () => {\n const result = await query(text, params);\n return Array.isArray(result) ? result : result.rows;\n });\n return {\n async get(key) {\n return (\n (await run(`SELECT value FROM ${name} WHERE key = $1`, [key]))[0]\n ?.value ?? null\n );\n },\n async set(key, value) {\n await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = now()`,\n [key, value]\n );\n },\n async add(key, value) {\n return (\n (\n await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT DO NOTHING RETURNING key`,\n [key, value]\n )\n ).length > 0\n );\n },\n async delete(key) {\n await run(`DELETE FROM ${name} WHERE key = $1`, [key]);\n },\n withLock(key, fn) {\n // A lease row, not an advisory lock: it survives a transaction-mode\n // pooler, where a session-scoped lock would be taken on another backend.\n return withLease(\n key,\n {\n async acquire(owner) {\n const taken = await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT DO NOTHING RETURNING key`,\n [key, owner]\n );\n if (taken.length > 0) {\n return true;\n }\n const expired = await run(\n `UPDATE ${name} SET value = $2, updated_at = now() WHERE key = $1 AND updated_at < now() - interval '${lease} seconds' RETURNING key`,\n [key, owner]\n );\n return expired.length > 0;\n },\n async renew(owner) {\n await run(\n `UPDATE ${name} SET updated_at = now() WHERE key = $1 AND value = $2`,\n [key, owner]\n );\n },\n async release(owner) {\n await run(`DELETE FROM ${name} WHERE key = $1 AND value = $2`, [\n key,\n owner,\n ]);\n },\n },\n fn\n );\n },\n };\n}\n","import { ArcaConfigurationError } from \"../errors\";\nimport { ARCA_LEASE_MS, withLease } from \"./lock\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\ntype RedisClient = {\n get(key: string): Promise<unknown>;\n set(key: string, value: string): Promise<unknown>;\n call?(...args: string[]): Promise<unknown>;\n del?(key: string): Promise<unknown>;\n};\n/** Uses ioredis or Upstash without importing either driver. */\nexport function createRedisStore(\n client: RedisClient,\n options: { flavor?: \"ioredis\" | \"upstash\" } = {}\n): ArcaStore {\n const flavor =\n options.flavor ??\n (typeof client.call === \"function\" ? \"ioredis\" : \"upstash\");\n if (flavor === \"ioredis\" && !client.call) {\n throw new ArcaConfigurationError(\n \"ARCA Redis ioredis flavor requires client.call.\"\n );\n }\n // The public structural type accepts ioredis's overloaded set method.\n // Only the Upstash flavor invokes its options-object overload.\n const upstashSet = client.set as (\n key: string,\n value: string,\n options: { nx?: true; xx?: true; px?: number }\n ) => Promise<unknown>;\n const read = async (key: string) => {\n const value = await client.get(key);\n if (value === null || value === undefined) {\n return null;\n }\n // Upstash can deserialize stored JSON automatically.\n return typeof value === \"string\" ? value : JSON.stringify(value);\n };\n // A lease, so a crashed holder frees the key; a renewal keeps a live one.\n const lease = (key: string, owner: string, mode: \"nx\" | \"xx\") =>\n storeCall(\n async () =>\n (flavor === \"ioredis\"\n ? await client.call?.(\n \"SET\",\n key,\n owner,\n mode.toUpperCase(),\n \"PX\",\n String(ARCA_LEASE_MS)\n )\n : await upstashSet.call(client, key, owner, {\n [mode]: true,\n px: ARCA_LEASE_MS,\n })) === \"OK\"\n );\n return {\n get: (key) => storeCall(() => read(key)),\n set: (key, value) =>\n storeCall(async () => {\n await client.set(key, value);\n }),\n add: (key, value) =>\n storeCall(\n async () =>\n (flavor === \"ioredis\"\n ? await client.call?.(\"SET\", key, value, \"NX\")\n : await upstashSet.call(client, key, value, { nx: true })) === \"OK\"\n ),\n ...(client.del\n ? {\n delete: (key: string) =>\n storeCall(async () => {\n await client.del?.(key);\n }),\n withLock: <T>(key: string, fn: () => Promise<T>) =>\n withLease(\n key,\n {\n acquire: (owner) => lease(key, owner, \"nx\"),\n renew: async (owner) => {\n // Check and set: only the holder extends its own lease.\n if ((await storeCall(() => read(key))) === owner) {\n await lease(key, owner, \"xx\");\n }\n },\n release: async (owner) => {\n await storeCall(async () => {\n if ((await read(key)) === owner) {\n await client.del?.(key);\n }\n });\n },\n },\n fn\n ),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/store/memory.ts","../src/store/postgres.ts","../src/store/redis.ts"],"sourcesContent":["import type { ArcaStore } from \"./types\";\n\n/** In-process store for tests; reservations do not survive a restart. */\nexport function createMemoryStore(): ArcaStore {\n const values = new Map<string, string>();\n const locks = new Map<string, Promise<void>>();\n return {\n get: (key) => Promise.resolve(values.get(key) ?? null),\n set(key, value) {\n values.set(key, value);\n return Promise.resolve();\n },\n add(key, value) {\n if (values.has(key)) {\n return Promise.resolve(false);\n }\n values.set(key, value);\n return Promise.resolve(true);\n },\n delete(key) {\n values.delete(key);\n return Promise.resolve();\n },\n async withLock(key, fn) {\n const previous = locks.get(key) ?? Promise.resolve();\n let release: () => void = () => undefined;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.catch(() => undefined).then(() => current);\n locks.set(key, queued);\n await previous.catch(() => undefined);\n try {\n return await fn();\n } finally {\n release();\n if (locks.get(key) === queued) {\n locks.delete(key);\n }\n }\n },\n };\n}\n","import { ArcaConfigurationError } from \"../errors\";\nimport { ARCA_LEASE_MS, withLease } from \"./lock\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\ntype Row = { key?: string; value?: string };\n/** Uses the caller's SQL client; provision the table before use. */\nexport function createPostgresStore({\n query,\n table = \"arca_store\",\n}: {\n query: (text: string, params: string[]) => Promise<Row[] | { rows: Row[] }>;\n table?: string;\n}): ArcaStore {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(table)) {\n throw new ArcaConfigurationError(\"Invalid ARCA store table identifier.\");\n }\n const name = `\"${table}\"`;\n const lease = Math.round(ARCA_LEASE_MS / 1000);\n const run = (text: string, params: string[]) =>\n storeCall(async () => {\n const result = await query(text, params);\n return Array.isArray(result) ? result : result.rows;\n });\n return {\n async get(key) {\n return (\n (await run(`SELECT value FROM ${name} WHERE key = $1`, [key]))[0]\n ?.value ?? null\n );\n },\n async set(key, value) {\n await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, updated_at = now()`,\n [key, value]\n );\n },\n async add(key, value) {\n return (\n (\n await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT DO NOTHING RETURNING key`,\n [key, value]\n )\n ).length > 0\n );\n },\n async delete(key) {\n await run(`DELETE FROM ${name} WHERE key = $1`, [key]);\n },\n withLock(key, fn) {\n // A lease row, not an advisory lock: it survives a transaction-mode\n // pooler, where a session-scoped lock would be taken on another backend.\n return withLease(\n key,\n {\n async acquire(owner) {\n const taken = await run(\n `INSERT INTO ${name} (key, value) VALUES ($1, $2) ON CONFLICT DO NOTHING RETURNING key`,\n [key, owner]\n );\n if (taken.length > 0) {\n return true;\n }\n const expired = await run(\n `UPDATE ${name} SET value = $2, updated_at = now() WHERE key = $1 AND updated_at < now() - interval '${lease} seconds' RETURNING key`,\n [key, owner]\n );\n return expired.length > 0;\n },\n async renew(owner) {\n await run(\n `UPDATE ${name} SET updated_at = now() WHERE key = $1 AND value = $2`,\n [key, owner]\n );\n },\n async release(owner) {\n await run(`DELETE FROM ${name} WHERE key = $1 AND value = $2`, [\n key,\n owner,\n ]);\n },\n },\n fn\n );\n },\n };\n}\n","import { ArcaConfigurationError } from \"../errors\";\nimport { ARCA_LEASE_MS, withLease } from \"./lock\";\nimport { type ArcaStore, storeCall } from \"./types\";\n\ntype RedisClient = {\n get(key: string): Promise<unknown>;\n set(key: string, value: string): Promise<unknown>;\n call?(...args: string[]): Promise<unknown>;\n del?(key: string): Promise<unknown>;\n};\n/** Uses ioredis or Upstash without importing either driver. */\nexport function createRedisStore(\n client: RedisClient,\n options: { flavor?: \"ioredis\" | \"upstash\" } = {}\n): ArcaStore {\n const flavor =\n options.flavor ??\n (typeof client.call === \"function\" ? \"ioredis\" : \"upstash\");\n if (flavor === \"ioredis\" && !client.call) {\n throw new ArcaConfigurationError(\n \"ARCA Redis ioredis flavor requires client.call.\"\n );\n }\n // The public structural type accepts ioredis's overloaded set method.\n // Only the Upstash flavor invokes its options-object overload.\n const upstashSet = client.set as (\n key: string,\n value: string,\n options: { nx?: true; xx?: true; px?: number }\n ) => Promise<unknown>;\n const read = async (key: string) => {\n const value = await client.get(key);\n if (value === null || value === undefined) {\n return null;\n }\n // Upstash can deserialize stored JSON automatically.\n return typeof value === \"string\" ? value : JSON.stringify(value);\n };\n // A lease, so a crashed holder frees the key; a renewal keeps a live one.\n const lease = (key: string, owner: string, mode: \"nx\" | \"xx\") =>\n storeCall(\n async () =>\n (flavor === \"ioredis\"\n ? await client.call?.(\n \"SET\",\n key,\n owner,\n mode.toUpperCase(),\n \"PX\",\n String(ARCA_LEASE_MS)\n )\n : await upstashSet.call(client, key, owner, {\n [mode]: true,\n px: ARCA_LEASE_MS,\n })) === \"OK\"\n );\n return {\n get: (key) => storeCall(() => read(key)),\n set: (key, value) =>\n storeCall(async () => {\n await client.set(key, value);\n }),\n add: (key, value) =>\n storeCall(\n async () =>\n (flavor === \"ioredis\"\n ? await client.call?.(\"SET\", key, value, \"NX\")\n : await upstashSet.call(client, key, value, { nx: true })) === \"OK\"\n ),\n ...(client.del\n ? {\n delete: (key: string) =>\n storeCall(async () => {\n await client.del?.(key);\n }),\n withLock: <T>(key: string, fn: () => Promise<T>) =>\n withLease(\n key,\n {\n acquire: (owner) => lease(key, owner, \"nx\"),\n renew: async (owner) => {\n // Check and set: only the holder extends its own lease.\n if ((await storeCall(() => read(key))) === owner) {\n await lease(key, owner, \"xx\");\n }\n },\n release: async (owner) => {\n await storeCall(async () => {\n if ((await read(key)) === owner) {\n await client.del?.(key);\n }\n });\n },\n },\n fn\n ),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
package/dist/padron.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as ArcaClientConfig } from './types-SdBQAflw.js';
2
- import { W as WsaaAuthModule, S as SoapTransport } from './index-CT1ffEAL.js';
1
+ import { a as ArcaClientConfig } from './types-Su7QwloQ.js';
2
+ import { W as WsaaAuthModule, S as SoapTransport } from './index-DAC3edtw.js';
3
3
 
4
4
  /** Result of a taxpayer lookup via Padron A5. */
5
5
  type PadronTaxpayerResult = {
package/dist/padron.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPadronService
3
- } from "./chunk-7LEKQ4P7.mjs";
4
- import "./chunk-ZOSNASXB.mjs";
3
+ } from "./chunk-WVKVJTFG.mjs";
4
+ import "./chunk-BYEP3ABS.mjs";
5
5
  export {
6
6
  createPadronService
7
7
  };
@@ -64,7 +64,7 @@ type ArcaAuthOptions = {
64
64
  forceRefresh?: boolean;
65
65
  representedTaxId?: ArcaRepresentedTaxId;
66
66
  /** Aborts login, submission and consultation with the caller's deadline. */
67
- signal?: AbortSignal;
67
+ abortSignal?: AbortSignal;
68
68
  };
69
69
  type ArcaSoapExecutionOptions<TBody> = {
70
70
  service: ArcaServiceName;
package/dist/types.d.ts CHANGED
@@ -1 +1 @@
1
- export { g as ArcaAuthCredentials, f as ArcaAuthOptions, A as ArcaClientConfig, h as ArcaEnvironment, k as ArcaLogLevel, l as ArcaLoggerConfig, m as ArcaPadronServiceName, n as ArcaRepresentedTaxId, b as ArcaServiceName, o as ArcaServiceTarget, e as ArcaWsaaServiceId, p as ArcaWsaaSessionKey, j as ArcaWsaaSessionStore } from './types-SdBQAflw.js';
1
+ export { g as ArcaAuthCredentials, f as ArcaAuthOptions, A as ArcaClientConfig, h as ArcaEnvironment, k as ArcaLogLevel, l as ArcaLoggerConfig, m as ArcaPadronServiceName, n as ArcaRepresentedTaxId, b as ArcaServiceName, o as ArcaServiceTarget, e as ArcaWsaaServiceId, p as ArcaWsaaSessionKey, j as ArcaWsaaSessionStore } from './types-Su7QwloQ.js';
package/dist/wsfe.d.ts CHANGED
@@ -1,45 +1,269 @@
1
- import { i as WsfeDateInput, S as SupportedVatRate, s as WsfeVoucherInput } from './decimal-xie0oMOQ.js';
2
- export { C as CreateWsfeServiceOptions, W as WsfeActivity, a as WsfeActivityType, b as WsfeAssociatedPeriod, c as WsfeAssociatedVoucher, d as WsfeAuthorizationOutcome, e as WsfeAuthorizeVoucherInput, f as WsfeBuyer, g as WsfeCatalogEntry, h as WsfeCurrencyType, j as WsfeOptionalField, k as WsfeQuotation, l as WsfeReceiverVatCondition, m as WsfeSalesPoint, n as WsfeServerStatus, o as WsfeService, p as WsfeTax, q as WsfeVatRate, r as WsfeVoucherInfo, t as WsfeVoucherLookupResult, u as createWsfeService } from './decimal-xie0oMOQ.js';
3
- import './types-SdBQAflw.js';
4
- import './index-CT1ffEAL.js';
5
- import './fiscal-evidence-Dpj-Iao8.js';
1
+ import { a as ArcaClientConfig } from './types-Su7QwloQ.js';
2
+ import { W as WsaaAuthModule, S as SoapTransport } from './index-DAC3edtw.js';
3
+ import { e as ArcaAuthorizationOutcome, t as ArcaVoucherLookupResult } from './fiscal-evidence-DaCyGd5o.js';
6
4
 
7
- type WsfeBuilderCurrencyInput = {
8
- currency?: "ARS";
9
- exchangeRate?: never;
10
- sameCurrencyForeignCancellation?: never;
11
- } | {
12
- currency: "USD";
13
- exchangeRate: string;
14
- sameCurrencyForeignCancellation?: false;
15
- } | {
16
- currency: "USD";
17
- exchangeRate?: never;
18
- sameCurrencyForeignCancellation: true;
19
- };
20
- type WsfeBuilderVatRate = SupportedVatRate;
21
- type WsfeInvoiceBuilderBaseInput = {
5
+ /** Accepted public date inputs for WSFE request fields. */
6
+ type WsfeDateInput = `${number}${number}${number}${number}-${number}${number}-${number}${number}` | `${number}${number}${number}${number}${number}${number}${number}${number}`;
7
+ /** An associated voucher referenced by a WSFE invoice request. */
8
+ type WsfeAssociatedVoucher = {
9
+ type: number;
22
10
  salesPoint: number;
11
+ number: number;
12
+ taxId?: string;
13
+ voucherDate?: WsfeDateInput;
14
+ };
15
+ /** An associated period used by WSFE credit/debit notes without associated vouchers. */
16
+ type WsfeAssociatedPeriod = {
17
+ startDate: WsfeDateInput;
18
+ endDate: WsfeDateInput;
19
+ };
20
+ /** A tax (tributo) item in a WSFE invoice request. */
21
+ type WsfeTax = {
22
+ id: number;
23
+ description?: string;
24
+ baseAmount: number;
25
+ rate: number;
26
+ amount: number;
27
+ };
28
+ /** A VAT rate (alícuota IVA) item in a WSFE invoice request. */
29
+ type WsfeVatRate = {
30
+ id: number;
31
+ baseAmount: number;
32
+ amount: number;
33
+ };
34
+ /** An optional field (campo opcional) in a WSFE invoice request. */
35
+ type WsfeOptionalField = {
36
+ id: string;
37
+ value: string;
38
+ };
39
+ /** A buyer (comprador) in a WSFE invoice request. */
40
+ type WsfeBuyer = {
41
+ documentType: number;
42
+ documentNumber: number;
43
+ percentage: number;
44
+ };
45
+ /** An activity associated with a WSFE invoice request. */
46
+ type WsfeActivity = {
47
+ id: number;
48
+ };
49
+ /** Input data for authorizing a WSFE voucher. */
50
+ type WsfeVoucherInput = {
51
+ salesPoint: number;
52
+ voucherType: number;
23
53
  concept: number;
24
54
  documentType: number;
25
55
  documentNumber: number;
26
56
  receiverVatConditionId: number;
27
57
  voucherDate: WsfeDateInput;
58
+ totalAmount: number;
59
+ nonTaxableAmount: number;
60
+ netAmount: number;
61
+ exemptAmount: number;
62
+ taxAmount: number;
63
+ vatAmount: number;
64
+ currencyId: string;
65
+ exchangeRate?: number | string;
66
+ sameCurrencyForeignCancellation?: "S" | "N";
28
67
  serviceStartDate?: WsfeDateInput;
29
68
  serviceEndDate?: WsfeDateInput;
30
69
  paymentDueDate?: WsfeDateInput;
70
+ associatedVouchers?: WsfeAssociatedVoucher[];
71
+ associatedPeriod?: WsfeAssociatedPeriod;
72
+ taxes?: WsfeTax[];
73
+ vatRates?: WsfeVatRate[];
74
+ optionalFields?: WsfeOptionalField[];
75
+ buyers?: WsfeBuyer[];
76
+ activities?: WsfeActivity[];
31
77
  };
32
- type BuildFacturaBInput = WsfeInvoiceBuilderBaseInput & WsfeBuilderCurrencyInput & {
33
- /** Positive integer currency minor units forming the taxable base. */
34
- taxableAmount: number;
35
- vatRate: WsfeBuilderVatRate;
78
+ /** Input for authorizing a WSFE voucher with an explicit voucher number. */
79
+ type WsfeAuthorizeVoucherInput = {
80
+ representedTaxId?: number | string;
81
+ data: WsfeVoucherInput;
82
+ voucherNumber: number;
83
+ forceRefresh?: boolean;
84
+ /** Aborts login, submission and consultation with the caller's deadline. */
85
+ abortSignal?: AbortSignal;
36
86
  };
37
- type BuildFacturaCInput = WsfeInvoiceBuilderBaseInput & WsfeBuilderCurrencyInput & {
38
- amount: number;
87
+ /** Structured evidence from one exact WSFE authorization attempt. */
88
+ type WsfeAuthorizationOutcome = ArcaAuthorizationOutcome<"wsfe">;
89
+ /** A point-of-sale entry returned by {@link WsfeService.getSalesPoints}. */
90
+ type WsfeSalesPoint = {
91
+ number: number;
92
+ emissionType?: string;
93
+ blocked?: string;
94
+ deletedSince?: string;
95
+ };
96
+ /** Voucher details returned by {@link WsfeService.getVoucherInfo}. */
97
+ type WsfeVoucherInfo = {
98
+ voucherNumber: number;
99
+ voucherDate?: string;
100
+ salesPoint?: number;
101
+ voucherType?: number;
102
+ concept?: number;
103
+ documentType?: number;
104
+ documentNumber?: string;
105
+ receiverVatConditionId?: number;
106
+ totalAmount?: number;
107
+ nonTaxableAmount?: number;
108
+ netAmount?: number;
109
+ exemptAmount?: number;
110
+ taxAmount?: number;
111
+ vatAmount?: number;
112
+ currencyId?: string;
113
+ exchangeRate?: number;
114
+ result?: string;
115
+ cae?: string;
116
+ caeExpiry?: string;
117
+ vatRates?: WsfeVatRate[];
118
+ serviceStartDate?: string;
119
+ serviceEndDate?: string;
120
+ paymentDueDate?: string;
121
+ taxes?: WsfeTax[];
122
+ associatedVouchers?: WsfeAssociatedVoucher[];
123
+ associatedPeriod?: WsfeAssociatedPeriod;
124
+ optionalFields?: WsfeOptionalField[];
125
+ buyers?: WsfeBuyer[];
126
+ activities?: WsfeActivity[];
127
+ sameCurrencyForeignCancellation?: "S" | "N";
128
+ raw: Record<string, unknown>;
129
+ };
130
+ /** Typed exact-voucher consultation result for WSFE. */
131
+ type WsfeVoucherLookupResult = ArcaVoucherLookupResult<WsfeVoucherInfo, "wsfe">;
132
+ type WsfeCatalogEntry = {
133
+ id: number;
134
+ description: string;
135
+ };
136
+ type WsfeActivityType = WsfeCatalogEntry & {
137
+ order: number;
138
+ };
139
+ type WsfeReceiverVatCondition = WsfeCatalogEntry & {
140
+ voucherClass: string;
141
+ };
142
+ type WsfeCurrencyType = {
143
+ id: string;
144
+ description: string;
145
+ validFrom: string;
146
+ validTo: string;
147
+ };
148
+ type WsfeServerStatus = {
149
+ appServer: string;
150
+ dbServer: string;
151
+ authServer: string;
152
+ };
153
+ type WsfeQuotation = {
154
+ currencyId: string;
155
+ rate: number;
156
+ date: string;
157
+ };
158
+ /** WSFE electronic invoicing service. */
159
+ type WsfeService = {
160
+ /**
161
+ * Issues one exact voucher: a single FECAESolicitar for the caller-owned
162
+ * `voucherNumber`, without transport retries, returning structured evidence
163
+ * (`authorized`, `rejected` or `indeterminate`) instead of throwing.
164
+ */
165
+ issue(input: WsfeAuthorizeVoucherInput): Promise<WsfeAuthorizationOutcome>;
166
+ /** Returns the next available voucher number for the given sales point and type. */
167
+ getNextVoucherNumber(input: {
168
+ representedTaxId?: number | string;
169
+ salesPoint: number;
170
+ voucherType: number;
171
+ forceRefresh?: boolean;
172
+ abortSignal?: AbortSignal;
173
+ }): Promise<number>;
174
+ /**
175
+ * @deprecated Use `getNextVoucherNumber()` instead.
176
+ * Returns the next available voucher number, not the last authorized one.
177
+ */
178
+ getLastVoucher(input: {
179
+ representedTaxId?: number | string;
180
+ salesPoint: number;
181
+ voucherType: number;
182
+ forceRefresh?: boolean;
183
+ }): Promise<number>;
184
+ /** Lists all configured points of sale for the taxpayer. */
185
+ getSalesPoints(input: {
186
+ representedTaxId?: number | string;
187
+ forceRefresh?: boolean;
188
+ }): Promise<WsfeSalesPoint[]>;
189
+ /** Lists voucher types accepted by WSFE. */
190
+ getVoucherTypes(input: {
191
+ representedTaxId?: number | string;
192
+ forceRefresh?: boolean;
193
+ }): Promise<WsfeCatalogEntry[]>;
194
+ /** Lists document types accepted by WSFE. */
195
+ getDocumentTypes(input: {
196
+ representedTaxId?: number | string;
197
+ forceRefresh?: boolean;
198
+ }): Promise<WsfeCatalogEntry[]>;
199
+ /** Lists concept types accepted by WSFE. */
200
+ getConceptTypes(input: {
201
+ representedTaxId?: number | string;
202
+ forceRefresh?: boolean;
203
+ }): Promise<WsfeCatalogEntry[]>;
204
+ /** Lists live ARCA currency identifiers such as PES and DOL, not ISO codes. */
205
+ getCurrencyTypes(input: {
206
+ representedTaxId?: number | string;
207
+ forceRefresh?: boolean;
208
+ }): Promise<WsfeCurrencyType[]>;
209
+ /** Lists VAT rates accepted by WSFE. */
210
+ getVatRates(input: {
211
+ representedTaxId?: number | string;
212
+ forceRefresh?: boolean;
213
+ }): Promise<WsfeCatalogEntry[]>;
214
+ /** Lists tax types accepted by WSFE. */
215
+ getTaxTypes(input: {
216
+ representedTaxId?: number | string;
217
+ forceRefresh?: boolean;
218
+ }): Promise<WsfeCatalogEntry[]>;
219
+ /** Lists optional field types accepted by WSFE. */
220
+ getOptionalTypes(input: {
221
+ representedTaxId?: number | string;
222
+ forceRefresh?: boolean;
223
+ }): Promise<WsfeCatalogEntry[]>;
224
+ /** Lists activities enabled for the taxpayer. */
225
+ getActivities(input: {
226
+ representedTaxId?: number | string;
227
+ forceRefresh?: boolean;
228
+ }): Promise<WsfeActivityType[]>;
229
+ /** Lists receiver VAT condition values accepted by WSFE. */
230
+ getReceiverVatConditions(input: {
231
+ representedTaxId?: number | string;
232
+ voucherClass?: string;
233
+ forceRefresh?: boolean;
234
+ }): Promise<WsfeReceiverVatCondition[]>;
235
+ /** Reports WSFE backend status without requiring taxpayer authorization. */
236
+ getServerStatus(): Promise<WsfeServerStatus>;
237
+ /** Returns the exchange rate for a given currency. */
238
+ getQuotation(input: {
239
+ currencyId: string;
240
+ representedTaxId?: number | string;
241
+ forceRefresh?: boolean;
242
+ }): Promise<WsfeQuotation>;
243
+ /** Retrieves details for a specific voucher. Returns `null` if not found. */
244
+ getVoucherInfo(input: {
245
+ representedTaxId?: number | string;
246
+ number: number;
247
+ salesPoint: number;
248
+ voucherType: number;
249
+ forceRefresh?: boolean;
250
+ }): Promise<WsfeVoucherInfo | null>;
251
+ /** Consults one exact voucher and normalizes WSFE error 602 to `not_found`. */
252
+ lookupVoucher(input: {
253
+ representedTaxId?: number | string;
254
+ number: number;
255
+ salesPoint: number;
256
+ voucherType: number;
257
+ forceRefresh?: boolean;
258
+ abortSignal?: AbortSignal;
259
+ }): Promise<WsfeVoucherLookupResult>;
260
+ };
261
+ type CreateWsfeServiceOptions = {
262
+ config: ArcaClientConfig;
263
+ auth: WsaaAuthModule;
264
+ soap: SoapTransport;
39
265
  };
40
- /** Builds a narrow Factura B exact WSFE input from integer currency minor units. */
41
- declare function buildFacturaB(input: BuildFacturaBInput): WsfeVoucherInput;
42
- /** Builds a narrow Factura C exact WSFE input from integer currency minor units. */
43
- declare function buildFacturaC(input: BuildFacturaCInput): WsfeVoucherInput;
266
+ /** Creates a WSFE service instance wired with authentication and SOAP transport. */
267
+ declare function createWsfeService(options: CreateWsfeServiceOptions): WsfeService;
44
268
 
45
- export { type BuildFacturaBInput, type BuildFacturaCInput, type WsfeBuilderCurrencyInput, type WsfeBuilderVatRate, WsfeDateInput, WsfeVoucherInput, buildFacturaB, buildFacturaC };
269
+ export { type CreateWsfeServiceOptions, type WsfeActivity, type WsfeActivityType, type WsfeAssociatedPeriod, type WsfeAssociatedVoucher, type WsfeAuthorizationOutcome, type WsfeAuthorizeVoucherInput, type WsfeBuyer, type WsfeCatalogEntry, type WsfeCurrencyType, type WsfeDateInput, type WsfeOptionalField, type WsfeQuotation, type WsfeReceiverVatCondition, type WsfeSalesPoint, type WsfeServerStatus, type WsfeService, type WsfeTax, type WsfeVatRate, type WsfeVoucherInfo, type WsfeVoucherInput, type WsfeVoucherLookupResult, createWsfeService };
package/dist/wsfe.mjs CHANGED
@@ -1,16 +1,9 @@
1
- import {
2
- buildFacturaB,
3
- buildFacturaC
4
- } from "./chunk-VGNLXU4T.mjs";
5
1
  import {
6
2
  createWsfeService
7
- } from "./chunk-QHYJ424J.mjs";
8
- import "./chunk-GX5ERXT6.mjs";
9
- import "./chunk-UDX6HLAU.mjs";
10
- import "./chunk-ZOSNASXB.mjs";
3
+ } from "./chunk-BPBTQDCO.mjs";
4
+ import "./chunk-PHXH34L6.mjs";
5
+ import "./chunk-BYEP3ABS.mjs";
11
6
  export {
12
- buildFacturaB,
13
- buildFacturaC,
14
7
  createWsfeService
15
8
  };
16
9
  //# sourceMappingURL=wsfe.mjs.map
package/dist/wsmtxca.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { n as ArcaRepresentedTaxId, a as ArcaClientConfig } from './types-SdBQAflw.js';
2
- import { W as WsaaAuthModule, S as SoapTransport } from './index-CT1ffEAL.js';
3
- import { A as ArcaAuthorizationOutcome, a as ArcaVoucherLookupResult } from './fiscal-evidence-Dpj-Iao8.js';
1
+ import { n as ArcaRepresentedTaxId, a as ArcaClientConfig } from './types-Su7QwloQ.js';
2
+ import { W as WsaaAuthModule, S as SoapTransport } from './index-DAC3edtw.js';
3
+ import { e as ArcaAuthorizationOutcome, t as ArcaVoucherLookupResult } from './fiscal-evidence-DaCyGd5o.js';
4
4
 
5
5
  /** Input data for one WSMTXCA voucher authorization. */
6
6
  type WsmtxcaAuthorizeVoucherInput = {
@@ -8,7 +8,7 @@ type WsmtxcaAuthorizeVoucherInput = {
8
8
  data: Record<string, unknown>;
9
9
  forceRefresh?: boolean;
10
10
  /** Aborts login, submission and consultation with the caller's deadline. */
11
- signal?: AbortSignal;
11
+ abortSignal?: AbortSignal;
12
12
  };
13
13
  /** Structured evidence from one exact WSMTXCA authorization attempt. */
14
14
  type WsmtxcaAuthorizationOutcome = ArcaAuthorizationOutcome<"wsmtxca">;
@@ -73,7 +73,7 @@ type WsmtxcaService = {
73
73
  voucherType: number;
74
74
  salesPoint: number;
75
75
  forceRefresh?: boolean;
76
- signal?: AbortSignal;
76
+ abortSignal?: AbortSignal;
77
77
  }): Promise<WsmtxcaLastAuthorizedVoucherResult>;
78
78
  /** Returns the points of sale enabled for WSMTXCA. */
79
79
  getSalesPoints(input: {
@@ -87,7 +87,7 @@ type WsmtxcaService = {
87
87
  salesPoint: number;
88
88
  voucherNumber: number;
89
89
  forceRefresh?: boolean;
90
- signal?: AbortSignal;
90
+ abortSignal?: AbortSignal;
91
91
  }): Promise<WsmtxcaVoucherLookupOutcome>;
92
92
  /** Retrieves details for a specific voucher. */
93
93
  getVoucher(input: {
package/dist/wsmtxca.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createWsmtxcaService
3
- } from "./chunk-ZPVXXSUC.mjs";
4
- import "./chunk-UDX6HLAU.mjs";
5
- import "./chunk-ZOSNASXB.mjs";
3
+ } from "./chunk-WN62NMUJ.mjs";
4
+ import "./chunk-PHXH34L6.mjs";
5
+ import "./chunk-BYEP3ABS.mjs";
6
6
  export {
7
7
  createWsmtxcaService
8
8
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "facturas",
3
- "version": "0.12.3",
3
+ "version": "0.13.0",
4
4
  "description": "Node.js client for ARCA services including WSFE, WSMTXCA, and padron lookups.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",