{ "kind": "open-flow-workflow", "version": 1, "name": "Check Airtable Email MX Records", "content": { "modelVersion": 14, "document": { "bindings": {}, "graph": { "nodes": { "n_308aee618cbd2200": { "name": "Check email domains", "kind": "start", "inputDefs": [] }, "n_eff64ed1caca5ceb": { "inputs": { "baseId": { "kind": "value", "value": "YOUR_AIRTABLE_BASE_ID" }, "tableIdOrName": { "kind": "value", "value": "YOUR_AIRTABLE_TABLE_ID" }, "pageSize": { "kind": "value", "value": 100 }, "offset": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_d0cf95af3e94fe32", "output": "offset" } ] } }, "name": "Read Airtable records", "kind": "task", "task": { "inputs": [ { "description": "Base ID in the format appXXXXXXXXXXXXXX.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Base ID in the format appXXXXXXXXXXXXXX." }, "nullable": false, "handle": "baseId" }, { "description": "Table ID or table name accepted by the Airtable path parameter.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Table ID or table name accepted by the Airtable path parameter." }, "nullable": false, "handle": "tableIdOrName" }, { "description": "View name or view ID used by Airtable to filter and sort results.", "jsonSchema": { "type": "string", "minLength": 1, "description": "View name or view ID used by Airtable to filter and sort results." }, "nullable": true, "handle": "view", "value": null }, { "description": "Field names or field IDs to include in the Airtable response.", "jsonSchema": { "type": "array", "items": { "type": "string", "minLength": 1, "description": "An array item." }, "minItems": 1, "description": "Field names or field IDs to include in the Airtable response." }, "nullable": true, "handle": "fields", "value": null }, { "description": "Sort rules applied by Airtable in order.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "field": { "type": "string", "minLength": 1, "description": "Field name or field ID used by Airtable for sorting." }, "direction": { "type": "string", "enum": [ "asc", "desc" ], "description": "Sort direction accepted by Airtable." } }, "required": [ "field" ], "additionalProperties": false, "description": "Sort rule accepted by the Airtable list records endpoint." }, "minItems": 1, "description": "Sort rules applied by Airtable in order." }, "nullable": true, "handle": "sort", "value": null }, { "description": "Formula string evaluated by Airtable to filter matching records.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Formula string evaluated by Airtable to filter matching records." }, "nullable": true, "handle": "filterByFormula", "value": null }, { "description": "Maximum total number of records to return before Airtable stops pagination.", "jsonSchema": { "type": "integer", "minimum": 1, "description": "Maximum total number of records to return before Airtable stops pagination." }, "nullable": true, "handle": "maxRecords", "value": null }, { "description": "Number of records to return per page.", "jsonSchema": { "type": "integer", "minimum": 1, "maximum": 100, "description": "Number of records to return per page." }, "nullable": true, "handle": "pageSize", "value": null }, { "description": "Opaque pagination cursor returned by a previous Airtable response.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Opaque pagination cursor returned by a previous Airtable response." }, "nullable": true, "handle": "offset", "value": null }, { "description": "Cell format accepted by Airtable for read operations.", "jsonSchema": { "type": "string", "enum": [ "json", "string" ], "description": "Cell format accepted by Airtable for read operations." }, "nullable": true, "handle": "cellFormat", "value": null }, { "description": "Timezone string sent to Airtable when cellFormat is string.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Timezone string sent to Airtable when cellFormat is string." }, "nullable": true, "handle": "timeZone", "value": null }, { "description": "User locale sent to Airtable when cellFormat is string.", "jsonSchema": { "type": "string", "minLength": 1, "description": "User locale sent to Airtable when cellFormat is string." }, "nullable": true, "handle": "userLocale", "value": null }, { "description": "Whether Airtable should return field IDs instead of field names in record objects.", "jsonSchema": { "type": "boolean", "description": "Whether Airtable should return field IDs instead of field names in record objects." }, "nullable": true, "handle": "returnFieldsByFieldId", "value": null }, { "description": "Whether Airtable should return date dependency metadata for linked record fields.", "jsonSchema": { "type": "boolean", "description": "Whether Airtable should return date dependency metadata for linked record fields." }, "nullable": true, "handle": "includeDateDependencyMetadata", "value": null }, { "description": "Record metadata fields to include in Airtable list records responses.", "jsonSchema": { "type": "array", "items": { "const": "commentCount", "description": "An array item." }, "minItems": 1, "description": "Record metadata fields to include in Airtable list records responses." }, "nullable": true, "handle": "recordMetadata", "value": null } ], "outputs": [ { "description": "Records returned by Airtable.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Record ID." }, "createdTime": { "type": "string", "description": "Record creation timestamp returned by Airtable." }, "fields": { "type": "object", "additionalProperties": { "description": "A record value." }, "description": "Record fields keyed by field name or field ID." }, "commentCount": { "type": "integer", "description": "Comment count returned by Airtable when enabled on the endpoint." } }, "required": [ "id", "fields" ], "additionalProperties": true, "description": "Airtable record." }, "description": "Records returned by Airtable." }, "nullable": false, "handle": "records" }, { "description": "Pagination cursor for the next page of records, or null when unavailable.", "jsonSchema": { "type": [ "string", "null" ], "description": "Pagination cursor for the next page of records, or null when unavailable." }, "nullable": true, "handle": "offset" } ], "name": "Read Airtable records", "executor": { "kind": "connector", "action": "airtable.list_records" } } }, "n_d0cf95af3e94fe32": { "inputs": { "records": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_eff64ed1caca5ceb", "output": "records" } ] }, "offset": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_eff64ed1caca5ceb", "output": "offset" } ] }, "previous": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_d0cf95af3e94fe32", "output": "state" } ] } }, "name": "Collect Airtable pages", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Record ID." }, "createdTime": { "type": "string", "description": "Record creation timestamp returned by Airtable." }, "fields": { "type": "object", "additionalProperties": { "description": "A record value." }, "description": "Record fields keyed by field name or field ID." }, "commentCount": { "type": "integer", "description": "Comment count returned by Airtable when enabled on the endpoint." } }, "required": [ "id", "fields" ], "additionalProperties": true, "description": "Airtable record." }, "description": "Records returned by Airtable." }, "nullable": false, "handle": "records" }, { "jsonSchema": { "type": [ "string", "null" ], "description": "Pagination cursor for the next page of records, or null when unavailable." }, "nullable": true, "handle": "offset" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": true, "handle": "previous" } ], "outputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "state" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "offset" }, { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "more" } ], "name": "Collect Airtable pages", "moduleId": "n_a3bf2bf9f815d86e", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_59d99522c5059de2": { "inputs": {}, "name": "More pages?", "kind": "condition", "matchMode": "first", "cases": [ { "output": "yes", "groups": [ { "expressions": [ { "left": { "kind": "source", "source": { "kind": "node", "nodeId": "n_d0cf95af3e94fe32", "output": "more" } }, "operator": "isTrue" } ] } ] } ] }, "n_216458232e7a4e34": { "inputs": { "pageState": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_d0cf95af3e94fe32", "output": "state" } ] }, "previous": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_216458232e7a4e34", "output": "state" } ] }, "result": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_bfa2b943050f5046", "output": "email" } ] } }, "name": "Select the next email", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "pageState" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": true, "handle": "previous" }, { "jsonSchema": { "type": "object", "properties": { "status": { "type": "integer", "description": "The HTTP-style status code returned by the email endpoint." }, "email": { "type": "string", "description": "The normalized email address returned by UserCheck." }, "normalized_email": { "type": "string", "description": "The normalized email address returned after alias or typo normalization." }, "domain": { "type": "string", "description": "The domain extracted from the validated email address." }, "domain_authority": { "anyOf": [ { "type": "integer", "description": "The optional 0 to 100 domain authority score returned by UserCheck." }, { "const": null, "description": "Null when UserCheck does not return a numeric value." } ], "description": "The optional 0 to 100 domain authority score returned by UserCheck." }, "tld_trust": { "anyOf": [ { "type": "integer", "description": "The optional TLD trust score returned by UserCheck." }, { "const": null, "description": "Null when UserCheck does not return a numeric value." } ], "description": "The optional TLD trust score returned by UserCheck." }, "domain_age_in_days": { "anyOf": [ { "type": "integer", "description": "The optional number of days since the domain was registered." }, { "const": null, "description": "Null when UserCheck does not return a numeric value." } ], "description": "The optional number of days since the domain was registered." }, "mx": { "type": "boolean", "description": "Whether the email domain has valid MX records." }, "mx_records": { "type": "array", "items": { "type": "object", "properties": { "hostname": { "type": "string", "description": "The hostname of the MX server." }, "priority": { "type": "integer", "description": "The priority assigned to the MX record." } }, "required": [ "hostname", "priority" ], "additionalProperties": false, "description": "One MX record returned for the email domain." }, "description": "The MX records returned for the email domain." }, "mx_providers": { "type": "array", "items": { "type": "object", "properties": { "slug": { "type": "string", "description": "The stable provider identifier returned by UserCheck." }, "type": { "type": "string", "enum": [ "mailbox", "hosting", "email_api", "security_gateway", "forwarding" ], "description": "The provider category assigned to the detected MX provider." }, "grade": { "type": "string", "enum": [ "enterprise", "professional", "standard", "basic" ], "description": "The onboarding or commitment grade assigned to the detected MX provider." } }, "required": [ "slug", "type", "grade" ], "additionalProperties": false, "description": "One MX provider returned for the email domain." }, "description": "The recognized MX providers returned for the email domain." }, "disposable": { "type": "boolean", "description": "Whether the email is disposable." }, "public_domain": { "type": "boolean", "description": "Whether the email uses a public mailbox domain." }, "relay_domain": { "type": "boolean", "description": "Whether the email uses a forwarding or relay domain." }, "alias": { "type": "boolean", "description": "Whether the original email included an alias component according to UserCheck." }, "role_account": { "type": "boolean", "description": "Whether the email is a role account." }, "spam": { "type": "boolean", "description": "Whether the email domain is associated with spam activity." }, "did_you_mean": { "anyOf": [ { "type": "string", "description": "The typo correction suggestion returned by UserCheck, if any." }, { "const": null, "description": "Null when UserCheck does not return a string value." } ], "description": "The typo correction suggestion returned by UserCheck, if any." }, "blocklisted": { "type": "boolean", "description": "Whether the email domain appears on the account blocklist." }, "disposable_provider": { "anyOf": [ { "type": "string", "description": "The disposable provider domain returned by UserCheck when available." }, { "const": null, "description": "Null when UserCheck does not return a string value." } ], "description": "The disposable provider domain returned by UserCheck when available." } }, "required": [ "status", "email", "normalized_email", "domain", "mx", "mx_records", "mx_providers", "disposable", "public_domain", "relay_domain", "alias", "role_account", "spam" ], "additionalProperties": true, "description": "The UserCheck email validation payload." }, "nullable": true, "handle": "result" } ], "outputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "state" }, { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "more" }, { "jsonSchema": { "type": "string", "format": "email", "description": "The email address to validate with UserCheck." }, "nullable": false, "handle": "email" } ], "name": "Select the next email", "moduleId": "n_4fcdd65d99fb6faa", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_a11794804616e458": { "inputs": {}, "name": "More emails?", "kind": "condition", "matchMode": "first", "cases": [ { "output": "yes", "groups": [ { "expressions": [ { "left": { "kind": "source", "source": { "kind": "node", "nodeId": "n_216458232e7a4e34", "output": "more" } }, "operator": "isTrue" } ] } ] } ] }, "n_bfa2b943050f5046": { "inputs": { "email": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_216458232e7a4e34", "output": "email" } ] } }, "name": "Check email MX", "kind": "task", "task": { "inputs": [ { "description": "The email address to validate with UserCheck.", "jsonSchema": { "type": "string", "format": "email", "description": "The email address to validate with UserCheck." }, "nullable": false, "handle": "email" } ], "outputs": [ { "description": "The UserCheck email validation payload.", "jsonSchema": { "type": "object", "properties": { "status": { "type": "integer", "description": "The HTTP-style status code returned by the email endpoint." }, "email": { "type": "string", "description": "The normalized email address returned by UserCheck." }, "normalized_email": { "type": "string", "description": "The normalized email address returned after alias or typo normalization." }, "domain": { "type": "string", "description": "The domain extracted from the validated email address." }, "domain_authority": { "anyOf": [ { "type": "integer", "description": "The optional 0 to 100 domain authority score returned by UserCheck." }, { "const": null, "description": "Null when UserCheck does not return a numeric value." } ], "description": "The optional 0 to 100 domain authority score returned by UserCheck." }, "tld_trust": { "anyOf": [ { "type": "integer", "description": "The optional TLD trust score returned by UserCheck." }, { "const": null, "description": "Null when UserCheck does not return a numeric value." } ], "description": "The optional TLD trust score returned by UserCheck." }, "domain_age_in_days": { "anyOf": [ { "type": "integer", "description": "The optional number of days since the domain was registered." }, { "const": null, "description": "Null when UserCheck does not return a numeric value." } ], "description": "The optional number of days since the domain was registered." }, "mx": { "type": "boolean", "description": "Whether the email domain has valid MX records." }, "mx_records": { "type": "array", "items": { "type": "object", "properties": { "hostname": { "type": "string", "description": "The hostname of the MX server." }, "priority": { "type": "integer", "description": "The priority assigned to the MX record." } }, "required": [ "hostname", "priority" ], "additionalProperties": false, "description": "One MX record returned for the email domain." }, "description": "The MX records returned for the email domain." }, "mx_providers": { "type": "array", "items": { "type": "object", "properties": { "slug": { "type": "string", "description": "The stable provider identifier returned by UserCheck." }, "type": { "type": "string", "enum": [ "mailbox", "hosting", "email_api", "security_gateway", "forwarding" ], "description": "The provider category assigned to the detected MX provider." }, "grade": { "type": "string", "enum": [ "enterprise", "professional", "standard", "basic" ], "description": "The onboarding or commitment grade assigned to the detected MX provider." } }, "required": [ "slug", "type", "grade" ], "additionalProperties": false, "description": "One MX provider returned for the email domain." }, "description": "The recognized MX providers returned for the email domain." }, "disposable": { "type": "boolean", "description": "Whether the email is disposable." }, "public_domain": { "type": "boolean", "description": "Whether the email uses a public mailbox domain." }, "relay_domain": { "type": "boolean", "description": "Whether the email uses a forwarding or relay domain." }, "alias": { "type": "boolean", "description": "Whether the original email included an alias component according to UserCheck." }, "role_account": { "type": "boolean", "description": "Whether the email is a role account." }, "spam": { "type": "boolean", "description": "Whether the email domain is associated with spam activity." }, "did_you_mean": { "anyOf": [ { "type": "string", "description": "The typo correction suggestion returned by UserCheck, if any." }, { "const": null, "description": "Null when UserCheck does not return a string value." } ], "description": "The typo correction suggestion returned by UserCheck, if any." }, "blocklisted": { "type": "boolean", "description": "Whether the email domain appears on the account blocklist." }, "disposable_provider": { "anyOf": [ { "type": "string", "description": "The disposable provider domain returned by UserCheck when available." }, { "const": null, "description": "Null when UserCheck does not return a string value." } ], "description": "The disposable provider domain returned by UserCheck when available." } }, "required": [ "status", "email", "normalized_email", "domain", "mx", "mx_records", "mx_providers", "disposable", "public_domain", "relay_domain", "alias", "role_account", "spam" ], "additionalProperties": true, "description": "The UserCheck email validation payload." }, "nullable": false, "handle": "email" } ], "name": "Check email MX", "executor": { "kind": "connector", "action": "mailcheck.verify_email" } } }, "n_0356983824c5eb36": { "inputs": { "checkState": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_216458232e7a4e34", "output": "state" } ] }, "previous": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_0356983824c5eb36", "output": "state" } ] } }, "name": "Prepare the next update", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "checkState" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": true, "handle": "previous" } ], "outputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "state" }, { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "more" }, { "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "minLength": 1, "description": "Record ID in the format recXXXXXXXXXXXXXX." }, "fields": { "type": "object", "additionalProperties": { "description": "A record value." }, "description": "Field values to write into the existing Airtable record." } }, "required": [ "id", "fields" ], "additionalProperties": false, "description": "Record payload used when updating Airtable records." }, "minItems": 1, "maxItems": 10, "description": "Records to update in the Airtable table." }, "nullable": false, "handle": "records" } ], "name": "Prepare the next update", "moduleId": "n_d4ba0a3c2a83c244", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_80c76c427b3197d2": { "inputs": {}, "name": "More updates?", "kind": "condition", "matchMode": "first", "cases": [ { "output": "yes", "groups": [ { "expressions": [ { "left": { "kind": "source", "source": { "kind": "node", "nodeId": "n_0356983824c5eb36", "output": "more" } }, "operator": "isTrue" } ] } ] } ] }, "n_a948f15a27aff09b": { "inputs": { "baseId": { "kind": "value", "value": "YOUR_AIRTABLE_BASE_ID" }, "tableIdOrName": { "kind": "value", "value": "YOUR_AIRTABLE_TABLE_ID" }, "records": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_0356983824c5eb36", "output": "records" } ] }, "typecast": { "kind": "value", "value": false } }, "name": "Update the Airtable record", "kind": "task", "task": { "inputs": [ { "description": "Base ID in the format appXXXXXXXXXXXXXX.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Base ID in the format appXXXXXXXXXXXXXX." }, "nullable": false, "handle": "baseId" }, { "description": "Table ID or table name accepted by the Airtable path parameter.", "jsonSchema": { "type": "string", "minLength": 1, "description": "Table ID or table name accepted by the Airtable path parameter." }, "nullable": false, "handle": "tableIdOrName" }, { "description": "Records to update in the Airtable table.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "minLength": 1, "description": "Record ID in the format recXXXXXXXXXXXXXX." }, "fields": { "type": "object", "additionalProperties": { "description": "A record value." }, "description": "Field values to write into the existing Airtable record." } }, "required": [ "id", "fields" ], "additionalProperties": false, "description": "Record payload used when updating Airtable records." }, "minItems": 1, "maxItems": 10, "description": "Records to update in the Airtable table." }, "nullable": false, "handle": "records" }, { "description": "Whether Airtable should coerce incoming values to compatible field types.", "jsonSchema": { "type": "boolean", "description": "Whether Airtable should coerce incoming values to compatible field types." }, "nullable": true, "handle": "typecast", "value": null }, { "description": "Whether Airtable should return field IDs instead of field names in record objects.", "jsonSchema": { "type": "boolean", "description": "Whether Airtable should return field IDs instead of field names in record objects." }, "nullable": true, "handle": "returnFieldsByFieldId", "value": null } ], "outputs": [ { "description": "Records returned by Airtable after update.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Record ID." }, "createdTime": { "type": "string", "description": "Record creation timestamp returned by Airtable." }, "fields": { "type": "object", "additionalProperties": { "description": "A record value." }, "description": "Record fields keyed by field name or field ID." }, "commentCount": { "type": "integer", "description": "Comment count returned by Airtable when enabled on the endpoint." } }, "required": [ "id", "fields" ], "additionalProperties": true, "description": "Airtable record." }, "description": "Records returned by Airtable after update." }, "nullable": false, "handle": "records" } ], "name": "Update the Airtable record", "executor": { "kind": "connector", "action": "airtable.update_records" } } } }, "edges": [ { "source": "n_308aee618cbd2200", "target": "n_eff64ed1caca5ceb" }, { "source": "n_eff64ed1caca5ceb", "target": "n_d0cf95af3e94fe32" }, { "source": "n_d0cf95af3e94fe32", "target": "n_59d99522c5059de2" }, { "source": "n_59d99522c5059de2", "target": "n_eff64ed1caca5ceb", "sourceHandle": "yes" }, { "source": "n_59d99522c5059de2", "target": "n_216458232e7a4e34", "sourceHandle": "otherwise" }, { "source": "n_216458232e7a4e34", "target": "n_a11794804616e458" }, { "source": "n_a11794804616e458", "target": "n_bfa2b943050f5046", "sourceHandle": "yes" }, { "source": "n_bfa2b943050f5046", "target": "n_216458232e7a4e34" }, { "source": "n_a11794804616e458", "target": "n_0356983824c5eb36", "sourceHandle": "otherwise" }, { "source": "n_0356983824c5eb36", "target": "n_80c76c427b3197d2" }, { "source": "n_80c76c427b3197d2", "target": "n_a948f15a27aff09b", "sourceHandle": "yes" }, { "source": "n_a948f15a27aff09b", "target": "n_0356983824c5eb36" } ] } }, "modules": { "n_a3bf2bf9f815d86e": { "name": "Collect Airtable pages", "imports": [], "source": "export default function pages({records,offset,previous}){if(!Array.isArray(records))throw Error('Invalid records');const state=previous??{records:[],seen:[]};if(!Array.isArray(state.records)||!Array.isArray(state.seen))throw Error('Invalid pagination state');if(offset!==null&&(typeof offset!=='string'||!offset||state.seen.includes(offset)))throw Error('Repeated or invalid offset');return{state:{records:[...state.records,...records],seen:offset===null?state.seen:[...state.seen,offset]},offset:offset??'unused',more:offset!==null}}\n" }, "n_4fcdd65d99fb6faa": { "name": "Select the next email", "imports": [], "source": "export default function next({pageState,previous,result}){const s=previous??{index:0,records:pageState.records,checked:[]};if(!Array.isArray(s.records)||!Array.isArray(s.checked))throw Error('Invalid state');if(previous){const item=s.records[s.index];if(!result||typeof result.mx!=='boolean'||typeof result.email!=='string'||result.email.toLowerCase()!==item.fields.Email.toLowerCase())throw Error('Unconfirmed MX result');s.checked.push({id:item.id,mx:result.mx});s.index++}if(s.index===s.records.length)return{state:s,more:false,email:'unused@example.com'};const r=s.records[s.index],email=r?.fields?.Email;if(typeof r?.id!=='string'||!r.id||typeof email!=='string'||!email.trim())throw Error('Record needs ID and Email');return{state:s,more:true,email}}\n" }, "n_d4ba0a3c2a83c244": { "name": "Prepare the next update", "imports": [], "source": "export default function next({checkState,previous}){const i=previous?.index??0,rows=checkState.checked;if(!Array.isArray(rows)||!Number.isInteger(i)||i<0||i>rows.length)throw Error('Invalid update state');if(i===rows.length)return{state:{index:i},more:false,records:[{id:'unused',fields:{Valid:false}}]};const r=rows[i];return{state:{index:i+1},more:true,records:[{id:r.id,fields:{Valid:r.mx}}]}}\n" } } }, "presentation": { "designer": { "version": 1, "flow": { "direction": "vertical" } } } }