/** * Add Numbers — Zapier create that needs no backend. * * Inputs: number1, number2 (Zapier number fields). * Output: { number1, number2, sum, mode }. * * If both api_base and api_key are set on the connection, POST /v1/add on the * zappier commercial edge instead of adding locally. * * @module creates/add_numbers */ /** * @param {unknown} value * @param {string} name * @returns {number} */ function toFiniteNumber(value, name) { const n = typeof value === 'number' ? value : Number(value); if (!Number.isFinite(n)) { throw new Error(`${name} must be a finite number`); } return n; } /** * @param {object} z Zapier z toolkit * @param {object} bundle * @param {object} bundle.inputData * @param {string|number} bundle.inputData.number1 * @param {string|number} bundle.inputData.number2 * @param {object} bundle.authData * @returns {Promise<{number1: number, number2: number, sum: number, mode: string}>} */ const perform = async (z, bundle) => { const number1 = toFiniteNumber(bundle.inputData.number1, 'number1'); const number2 = toFiniteNumber(bundle.inputData.number2, 'number2'); const base = (bundle.authData.api_base || process.env.ZAPPIER_API_BASE || '').replace(/\/$/, ''); const key = bundle.authData.api_key || ''; if (base && key) { const response = await z.request({ method: 'POST', url: `${base}/v1/add`, headers: { 'x-api-key': key, 'content-type': 'application/json' }, body: { number1, number2 }, }); const data = response.data || {}; return { number1: data.number1 ?? number1, number2: data.number2 ?? number2, sum: data.sum, mode: 'hosted', }; } return { number1, number2, sum: number1 + number2, mode: 'local' }; }; module.exports = { key: 'add_numbers', noun: 'Sum', display: { label: 'Add Numbers', description: 'Adds number1 and number2. Works with no API — use this to prove the Zapier connection.', }, operation: { cleanInputData: false, inputFields: [ { key: 'number1', label: 'Number 1', type: 'number', required: true, helpText: 'First addend.', }, { key: 'number2', label: 'Number 2', type: 'number', required: true, helpText: 'Second addend.', }, ], perform, sample: { number1: 2, number2: 3, sum: 5, mode: 'local' }, outputFields: [ { key: 'number1', label: 'Number 1', type: 'number' }, { key: 'number2', label: 'Number 2', type: 'number' }, { key: 'sum', label: 'Sum', type: 'number' }, { key: 'mode', label: 'Mode', type: 'string' }, ], }, };