UNPKG

xero-hero

Version:

Heroic utilities to simplify and enable your progress with the [xero-node](https://www.npmjs.com/package/xero-node) SDK.

1 lines 8.8 kB
{"version":3,"sources":["../src/common/instance/operations.ts","../src/common/response/selectors.ts","../src/common/where/generators.ts","../src/accounting/attachments/requests.ts","../src/accounting/contacts/links.ts","../src/utils/properties.ts","../src/accounting/invoices/lineItems.ts","../src/accounting/invoices/links.ts","../src/accounting/journals/links.ts","../src/projects/generators.ts","../src/projects/timeEntries.ts"],"sourcesContent":["import { isObject } from 'deep-cuts';\r\n\r\nexport const deepClone = <T extends object>(instance: T): T => {\r\n if (instance && isObject(instance)) {\r\n const { constructor } = instance;\r\n // @ts-expect-error - This is not passing for TypeScript, bit will for any Xero class.\r\n const clone = new constructor();\r\n /* eslint-disable guard-for-in, functional/immutable-data */\r\n for (const key in instance) {\r\n clone[key] = deepClone(instance[key] as object);\r\n }\r\n /* eslint-enable guard-for-in, functional/immutable-data */\r\n\r\n return clone;\r\n }\r\n\r\n return instance;\r\n};\r\n","export const getListFromResponse = <\r\n T extends Record<string, any>,\r\n U,\r\n>(response: {\r\n body: T;\r\n}): U[] | undefined => {\r\n if (response.body) {\r\n const propertyName = Object.getOwnPropertyNames(response.body);\r\n for (const name of propertyName) {\r\n if (Array.isArray(response.body[name])) {\r\n return response.body[name];\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n};\r\n","export const dateInWhereFormat = (date: Date): string => {\r\n if (date) {\r\n return `DateTime(${date.getFullYear()}, ${\r\n date.getMonth() + 1\r\n }, ${date.getDate()})`;\r\n }\r\n\r\n throw new Error('You must pass in a valid JavaScript Date object.');\r\n};\r\n","import type { ReadStream } from 'node:fs';\r\nimport type http from 'node:http';\r\n\r\nimport { bufferToStream } from 'tranquil-stream';\r\nimport type { Attachments, XeroClient } from 'xero-node';\r\n\r\ntype ICreateInvoiceAttachmentParameters = {\r\n contents: Buffer;\r\n filename: string;\r\n invoiceId: string;\r\n};\r\n\r\nexport const createInvoiceAttachment = async (\r\n client: XeroClient,\r\n tenantId: string,\r\n { invoiceId, filename, contents }: ICreateInvoiceAttachmentParameters,\r\n): Promise<{\r\n body: Attachments;\r\n response: http.IncomingMessage;\r\n}> => {\r\n return client.accountingApi.createInvoiceAttachmentByFileName(\r\n tenantId,\r\n invoiceId,\r\n filename,\r\n bufferToStream(contents) as unknown as ReadStream,\r\n );\r\n};\r\n","import qs from 'qs';\r\nimport type { Contact } from 'xero-node';\r\n\r\nimport { hasProperty } from '../../utils/properties';\r\n\r\nexport const getContactLink = (contact: Contact | string): string => {\r\n return `https://go.xero.com/Contacts/View.aspx?${qs.stringify({\r\n contactID:\r\n (hasProperty(contact, 'contactID')\r\n ? (contact as Contact).contactID\r\n : contact) || 'null-or-empty-contact-id',\r\n })}`;\r\n};\r\n","export const hasProperty = (object: any, property: string): boolean => {\r\n if (Boolean(object) && typeof object === 'object') {\r\n return property in object;\r\n }\r\n\r\n return false;\r\n};\r\n","import { isNil } from 'deep-cuts';\r\nimport type { LineItem } from 'xero-node';\r\n\r\nimport type { DecisionFunction } from '../../types';\r\n\r\nexport const filterInvoiceLineItems = (\r\n lineItems: LineItem[],\r\n minCode: DecisionFunction<LineItem> | string | number,\r\n maxCode?: string | number,\r\n): LineItem[] => {\r\n if (typeof minCode === 'function') {\r\n return (lineItems || []).filter(minCode);\r\n }\r\n\r\n const parsedMinCode = isNil(minCode)\r\n ? minCode\r\n : Number.parseInt(minCode as string, 10);\r\n const parsedMaxCode = isNil(maxCode)\r\n ? maxCode\r\n : Number.parseInt(maxCode as string, 10);\r\n if (parsedMinCode || parsedMaxCode) {\r\n return (lineItems || []).filter(({ itemCode }) => {\r\n const parsedItemCode = isNil(itemCode)\r\n ? itemCode\r\n : Number.parseInt(itemCode as string, 10);\r\n if (parsedItemCode) {\r\n const greaterThanOrEqualToMinCode = isNil(parsedMinCode)\r\n ? true\r\n : parsedItemCode >= parsedMinCode;\r\n const lessThanOrEqualToMaxCode = isNil(parsedMaxCode)\r\n ? true\r\n : parsedItemCode <= (parsedMaxCode || 0);\r\n return greaterThanOrEqualToMinCode && lessThanOrEqualToMaxCode;\r\n }\r\n\r\n return false;\r\n });\r\n }\r\n\r\n return lineItems || [];\r\n};\r\n","import type { Invoice } from 'xero-node';\r\n\r\nimport { hasProperty } from '../../utils/properties';\r\n\r\nexport const getInvoiceLink = (invoice: Invoice | string): string => {\r\n return `https://invoicing.xero.com/view/${\r\n (hasProperty(invoice, 'invoiceID')\r\n ? (invoice as Invoice).invoiceID\r\n : invoice) || 'null-or-empty-invoice-id'\r\n }`;\r\n};\r\n","import qs from 'qs';\r\nimport type { ManualJournal } from 'xero-node';\r\n\r\nimport { hasProperty } from '../../utils/properties';\r\n\r\nexport const getManualJournalLink = (\r\n manualJournal: ManualJournal | string,\r\n): string => {\r\n return `https://go.xero.com/Journal/View.aspx?${qs.stringify({\r\n invoiceID:\r\n (hasProperty(manualJournal, 'manualJournalID')\r\n ? (manualJournal as ManualJournal).manualJournalID\r\n : manualJournal) || 'null-or-empty-manual-journal-id',\r\n })}`;\r\n};\r\n","import type { Amount, CurrencyCode } from './shimTypes';\r\n\r\nexport const generateProjectAmountUSD = (value: number): Amount => {\r\n const amount = {} as Amount;\r\n /* eslint-disable functional/immutable-data */\r\n amount.currency = 'USD' as unknown as CurrencyCode;\r\n amount.value = value;\r\n /* eslint-enable functional/immutable-data */\r\n return amount;\r\n};\r\n","import { roundToNearestFraction } from 'deep-cuts';\r\n\r\nimport type { TimeEntry } from './shimTypes';\r\n\r\nexport const hoursFromTimeEntries = (\r\n timeEntries: TimeEntry[],\r\n denominator: number = 4,\r\n maxDecimalPlaces: number = 2,\r\n): number | undefined => {\r\n const totalMinutes = timeEntries.reduce((totalMinutes, timeEntry) => {\r\n const duration = timeEntry.duration || 0;\r\n return totalMinutes + duration;\r\n }, 0);\r\n return roundToNearestFraction(\r\n totalMinutes / 60,\r\n denominator,\r\n maxDecimalPlaces,\r\n );\r\n};\r\n"],"mappings":"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","names":["qs","qs","totalMinutes"]}