@useairfoil/producer-salesforce 0.0.2 → 0.0.3

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.
package/dist/main.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","names":["ConnectorLayer","SalesforceConnector.layerConfig","TelemetryLayer","SalesforceConnector.SalesforceConnector","SalesforceConnector.layerConfig","SalesforceConnector.SalesforceConnector","packageJson.version"],"sources":["../package.json","../src/tables.ts","../src/create-table.ts","../src/demo/shared.ts","../src/demo/activity.ts","../src/demo/cases.ts","../src/demo/contacts.ts","../src/demo/contracts.ts","../src/demo/opportunities.ts","../src/demo/accounts.ts","../src/demo/setup.ts","../src/demo/index.ts","../src/sandbox.ts","../src/start.ts","../src/main.ts"],"sourcesContent":["","import type { Schema } from \"effect\";\n\nimport { objects } from \"./manifest\";\nimport { ObjectFieldSchema } from \"./schemas/object-fields\";\nimport { CustomObjectSchema, objectSchema } from \"./schemas/objects\";\n\nexport const tableSchemas: Readonly<Record<string, Schema.Top>> = {\n ...Object.fromEntries(objects.map((spec) => [spec.name, objectSchema(spec.object)])),\n custom_objects: CustomObjectSchema,\n object_fields: ObjectFieldSchema,\n};\n","import { ConnectorApp } from \"@useairfoil/connector-kit\";\n\nimport { tableSchemas } from \"./tables\";\n\nexport const createTableCommand = ConnectorApp.makeCreateTableCommand(tableSchemas);\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport { DateTime, Duration } from \"effect\";\n\nimport type { CustomObject, ObjectRow } from \"../schemas/objects\";\n\nimport { objects } from \"../manifest\";\n\nexport const hour = Duration.toMillis(Duration.hours(1));\nexport const day = Duration.toMillis(Duration.days(1));\n\nexport type Value = string | number | boolean | null;\nexport type TableName = (typeof objects)[number][\"name\"];\n\n// Salesforce IDs are 18 characters: a 3-character key prefix for the object, then\n// the record. Demo IDs keep the real prefixes.\nexport const sfid = (prefix: string, index: number, part = 0) =>\n `${prefix}Dm${String(part).padStart(3, \"0\")}${String(index).padStart(7, \"0\")}AAQ`;\n\n// Salesforce sends datetimes with a +0000 offset.\nexport const datetime = (date: Date) => date.toISOString().replace(\"Z\", \"+0000\");\nexport const dateOnly = (date: Date) => DateTime.formatIsoDateUtc(DateTime.fromDateUnsafe(date));\n\n/**\n * One record: the shared columns, and every non-null field as a string, the way\n * the connector stores them.\n */\nexport const sobject = (\n id: string,\n created: Date,\n updated: Date,\n now: Date,\n fields: Readonly<Record<string, Value>>,\n): ObjectRow => ({\n id,\n // Salesforce rows use the fetch time as their version.\n version: now,\n created_at: created,\n updated_at: updated,\n _deleted: false,\n fields: new Map(\n Object.entries({\n Id: id,\n CreatedDate: datetime(created),\n LastModifiedDate: datetime(updated),\n SystemModstamp: datetime(updated),\n IsDeleted: false,\n ...fields,\n }).flatMap(\n ([name, value]): ReadonlyArray<readonly [string, string]> =>\n value === null ? [] : [[name, String(value)]],\n ),\n ),\n});\n\nexport const userCount = 12;\nexport const userId = (u: number) => sfid(\"005\", u);\nexport const profileId = (p: number) => sfid(\"00e\", p);\nexport const roleId = (r: number) => sfid(\"00E\", r);\nexport const pricebookId = sfid(\"01s\", 0);\n\nexport const products = [\n { name: \"Analytics Cloud\", code: \"AC-STD\", family: \"Software\", price: 24000 },\n { name: \"Analytics Cloud Enterprise\", code: \"AC-ENT\", family: \"Software\", price: 60000 },\n { name: \"Data Connectors Pack\", code: \"DC-PACK\", family: \"Add-on\", price: 8000 },\n { name: \"Premier Support\", code: \"SUP-PREM\", family: \"Services\", price: 12000 },\n { name: \"Implementation\", code: \"SVC-IMPL\", family: \"Services\", price: 15000 },\n { name: \"Training Day\", code: \"SVC-TRAIN\", family: \"Services\", price: 2500 },\n] as const;\n\nexport const productId = (p: number) => sfid(\"01t\", p);\nexport const entryId = (p: number) => sfid(\"01u\", p);\n\nexport const campaigns = [\n \"Spring Webinar Series\",\n \"Annual Customer Summit\",\n \"Q3 Outbound\",\n \"Partner Newsletter\",\n] as const;\n\nexport const campaignId = (c: number) => sfid(\"701\", c);\nexport const territoryId = (t: number) => sfid(\"0Hh\", t);\nexport const resourceId = (r: number) => sfid(\"0Hn\", r);\nexport const topics = [\"Renewal\", \"Expansion\", \"Escalation\", \"Integration\"] as const;\nexport const topicId = (t: number) => sfid(\"0TO\", t);\n\nexport const opportunityStages = [\n { name: \"Prospecting\", probability: 10 },\n { name: \"Qualification\", probability: 20 },\n { name: \"Needs Analysis\", probability: 40 },\n { name: \"Proposal/Price Quote\", probability: 60 },\n { name: \"Negotiation/Review\", probability: 80 },\n { name: \"Closed Won\", probability: 100 },\n { name: \"Closed Lost\", probability: 0 },\n] as const;\n\n/** Date helpers for one run. `at` keeps a time from going past now. */\nexport const clock = ({ faker, now }: Demo.DemoContext) => {\n const at = (time: number) => new Date(Math.min(time, now.getTime()));\n\n const between = (from: Date, to: Date) =>\n faker.date.between({ from, to: at(Math.max(from.getTime(), to.getTime())) });\n\n return { at, between };\n};\n\n/**\n * One account being built: the run's tools and what its parts need to know.\n * `add` writes a row, and `next` gives the next record ID within the account,\n * so IDs follow write order.\n */\nexport type AccountGroup = Demo.DemoContext &\n ReturnType<typeof clock> & {\n readonly index: number;\n readonly accountId: string;\n readonly name: string;\n readonly owner: number;\n readonly agent: number;\n readonly domain: string;\n readonly industry: string;\n readonly created: Date;\n readonly city: string;\n readonly state: string;\n readonly add: (table: TableName, row: ObjectRow) => void;\n readonly next: (prefix: string) => string;\n readonly custom: Array<CustomObject>;\n };\n\nexport type AccountContact = {\n readonly id: string;\n readonly first: string;\n readonly last: string;\n readonly email: string;\n readonly added: Date;\n};\n\nexport type OpportunityPlan = {\n readonly id: string;\n readonly stage: number;\n readonly closed: Date | null;\n readonly amount: number;\n readonly lines: ReadonlyArray<number>;\n};\n","import {\n type AccountContact,\n type AccountGroup,\n campaignId,\n dateOnly,\n datetime,\n day,\n hour,\n type OpportunityPlan,\n sfid,\n sobject,\n topicId,\n userId,\n} from \"./shared\";\n\n/** Sales activity on the account: tasks, events, notes, and Chatter. */\nexport const activityRows = (\n account: AccountGroup,\n contactIds: ReadonlyArray<string>,\n opportunities: ReadonlyArray<OpportunityPlan>,\n won: OpportunityPlan | undefined,\n) => {\n const { faker, now, between, accountId, name, owner, created, add, next } = account;\n\n for (let a = 0; a < faker.number.int({ min: 1, max: 6 }); a++) {\n const when = between(created, now);\n const who = faker.helpers.arrayElement(contactIds);\n\n const what =\n opportunities.length > 0 && faker.datatype.boolean()\n ? faker.helpers.arrayElement(opportunities).id\n : accountId;\n\n if (faker.datatype.boolean()) {\n const taskId = next(\"00T\");\n\n add(\n \"tasks\",\n sobject(taskId, when, when, now, {\n Subject: faker.helpers.arrayElement([\"Call\", \"Send proposal\", \"Follow up\"]),\n Status: when < new Date(now.getTime() - 3 * day) ? \"Completed\" : \"Not Started\",\n Priority: \"Normal\",\n ActivityDate: dateOnly(when),\n WhoId: who ?? null,\n WhatId: what,\n OwnerId: userId(owner),\n TaskSubtype: \"Task\",\n }),\n );\n\n if (who)\n add(\n \"task_relations\",\n sobject(next(\"0RT\"), when, when, now, { TaskId: taskId, RelationId: who, IsWhat: false }),\n );\n } else {\n const eventId = next(\"00U\");\n\n add(\n \"events\",\n sobject(eventId, when, when, now, {\n Subject: faker.helpers.arrayElement([\"Discovery call\", \"Demo\", \"QBR\"]),\n StartDateTime: datetime(when),\n EndDateTime: datetime(new Date(when.getTime() + hour)),\n DurationInMinutes: 60,\n WhoId: who ?? null,\n WhatId: what,\n OwnerId: userId(owner),\n }),\n );\n\n if (who)\n add(\n \"event_relations\",\n sobject(next(\"0RE\"), when, when, now, {\n EventId: eventId,\n RelationId: who,\n IsInvitee: true,\n Status: \"Accepted\",\n }),\n );\n }\n }\n\n const noted = between(created, now);\n\n add(\n \"notes\",\n sobject(next(\"002\"), noted, noted, now, {\n ParentId: accountId,\n Title: \"Account plan\",\n Body: \"Expand into the data team next quarter.\",\n IsPrivate: false,\n OwnerId: userId(owner),\n }),\n );\n\n if (faker.datatype.boolean({ probability: 0.3 })) {\n add(\n \"attachments\",\n sobject(next(\"00P\"), noted, noted, now, {\n ParentId: accountId,\n Name: \"signed-order-form.pdf\",\n ContentType: \"application/pdf\",\n BodyLength: faker.number.int({ min: 50_000, max: 900_000 }),\n OwnerId: userId(owner),\n }),\n );\n }\n\n const feedItem = next(\"0D5\");\n\n add(\n \"feed_items\",\n sobject(feedItem, noted, noted, now, {\n ParentId: accountId,\n Type: \"TextPost\",\n Body: `Great call with ${name} today!`,\n CreatedById: userId(owner),\n CommentCount: 1,\n LikeCount: faker.number.int({ max: 5 }),\n }),\n );\n\n add(\n \"feed_comments\",\n sobject(next(\"0D7\"), noted, noted, now, {\n FeedItemId: feedItem,\n ParentId: accountId,\n CommentBody: \"Nice work!\",\n CreatedById: userId(1),\n }),\n );\n\n add(\n \"topic_assignments\",\n sobject(next(\"0FT\"), noted, noted, now, {\n TopicId: topicId(won ? 0 : 1),\n EntityId: accountId,\n EntityType: \"Account\",\n }),\n );\n};\n\n/** A lead that hasn't converted yet, from the same company. */\nexport const leadRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n campaign: number,\n) => {\n const { faker, now, between, index, name, owner, domain, industry, created, add, next } = account;\n\n const leadFirst = faker.person.firstName();\n const leadLast = faker.person.lastName();\n const leadId = sfid(\"00Q\", index);\n const leadCreated = between(created, now);\n\n add(\n \"leads\",\n sobject(leadId, leadCreated, leadCreated, now, {\n FirstName: leadFirst,\n LastName: leadLast,\n Name: `${leadFirst} ${leadLast}`,\n Company: name,\n Email: `${leadFirst}.${leadLast}@${domain}`.toLowerCase(),\n Status: faker.helpers.arrayElement([\n \"Open - Not Contacted\",\n \"Working - Contacted\",\n \"Closed - Not Converted\",\n ]),\n LeadSource: \"Webinar\",\n Industry: industry,\n IsConverted: false,\n OwnerId: userId(owner),\n }),\n );\n\n add(\n \"lead_history\",\n sobject(next(\"017\"), leadCreated, leadCreated, now, {\n LeadId: leadId,\n Field: \"created\",\n OldValue: null,\n NewValue: null,\n CreatedById: userId(owner),\n }),\n );\n\n add(\n \"campaign_members\",\n sobject(next(\"00v\"), leadCreated, leadCreated, now, {\n CampaignId: campaignId(campaign),\n LeadId: leadId,\n Status: \"Sent\",\n HasResponded: false,\n }),\n );\n\n // Sometimes the lead duplicates a contact.\n if (main && faker.datatype.boolean({ probability: 0.1 })) {\n const set = next(\"0GK\");\n\n add(\n \"duplicate_record_sets\",\n sobject(set, leadCreated, leadCreated, now, {\n DuplicateRuleId: sfid(\"0Bm\", 0),\n RecordCount: 2,\n }),\n );\n\n add(\n \"duplicate_record_items\",\n sobject(next(\"0GL\"), leadCreated, leadCreated, now, {\n DuplicateRecordSetId: set,\n RecordId: leadId,\n }),\n );\n\n add(\n \"duplicate_record_items\",\n sobject(next(\"0GL\"), leadCreated, leadCreated, now, {\n DuplicateRecordSetId: set,\n RecordId: main.id,\n }),\n );\n }\n};\n","import {\n type AccountContact,\n type AccountGroup,\n datetime,\n day,\n hour,\n type OpportunityPlan,\n sfid,\n sobject,\n topicId,\n userId,\n} from \"./shared\";\n\n/** Customers open cases, worked by support. */\nexport const caseRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n won: OpportunityPlan | undefined,\n) => {\n const { faker, now, at, between, index, accountId, agent, domain, created, add, next } = account;\n\n const caseCount = won ? faker.number.int({ max: 3 }) : 0;\n\n for (let k = 0; k < caseCount; k++) {\n const caseId = next(\"500\");\n const opened = between(won?.closed ?? created, now);\n\n const closedCase = faker.datatype.boolean({ probability: 0.7 })\n ? at(opened.getTime() + faker.number.int({ min: hour, max: 5 * day }))\n : null;\n\n const subject = faker.helpers.arrayElement([\n \"Dashboard won't load\",\n \"Connector sync failing\",\n \"Need help with SSO\",\n \"Export is missing rows\",\n ]);\n\n add(\n \"cases\",\n sobject(caseId, opened, closedCase ?? opened, now, {\n AccountId: accountId,\n ContactId: main?.id ?? null,\n Subject: subject,\n Description: `${subject}. It started this morning.`,\n Status: closedCase ? \"Closed\" : faker.helpers.arrayElement([\"New\", \"Working\", \"Escalated\"]),\n Priority: faker.helpers.arrayElement([\"Low\", \"Medium\", \"High\"]),\n Origin: faker.helpers.arrayElement([\"Email\", \"Web\", \"Phone\", \"Chat\"]),\n IsClosed: closedCase !== null,\n ClosedDate: closedCase ? datetime(closedCase) : null,\n CaseNumber: String(50_000 + index * 4 + k),\n OwnerId: userId(agent),\n RecordTypeId: sfid(\"012\", 1),\n }),\n );\n\n add(\n \"case_comments\",\n sobject(next(\"00a\"), opened, opened, now, {\n ParentId: caseId,\n CommentBody: \"Thanks, we're looking into it.\",\n IsPublished: true,\n CreatedById: userId(agent),\n }),\n );\n\n if (main)\n add(\n \"case_contact_roles\",\n sobject(next(\"03j\"), opened, opened, now, {\n CasesId: caseId,\n ContactId: main.id,\n Role: \"Technical Contact\",\n }),\n );\n\n add(\n \"case_team_members\",\n sobject(next(\"0B6\"), opened, opened, now, {\n ParentId: caseId,\n MemberId: userId(agent),\n TeamRoleId: sfid(\"0B7\", 0),\n }),\n );\n\n add(\n \"case_history\",\n sobject(next(\"017\"), opened, opened, now, {\n CaseId: caseId,\n Field: \"Status\",\n OldValue: null,\n NewValue: \"New\",\n CreatedById: userId(agent),\n }),\n );\n\n if (closedCase)\n add(\n \"case_history\",\n sobject(next(\"017\"), closedCase, closedCase, now, {\n CaseId: caseId,\n Field: \"Status\",\n OldValue: \"Working\",\n NewValue: \"Closed\",\n CreatedById: userId(agent),\n }),\n );\n\n const emailId = next(\"02s\");\n\n add(\n \"email_messages\",\n sobject(emailId, opened, opened, now, {\n ParentId: caseId,\n Subject: subject,\n FromAddress: main?.email ?? `support@${domain}`,\n ToAddress: \"support@acme-analytics.example.com\",\n Incoming: true,\n Status: \"3\",\n TextBody: `${subject}. Can you help?`,\n }),\n );\n\n add(\n \"email_message_relations\",\n sobject(next(\"0EM\"), opened, opened, now, {\n EmailMessageId: emailId,\n RelationId: main?.id ?? null,\n RelationType: \"FromAddress\",\n RelationAddress: main?.email ?? null,\n }),\n );\n\n if (faker.datatype.boolean({ probability: 0.3 })) {\n const chatStart = at(opened.getTime() - hour / 6);\n\n add(\n \"live_chat_transcripts\",\n sobject(next(\"570\"), chatStart, chatStart, now, {\n CaseId: caseId,\n ContactId: main?.id ?? null,\n Status: \"Completed\",\n StartTime: datetime(chatStart),\n EndTime: datetime(opened),\n ChatDuration: 600,\n OwnerId: userId(agent),\n }),\n );\n\n add(\n \"messaging_sessions\",\n sobject(next(\"0Mw\"), chatStart, chatStart, now, {\n CaseId: caseId,\n Status: \"Ended\",\n Origin: \"InboundInitiated\",\n StartTime: datetime(chatStart),\n EndTime: datetime(opened),\n OwnerId: userId(agent),\n }),\n );\n }\n\n add(\n \"topic_assignments\",\n sobject(next(\"0FT\"), opened, opened, now, {\n TopicId: topicId(2),\n EntityId: caseId,\n EntityType: \"Case\",\n }),\n );\n }\n};\n","import { type AccountContact, type AccountGroup, day, sfid, sobject, userId } from \"./shared\";\n\n/** Contacts, each with their consent records. The first one is the main contact. */\nexport const contactRows = (account: AccountGroup): Array<AccountContact> => {\n const { faker, now, between, index, accountId, owner, domain, created, city, state, add } =\n account;\n\n return Array.from({ length: faker.number.int({ min: 1, max: 4 }) }, (_, c) => {\n const first = faker.person.firstName();\n const last = faker.person.lastName();\n const id = sfid(\"003\", index, c);\n const added = between(created, new Date(created.getTime() + 60 * day));\n const email = `${first}.${last}@${domain}`.toLowerCase();\n const phone = faker.phone.number({ style: \"national\" });\n const individual = sfid(\"0PK\", index, c);\n\n add(\n \"individuals\",\n sobject(individual, added, added, now, {\n FirstName: first,\n LastName: last,\n HasOptedOutTracking: false,\n HasOptedOutProcessing: false,\n }),\n );\n\n add(\n \"contact_point_emails\",\n sobject(sfid(\"9PE\", index, c), added, added, now, {\n ParentId: individual,\n EmailAddress: email,\n IsPrimary: true,\n }),\n );\n\n add(\n \"contact_point_phones\",\n sobject(sfid(\"9PP\", index, c), added, added, now, {\n ParentId: individual,\n TelephoneNumber: phone,\n PhoneType: \"Work\",\n IsPrimary: true,\n }),\n );\n\n add(\n \"contacts\",\n sobject(id, added, added, now, {\n AccountId: accountId,\n FirstName: first,\n LastName: last,\n Name: `${first} ${last}`,\n Email: email,\n Phone: phone,\n Title: faker.person.jobTitle(),\n IndividualId: individual,\n LeadSource: faker.helpers.arrayElement([\n \"Web\",\n \"Webinar\",\n \"Partner Referral\",\n \"Trade Show\",\n ]),\n MailingCity: city,\n MailingState: state,\n MailingCountry: \"United States\",\n OwnerId: userId(owner),\n }),\n );\n\n add(\n \"account_contact_relations\",\n sobject(sfid(\"07k\", index, c), added, added, now, {\n AccountId: accountId,\n ContactId: id,\n IsDirect: true,\n IsActive: true,\n Roles: c === 0 ? \"Decision Maker\" : \"Evaluator\",\n }),\n );\n\n add(\n \"contact_history\",\n sobject(sfid(\"017\", index, c), added, added, now, {\n ContactId: id,\n Field: \"created\",\n OldValue: null,\n NewValue: null,\n CreatedById: userId(owner),\n }),\n );\n\n return { id, first, last, email, added };\n });\n};\n","import {\n type AccountContact,\n type AccountGroup,\n dateOnly,\n datetime,\n day,\n entryId,\n hour,\n type OpportunityPlan,\n pricebookId,\n productId,\n products,\n resourceId,\n sfid,\n sobject,\n territoryId,\n userId,\n} from \"./shared\";\n\n/** A won deal becomes a contract, an order, assets, and support entitlements. */\nexport const contractRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n opportunities: ReadonlyArray<OpportunityPlan>,\n won: OpportunityPlan | undefined,\n) => {\n const { faker, now, at, index, accountId, name, owner, add, next, custom } = account;\n\n if (!won?.closed) return;\n\n const start = won.closed;\n const contractId = sfid(\"800\", index);\n\n add(\n \"contracts\",\n sobject(contractId, start, start, now, {\n AccountId: accountId,\n Status: \"Activated\",\n StartDate: dateOnly(start),\n ContractTerm: 12,\n EndDate: dateOnly(new Date(start.getTime() + 365 * day)),\n ContractNumber: String(10_000 + index),\n OwnerId: userId(owner),\n }),\n );\n\n if (main)\n add(\n \"contract_contact_roles\",\n sobject(next(\"02a\"), start, start, now, {\n ContractId: contractId,\n ContactId: main.id,\n Role: \"Business User\",\n IsPrimary: true,\n }),\n );\n\n const orderId = sfid(\"801\", index);\n\n add(\n \"orders\",\n sobject(orderId, start, start, now, {\n AccountId: accountId,\n ContractId: contractId,\n OpportunityId: won.id,\n Status: \"Activated\",\n EffectiveDate: dateOnly(start),\n TotalAmount: won.amount,\n Pricebook2Id: pricebookId,\n OrderNumber: String(20_000 + index),\n }),\n );\n\n const assets: Array<string> = [];\n\n won.lines.forEach((p) => {\n add(\n \"order_items\",\n sobject(next(\"802\"), start, start, now, {\n OrderId: orderId,\n PricebookEntryId: entryId(p),\n Product2Id: productId(p),\n Quantity: 1,\n UnitPrice: products[p]?.price ?? 0,\n TotalPrice: products[p]?.price ?? 0,\n }),\n );\n\n const assetId = next(\"02i\");\n assets.push(assetId);\n\n add(\n \"assets\",\n sobject(assetId, start, start, now, {\n AccountId: accountId,\n ContactId: main?.id ?? null,\n Product2Id: productId(p),\n Name: products[p]?.name ?? \"Asset\",\n Status: \"Installed\",\n InstallDate: dateOnly(start),\n Quantity: 1,\n }),\n );\n });\n\n const [firstAsset, secondAsset] = assets;\n\n if (firstAsset && secondAsset) {\n add(\n \"asset_relationships\",\n sobject(next(\"1AR\"), start, start, now, {\n AssetId: firstAsset,\n RelatedAssetId: secondAsset,\n RelationshipType: \"Upgrade\",\n }),\n );\n }\n\n const contract = next(\"810\");\n\n add(\n \"service_contracts\",\n sobject(contract, start, start, now, {\n AccountId: accountId,\n Name: `${name} support`,\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(start.getTime() + 365 * day)),\n Status: \"Active\",\n Pricebook2Id: pricebookId,\n }),\n );\n\n add(\n \"contract_line_items\",\n sobject(next(\"811\"), start, start, now, {\n ServiceContractId: contract,\n PricebookEntryId: entryId(3),\n Quantity: 1,\n UnitPrice: products[3].price,\n }),\n );\n\n add(\n \"entitlements\",\n sobject(next(\"550\"), start, start, now, {\n AccountId: accountId,\n Name: \"Premier Support\",\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(start.getTime() + 365 * day)),\n Status: \"Active\",\n ServiceContractId: contract,\n Type: \"Phone Support\",\n }),\n );\n\n custom.push({\n ...sobject(sfid(\"a0B\", index), start, start, now, {\n Name: `${name} onboarding`,\n Account__c: accountId,\n Status__c: start.getTime() + 45 * day < now.getTime() ? \"Live\" : \"In Progress\",\n Go_Live_Date__c: dateOnly(new Date(start.getTime() + 45 * day)),\n }),\n object: \"Onboarding_Project__c\",\n });\n\n // Field service visit to install it.\n const workOrder = next(\"0WO\");\n const visit = at(start.getTime() + faker.number.int({ min: 5 * day, max: 20 * day }));\n\n add(\n \"work_orders\",\n sobject(workOrder, start, visit, now, {\n AccountId: accountId,\n ContactId: main?.id ?? null,\n Subject: \"On-site installation\",\n Status: visit < now ? \"Completed\" : \"New\",\n Priority: \"Medium\",\n ServiceTerritoryId: territoryId(index % 2),\n WorkOrderNumber: String(30_000 + index),\n }),\n );\n\n add(\n \"work_order_line_items\",\n sobject(next(\"1WL\"), start, start, now, {\n WorkOrderId: workOrder,\n Description: \"Install and configure\",\n Status: visit < now ? \"Completed\" : \"New\",\n Quantity: 1,\n }),\n );\n\n const appointment = next(\"08p\");\n\n add(\n \"service_appointments\",\n sobject(appointment, start, visit, now, {\n ParentRecordId: workOrder,\n Status: visit < now ? \"Completed\" : \"Scheduled\",\n SchedStartTime: datetime(visit),\n SchedEndTime: datetime(new Date(visit.getTime() + 3 * hour)),\n ServiceTerritoryId: territoryId(index % 2),\n AppointmentNumber: String(40_000 + index),\n }),\n );\n\n add(\n \"assigned_resources\",\n sobject(next(\"03r\"), start, start, now, {\n ServiceAppointmentId: appointment,\n ServiceResourceId: resourceId(index % 3),\n }),\n );\n};\n","import {\n type AccountContact,\n type AccountGroup,\n campaignId,\n dateOnly,\n day,\n entryId,\n type OpportunityPlan,\n opportunityStages,\n pricebookId,\n productId,\n products,\n sfid,\n sobject,\n userId,\n} from \"./shared\";\n\n/** Opportunities, with their products, people, competition, and history. */\nexport const opportunityRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n campaign: number,\n): Array<OpportunityPlan> => {\n const { faker, now, between, index, accountId, name, owner, created, add, next } = account;\n\n return Array.from(\n {\n length: faker.helpers.weightedArrayElement([\n { weight: 20, value: 0 },\n { weight: 55, value: 1 },\n { weight: 25, value: 2 },\n ]),\n },\n (_, o) => {\n const id = sfid(\"006\", index, o);\n const opened = between(created, now);\n\n const stage = faker.helpers.weightedArrayElement([\n { weight: 40, value: 5 },\n { weight: 20, value: 6 },\n ...[0, 1, 2, 3, 4].map((value) => ({ weight: 8, value })),\n ]);\n\n const stageInfo = opportunityStages[stage] ?? opportunityStages[0];\n const closed = stage >= 5 ? between(opened, new Date(opened.getTime() + 90 * day)) : null;\n\n const lines = [\n faker.number.int({ max: 1 }),\n ...faker.helpers.arrayElements([2, 3, 4, 5], { min: 0, max: 2 }),\n ];\n\n const amount = lines.reduce((sum, p) => sum + (products[p]?.price ?? 0), 0);\n const updated = closed ?? opened;\n\n add(\n \"opportunities\",\n sobject(id, opened, updated, now, {\n AccountId: accountId,\n Name: `${name} - ${products[lines[0] ?? 0]?.name ?? \"Analytics Cloud\"}`,\n StageName: stageInfo.name,\n Probability: stageInfo.probability,\n Amount: amount,\n CloseDate: dateOnly(closed ?? new Date(opened.getTime() + 60 * day)),\n IsClosed: stage >= 5,\n IsWon: stage === 5,\n Type: o === 0 ? \"New Business\" : \"Existing Business\",\n LeadSource: \"Web\",\n ForecastCategoryName:\n stage === 5 ? \"Closed\" : stage === 6 ? \"Omitted\" : stage >= 3 ? \"Commit\" : \"Pipeline\",\n OwnerId: userId(owner),\n Pricebook2Id: pricebookId,\n CampaignId: campaignId(campaign),\n RecordTypeId: sfid(\"012\", 0),\n }),\n );\n\n lines.forEach((p) => {\n const product = products[p] ?? products[0];\n\n add(\n \"opportunity_line_items\",\n sobject(next(\"00k\"), opened, opened, now, {\n OpportunityId: id,\n PricebookEntryId: entryId(p),\n Product2Id: productId(p),\n Name: product.name,\n Quantity: 1,\n UnitPrice: product.price,\n TotalPrice: product.price,\n ListPrice: product.price,\n }),\n );\n });\n\n if (main)\n add(\n \"opportunity_contact_roles\",\n sobject(next(\"00K\"), opened, opened, now, {\n OpportunityId: id,\n ContactId: main.id,\n Role: \"Decision Maker\",\n IsPrimary: true,\n }),\n );\n\n if (faker.datatype.boolean({ probability: 0.4 })) {\n add(\n \"opportunity_competitors\",\n sobject(next(\"00J\"), opened, opened, now, {\n OpportunityId: id,\n CompetitorName: faker.helpers.arrayElement([\"Tableau\", \"Looker\", \"Power BI\"]),\n Strengths: \"Brand awareness\",\n Weaknesses: \"Pricing\",\n }),\n );\n }\n\n add(\n \"opportunity_team_members\",\n sobject(next(\"00q\"), opened, opened, now, {\n OpportunityId: id,\n UserId: userId(owner),\n TeamMemberRole: \"Account Manager\",\n OpportunityAccessLevel: \"Edit\",\n }),\n );\n\n add(\n \"opportunity_splits\",\n sobject(next(\"049\"), opened, opened, now, {\n OpportunityId: id,\n SplitOwnerId: userId(owner),\n SplitPercentage: 100,\n SplitAmount: amount,\n SplitTypeId: sfid(\"149\", 0),\n }),\n );\n\n // Stage history: one row for each stage it reached, in order, and the last\n // one is when the opportunity last changed.\n const reached = stage === 6 ? faker.number.int({ max: 4 }) : Math.min(stage, 5);\n\n const steps = Array.from({ length: reached }, () => between(opened, updated)).toSorted(\n (a, b) => a.getTime() - b.getTime(),\n );\n\n for (let s = 0; s <= reached; s++) {\n const changed = s === reached ? updated : s === 0 ? opened : (steps[s - 1] ?? updated);\n const shown = s === reached && stage === 6 ? opportunityStages[6] : opportunityStages[s];\n\n add(\n \"opportunity_history\",\n sobject(next(\"008\"), changed, changed, now, {\n OpportunityId: id,\n StageName: shown?.name ?? \"Prospecting\",\n Amount: amount,\n Probability: shown?.probability ?? 10,\n CloseDate: dateOnly(closed ?? new Date(opened.getTime() + 60 * day)),\n }),\n );\n\n if (s > 0) {\n add(\n \"opportunity_field_history\",\n sobject(next(\"017\"), changed, changed, now, {\n OpportunityId: id,\n Field: \"StageName\",\n OldValue: opportunityStages[s - 1]?.name ?? null,\n NewValue: shown?.name ?? null,\n CreatedById: userId(owner),\n }),\n );\n }\n }\n\n if (stage >= 3) {\n const quoteId = next(\"0Q0\");\n const sent = between(opened, closed ?? now);\n\n add(\n \"quotes\",\n sobject(quoteId, sent, sent, now, {\n OpportunityId: id,\n Name: `Quote for ${name}`,\n Status: stage === 5 ? \"Accepted\" : stage === 6 ? \"Denied\" : \"Presented\",\n ExpirationDate: dateOnly(new Date(sent.getTime() + 30 * day)),\n GrandTotal: amount,\n Subtotal: amount,\n Pricebook2Id: pricebookId,\n ContactId: main?.id ?? null,\n }),\n );\n\n lines.forEach((p) => {\n add(\n \"quote_line_items\",\n sobject(next(\"0QL\"), sent, sent, now, {\n QuoteId: quoteId,\n PricebookEntryId: entryId(p),\n Product2Id: productId(p),\n Quantity: 1,\n UnitPrice: products[p]?.price ?? 0,\n }),\n );\n });\n }\n\n return { id, stage, closed, amount, lines };\n },\n );\n};\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport type { CustomObject, ObjectRow } from \"../schemas/objects\";\n\nimport { activityRows, leadRows } from \"./activity\";\nimport { caseRows } from \"./cases\";\nimport { contactRows } from \"./contacts\";\nimport { contractRows } from \"./contracts\";\nimport { opportunityRows } from \"./opportunities\";\nimport {\n type AccountGroup,\n campaignId,\n campaigns,\n clock,\n day,\n sfid,\n sobject,\n type TableName,\n userId,\n} from \"./shared\";\n\n/** One group is one account with its people, deals, contracts, service work, and activity. */\nexport const accountRows = (index: number, context: Demo.DemoContext) => {\n const { faker, now } = context;\n const { at } = clock(context);\n\n const rows: Partial<Record<TableName, Array<ObjectRow>>> = {};\n const custom: Array<CustomObject> = [];\n\n const add = (table: TableName, row: ObjectRow) => {\n (rows[table] ??= []).push(row);\n };\n\n let n = 0;\n\n // Each record gets the next number within the account, so IDs follow write order.\n const next = (prefix: string) => sfid(prefix, index, n++);\n\n const owner = 3 + faker.number.int({ max: 4 });\n const agent = 8 + faker.number.int({ max: 3 });\n const name = faker.company.name();\n const domain = `${name.toLowerCase().replaceAll(/[^a-z]+/g, \"\")}.example.com`;\n\n const industry = faker.helpers.arrayElement([\n \"Technology\",\n \"Finance\",\n \"Healthcare\",\n \"Retail\",\n \"Manufacturing\",\n ]);\n\n const employees = faker.helpers.arrayElement([40, 120, 450, 1_500, 8_000]);\n const created = at(now.getTime() - faker.number.int({ min: 30 * day, max: 800 * day }));\n const city = faker.location.city();\n const state = faker.location.state({ abbreviated: true });\n const accountId = sfid(\"001\", index);\n\n const account: AccountGroup = {\n ...context,\n ...clock(context),\n index,\n accountId,\n name,\n owner,\n agent,\n domain,\n industry,\n created,\n city,\n state,\n add,\n next,\n custom,\n };\n\n const contacts = contactRows(account);\n\n const main = contacts[0];\n const contactIds = contacts.map((contact) => contact.id);\n\n add(\n \"account_team_members\",\n sobject(next(\"01M\"), created, created, now, {\n AccountId: accountId,\n UserId: userId(owner),\n TeamMemberRole: \"Account Manager\",\n AccountAccessLevel: \"Edit\",\n }),\n );\n\n add(\n \"account_history\",\n sobject(next(\"017\"), created, created, now, {\n AccountId: accountId,\n Field: \"created\",\n OldValue: null,\n NewValue: null,\n CreatedById: userId(owner),\n }),\n );\n\n if (index > 0 && faker.datatype.boolean({ probability: 0.1 })) {\n add(\n \"partners\",\n sobject(next(\"00I\"), created, created, now, {\n AccountFromId: accountId,\n AccountToId: sfid(\"001\", index - 1),\n Role: \"Reseller\",\n IsPrimary: false,\n }),\n );\n }\n\n // A campaign brought some contacts in.\n const campaign = faker.number.int({ max: campaigns.length - 1 });\n\n if (main) {\n add(\n \"campaign_members\",\n sobject(next(\"00v\"), main.added, main.added, now, {\n CampaignId: campaignId(campaign),\n ContactId: main.id,\n Status: \"Responded\",\n HasResponded: true,\n }),\n );\n }\n\n const opportunities = opportunityRows(account, main, campaign);\n\n const won = opportunities.find((opportunity) => opportunity.stage === 5 && opportunity.closed);\n\n contractRows(account, main, opportunities, won);\n caseRows(account, main, won);\n activityRows(account, contactIds, opportunities, won);\n leadRows(account, main, campaign);\n\n const lastTouch = new Date(\n Math.max(\n created.getTime(),\n ...opportunities.map((opportunity) => (opportunity.closed ?? created).getTime()),\n ),\n );\n\n add(\n \"accounts\",\n sobject(accountId, created, lastTouch, now, {\n Name: name,\n Type: won ? \"Customer\" : \"Prospect\",\n Industry: industry,\n NumberOfEmployees: employees,\n AnnualRevenue: employees * faker.number.int({ min: 100_000, max: 250_000 }),\n Website: `https://www.${domain}`,\n Phone: faker.phone.number({ style: \"national\" }),\n BillingCity: city,\n BillingState: state,\n BillingCountry: \"United States\",\n OwnerId: userId(owner),\n Rating: won ? \"Hot\" : faker.helpers.arrayElement([\"Warm\", \"Cold\"]),\n AccountSource: \"Web\",\n }),\n );\n\n return { ...rows, custom_objects: custom };\n};\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport type { ObjectField } from \"../schemas/object-fields\";\nimport type { ObjectRow } from \"../schemas/objects\";\n\nimport {\n campaignId,\n campaigns,\n dateOnly,\n datetime,\n day,\n entryId,\n hour,\n opportunityStages,\n pricebookId,\n productId,\n products,\n profileId,\n resourceId,\n roleId,\n sfid,\n sobject,\n type TableName,\n territoryId,\n topicId,\n topics,\n userCount,\n userId,\n type Value,\n} from \"./shared\";\n\n/** The org setup, written once before any account. */\nexport const setupRows = ({ faker, now }: Demo.DemoContext) => {\n const setup = new Date(now.getTime() - 900 * day);\n\n const row = (id: string, fields: Readonly<Record<string, Value>>) =>\n sobject(id, setup, setup, now, fields);\n\n const profiles = [\"System Administrator\", \"Standard User\", \"Sales User\", \"Service User\"];\n\n const roles = [\n \"CEO\",\n \"VP Sales\",\n \"Sales Manager\",\n \"Account Executive\",\n \"Support Manager\",\n \"Support Agent\",\n ];\n\n const people = Array.from({ length: userCount }, (_, u) => ({\n first: faker.person.firstName(),\n last: faker.person.lastName(),\n role: u === 0 ? 0 : u < 3 ? 2 : u < 8 ? 3 : u === 8 ? 4 : 5,\n }));\n\n const rows: Partial<Record<TableName, Array<ObjectRow>>> = {\n organization: [\n row(sfid(\"00D\", 0), {\n Name: \"Acme Analytics\",\n OrganizationType: \"Enterprise Edition\",\n Country: \"United States\",\n DefaultLocaleSidKey: \"en_US\",\n TimeZoneSidKey: \"America/Los_Angeles\",\n FiscalYearStartMonth: 1,\n IsSandbox: false,\n }),\n ],\n profiles: profiles.map((name, p) =>\n row(profileId(p), { Name: name, UserType: \"Standard\", Description: null }),\n ),\n user_roles: roles.map((name, r) =>\n row(roleId(r), {\n Name: name,\n ParentRoleId: r === 0 ? null : roleId(r < 4 ? Math.max(0, r - 1) : r === 4 ? 0 : 4),\n RollupDescription: name,\n }),\n ),\n users: people.map((person, u) =>\n row(userId(u), {\n Username: `${person.first}.${person.last}@acme-analytics.example.com`.toLowerCase(),\n FirstName: person.first,\n LastName: person.last,\n Name: `${person.first} ${person.last}`,\n Email: `${person.first}.${person.last}@acme-analytics.example.com`.toLowerCase(),\n Alias: `${person.first.slice(0, 1)}${person.last.slice(0, 4)}`.toLowerCase(),\n IsActive: true,\n ProfileId: profileId(u === 0 ? 0 : u < 8 ? 2 : 3),\n UserRoleId: roleId(person.role),\n Title: roles[person.role] ?? \"Account Executive\",\n TimeZoneSidKey: \"America/Los_Angeles\",\n LastLoginDate: datetime(\n new Date(now.getTime() - faker.number.int({ min: hour, max: 5 * day })),\n ),\n }),\n ),\n permission_sets: [\"Sales Cloud User\", \"Service Cloud User\", \"Analytics Viewer\"].map(\n (label, p) =>\n row(sfid(\"0PS\", p), {\n Name: label.replaceAll(\" \", \"_\"),\n Label: label,\n IsOwnedByProfile: false,\n }),\n ),\n permission_set_assignments: people.map((_, u) =>\n row(sfid(\"0Pa\", u), { AssigneeId: userId(u), PermissionSetId: sfid(\"0PS\", u < 8 ? 0 : 1) }),\n ),\n groups: [\"Sales Team\", \"Support Team\"].map((name, g) =>\n row(sfid(\"00G\", g), {\n Name: name,\n DeveloperName: name.replaceAll(\" \", \"_\"),\n Type: \"Regular\",\n }),\n ),\n group_members: people.map((_, u) =>\n row(sfid(\"011\", u), { GroupId: sfid(\"00G\", u < 8 ? 0 : 1), UserOrGroupId: userId(u) }),\n ),\n collaboration_groups: [\"All Acme\", \"Deal Desk\"].map((name, g) =>\n row(sfid(\"0F9\", g), {\n Name: name,\n CollaborationType: \"Public\",\n MemberCount: g === 0 ? userCount : 4,\n OwnerId: userId(0),\n }),\n ),\n collaboration_group_members: people.map((_, u) =>\n row(sfid(\"0FB\", u), {\n CollaborationGroupId: sfid(\"0F9\", 0),\n MemberId: userId(u),\n CollaborationRole: u === 0 ? \"Admin\" : \"Standard\",\n }),\n ),\n record_types: [\n [\"Enterprise Deal\", \"Opportunity\"],\n [\"Support Case\", \"Case\"],\n ].map(([name, type], r) =>\n row(sfid(\"012\", r), {\n Name: name ?? \"\",\n DeveloperName: (name ?? \"\").replaceAll(\" \", \"_\"),\n SobjectType: type ?? \"\",\n IsActive: true,\n }),\n ),\n business_hours: [\n row(sfid(\"01m\", 0), {\n Name: \"Default\",\n IsDefault: true,\n IsActive: true,\n TimeZoneSidKey: \"America/Los_Angeles\",\n MondayStartTime: \"09:00:00.000Z\",\n MondayEndTime: \"17:00:00.000Z\",\n FridayStartTime: \"09:00:00.000Z\",\n FridayEndTime: \"17:00:00.000Z\",\n }),\n ],\n holidays: [\n [\"New Year's Day\", `${now.getUTCFullYear()}-01-01`],\n [\"Independence Day\", `${now.getUTCFullYear()}-07-04`],\n [\"Thanksgiving\", `${now.getUTCFullYear()}-11-26`],\n ].map(([name, date], h) =>\n row(sfid(\"0C0\", h), { Name: name ?? \"\", ActivityDate: date ?? \"\", IsAllDay: true }),\n ),\n periods: [0, 1, 2, 3].map((q) => {\n const start = new Date(Date.UTC(now.getUTCFullYear(), q * 3, 1));\n\n return row(sfid(\"026\", q), {\n Type: \"Quarter\",\n Number: q + 1,\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(Date.UTC(now.getUTCFullYear(), q * 3 + 3, 0))),\n FullyQualifiedLabel: `Q${q + 1}-${now.getUTCFullYear()}`,\n });\n }),\n folders: [\n row(sfid(\"00l\", 0), { Name: \"Sales Collateral\", Type: \"Document\", AccessType: \"Public\" }),\n ],\n documents: [\"Pricing sheet\", \"Security overview\", \"Case study\"].map((name, d) =>\n row(sfid(\"015\", d), {\n Name: name,\n FolderId: sfid(\"00l\", 0),\n Type: \"pdf\",\n ContentType: \"application/pdf\",\n BodyLength: faker.number.int({ min: 80_000, max: 2_000_000 }),\n AuthorId: userId(1),\n }),\n ),\n products: products.map((product, p) =>\n row(productId(p), {\n Name: product.name,\n ProductCode: product.code,\n Family: product.family,\n IsActive: true,\n Description: `${product.name}, billed yearly`,\n }),\n ),\n pricebooks: [\n row(pricebookId, { Name: \"Standard Price Book\", IsStandard: true, IsActive: true }),\n ],\n pricebook_entries: products.map((product, p) =>\n row(entryId(p), {\n Pricebook2Id: pricebookId,\n Product2Id: productId(p),\n UnitPrice: product.price,\n IsActive: true,\n UseStandardPrice: false,\n CurrencyIsoCode: \"USD\",\n }),\n ),\n campaigns: campaigns.map((name, c) => {\n const start = new Date(now.getTime() - (300 - c * 70) * day);\n\n return row(campaignId(c), {\n Name: name,\n Type: c === 1 ? \"Conference\" : c === 3 ? \"Email\" : \"Webinar\",\n Status: start < now ? \"Completed\" : \"Planned\",\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(start.getTime() + 30 * day)),\n BudgetedCost: [20_000, 150_000, 40_000, 5_000][c] ?? 10_000,\n IsActive: true,\n OwnerId: userId(1),\n });\n }),\n campaign_member_statuses: campaigns.flatMap((_, c) =>\n [\"Sent\", \"Responded\", \"Attended\"].map((label, s) =>\n row(sfid(\"01Y\", c * 10 + s), {\n CampaignId: campaignId(c),\n Label: label,\n HasResponded: s > 0,\n IsDefault: s === 0,\n SortOrder: s + 1,\n }),\n ),\n ),\n forecasting_quotas: people.slice(3, 8).flatMap((_, u) =>\n [0, 1, 2, 3].map((q) =>\n row(sfid(\"0J9\", u * 10 + q), {\n QuotaOwnerId: userId(u + 3),\n QuotaAmount: faker.helpers.arrayElement([150_000, 200_000, 250_000]),\n StartDate: dateOnly(new Date(Date.UTC(now.getUTCFullYear(), q * 3, 1))),\n ForecastingTypeId: sfid(\"0Db\", 0),\n }),\n ),\n ),\n solutions: [\n \"Reset a user's password\",\n \"Connect a data warehouse\",\n \"Fix dashboard timeouts\",\n ].map((name, s) =>\n row(sfid(\"501\", s), {\n SolutionName: name,\n SolutionNote: `Steps to ${name.toLowerCase()}.`,\n Status: \"Reviewed\",\n IsPublished: true,\n OwnerId: userId(9),\n }),\n ),\n macros: [\"Send reset link\", \"Escalate to tier 2\"].map((name, m) =>\n row(sfid(\"0JZ\", m), {\n Name: name,\n Description: `${name} macro`,\n IsAlohaSupported: true,\n IsLightningSupported: true,\n }),\n ),\n quick_texts: [\"Greeting\", \"Closing\"].map((name, q) =>\n row(sfid(\"0ex\", q), {\n Name: name,\n Message: q === 0 ? \"Hi! Thanks for reaching out.\" : \"Glad we could help. Have a great day!\",\n Channel: \"Email;Phone\",\n }),\n ),\n locations: [\"Los Angeles warehouse\", \"Chicago depot\"].map((name, l) =>\n row(sfid(\"131\", l), {\n Name: name,\n LocationType: \"Warehouse\",\n IsInventoryLocation: true,\n IsMobile: false,\n }),\n ),\n service_territories: [\"West\", \"Central\"].map((name, t) =>\n row(territoryId(t), {\n Name: `${name} Field Service`,\n IsActive: true,\n OperatingHoursId: sfid(\"0OH\", 0),\n }),\n ),\n service_resources: [9, 10, 11].map((u, r) =>\n row(resourceId(r), {\n Name: `${people[u]?.first ?? \"Field\"} ${people[u]?.last ?? \"Tech\"}`,\n RelatedRecordId: userId(u),\n ResourceType: \"T\",\n IsActive: true,\n }),\n ),\n resource_absences: [0, 1].map((r) => {\n const start = new Date(now.getTime() + (r * 9 + 4) * day);\n\n return row(sfid(\"0Ho\", r), {\n ResourceId: resourceId(r),\n Type: \"Vacation\",\n Start: datetime(start),\n End: datetime(new Date(start.getTime() + 3 * day)),\n });\n }),\n product_items: products.slice(3).map((product, p) =>\n row(sfid(\"0TS\", p), {\n Product2Id: productId(p + 3),\n LocationId: sfid(\"131\", p % 2),\n QuantityOnHand: faker.number.int({ min: 5, max: 200 }),\n QuantityUnitOfMeasure: \"Each\",\n }),\n ),\n topics: topics.map((name, t) =>\n row(topicId(t), { Name: name, TalkingAbout: faker.number.int({ min: 1, max: 40 }) }),\n ),\n };\n\n // Field definitions for the main objects, as describe returns them.\n const describe: Array<\n readonly [string, string, string, string, ReadonlyArray<string>, ReadonlyArray<string>]\n > = [\n [\"Account\", \"Name\", \"Account Name\", \"string\", [], []],\n [\n \"Account\",\n \"Industry\",\n \"Industry\",\n \"picklist\",\n [\"Technology\", \"Finance\", \"Healthcare\", \"Retail\", \"Manufacturing\"],\n [],\n ],\n [\"Account\", \"OwnerId\", \"Owner ID\", \"reference\", [], [\"User\"]],\n [\"Contact\", \"AccountId\", \"Account ID\", \"reference\", [], [\"Account\"]],\n [\"Contact\", \"Email\", \"Email\", \"email\", [], []],\n [\n \"Opportunity\",\n \"StageName\",\n \"Stage\",\n \"picklist\",\n opportunityStages.map((stage) => stage.name),\n [],\n ],\n [\"Opportunity\", \"Amount\", \"Amount\", \"currency\", [], []],\n [\"Case\", \"Status\", \"Status\", \"picklist\", [\"New\", \"Working\", \"Escalated\", \"Closed\"], []],\n [\"Case\", \"Priority\", \"Priority\", \"picklist\", [\"Low\", \"Medium\", \"High\"], []],\n ];\n\n const objectFields: Array<ObjectField> = describe.map(\n ([object, name, label, type, picklist, references]) => ({\n id: `${object}.${name}`,\n version: now,\n object,\n name,\n label,\n type,\n custom: false,\n calculated: false,\n nillable: name !== \"Name\" && name !== \"StageName\",\n length: type === \"string\" ? 255n : type === \"email\" ? 80n : type === \"reference\" ? 18n : 0n,\n precision: type === \"currency\" ? 18n : 0n,\n scale: type === \"currency\" ? 2n : 0n,\n reference_to: [...references],\n picklist_values: picklist.map((value) => ({ value, label: value, active: true })),\n }),\n );\n\n return { ...rows, object_fields: objectFields };\n};\n","import { ConnectorApp, Demo, RuntimeConfig } from \"@useairfoil/connector-kit\";\nimport { Command } from \"effect/cli\";\n\nimport { objects } from \"../manifest\";\nimport { ObjectFieldSchema } from \"../schemas/object-fields\";\nimport { CustomObjectSchema, objectSchema } from \"../schemas/objects\";\nimport { accountRows } from \"./accounts\";\nimport { setupRows } from \"./setup\";\nimport { type TableName } from \"./shared\";\n\nconst objectTables = objects.map((spec) =>\n Demo.table({ name: spec.name, rowSchema: objectSchema(spec.object), version: \"version\" }),\n);\n\n// Tables the org setup writes once. Every other object comes with an account.\nconst orgTables = new Set<TableName>([\n \"organization\",\n \"profiles\",\n \"user_roles\",\n \"users\",\n \"permission_sets\",\n \"permission_set_assignments\",\n \"groups\",\n \"group_members\",\n \"collaboration_groups\",\n \"collaboration_group_members\",\n \"record_types\",\n \"business_hours\",\n \"holidays\",\n \"periods\",\n \"folders\",\n \"documents\",\n \"products\",\n \"pricebooks\",\n \"pricebook_entries\",\n \"campaigns\",\n \"campaign_member_statuses\",\n \"forecasting_quotas\",\n \"solutions\",\n \"macros\",\n \"quick_texts\",\n \"locations\",\n \"service_territories\",\n \"service_resources\",\n \"resource_absences\",\n \"product_items\",\n \"topics\",\n]);\n\nexport const demo = Demo.define({\n name: \"producer-salesforce\",\n setup: {\n tables: [\n ...objectTables.filter((table) => orgTables.has(table.name)),\n Demo.table({ name: \"object_fields\", rowSchema: ObjectFieldSchema, version: \"version\" }),\n ],\n rows: setupRows,\n },\n group: {\n tables: [\n ...objectTables.filter((table) => !orgTables.has(table.name)),\n Demo.table({ name: \"custom_objects\", rowSchema: CustomObjectSchema, version: \"version\" }),\n ],\n rows: accountRows,\n // An account with everything around it is about 27 KB.\n groupsPerChunk: 30,\n },\n});\n\nexport const demoCommand = ConnectorApp.makeDemoCommand(demo).pipe(\n Command.provide(RuntimeConfig.layerHosted()),\n);\n","import {\n ConnectorApp,\n Ingestor,\n RuntimeConfig,\n StateStore,\n Telemetry,\n} from \"@useairfoil/connector-kit\";\nimport { Effect, Layer, Logger } from \"effect\";\nimport { Command } from \"effect/cli\";\n\nimport { SalesforceConnector } from \"./index\";\n\nconst ConnectorLayer = SalesforceConnector.layerConfig(\n SalesforceConnector.SalesforceConfigDef.config,\n);\n\nconst TelemetryLayer = Layer.mergeAll(Telemetry.layerOtlp(), Telemetry.layerMetricsConsoleDump());\n\nexport const sandboxCommand = Command.make(\"sandbox\", {}, () =>\n Effect.gen(function* () {\n const port = yield* RuntimeConfig.httpPort;\n const entrypoint = yield* SalesforceConnector.SalesforceConnector;\n\n return yield* ConnectorApp.start(entrypoint, { port });\n }).pipe(\n Effect.annotateLogs({ component: \"salesforce\" }),\n Effect.provide(\n Layer.mergeAll(\n StateStore.layerMemory,\n Ingestor.layerConsole,\n ConnectorLayer,\n Logger.layer([Logger.consolePretty()]),\n TelemetryLayer,\n ),\n ),\n ),\n).pipe(Command.withDescription(\"Run the connector locally and log ingested data\"));\n","import { PgClient } from \"@effect/sql-pg\";\nimport {\n ConnectorApp,\n Ingestor,\n RuntimeConfig,\n StateStore,\n Telemetry,\n} from \"@useairfoil/connector-kit\";\nimport { Config, Effect, Layer, Logger, Schema } from \"effect\";\nimport { Command } from \"effect/cli\";\n\nimport { SalesforceConnector } from \"./index\";\n\nconst ConnectorLayer = SalesforceConnector.layerConfig(\n SalesforceConnector.SalesforceConfigDef.config,\n);\nconst TelemetryLayer = Telemetry.layerOtlp();\nconst PostgresLayer = PgClient.layerConfig({\n url: Config.schema(\n Schema.Redacted(Schema.NonEmptyString),\n RuntimeConfig.PlatformRuntimeKey.postgresConnectionString,\n ),\n maxConnections: Config.succeed(2),\n connectTimeout: Config.succeed(\"5 seconds\"),\n applicationName: Config.succeed(\"airfoil-producer-salesforce\"),\n});\nconst StateStoreLayer = StateStore.layerSql().pipe(Layer.provide(PostgresLayer));\n\nexport const startCommand = Command.make(\"start\", {}, () =>\n Effect.gen(function* () {\n const port = yield* RuntimeConfig.httpPort;\n const entrypoint = yield* SalesforceConnector.SalesforceConnector;\n\n return yield* ConnectorApp.start(entrypoint, { port }).pipe(\n Effect.provide(Ingestor.layerWingsConfig(entrypoint)),\n );\n }).pipe(\n Effect.annotateLogs({ component: \"salesforce\" }),\n Effect.provide(\n Layer.mergeAll(\n StateStoreLayer,\n ConnectorLayer,\n Logger.layer([Logger.consolePretty()]),\n TelemetryLayer,\n ),\n ),\n Effect.provide(RuntimeConfig.layerHosted()),\n ),\n).pipe(Command.withDescription(\"Run the production connector against Wings\"));\n","#!/usr/bin/env node\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { Effect, Layer } from \"effect\";\nimport { Command } from \"effect/cli\";\nimport { FetchHttpClient } from \"effect/http\";\n\nimport packageJson from \"../package.json\";\nimport { createTableCommand } from \"./create-table\";\nimport { demoCommand } from \"./demo\";\nimport { sandboxCommand } from \"./sandbox\";\nimport { startCommand } from \"./start\";\n\nconst BootstrapLayer = Layer.mergeAll(FetchHttpClient.layer, NodeServices.layer);\n\nconst program = Command.make(\"producer-salesforce\", {}, () => Effect.void).pipe(\n Command.withSubcommands([startCommand, sandboxCommand, createTableCommand, demoCommand]),\n);\n\nconst cli = Command.run(program, { version: packageJson.version });\n\nNodeRuntime.runMain(cli.pipe(Effect.provide(BootstrapLayer), Effect.scoped));\n"],"mappings":"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"}
1
+ {"version":3,"file":"main.mjs","names":["ConnectorLayer","SalesforceConnector.layerConfig","TelemetryLayer","SalesforceConnector.SalesforceConnector","SalesforceConnector.layerConfig","SalesforceConnector.SalesforceConnector","packageJson.version"],"sources":["../package.json","../src/tables.ts","../src/create-table.ts","../src/demo/shared.ts","../src/demo/activity.ts","../src/demo/cases.ts","../src/demo/contacts.ts","../src/demo/contracts.ts","../src/demo/opportunities.ts","../src/demo/accounts.ts","../src/demo/setup.ts","../src/demo/index.ts","../src/sandbox.ts","../src/start.ts","../src/main.ts"],"sourcesContent":["","import type { Schema } from \"effect\";\n\nimport { objects } from \"./manifest\";\nimport { ObjectFieldSchema } from \"./schemas/object-fields\";\nimport { CustomObjectSchema, objectSchema } from \"./schemas/objects\";\n\nexport const tableSchemas: Readonly<Record<string, Schema.Top>> = {\n ...Object.fromEntries(objects.map((spec) => [spec.name, objectSchema(spec.object)])),\n custom_objects: CustomObjectSchema,\n object_fields: ObjectFieldSchema,\n};\n","import { ConnectorApp, RuntimeConfig } from \"@useairfoil/connector-kit\";\nimport { Command } from \"effect/cli\";\n\nimport { tableSchemas } from \"./tables\";\n\nexport const createTableCommand = ConnectorApp.makeCreateTableCommand(tableSchemas);\n\nexport const setupCommand = ConnectorApp.makeSetupCommand(tableSchemas).pipe(\n Command.provide(RuntimeConfig.layerHosted()),\n);\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport { DateTime, Duration } from \"effect\";\n\nimport type { CustomObject, ObjectRow } from \"../schemas/objects\";\n\nimport { objects } from \"../manifest\";\n\nexport const hour = Duration.toMillis(Duration.hours(1));\nexport const day = Duration.toMillis(Duration.days(1));\n\nexport type Value = string | number | boolean | null;\nexport type TableName = (typeof objects)[number][\"name\"];\n\n// Salesforce IDs are 18 characters: a 3-character key prefix for the object, then\n// the record. Demo IDs keep the real prefixes.\nexport const sfid = (prefix: string, index: number, part = 0) =>\n `${prefix}Dm${String(part).padStart(3, \"0\")}${String(index).padStart(7, \"0\")}AAQ`;\n\n// Salesforce sends datetimes with a +0000 offset.\nexport const datetime = (date: Date) => date.toISOString().replace(\"Z\", \"+0000\");\nexport const dateOnly = (date: Date) => DateTime.formatIsoDateUtc(DateTime.fromDateUnsafe(date));\n\n/**\n * One record: the shared columns, and every non-null field as a string, the way\n * the connector stores them.\n */\nexport const sobject = (\n id: string,\n created: Date,\n updated: Date,\n now: Date,\n fields: Readonly<Record<string, Value>>,\n): ObjectRow => ({\n id,\n // Salesforce rows use the fetch time as their version.\n version: now,\n created_at: created,\n updated_at: updated,\n _deleted: false,\n fields: new Map(\n Object.entries({\n Id: id,\n CreatedDate: datetime(created),\n LastModifiedDate: datetime(updated),\n SystemModstamp: datetime(updated),\n IsDeleted: false,\n ...fields,\n }).flatMap(\n ([name, value]): ReadonlyArray<readonly [string, string]> =>\n value === null ? [] : [[name, String(value)]],\n ),\n ),\n});\n\nexport const userCount = 12;\nexport const userId = (u: number) => sfid(\"005\", u);\nexport const profileId = (p: number) => sfid(\"00e\", p);\nexport const roleId = (r: number) => sfid(\"00E\", r);\nexport const pricebookId = sfid(\"01s\", 0);\n\nexport const products = [\n { name: \"Analytics Cloud\", code: \"AC-STD\", family: \"Software\", price: 24000 },\n { name: \"Analytics Cloud Enterprise\", code: \"AC-ENT\", family: \"Software\", price: 60000 },\n { name: \"Data Connectors Pack\", code: \"DC-PACK\", family: \"Add-on\", price: 8000 },\n { name: \"Premier Support\", code: \"SUP-PREM\", family: \"Services\", price: 12000 },\n { name: \"Implementation\", code: \"SVC-IMPL\", family: \"Services\", price: 15000 },\n { name: \"Training Day\", code: \"SVC-TRAIN\", family: \"Services\", price: 2500 },\n] as const;\n\nexport const productId = (p: number) => sfid(\"01t\", p);\nexport const entryId = (p: number) => sfid(\"01u\", p);\n\nexport const campaigns = [\n \"Spring Webinar Series\",\n \"Annual Customer Summit\",\n \"Q3 Outbound\",\n \"Partner Newsletter\",\n] as const;\n\nexport const campaignId = (c: number) => sfid(\"701\", c);\nexport const territoryId = (t: number) => sfid(\"0Hh\", t);\nexport const resourceId = (r: number) => sfid(\"0Hn\", r);\nexport const topics = [\"Renewal\", \"Expansion\", \"Escalation\", \"Integration\"] as const;\nexport const topicId = (t: number) => sfid(\"0TO\", t);\n\nexport const opportunityStages = [\n { name: \"Prospecting\", probability: 10 },\n { name: \"Qualification\", probability: 20 },\n { name: \"Needs Analysis\", probability: 40 },\n { name: \"Proposal/Price Quote\", probability: 60 },\n { name: \"Negotiation/Review\", probability: 80 },\n { name: \"Closed Won\", probability: 100 },\n { name: \"Closed Lost\", probability: 0 },\n] as const;\n\n/** Date helpers for one run. `at` keeps a time from going past now. */\nexport const clock = ({ faker, now }: Demo.DemoContext) => {\n const at = (time: number) => new Date(Math.min(time, now.getTime()));\n\n const between = (from: Date, to: Date) =>\n faker.date.between({ from, to: at(Math.max(from.getTime(), to.getTime())) });\n\n return { at, between };\n};\n\n/**\n * One account being built: the run's tools and what its parts need to know.\n * `add` writes a row, and `next` gives the next record ID within the account,\n * so IDs follow write order.\n */\nexport type AccountGroup = Demo.DemoContext &\n ReturnType<typeof clock> & {\n readonly index: number;\n readonly accountId: string;\n readonly name: string;\n readonly owner: number;\n readonly agent: number;\n readonly domain: string;\n readonly industry: string;\n readonly created: Date;\n readonly city: string;\n readonly state: string;\n readonly add: (table: TableName, row: ObjectRow) => void;\n readonly next: (prefix: string) => string;\n readonly custom: Array<CustomObject>;\n };\n\nexport type AccountContact = {\n readonly id: string;\n readonly first: string;\n readonly last: string;\n readonly email: string;\n readonly added: Date;\n};\n\nexport type OpportunityPlan = {\n readonly id: string;\n readonly stage: number;\n readonly closed: Date | null;\n readonly amount: number;\n readonly lines: ReadonlyArray<number>;\n};\n","import {\n type AccountContact,\n type AccountGroup,\n campaignId,\n dateOnly,\n datetime,\n day,\n hour,\n type OpportunityPlan,\n sfid,\n sobject,\n topicId,\n userId,\n} from \"./shared\";\n\n/** Sales activity on the account: tasks, events, notes, and Chatter. */\nexport const activityRows = (\n account: AccountGroup,\n contactIds: ReadonlyArray<string>,\n opportunities: ReadonlyArray<OpportunityPlan>,\n won: OpportunityPlan | undefined,\n) => {\n const { faker, now, between, accountId, name, owner, created, add, next } = account;\n\n for (let a = 0; a < faker.number.int({ min: 1, max: 6 }); a++) {\n const when = between(created, now);\n const who = faker.helpers.arrayElement(contactIds);\n\n const what =\n opportunities.length > 0 && faker.datatype.boolean()\n ? faker.helpers.arrayElement(opportunities).id\n : accountId;\n\n if (faker.datatype.boolean()) {\n const taskId = next(\"00T\");\n\n add(\n \"tasks\",\n sobject(taskId, when, when, now, {\n Subject: faker.helpers.arrayElement([\"Call\", \"Send proposal\", \"Follow up\"]),\n Status: when < new Date(now.getTime() - 3 * day) ? \"Completed\" : \"Not Started\",\n Priority: \"Normal\",\n ActivityDate: dateOnly(when),\n WhoId: who ?? null,\n WhatId: what,\n OwnerId: userId(owner),\n TaskSubtype: \"Task\",\n }),\n );\n\n if (who)\n add(\n \"task_relations\",\n sobject(next(\"0RT\"), when, when, now, { TaskId: taskId, RelationId: who, IsWhat: false }),\n );\n } else {\n const eventId = next(\"00U\");\n\n add(\n \"events\",\n sobject(eventId, when, when, now, {\n Subject: faker.helpers.arrayElement([\"Discovery call\", \"Demo\", \"QBR\"]),\n StartDateTime: datetime(when),\n EndDateTime: datetime(new Date(when.getTime() + hour)),\n DurationInMinutes: 60,\n WhoId: who ?? null,\n WhatId: what,\n OwnerId: userId(owner),\n }),\n );\n\n if (who)\n add(\n \"event_relations\",\n sobject(next(\"0RE\"), when, when, now, {\n EventId: eventId,\n RelationId: who,\n IsInvitee: true,\n Status: \"Accepted\",\n }),\n );\n }\n }\n\n const noted = between(created, now);\n\n add(\n \"notes\",\n sobject(next(\"002\"), noted, noted, now, {\n ParentId: accountId,\n Title: \"Account plan\",\n Body: \"Expand into the data team next quarter.\",\n IsPrivate: false,\n OwnerId: userId(owner),\n }),\n );\n\n if (faker.datatype.boolean({ probability: 0.3 })) {\n add(\n \"attachments\",\n sobject(next(\"00P\"), noted, noted, now, {\n ParentId: accountId,\n Name: \"signed-order-form.pdf\",\n ContentType: \"application/pdf\",\n BodyLength: faker.number.int({ min: 50_000, max: 900_000 }),\n OwnerId: userId(owner),\n }),\n );\n }\n\n const feedItem = next(\"0D5\");\n\n add(\n \"feed_items\",\n sobject(feedItem, noted, noted, now, {\n ParentId: accountId,\n Type: \"TextPost\",\n Body: `Great call with ${name} today!`,\n CreatedById: userId(owner),\n CommentCount: 1,\n LikeCount: faker.number.int({ max: 5 }),\n }),\n );\n\n add(\n \"feed_comments\",\n sobject(next(\"0D7\"), noted, noted, now, {\n FeedItemId: feedItem,\n ParentId: accountId,\n CommentBody: \"Nice work!\",\n CreatedById: userId(1),\n }),\n );\n\n add(\n \"topic_assignments\",\n sobject(next(\"0FT\"), noted, noted, now, {\n TopicId: topicId(won ? 0 : 1),\n EntityId: accountId,\n EntityType: \"Account\",\n }),\n );\n};\n\n/** A lead that hasn't converted yet, from the same company. */\nexport const leadRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n campaign: number,\n) => {\n const { faker, now, between, index, name, owner, domain, industry, created, add, next } = account;\n\n const leadFirst = faker.person.firstName();\n const leadLast = faker.person.lastName();\n const leadId = sfid(\"00Q\", index);\n const leadCreated = between(created, now);\n\n add(\n \"leads\",\n sobject(leadId, leadCreated, leadCreated, now, {\n FirstName: leadFirst,\n LastName: leadLast,\n Name: `${leadFirst} ${leadLast}`,\n Company: name,\n Email: `${leadFirst}.${leadLast}@${domain}`.toLowerCase(),\n Status: faker.helpers.arrayElement([\n \"Open - Not Contacted\",\n \"Working - Contacted\",\n \"Closed - Not Converted\",\n ]),\n LeadSource: \"Webinar\",\n Industry: industry,\n IsConverted: false,\n OwnerId: userId(owner),\n }),\n );\n\n add(\n \"lead_history\",\n sobject(next(\"017\"), leadCreated, leadCreated, now, {\n LeadId: leadId,\n Field: \"created\",\n OldValue: null,\n NewValue: null,\n CreatedById: userId(owner),\n }),\n );\n\n add(\n \"campaign_members\",\n sobject(next(\"00v\"), leadCreated, leadCreated, now, {\n CampaignId: campaignId(campaign),\n LeadId: leadId,\n Status: \"Sent\",\n HasResponded: false,\n }),\n );\n\n // Sometimes the lead duplicates a contact.\n if (main && faker.datatype.boolean({ probability: 0.1 })) {\n const set = next(\"0GK\");\n\n add(\n \"duplicate_record_sets\",\n sobject(set, leadCreated, leadCreated, now, {\n DuplicateRuleId: sfid(\"0Bm\", 0),\n RecordCount: 2,\n }),\n );\n\n add(\n \"duplicate_record_items\",\n sobject(next(\"0GL\"), leadCreated, leadCreated, now, {\n DuplicateRecordSetId: set,\n RecordId: leadId,\n }),\n );\n\n add(\n \"duplicate_record_items\",\n sobject(next(\"0GL\"), leadCreated, leadCreated, now, {\n DuplicateRecordSetId: set,\n RecordId: main.id,\n }),\n );\n }\n};\n","import {\n type AccountContact,\n type AccountGroup,\n datetime,\n day,\n hour,\n type OpportunityPlan,\n sfid,\n sobject,\n topicId,\n userId,\n} from \"./shared\";\n\n/** Customers open cases, worked by support. */\nexport const caseRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n won: OpportunityPlan | undefined,\n) => {\n const { faker, now, at, between, index, accountId, agent, domain, created, add, next } = account;\n\n const caseCount = won ? faker.number.int({ max: 3 }) : 0;\n\n for (let k = 0; k < caseCount; k++) {\n const caseId = next(\"500\");\n const opened = between(won?.closed ?? created, now);\n\n const closedCase = faker.datatype.boolean({ probability: 0.7 })\n ? at(opened.getTime() + faker.number.int({ min: hour, max: 5 * day }))\n : null;\n\n const subject = faker.helpers.arrayElement([\n \"Dashboard won't load\",\n \"Connector sync failing\",\n \"Need help with SSO\",\n \"Export is missing rows\",\n ]);\n\n add(\n \"cases\",\n sobject(caseId, opened, closedCase ?? opened, now, {\n AccountId: accountId,\n ContactId: main?.id ?? null,\n Subject: subject,\n Description: `${subject}. It started this morning.`,\n Status: closedCase ? \"Closed\" : faker.helpers.arrayElement([\"New\", \"Working\", \"Escalated\"]),\n Priority: faker.helpers.arrayElement([\"Low\", \"Medium\", \"High\"]),\n Origin: faker.helpers.arrayElement([\"Email\", \"Web\", \"Phone\", \"Chat\"]),\n IsClosed: closedCase !== null,\n ClosedDate: closedCase ? datetime(closedCase) : null,\n CaseNumber: String(50_000 + index * 4 + k),\n OwnerId: userId(agent),\n RecordTypeId: sfid(\"012\", 1),\n }),\n );\n\n add(\n \"case_comments\",\n sobject(next(\"00a\"), opened, opened, now, {\n ParentId: caseId,\n CommentBody: \"Thanks, we're looking into it.\",\n IsPublished: true,\n CreatedById: userId(agent),\n }),\n );\n\n if (main)\n add(\n \"case_contact_roles\",\n sobject(next(\"03j\"), opened, opened, now, {\n CasesId: caseId,\n ContactId: main.id,\n Role: \"Technical Contact\",\n }),\n );\n\n add(\n \"case_team_members\",\n sobject(next(\"0B6\"), opened, opened, now, {\n ParentId: caseId,\n MemberId: userId(agent),\n TeamRoleId: sfid(\"0B7\", 0),\n }),\n );\n\n add(\n \"case_history\",\n sobject(next(\"017\"), opened, opened, now, {\n CaseId: caseId,\n Field: \"Status\",\n OldValue: null,\n NewValue: \"New\",\n CreatedById: userId(agent),\n }),\n );\n\n if (closedCase)\n add(\n \"case_history\",\n sobject(next(\"017\"), closedCase, closedCase, now, {\n CaseId: caseId,\n Field: \"Status\",\n OldValue: \"Working\",\n NewValue: \"Closed\",\n CreatedById: userId(agent),\n }),\n );\n\n const emailId = next(\"02s\");\n\n add(\n \"email_messages\",\n sobject(emailId, opened, opened, now, {\n ParentId: caseId,\n Subject: subject,\n FromAddress: main?.email ?? `support@${domain}`,\n ToAddress: \"support@acme-analytics.example.com\",\n Incoming: true,\n Status: \"3\",\n TextBody: `${subject}. Can you help?`,\n }),\n );\n\n add(\n \"email_message_relations\",\n sobject(next(\"0EM\"), opened, opened, now, {\n EmailMessageId: emailId,\n RelationId: main?.id ?? null,\n RelationType: \"FromAddress\",\n RelationAddress: main?.email ?? null,\n }),\n );\n\n if (faker.datatype.boolean({ probability: 0.3 })) {\n const chatStart = at(opened.getTime() - hour / 6);\n\n add(\n \"live_chat_transcripts\",\n sobject(next(\"570\"), chatStart, chatStart, now, {\n CaseId: caseId,\n ContactId: main?.id ?? null,\n Status: \"Completed\",\n StartTime: datetime(chatStart),\n EndTime: datetime(opened),\n ChatDuration: 600,\n OwnerId: userId(agent),\n }),\n );\n\n add(\n \"messaging_sessions\",\n sobject(next(\"0Mw\"), chatStart, chatStart, now, {\n CaseId: caseId,\n Status: \"Ended\",\n Origin: \"InboundInitiated\",\n StartTime: datetime(chatStart),\n EndTime: datetime(opened),\n OwnerId: userId(agent),\n }),\n );\n }\n\n add(\n \"topic_assignments\",\n sobject(next(\"0FT\"), opened, opened, now, {\n TopicId: topicId(2),\n EntityId: caseId,\n EntityType: \"Case\",\n }),\n );\n }\n};\n","import { type AccountContact, type AccountGroup, day, sfid, sobject, userId } from \"./shared\";\n\n/** Contacts, each with their consent records. The first one is the main contact. */\nexport const contactRows = (account: AccountGroup): Array<AccountContact> => {\n const { faker, now, between, index, accountId, owner, domain, created, city, state, add } =\n account;\n\n return Array.from({ length: faker.number.int({ min: 1, max: 4 }) }, (_, c) => {\n const first = faker.person.firstName();\n const last = faker.person.lastName();\n const id = sfid(\"003\", index, c);\n const added = between(created, new Date(created.getTime() + 60 * day));\n const email = `${first}.${last}@${domain}`.toLowerCase();\n const phone = faker.phone.number({ style: \"national\" });\n const individual = sfid(\"0PK\", index, c);\n\n add(\n \"individuals\",\n sobject(individual, added, added, now, {\n FirstName: first,\n LastName: last,\n HasOptedOutTracking: false,\n HasOptedOutProcessing: false,\n }),\n );\n\n add(\n \"contact_point_emails\",\n sobject(sfid(\"9PE\", index, c), added, added, now, {\n ParentId: individual,\n EmailAddress: email,\n IsPrimary: true,\n }),\n );\n\n add(\n \"contact_point_phones\",\n sobject(sfid(\"9PP\", index, c), added, added, now, {\n ParentId: individual,\n TelephoneNumber: phone,\n PhoneType: \"Work\",\n IsPrimary: true,\n }),\n );\n\n add(\n \"contacts\",\n sobject(id, added, added, now, {\n AccountId: accountId,\n FirstName: first,\n LastName: last,\n Name: `${first} ${last}`,\n Email: email,\n Phone: phone,\n Title: faker.person.jobTitle(),\n IndividualId: individual,\n LeadSource: faker.helpers.arrayElement([\n \"Web\",\n \"Webinar\",\n \"Partner Referral\",\n \"Trade Show\",\n ]),\n MailingCity: city,\n MailingState: state,\n MailingCountry: \"United States\",\n OwnerId: userId(owner),\n }),\n );\n\n add(\n \"account_contact_relations\",\n sobject(sfid(\"07k\", index, c), added, added, now, {\n AccountId: accountId,\n ContactId: id,\n IsDirect: true,\n IsActive: true,\n Roles: c === 0 ? \"Decision Maker\" : \"Evaluator\",\n }),\n );\n\n add(\n \"contact_history\",\n sobject(sfid(\"017\", index, c), added, added, now, {\n ContactId: id,\n Field: \"created\",\n OldValue: null,\n NewValue: null,\n CreatedById: userId(owner),\n }),\n );\n\n return { id, first, last, email, added };\n });\n};\n","import {\n type AccountContact,\n type AccountGroup,\n dateOnly,\n datetime,\n day,\n entryId,\n hour,\n type OpportunityPlan,\n pricebookId,\n productId,\n products,\n resourceId,\n sfid,\n sobject,\n territoryId,\n userId,\n} from \"./shared\";\n\n/** A won deal becomes a contract, an order, assets, and support entitlements. */\nexport const contractRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n opportunities: ReadonlyArray<OpportunityPlan>,\n won: OpportunityPlan | undefined,\n) => {\n const { faker, now, at, index, accountId, name, owner, add, next, custom } = account;\n\n if (!won?.closed) return;\n\n const start = won.closed;\n const contractId = sfid(\"800\", index);\n\n add(\n \"contracts\",\n sobject(contractId, start, start, now, {\n AccountId: accountId,\n Status: \"Activated\",\n StartDate: dateOnly(start),\n ContractTerm: 12,\n EndDate: dateOnly(new Date(start.getTime() + 365 * day)),\n ContractNumber: String(10_000 + index),\n OwnerId: userId(owner),\n }),\n );\n\n if (main)\n add(\n \"contract_contact_roles\",\n sobject(next(\"02a\"), start, start, now, {\n ContractId: contractId,\n ContactId: main.id,\n Role: \"Business User\",\n IsPrimary: true,\n }),\n );\n\n const orderId = sfid(\"801\", index);\n\n add(\n \"orders\",\n sobject(orderId, start, start, now, {\n AccountId: accountId,\n ContractId: contractId,\n OpportunityId: won.id,\n Status: \"Activated\",\n EffectiveDate: dateOnly(start),\n TotalAmount: won.amount,\n Pricebook2Id: pricebookId,\n OrderNumber: String(20_000 + index),\n }),\n );\n\n const assets: Array<string> = [];\n\n won.lines.forEach((p) => {\n add(\n \"order_items\",\n sobject(next(\"802\"), start, start, now, {\n OrderId: orderId,\n PricebookEntryId: entryId(p),\n Product2Id: productId(p),\n Quantity: 1,\n UnitPrice: products[p]?.price ?? 0,\n TotalPrice: products[p]?.price ?? 0,\n }),\n );\n\n const assetId = next(\"02i\");\n assets.push(assetId);\n\n add(\n \"assets\",\n sobject(assetId, start, start, now, {\n AccountId: accountId,\n ContactId: main?.id ?? null,\n Product2Id: productId(p),\n Name: products[p]?.name ?? \"Asset\",\n Status: \"Installed\",\n InstallDate: dateOnly(start),\n Quantity: 1,\n }),\n );\n });\n\n const [firstAsset, secondAsset] = assets;\n\n if (firstAsset && secondAsset) {\n add(\n \"asset_relationships\",\n sobject(next(\"1AR\"), start, start, now, {\n AssetId: firstAsset,\n RelatedAssetId: secondAsset,\n RelationshipType: \"Upgrade\",\n }),\n );\n }\n\n const contract = next(\"810\");\n\n add(\n \"service_contracts\",\n sobject(contract, start, start, now, {\n AccountId: accountId,\n Name: `${name} support`,\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(start.getTime() + 365 * day)),\n Status: \"Active\",\n Pricebook2Id: pricebookId,\n }),\n );\n\n add(\n \"contract_line_items\",\n sobject(next(\"811\"), start, start, now, {\n ServiceContractId: contract,\n PricebookEntryId: entryId(3),\n Quantity: 1,\n UnitPrice: products[3].price,\n }),\n );\n\n add(\n \"entitlements\",\n sobject(next(\"550\"), start, start, now, {\n AccountId: accountId,\n Name: \"Premier Support\",\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(start.getTime() + 365 * day)),\n Status: \"Active\",\n ServiceContractId: contract,\n Type: \"Phone Support\",\n }),\n );\n\n custom.push({\n ...sobject(sfid(\"a0B\", index), start, start, now, {\n Name: `${name} onboarding`,\n Account__c: accountId,\n Status__c: start.getTime() + 45 * day < now.getTime() ? \"Live\" : \"In Progress\",\n Go_Live_Date__c: dateOnly(new Date(start.getTime() + 45 * day)),\n }),\n object: \"Onboarding_Project__c\",\n });\n\n // Field service visit to install it.\n const workOrder = next(\"0WO\");\n const visit = at(start.getTime() + faker.number.int({ min: 5 * day, max: 20 * day }));\n\n add(\n \"work_orders\",\n sobject(workOrder, start, visit, now, {\n AccountId: accountId,\n ContactId: main?.id ?? null,\n Subject: \"On-site installation\",\n Status: visit < now ? \"Completed\" : \"New\",\n Priority: \"Medium\",\n ServiceTerritoryId: territoryId(index % 2),\n WorkOrderNumber: String(30_000 + index),\n }),\n );\n\n add(\n \"work_order_line_items\",\n sobject(next(\"1WL\"), start, start, now, {\n WorkOrderId: workOrder,\n Description: \"Install and configure\",\n Status: visit < now ? \"Completed\" : \"New\",\n Quantity: 1,\n }),\n );\n\n const appointment = next(\"08p\");\n\n add(\n \"service_appointments\",\n sobject(appointment, start, visit, now, {\n ParentRecordId: workOrder,\n Status: visit < now ? \"Completed\" : \"Scheduled\",\n SchedStartTime: datetime(visit),\n SchedEndTime: datetime(new Date(visit.getTime() + 3 * hour)),\n ServiceTerritoryId: territoryId(index % 2),\n AppointmentNumber: String(40_000 + index),\n }),\n );\n\n add(\n \"assigned_resources\",\n sobject(next(\"03r\"), start, start, now, {\n ServiceAppointmentId: appointment,\n ServiceResourceId: resourceId(index % 3),\n }),\n );\n};\n","import {\n type AccountContact,\n type AccountGroup,\n campaignId,\n dateOnly,\n day,\n entryId,\n type OpportunityPlan,\n opportunityStages,\n pricebookId,\n productId,\n products,\n sfid,\n sobject,\n userId,\n} from \"./shared\";\n\n/** Opportunities, with their products, people, competition, and history. */\nexport const opportunityRows = (\n account: AccountGroup,\n main: AccountContact | undefined,\n campaign: number,\n): Array<OpportunityPlan> => {\n const { faker, now, between, index, accountId, name, owner, created, add, next } = account;\n\n return Array.from(\n {\n length: faker.helpers.weightedArrayElement([\n { weight: 20, value: 0 },\n { weight: 55, value: 1 },\n { weight: 25, value: 2 },\n ]),\n },\n (_, o) => {\n const id = sfid(\"006\", index, o);\n const opened = between(created, now);\n\n const stage = faker.helpers.weightedArrayElement([\n { weight: 40, value: 5 },\n { weight: 20, value: 6 },\n ...[0, 1, 2, 3, 4].map((value) => ({ weight: 8, value })),\n ]);\n\n const stageInfo = opportunityStages[stage] ?? opportunityStages[0];\n const closed = stage >= 5 ? between(opened, new Date(opened.getTime() + 90 * day)) : null;\n\n const lines = [\n faker.number.int({ max: 1 }),\n ...faker.helpers.arrayElements([2, 3, 4, 5], { min: 0, max: 2 }),\n ];\n\n const amount = lines.reduce((sum, p) => sum + (products[p]?.price ?? 0), 0);\n const updated = closed ?? opened;\n\n add(\n \"opportunities\",\n sobject(id, opened, updated, now, {\n AccountId: accountId,\n Name: `${name} - ${products[lines[0] ?? 0]?.name ?? \"Analytics Cloud\"}`,\n StageName: stageInfo.name,\n Probability: stageInfo.probability,\n Amount: amount,\n CloseDate: dateOnly(closed ?? new Date(opened.getTime() + 60 * day)),\n IsClosed: stage >= 5,\n IsWon: stage === 5,\n Type: o === 0 ? \"New Business\" : \"Existing Business\",\n LeadSource: \"Web\",\n ForecastCategoryName:\n stage === 5 ? \"Closed\" : stage === 6 ? \"Omitted\" : stage >= 3 ? \"Commit\" : \"Pipeline\",\n OwnerId: userId(owner),\n Pricebook2Id: pricebookId,\n CampaignId: campaignId(campaign),\n RecordTypeId: sfid(\"012\", 0),\n }),\n );\n\n lines.forEach((p) => {\n const product = products[p] ?? products[0];\n\n add(\n \"opportunity_line_items\",\n sobject(next(\"00k\"), opened, opened, now, {\n OpportunityId: id,\n PricebookEntryId: entryId(p),\n Product2Id: productId(p),\n Name: product.name,\n Quantity: 1,\n UnitPrice: product.price,\n TotalPrice: product.price,\n ListPrice: product.price,\n }),\n );\n });\n\n if (main)\n add(\n \"opportunity_contact_roles\",\n sobject(next(\"00K\"), opened, opened, now, {\n OpportunityId: id,\n ContactId: main.id,\n Role: \"Decision Maker\",\n IsPrimary: true,\n }),\n );\n\n if (faker.datatype.boolean({ probability: 0.4 })) {\n add(\n \"opportunity_competitors\",\n sobject(next(\"00J\"), opened, opened, now, {\n OpportunityId: id,\n CompetitorName: faker.helpers.arrayElement([\"Tableau\", \"Looker\", \"Power BI\"]),\n Strengths: \"Brand awareness\",\n Weaknesses: \"Pricing\",\n }),\n );\n }\n\n add(\n \"opportunity_team_members\",\n sobject(next(\"00q\"), opened, opened, now, {\n OpportunityId: id,\n UserId: userId(owner),\n TeamMemberRole: \"Account Manager\",\n OpportunityAccessLevel: \"Edit\",\n }),\n );\n\n add(\n \"opportunity_splits\",\n sobject(next(\"049\"), opened, opened, now, {\n OpportunityId: id,\n SplitOwnerId: userId(owner),\n SplitPercentage: 100,\n SplitAmount: amount,\n SplitTypeId: sfid(\"149\", 0),\n }),\n );\n\n // Stage history: one row for each stage it reached, in order, and the last\n // one is when the opportunity last changed.\n const reached = stage === 6 ? faker.number.int({ max: 4 }) : Math.min(stage, 5);\n\n const steps = Array.from({ length: reached }, () => between(opened, updated)).toSorted(\n (a, b) => a.getTime() - b.getTime(),\n );\n\n for (let s = 0; s <= reached; s++) {\n const changed = s === reached ? updated : s === 0 ? opened : (steps[s - 1] ?? updated);\n const shown = s === reached && stage === 6 ? opportunityStages[6] : opportunityStages[s];\n\n add(\n \"opportunity_history\",\n sobject(next(\"008\"), changed, changed, now, {\n OpportunityId: id,\n StageName: shown?.name ?? \"Prospecting\",\n Amount: amount,\n Probability: shown?.probability ?? 10,\n CloseDate: dateOnly(closed ?? new Date(opened.getTime() + 60 * day)),\n }),\n );\n\n if (s > 0) {\n add(\n \"opportunity_field_history\",\n sobject(next(\"017\"), changed, changed, now, {\n OpportunityId: id,\n Field: \"StageName\",\n OldValue: opportunityStages[s - 1]?.name ?? null,\n NewValue: shown?.name ?? null,\n CreatedById: userId(owner),\n }),\n );\n }\n }\n\n if (stage >= 3) {\n const quoteId = next(\"0Q0\");\n const sent = between(opened, closed ?? now);\n\n add(\n \"quotes\",\n sobject(quoteId, sent, sent, now, {\n OpportunityId: id,\n Name: `Quote for ${name}`,\n Status: stage === 5 ? \"Accepted\" : stage === 6 ? \"Denied\" : \"Presented\",\n ExpirationDate: dateOnly(new Date(sent.getTime() + 30 * day)),\n GrandTotal: amount,\n Subtotal: amount,\n Pricebook2Id: pricebookId,\n ContactId: main?.id ?? null,\n }),\n );\n\n lines.forEach((p) => {\n add(\n \"quote_line_items\",\n sobject(next(\"0QL\"), sent, sent, now, {\n QuoteId: quoteId,\n PricebookEntryId: entryId(p),\n Product2Id: productId(p),\n Quantity: 1,\n UnitPrice: products[p]?.price ?? 0,\n }),\n );\n });\n }\n\n return { id, stage, closed, amount, lines };\n },\n );\n};\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport type { CustomObject, ObjectRow } from \"../schemas/objects\";\n\nimport { activityRows, leadRows } from \"./activity\";\nimport { caseRows } from \"./cases\";\nimport { contactRows } from \"./contacts\";\nimport { contractRows } from \"./contracts\";\nimport { opportunityRows } from \"./opportunities\";\nimport {\n type AccountGroup,\n campaignId,\n campaigns,\n clock,\n day,\n sfid,\n sobject,\n type TableName,\n userId,\n} from \"./shared\";\n\n/** One group is one account with its people, deals, contracts, service work, and activity. */\nexport const accountRows = (index: number, context: Demo.DemoContext) => {\n const { faker, now } = context;\n const { at } = clock(context);\n\n const rows: Partial<Record<TableName, Array<ObjectRow>>> = {};\n const custom: Array<CustomObject> = [];\n\n const add = (table: TableName, row: ObjectRow) => {\n (rows[table] ??= []).push(row);\n };\n\n let n = 0;\n\n // Each record gets the next number within the account, so IDs follow write order.\n const next = (prefix: string) => sfid(prefix, index, n++);\n\n const owner = 3 + faker.number.int({ max: 4 });\n const agent = 8 + faker.number.int({ max: 3 });\n const name = faker.company.name();\n const domain = `${name.toLowerCase().replaceAll(/[^a-z]+/g, \"\")}.example.com`;\n\n const industry = faker.helpers.arrayElement([\n \"Technology\",\n \"Finance\",\n \"Healthcare\",\n \"Retail\",\n \"Manufacturing\",\n ]);\n\n const employees = faker.helpers.arrayElement([40, 120, 450, 1_500, 8_000]);\n const created = at(now.getTime() - faker.number.int({ min: 30 * day, max: 800 * day }));\n const city = faker.location.city();\n const state = faker.location.state({ abbreviated: true });\n const accountId = sfid(\"001\", index);\n\n const account: AccountGroup = {\n ...context,\n ...clock(context),\n index,\n accountId,\n name,\n owner,\n agent,\n domain,\n industry,\n created,\n city,\n state,\n add,\n next,\n custom,\n };\n\n const contacts = contactRows(account);\n\n const main = contacts[0];\n const contactIds = contacts.map((contact) => contact.id);\n\n add(\n \"account_team_members\",\n sobject(next(\"01M\"), created, created, now, {\n AccountId: accountId,\n UserId: userId(owner),\n TeamMemberRole: \"Account Manager\",\n AccountAccessLevel: \"Edit\",\n }),\n );\n\n add(\n \"account_history\",\n sobject(next(\"017\"), created, created, now, {\n AccountId: accountId,\n Field: \"created\",\n OldValue: null,\n NewValue: null,\n CreatedById: userId(owner),\n }),\n );\n\n if (index > 0 && faker.datatype.boolean({ probability: 0.1 })) {\n add(\n \"partners\",\n sobject(next(\"00I\"), created, created, now, {\n AccountFromId: accountId,\n AccountToId: sfid(\"001\", index - 1),\n Role: \"Reseller\",\n IsPrimary: false,\n }),\n );\n }\n\n // A campaign brought some contacts in.\n const campaign = faker.number.int({ max: campaigns.length - 1 });\n\n if (main) {\n add(\n \"campaign_members\",\n sobject(next(\"00v\"), main.added, main.added, now, {\n CampaignId: campaignId(campaign),\n ContactId: main.id,\n Status: \"Responded\",\n HasResponded: true,\n }),\n );\n }\n\n const opportunities = opportunityRows(account, main, campaign);\n\n const won = opportunities.find((opportunity) => opportunity.stage === 5 && opportunity.closed);\n\n contractRows(account, main, opportunities, won);\n caseRows(account, main, won);\n activityRows(account, contactIds, opportunities, won);\n leadRows(account, main, campaign);\n\n const lastTouch = new Date(\n Math.max(\n created.getTime(),\n ...opportunities.map((opportunity) => (opportunity.closed ?? created).getTime()),\n ),\n );\n\n add(\n \"accounts\",\n sobject(accountId, created, lastTouch, now, {\n Name: name,\n Type: won ? \"Customer\" : \"Prospect\",\n Industry: industry,\n NumberOfEmployees: employees,\n AnnualRevenue: employees * faker.number.int({ min: 100_000, max: 250_000 }),\n Website: `https://www.${domain}`,\n Phone: faker.phone.number({ style: \"national\" }),\n BillingCity: city,\n BillingState: state,\n BillingCountry: \"United States\",\n OwnerId: userId(owner),\n Rating: won ? \"Hot\" : faker.helpers.arrayElement([\"Warm\", \"Cold\"]),\n AccountSource: \"Web\",\n }),\n );\n\n return { ...rows, custom_objects: custom };\n};\n","import type { Demo } from \"@useairfoil/connector-kit\";\n\nimport type { ObjectField } from \"../schemas/object-fields\";\nimport type { ObjectRow } from \"../schemas/objects\";\n\nimport {\n campaignId,\n campaigns,\n dateOnly,\n datetime,\n day,\n entryId,\n hour,\n opportunityStages,\n pricebookId,\n productId,\n products,\n profileId,\n resourceId,\n roleId,\n sfid,\n sobject,\n type TableName,\n territoryId,\n topicId,\n topics,\n userCount,\n userId,\n type Value,\n} from \"./shared\";\n\n/** The org setup, written once before any account. */\nexport const setupRows = ({ faker, now }: Demo.DemoContext) => {\n const setup = new Date(now.getTime() - 900 * day);\n\n const row = (id: string, fields: Readonly<Record<string, Value>>) =>\n sobject(id, setup, setup, now, fields);\n\n const profiles = [\"System Administrator\", \"Standard User\", \"Sales User\", \"Service User\"];\n\n const roles = [\n \"CEO\",\n \"VP Sales\",\n \"Sales Manager\",\n \"Account Executive\",\n \"Support Manager\",\n \"Support Agent\",\n ];\n\n const people = Array.from({ length: userCount }, (_, u) => ({\n first: faker.person.firstName(),\n last: faker.person.lastName(),\n role: u === 0 ? 0 : u < 3 ? 2 : u < 8 ? 3 : u === 8 ? 4 : 5,\n }));\n\n const rows: Partial<Record<TableName, Array<ObjectRow>>> = {\n organization: [\n row(sfid(\"00D\", 0), {\n Name: \"Acme Analytics\",\n OrganizationType: \"Enterprise Edition\",\n Country: \"United States\",\n DefaultLocaleSidKey: \"en_US\",\n TimeZoneSidKey: \"America/Los_Angeles\",\n FiscalYearStartMonth: 1,\n IsSandbox: false,\n }),\n ],\n profiles: profiles.map((name, p) =>\n row(profileId(p), { Name: name, UserType: \"Standard\", Description: null }),\n ),\n user_roles: roles.map((name, r) =>\n row(roleId(r), {\n Name: name,\n ParentRoleId: r === 0 ? null : roleId(r < 4 ? Math.max(0, r - 1) : r === 4 ? 0 : 4),\n RollupDescription: name,\n }),\n ),\n users: people.map((person, u) =>\n row(userId(u), {\n Username: `${person.first}.${person.last}@acme-analytics.example.com`.toLowerCase(),\n FirstName: person.first,\n LastName: person.last,\n Name: `${person.first} ${person.last}`,\n Email: `${person.first}.${person.last}@acme-analytics.example.com`.toLowerCase(),\n Alias: `${person.first.slice(0, 1)}${person.last.slice(0, 4)}`.toLowerCase(),\n IsActive: true,\n ProfileId: profileId(u === 0 ? 0 : u < 8 ? 2 : 3),\n UserRoleId: roleId(person.role),\n Title: roles[person.role] ?? \"Account Executive\",\n TimeZoneSidKey: \"America/Los_Angeles\",\n LastLoginDate: datetime(\n new Date(now.getTime() - faker.number.int({ min: hour, max: 5 * day })),\n ),\n }),\n ),\n permission_sets: [\"Sales Cloud User\", \"Service Cloud User\", \"Analytics Viewer\"].map(\n (label, p) =>\n row(sfid(\"0PS\", p), {\n Name: label.replaceAll(\" \", \"_\"),\n Label: label,\n IsOwnedByProfile: false,\n }),\n ),\n permission_set_assignments: people.map((_, u) =>\n row(sfid(\"0Pa\", u), { AssigneeId: userId(u), PermissionSetId: sfid(\"0PS\", u < 8 ? 0 : 1) }),\n ),\n groups: [\"Sales Team\", \"Support Team\"].map((name, g) =>\n row(sfid(\"00G\", g), {\n Name: name,\n DeveloperName: name.replaceAll(\" \", \"_\"),\n Type: \"Regular\",\n }),\n ),\n group_members: people.map((_, u) =>\n row(sfid(\"011\", u), { GroupId: sfid(\"00G\", u < 8 ? 0 : 1), UserOrGroupId: userId(u) }),\n ),\n collaboration_groups: [\"All Acme\", \"Deal Desk\"].map((name, g) =>\n row(sfid(\"0F9\", g), {\n Name: name,\n CollaborationType: \"Public\",\n MemberCount: g === 0 ? userCount : 4,\n OwnerId: userId(0),\n }),\n ),\n collaboration_group_members: people.map((_, u) =>\n row(sfid(\"0FB\", u), {\n CollaborationGroupId: sfid(\"0F9\", 0),\n MemberId: userId(u),\n CollaborationRole: u === 0 ? \"Admin\" : \"Standard\",\n }),\n ),\n record_types: [\n [\"Enterprise Deal\", \"Opportunity\"],\n [\"Support Case\", \"Case\"],\n ].map(([name, type], r) =>\n row(sfid(\"012\", r), {\n Name: name ?? \"\",\n DeveloperName: (name ?? \"\").replaceAll(\" \", \"_\"),\n SobjectType: type ?? \"\",\n IsActive: true,\n }),\n ),\n business_hours: [\n row(sfid(\"01m\", 0), {\n Name: \"Default\",\n IsDefault: true,\n IsActive: true,\n TimeZoneSidKey: \"America/Los_Angeles\",\n MondayStartTime: \"09:00:00.000Z\",\n MondayEndTime: \"17:00:00.000Z\",\n FridayStartTime: \"09:00:00.000Z\",\n FridayEndTime: \"17:00:00.000Z\",\n }),\n ],\n holidays: [\n [\"New Year's Day\", `${now.getUTCFullYear()}-01-01`],\n [\"Independence Day\", `${now.getUTCFullYear()}-07-04`],\n [\"Thanksgiving\", `${now.getUTCFullYear()}-11-26`],\n ].map(([name, date], h) =>\n row(sfid(\"0C0\", h), { Name: name ?? \"\", ActivityDate: date ?? \"\", IsAllDay: true }),\n ),\n periods: [0, 1, 2, 3].map((q) => {\n const start = new Date(Date.UTC(now.getUTCFullYear(), q * 3, 1));\n\n return row(sfid(\"026\", q), {\n Type: \"Quarter\",\n Number: q + 1,\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(Date.UTC(now.getUTCFullYear(), q * 3 + 3, 0))),\n FullyQualifiedLabel: `Q${q + 1}-${now.getUTCFullYear()}`,\n });\n }),\n folders: [\n row(sfid(\"00l\", 0), { Name: \"Sales Collateral\", Type: \"Document\", AccessType: \"Public\" }),\n ],\n documents: [\"Pricing sheet\", \"Security overview\", \"Case study\"].map((name, d) =>\n row(sfid(\"015\", d), {\n Name: name,\n FolderId: sfid(\"00l\", 0),\n Type: \"pdf\",\n ContentType: \"application/pdf\",\n BodyLength: faker.number.int({ min: 80_000, max: 2_000_000 }),\n AuthorId: userId(1),\n }),\n ),\n products: products.map((product, p) =>\n row(productId(p), {\n Name: product.name,\n ProductCode: product.code,\n Family: product.family,\n IsActive: true,\n Description: `${product.name}, billed yearly`,\n }),\n ),\n pricebooks: [\n row(pricebookId, { Name: \"Standard Price Book\", IsStandard: true, IsActive: true }),\n ],\n pricebook_entries: products.map((product, p) =>\n row(entryId(p), {\n Pricebook2Id: pricebookId,\n Product2Id: productId(p),\n UnitPrice: product.price,\n IsActive: true,\n UseStandardPrice: false,\n CurrencyIsoCode: \"USD\",\n }),\n ),\n campaigns: campaigns.map((name, c) => {\n const start = new Date(now.getTime() - (300 - c * 70) * day);\n\n return row(campaignId(c), {\n Name: name,\n Type: c === 1 ? \"Conference\" : c === 3 ? \"Email\" : \"Webinar\",\n Status: start < now ? \"Completed\" : \"Planned\",\n StartDate: dateOnly(start),\n EndDate: dateOnly(new Date(start.getTime() + 30 * day)),\n BudgetedCost: [20_000, 150_000, 40_000, 5_000][c] ?? 10_000,\n IsActive: true,\n OwnerId: userId(1),\n });\n }),\n campaign_member_statuses: campaigns.flatMap((_, c) =>\n [\"Sent\", \"Responded\", \"Attended\"].map((label, s) =>\n row(sfid(\"01Y\", c * 10 + s), {\n CampaignId: campaignId(c),\n Label: label,\n HasResponded: s > 0,\n IsDefault: s === 0,\n SortOrder: s + 1,\n }),\n ),\n ),\n forecasting_quotas: people.slice(3, 8).flatMap((_, u) =>\n [0, 1, 2, 3].map((q) =>\n row(sfid(\"0J9\", u * 10 + q), {\n QuotaOwnerId: userId(u + 3),\n QuotaAmount: faker.helpers.arrayElement([150_000, 200_000, 250_000]),\n StartDate: dateOnly(new Date(Date.UTC(now.getUTCFullYear(), q * 3, 1))),\n ForecastingTypeId: sfid(\"0Db\", 0),\n }),\n ),\n ),\n solutions: [\n \"Reset a user's password\",\n \"Connect a data warehouse\",\n \"Fix dashboard timeouts\",\n ].map((name, s) =>\n row(sfid(\"501\", s), {\n SolutionName: name,\n SolutionNote: `Steps to ${name.toLowerCase()}.`,\n Status: \"Reviewed\",\n IsPublished: true,\n OwnerId: userId(9),\n }),\n ),\n macros: [\"Send reset link\", \"Escalate to tier 2\"].map((name, m) =>\n row(sfid(\"0JZ\", m), {\n Name: name,\n Description: `${name} macro`,\n IsAlohaSupported: true,\n IsLightningSupported: true,\n }),\n ),\n quick_texts: [\"Greeting\", \"Closing\"].map((name, q) =>\n row(sfid(\"0ex\", q), {\n Name: name,\n Message: q === 0 ? \"Hi! Thanks for reaching out.\" : \"Glad we could help. Have a great day!\",\n Channel: \"Email;Phone\",\n }),\n ),\n locations: [\"Los Angeles warehouse\", \"Chicago depot\"].map((name, l) =>\n row(sfid(\"131\", l), {\n Name: name,\n LocationType: \"Warehouse\",\n IsInventoryLocation: true,\n IsMobile: false,\n }),\n ),\n service_territories: [\"West\", \"Central\"].map((name, t) =>\n row(territoryId(t), {\n Name: `${name} Field Service`,\n IsActive: true,\n OperatingHoursId: sfid(\"0OH\", 0),\n }),\n ),\n service_resources: [9, 10, 11].map((u, r) =>\n row(resourceId(r), {\n Name: `${people[u]?.first ?? \"Field\"} ${people[u]?.last ?? \"Tech\"}`,\n RelatedRecordId: userId(u),\n ResourceType: \"T\",\n IsActive: true,\n }),\n ),\n resource_absences: [0, 1].map((r) => {\n const start = new Date(now.getTime() + (r * 9 + 4) * day);\n\n return row(sfid(\"0Ho\", r), {\n ResourceId: resourceId(r),\n Type: \"Vacation\",\n Start: datetime(start),\n End: datetime(new Date(start.getTime() + 3 * day)),\n });\n }),\n product_items: products.slice(3).map((product, p) =>\n row(sfid(\"0TS\", p), {\n Product2Id: productId(p + 3),\n LocationId: sfid(\"131\", p % 2),\n QuantityOnHand: faker.number.int({ min: 5, max: 200 }),\n QuantityUnitOfMeasure: \"Each\",\n }),\n ),\n topics: topics.map((name, t) =>\n row(topicId(t), { Name: name, TalkingAbout: faker.number.int({ min: 1, max: 40 }) }),\n ),\n };\n\n // Field definitions for the main objects, as describe returns them.\n const describe: Array<\n readonly [string, string, string, string, ReadonlyArray<string>, ReadonlyArray<string>]\n > = [\n [\"Account\", \"Name\", \"Account Name\", \"string\", [], []],\n [\n \"Account\",\n \"Industry\",\n \"Industry\",\n \"picklist\",\n [\"Technology\", \"Finance\", \"Healthcare\", \"Retail\", \"Manufacturing\"],\n [],\n ],\n [\"Account\", \"OwnerId\", \"Owner ID\", \"reference\", [], [\"User\"]],\n [\"Contact\", \"AccountId\", \"Account ID\", \"reference\", [], [\"Account\"]],\n [\"Contact\", \"Email\", \"Email\", \"email\", [], []],\n [\n \"Opportunity\",\n \"StageName\",\n \"Stage\",\n \"picklist\",\n opportunityStages.map((stage) => stage.name),\n [],\n ],\n [\"Opportunity\", \"Amount\", \"Amount\", \"currency\", [], []],\n [\"Case\", \"Status\", \"Status\", \"picklist\", [\"New\", \"Working\", \"Escalated\", \"Closed\"], []],\n [\"Case\", \"Priority\", \"Priority\", \"picklist\", [\"Low\", \"Medium\", \"High\"], []],\n ];\n\n const objectFields: Array<ObjectField> = describe.map(\n ([object, name, label, type, picklist, references]) => ({\n id: `${object}.${name}`,\n version: now,\n object,\n name,\n label,\n type,\n custom: false,\n calculated: false,\n nillable: name !== \"Name\" && name !== \"StageName\",\n length: type === \"string\" ? 255n : type === \"email\" ? 80n : type === \"reference\" ? 18n : 0n,\n precision: type === \"currency\" ? 18n : 0n,\n scale: type === \"currency\" ? 2n : 0n,\n reference_to: [...references],\n picklist_values: picklist.map((value) => ({ value, label: value, active: true })),\n }),\n );\n\n return { ...rows, object_fields: objectFields };\n};\n","import { ConnectorApp, Demo, RuntimeConfig } from \"@useairfoil/connector-kit\";\nimport { Command } from \"effect/cli\";\n\nimport { objects } from \"../manifest\";\nimport { ObjectFieldSchema } from \"../schemas/object-fields\";\nimport { CustomObjectSchema, objectSchema } from \"../schemas/objects\";\nimport { accountRows } from \"./accounts\";\nimport { setupRows } from \"./setup\";\nimport { type TableName } from \"./shared\";\n\nconst objectTables = objects.map((spec) =>\n Demo.table({ name: spec.name, rowSchema: objectSchema(spec.object), version: \"version\" }),\n);\n\n// Tables the org setup writes once. Every other object comes with an account.\nconst orgTables = new Set<TableName>([\n \"organization\",\n \"profiles\",\n \"user_roles\",\n \"users\",\n \"permission_sets\",\n \"permission_set_assignments\",\n \"groups\",\n \"group_members\",\n \"collaboration_groups\",\n \"collaboration_group_members\",\n \"record_types\",\n \"business_hours\",\n \"holidays\",\n \"periods\",\n \"folders\",\n \"documents\",\n \"products\",\n \"pricebooks\",\n \"pricebook_entries\",\n \"campaigns\",\n \"campaign_member_statuses\",\n \"forecasting_quotas\",\n \"solutions\",\n \"macros\",\n \"quick_texts\",\n \"locations\",\n \"service_territories\",\n \"service_resources\",\n \"resource_absences\",\n \"product_items\",\n \"topics\",\n]);\n\nexport const demo = Demo.define({\n name: \"producer-salesforce\",\n setup: {\n tables: [\n ...objectTables.filter((table) => orgTables.has(table.name)),\n Demo.table({ name: \"object_fields\", rowSchema: ObjectFieldSchema, version: \"version\" }),\n ],\n rows: setupRows,\n },\n group: {\n tables: [\n ...objectTables.filter((table) => !orgTables.has(table.name)),\n Demo.table({ name: \"custom_objects\", rowSchema: CustomObjectSchema, version: \"version\" }),\n ],\n rows: accountRows,\n // An account with everything around it is about 27 KB.\n groupsPerChunk: 30,\n },\n});\n\nexport const demoCommand = ConnectorApp.makeDemoCommand(demo).pipe(\n Command.provide(RuntimeConfig.layerHosted()),\n);\n","import {\n ConnectorApp,\n Ingestor,\n RuntimeConfig,\n StateStore,\n Telemetry,\n} from \"@useairfoil/connector-kit\";\nimport { Effect, Layer, Logger } from \"effect\";\nimport { Command } from \"effect/cli\";\n\nimport { SalesforceConnector } from \"./index\";\n\nconst ConnectorLayer = SalesforceConnector.layerConfig(\n SalesforceConnector.SalesforceConfigDef.config,\n);\n\nconst TelemetryLayer = Layer.mergeAll(Telemetry.layerOtlp(), Telemetry.layerMetricsConsoleDump());\n\nexport const sandboxCommand = Command.make(\"sandbox\", {}, () =>\n Effect.gen(function* () {\n const port = yield* RuntimeConfig.httpPort;\n const entrypoint = yield* SalesforceConnector.SalesforceConnector;\n\n return yield* ConnectorApp.start(entrypoint, { port });\n }).pipe(\n Effect.annotateLogs({ component: \"salesforce\" }),\n Effect.provide(\n Layer.mergeAll(\n StateStore.layerMemory,\n Ingestor.layerConsole,\n ConnectorLayer,\n Logger.layer([Logger.consolePretty()]),\n TelemetryLayer,\n ),\n ),\n ),\n).pipe(Command.withDescription(\"Run the connector locally and log ingested data\"));\n","import { PgClient } from \"@effect/sql-pg\";\nimport {\n ConnectorApp,\n Ingestor,\n RuntimeConfig,\n StateStore,\n Telemetry,\n} from \"@useairfoil/connector-kit\";\nimport { Config, Effect, Layer, Logger, Schema } from \"effect\";\nimport { Command } from \"effect/cli\";\n\nimport { SalesforceConnector } from \"./index\";\n\nconst ConnectorLayer = SalesforceConnector.layerConfig(\n SalesforceConnector.SalesforceConfigDef.config,\n);\nconst TelemetryLayer = Telemetry.layerOtlp();\nconst PostgresLayer = PgClient.layerConfig({\n url: Config.schema(\n Schema.Redacted(Schema.NonEmptyString),\n RuntimeConfig.PlatformRuntimeKey.postgresConnectionString,\n ),\n maxConnections: Config.succeed(2),\n connectTimeout: Config.succeed(\"5 seconds\"),\n applicationName: Config.succeed(\"airfoil-producer-salesforce\"),\n});\nconst StateStoreLayer = StateStore.layerSql().pipe(Layer.provide(PostgresLayer));\n\nexport const startCommand = Command.make(\"start\", {}, () =>\n Effect.gen(function* () {\n const port = yield* RuntimeConfig.httpPort;\n const entrypoint = yield* SalesforceConnector.SalesforceConnector;\n\n return yield* ConnectorApp.start(entrypoint, { port }).pipe(\n Effect.provide(Ingestor.layerArrowFlightConfig(entrypoint)),\n );\n }).pipe(\n Effect.annotateLogs({ component: \"salesforce\" }),\n Effect.provide(\n Layer.mergeAll(\n StateStoreLayer,\n ConnectorLayer,\n Logger.layer([Logger.consolePretty()]),\n TelemetryLayer,\n ),\n ),\n Effect.provide(RuntimeConfig.layerHosted()),\n ),\n).pipe(Command.withDescription(\"Run the connector\"));\n","#!/usr/bin/env node\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { Effect, Layer } from \"effect\";\nimport { Command } from \"effect/cli\";\nimport { FetchHttpClient } from \"effect/http\";\n\nimport packageJson from \"../package.json\";\nimport { createTableCommand, setupCommand } from \"./create-table\";\nimport { demoCommand } from \"./demo\";\nimport { sandboxCommand } from \"./sandbox\";\nimport { startCommand } from \"./start\";\n\nconst BootstrapLayer = Layer.mergeAll(FetchHttpClient.layer, NodeServices.layer);\n\nconst program = Command.make(\"producer-salesforce\", {}, () => Effect.void).pipe(\n Command.withSubcommands([\n setupCommand,\n startCommand,\n sandboxCommand,\n createTableCommand,\n demoCommand,\n ]),\n);\n\nconst cli = Command.run(program, { version: packageJson.version });\n\nNodeRuntime.runMain(cli.pipe(Effect.provide(BootstrapLayer), Effect.scoped));\n"],"mappings":"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"}
@@ -115,29 +115,24 @@ const layer$1 = (config) => Layer.effect(SalesforceClient)(make$1(config)).pipe(
115
115
  const layerConfig$1 = (config) => Layer.unwrap(Config.unwrap(config).pipe(Effect.map(layer$1)));
116
116
  //#endregion
117
117
  //#region src/schemas/shared.ts
118
- const field = (fieldId, description) => Iceberg.field(fieldId, { description });
119
118
  /** Salesforce times, such as `2026-10-15T10:26:49.000+0000`. */
120
119
  const Timestamp = Schema.DateFromString;
121
- const version = (fieldId) => Schema.Date.pipe(field(fieldId, "Time the row was fetched from Salesforce."));
122
- const deleted = (fieldId) => Schema.optional(Schema.Boolean).pipe(field(fieldId, "Whether the record was deleted or merged into another record in Salesforce."));
123
- /** A string map column. Key and value IDs are separate from the column's field ID. */
124
- const stringMap = (keyId, valueId) => Schema.ReadonlyMap(Schema.String.annotate({ fieldId: keyId }), Schema.String.annotate({ fieldId: valueId }));
125
- /** A list column. The element ID is separate from the column's field ID. */
126
- const list = (elementId, item) => Schema.Array(item.annotate({ fieldId: elementId }));
120
+ const version = Schema.Date.pipe(Schema.annotateKey({ description: "Time the row was fetched from Salesforce." }));
121
+ const deleted = Schema.optional(Schema.Boolean).pipe(Schema.annotateKey({ description: "Whether the record was deleted or merged into another record in Salesforce." }));
127
122
  //#endregion
128
123
  //#region src/schemas/objects.ts
129
124
  const objectFields = {
130
- id: Schema.String.pipe(field(1, "Salesforce record ID, 18 characters.")),
131
- version: version(2),
132
- created_at: Schema.NullOr(Schema.Date).pipe(field(3, "`CreatedDate`. Null for objects without it.")),
133
- updated_at: Schema.NullOr(Schema.Date).pipe(field(4, "`SystemModstamp`. Null for objects without it. Cross-object formulas can change without it.")),
134
- fields: stringMap(101, 102).pipe(field(5, "Every non-null field the connector can read, by API name, as a string.")),
135
- _deleted: deleted(6)
125
+ id: Schema.String.pipe(Schema.annotateKey({ description: "Salesforce record ID, 18 characters." })),
126
+ version,
127
+ created_at: Schema.NullOr(Schema.Date).pipe(Schema.annotateKey({ description: "`CreatedDate`. Null for objects without it." })),
128
+ updated_at: Schema.NullOr(Schema.Date).pipe(Schema.annotateKey({ description: "`SystemModstamp`. Null for objects without it. Cross-object formulas can change without it." })),
129
+ fields: Schema.ReadonlyMap(Schema.String, Schema.String).pipe(Schema.annotateKey({ description: "Every non-null field the connector can read, by API name, as a string." })),
130
+ _deleted: deleted
136
131
  };
137
132
  const objectSchema = (object) => Schema.Struct(objectFields).annotate({ description: `Salesforce ${object} records.` }).pipe(Iceberg.identifier("id"));
138
133
  const CustomObjectSchema = Schema.Struct({
139
134
  ...objectFields,
140
- object: Schema.String.pipe(field(7, "API name of the custom object, such as `Invoice__c`."))
135
+ object: Schema.String.pipe(Schema.annotateKey({ description: "API name of the custom object, such as `Invoice__c`." }))
141
136
  }).annotate({ description: "Records of every Salesforce custom object." }).pipe(Iceberg.identifier("id"));
142
137
  //#endregion
143
138
  //#region src/schemas/api.ts
@@ -584,25 +579,25 @@ const makeDescriber = (client) => Effect.gen(function* () {
584
579
  //#endregion
585
580
  //#region src/schemas/object-fields.ts
586
581
  const PicklistValueSchema = Schema.Struct({
587
- value: Schema.String.pipe(field(103, "API value stored on records.")),
588
- label: Schema.NullOr(Schema.String).pipe(field(104, "Label shown in Salesforce.")),
589
- active: Schema.Boolean.pipe(field(105, "Whether the value can still be picked."))
582
+ value: Schema.String.pipe(Schema.annotateKey({ description: "API value stored on records." })),
583
+ label: Schema.NullOr(Schema.String).pipe(Schema.annotateKey({ description: "Label shown in Salesforce." })),
584
+ active: Schema.Boolean.pipe(Schema.annotateKey({ description: "Whether the value can still be picked." }))
590
585
  });
591
586
  const ObjectFieldSchema = Schema.Struct({
592
- id: Schema.String.pipe(field(1, "`<object>.<field>`, such as `Account.Industry`.")),
593
- version: version(2),
594
- object: Schema.String.pipe(field(3, "API name of the object.")),
595
- name: Schema.String.pipe(field(4, "API name of the field, the key in `fields`.")),
596
- label: Schema.String.pipe(field(5, "Label shown in Salesforce.")),
597
- type: Schema.String.pipe(field(6, "Salesforce field type, such as `picklist` or `currency`.")),
598
- custom: Schema.Boolean.pipe(field(7, "Whether the field is a custom field.")),
599
- calculated: Schema.Boolean.pipe(field(8, "Whether the field is a formula or roll-up.")),
600
- nillable: Schema.Boolean.pipe(field(9, "Whether the field can be empty.")),
601
- length: Schema.BigInt.pipe(field(10, "Maximum length of text fields.")),
602
- precision: Schema.BigInt.pipe(field(11, "Total digits of number fields.")),
603
- scale: Schema.BigInt.pipe(field(12, "Digits after the decimal point of number fields.")),
604
- reference_to: list(101, Schema.String).pipe(field(13, "Objects a lookup field can point to.")),
605
- picklist_values: list(102, PicklistValueSchema).pipe(field(14, "Values of picklist fields, active and inactive."))
587
+ id: Schema.String.pipe(Schema.annotateKey({ description: "`<object>.<field>`, such as `Account.Industry`." })),
588
+ version,
589
+ object: Schema.String.pipe(Schema.annotateKey({ description: "API name of the object." })),
590
+ name: Schema.String.pipe(Schema.annotateKey({ description: "API name of the field, the key in `fields`." })),
591
+ label: Schema.String.pipe(Schema.annotateKey({ description: "Label shown in Salesforce." })),
592
+ type: Schema.String.pipe(Schema.annotateKey({ description: "Salesforce field type, such as `picklist` or `currency`." })),
593
+ custom: Schema.Boolean.pipe(Schema.annotateKey({ description: "Whether the field is a custom field." })),
594
+ calculated: Schema.Boolean.pipe(Schema.annotateKey({ description: "Whether the field is a formula or roll-up." })),
595
+ nillable: Schema.Boolean.pipe(Schema.annotateKey({ description: "Whether the field can be empty." })),
596
+ length: Schema.BigInt.pipe(Schema.annotateKey({ description: "Maximum length of text fields." })),
597
+ precision: Schema.BigInt.pipe(Schema.annotateKey({ description: "Total digits of number fields." })),
598
+ scale: Schema.BigInt.pipe(Schema.annotateKey({ description: "Digits after the decimal point of number fields." })),
599
+ reference_to: Schema.Array(Schema.String).pipe(Schema.annotateKey({ description: "Objects a lookup field can point to." })),
600
+ picklist_values: Schema.Array(PicklistValueSchema).pipe(Schema.annotateKey({ description: "Values of picklist fields, active and inactive." }))
606
601
  }).annotate({ description: "Field definitions of every synced object, to name the keys and values in `fields`." }).pipe(Iceberg.identifier("id"));
607
602
  //#endregion
608
603
  //#region src/objects/object-fields.ts
@@ -686,4 +681,4 @@ const layerConfig = (config) => Layer.unwrap(Config.unwrap(config).pipe(Effect.m
686
681
  //#endregion
687
682
  export { CustomObjectSchema as a, ObjectFieldSchema as i, connector_exports as n, objectSchema as o, layerConfig as r, client_exports as s, SalesforceConnector as t };
688
683
 
689
- //# sourceMappingURL=src-C7uqtDzN.mjs.map
684
+ //# sourceMappingURL=src-D7c3ea3B.mjs.map