Skip to content

Conversation

@jcortes
Copy link
Collaborator

@jcortes jcortes commented Nov 5, 2025

WHY

Resolves #18724

Summary by CodeRabbit

  • New Features
    • Added Create Application, Create Candidate, Create Interview Schedule, Create Offer, and List Applications actions for Ashby.
    • UI fields now load live Ashby options (candidates, applications, jobs, plans, stages, sources, users) and accept richer structured inputs.
  • Chores
    • Added a JSON parsing utility for flexible input handling and bumped the Ashby component version.

@jcortes jcortes self-assigned this Nov 5, 2025
@vercel
Copy link

vercel bot commented Nov 5, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
pipedream-docs Ignored Ignored Nov 5, 2025 11:11pm
pipedream-docs-redirect-do-not-edit Ignored Ignored Nov 5, 2025 11:11pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 5, 2025

Walkthrough

Adds a new Ashby component: multiple action modules for create/list operations, an app module implementing HTTP, auth, pagination and API wrappers, a parseJson utility, and package version/dependency updates.

Changes

Cohort / File(s) Summary
Action modules
components/ashby/actions/create-application/create-application.mjs, components/ashby/actions/create-candidate/create-candidate.mjs, components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs, components/ashby/actions/create-offer/create-offer.mjs, components/ashby/actions/list-applications/list-applications.mjs
Five new action modules. Each exports an action object (metadata, props) and an async run({ $ }) that collects props, calls corresponding app.* wrapper (using utils.parseJson where appropriate), exports a summary via $.export("$summary", ...), and returns the API response.
App module
components/ashby/ashby.app.mjs
New/expanded app module adding propDefinitions with async options() for several ID/lookups, auth/header helpers (getAuth, getHeaders), a centralized request layer (makeRequest, post), a paginate utility, and multiple API wrapper methods (createCandidate, createApplication, createOffer, createInterviewSchedule, listApplications, listCandidates, listJobs, listInterviewPlans, listInterviewStages, listSources, listUsers).
Utilities
components/ashby/common/utils.mjs
New parseJson(input, maxDepth = 100) utility that recursively parses JSON-like strings into objects/arrays with cycle protection via WeakSet; exported as default { parseJson }.
Package configuration
components/ashby/package.json
Version bumped from 0.0.1 to 0.1.0 and dependencies added: @pipedream/platform: ^3.1.0.

Sequence Diagram(s)

sequenceDiagram
    participant User as Workflow/User
    participant Action as Action Module
    participant App as App Module
    participant API as Ashby API

    User->>Action: run({ $ })
    Action->>Action: read props from this
    Action->>App: call app.createCandidate/createApplication/createOffer/createInterviewSchedule(...)
    App->>App: getAuth() / getHeaders()
    App->>App: makeRequest / post (build request)
    App->>API: HTTP request
    API-->>App: response
    App-->>Action: return response
    Action->>Action: $.export("$summary", "...")
    Action-->>User: return response
Loading
sequenceDiagram
    participant User as Workflow/User
    participant ListAction as List Applications Action
    participant App as App Module
    participant Paginate as Paginate Utility
    participant API as Ashby API

    User->>ListAction: run({ $ })
    ListAction->>App: app.paginate({ fn: app.listApplications, fnArgs, max, keyField })
    loop pages
        Paginate->>App: app.listApplications(fnArgs)
        App->>API: HTTP POST with syncToken
        API-->>App: { results: [...], nextCursor? }
        App-->>Paginate: page
        Paginate->>Paginate: accumulate results
        alt nextCursor exists and under max
            Paginate->>Paginate: update fnArgs.syncToken
        else
            Paginate->>Paginate: stop
        end
    end
    Paginate-->>ListAction: aggregated items
    ListAction->>ListAction: $.export("$summary", count)
    ListAction-->>User: return aggregated items
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Pay special attention to components/ashby/ashby.app.mjs for auth/header correctness, axios/request error handling, and response normalization.
  • Review paginate cursor handling and each async options() implementation for consistent pagination and mapping.
  • Validate components/ashby/common/utils.mjs::parseJson for recursion depth, cycle protection, and edge-case parsing.
  • Check each action's run for correct prop extraction, conditional prop dependencies (e.g., interviewStageId dependence), and correct use of utils.parseJson where arrays/JSON strings are allowed.

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Description check ❓ Inconclusive The pull request description only contains a reference to the resolved issue (#18724) but does not follow the required template structure with a WHY section explaining the reasoning beyond issue resolution. Expand the description to explain why these changes are needed and what problem they solve, beyond just referencing the issue number.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: adding new Ashby components. It is concise, specific, and directly related to the changeset which introduces multiple new action modules and supporting infrastructure for Ashby integration.
Linked Issues check ✅ Passed The pull request successfully implements standard actions for managing candidates, jobs, applications, and interviews as requested in issue #18724. It includes actions for creating candidates, applications, interview schedules, offers, and listing applications, candidates, jobs, interview plans, stages, and sources.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing Ashby integration. The new action modules, app configuration, utility functions, and dependency updates are all in scope for the stated objective of adding Ashby support with standard actions for managing candidates, jobs, applications, and interviews.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ashby-new-components

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1ef0fae and a540a35.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • components/ashby/actions/create-application/create-application.mjs (1 hunks)
  • components/ashby/actions/create-candidate/create-candidate.mjs (1 hunks)
  • components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1 hunks)
  • components/ashby/actions/create-offer/create-offer.mjs (1 hunks)
  • components/ashby/actions/list-applications/list-applications.mjs (1 hunks)
  • components/ashby/ashby.app.mjs (1 hunks)
  • components/ashby/common/utils.mjs (1 hunks)
  • components/ashby/package.json (2 hunks)
🧰 Additional context used
🧠 Learnings (6)
📚 Learning: 2024-12-12T19:23:09.039Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like `fs` to `package.json` dependencies, as they are native modules provided by the Node.js runtime.

Applied to files:

  • components/ashby/package.json
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".

Applied to files:

  • components/ashby/actions/create-application/create-application.mjs
  • components/ashby/actions/create-candidate/create-candidate.mjs
  • components/ashby/actions/create-offer/create-offer.mjs
📚 Learning: 2025-07-09T18:07:12.426Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 17538
File: components/aircall/sources/new-sms/new-sms.mjs:19-25
Timestamp: 2025-07-09T18:07:12.426Z
Learning: In Aircall API webhook payloads, the `created_at` field is returned as an ISO 8601 string format (e.g., "2020-02-18T20:52:22.000Z"), not as milliseconds since epoch. For Pipedream components, this needs to be converted to milliseconds using `Date.parse()` before assigning to the `ts` field in `generateMeta()`.

Applied to files:

  • components/ashby/actions/create-application/create-application.mjs
📚 Learning: 2025-06-04T17:52:05.780Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 16954
File: components/salesloft/salesloft.app.mjs:14-23
Timestamp: 2025-06-04T17:52:05.780Z
Learning: In the Salesloft API integration (components/salesloft/salesloft.app.mjs), the _makeRequest method returns response.data which directly contains arrays for list endpoints like listPeople, listCadences, listUsers, and listAccounts. The propDefinitions correctly call .map() directly on these responses without needing to destructure a nested data property.

Applied to files:

  • components/ashby/ashby.app.mjs
📚 Learning: 2024-09-25T16:13:11.505Z
Learnt from: LucBerge
Repo: PipedreamHQ/pipedream PR: 14080
File: components/nocodb/nocodb.app.mjs:133-133
Timestamp: 2024-09-25T16:13:11.505Z
Learning: When implementing pagination with an offset, incrementing `args.params.offset` within the loop ensures correct tracking of the offset, particularly when a maximum count limit (`max`) is used.

Applied to files:

  • components/ashby/ashby.app.mjs
📚 Learning: 2025-09-15T22:01:11.472Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18362
File: components/leonardo_ai/actions/generate-image/generate-image.mjs:103-105
Timestamp: 2025-09-15T22:01:11.472Z
Learning: In Pipedream components, pipedream/platform's axios implementation automatically excludes undefined values from HTTP requests, so there's no need to manually check for truthiness before including properties in request payloads.

Applied to files:

  • components/ashby/ashby.app.mjs
🧬 Code graph analysis (7)
components/ashby/common/utils.mjs (1)
components/google_cloud/sources/bigquery-query-results/bigquery-query-results.mjs (1)
  • key (48-48)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (2)
components/ashby/actions/create-offer/create-offer.mjs (1)
  • response (54-63)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/list-applications/list-applications.mjs (2)
components/ashby/actions/create-application/create-application.mjs (1)
  • response (82-93)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/create-application/create-application.mjs (2)
components/ashby/actions/list-applications/list-applications.mjs (1)
  • response (75-91)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/create-candidate/create-candidate.mjs (1)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/create-offer/create-offer.mjs (3)
components/ashby/actions/create-application/create-application.mjs (1)
  • response (82-93)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1)
  • response (59-65)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/ashby.app.mjs (5)
components/ashby/actions/create-application/create-application.mjs (1)
  • response (82-93)
components/ashby/actions/create-candidate/create-candidate.mjs (1)
  • response (112-135)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1)
  • response (59-65)
components/ashby/actions/create-offer/create-offer.mjs (1)
  • response (54-63)
components/ashby/actions/list-applications/list-applications.mjs (1)
  • response (75-91)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Lint Code Base
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components

Comment @coderabbitai help to get the list of available commands and usage tips.

@jcortes jcortes force-pushed the ashby-new-components branch from 260b59e to 1ef0fae Compare November 5, 2025 23:00
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a2331fe and 1ef0fae.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • components/ashby/actions/create-application/create-application.mjs (1 hunks)
  • components/ashby/actions/create-candidate/create-candidate.mjs (1 hunks)
  • components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1 hunks)
  • components/ashby/actions/create-offer/create-offer.mjs (1 hunks)
  • components/ashby/actions/list-applications/list-applications.mjs (1 hunks)
  • components/ashby/ashby.app.mjs (1 hunks)
  • components/ashby/common/utils.mjs (1 hunks)
  • components/ashby/package.json (2 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2024-12-12T19:23:09.039Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like `fs` to `package.json` dependencies, as they are native modules provided by the Node.js runtime.

Applied to files:

  • components/ashby/package.json
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".

Applied to files:

  • components/ashby/actions/create-offer/create-offer.mjs
  • components/ashby/actions/create-candidate/create-candidate.mjs
  • components/ashby/actions/create-application/create-application.mjs
📚 Learning: 2025-06-04T17:52:05.780Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 16954
File: components/salesloft/salesloft.app.mjs:14-23
Timestamp: 2025-06-04T17:52:05.780Z
Learning: In the Salesloft API integration (components/salesloft/salesloft.app.mjs), the _makeRequest method returns response.data which directly contains arrays for list endpoints like listPeople, listCadences, listUsers, and listAccounts. The propDefinitions correctly call .map() directly on these responses without needing to destructure a nested data property.

Applied to files:

  • components/ashby/ashby.app.mjs
📚 Learning: 2025-09-15T22:01:11.472Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18362
File: components/leonardo_ai/actions/generate-image/generate-image.mjs:103-105
Timestamp: 2025-09-15T22:01:11.472Z
Learning: In Pipedream components, pipedream/platform's axios implementation automatically excludes undefined values from HTTP requests, so there's no need to manually check for truthiness before including properties in request payloads.

Applied to files:

  • components/ashby/ashby.app.mjs
🧬 Code graph analysis (6)
components/ashby/actions/create-offer/create-offer.mjs (2)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1)
  • response (59-65)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/ashby.app.mjs (5)
components/ashby/actions/create-application/create-application.mjs (1)
  • response (82-93)
components/ashby/actions/create-candidate/create-candidate.mjs (1)
  • response (112-135)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1)
  • response (59-65)
components/ashby/actions/create-offer/create-offer.mjs (1)
  • response (53-62)
components/ashby/actions/list-applications/list-applications.mjs (1)
  • response (75-91)
components/ashby/actions/create-candidate/create-candidate.mjs (2)
components/ashby/actions/create-application/create-application.mjs (1)
  • response (82-93)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/list-applications/list-applications.mjs (1)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/create-application/create-application.mjs (5)
components/ashby/actions/create-candidate/create-candidate.mjs (1)
  • response (112-135)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (1)
  • response (59-65)
components/ashby/actions/create-offer/create-offer.mjs (1)
  • response (53-62)
components/ashby/actions/list-applications/list-applications.mjs (1)
  • response (75-91)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
components/ashby/actions/create-interview-schedule/create-interview-schedule.mjs (2)
components/ashby/actions/create-offer/create-offer.mjs (1)
  • response (53-62)
components/ashby/ashby.app.mjs (2)
  • response (247-252)
  • response (345-352)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Lint Code Base
🔇 Additional comments (1)
components/ashby/actions/create-candidate/create-candidate.mjs (1)

124-133: Consider filtering undefined location fields.

The current logic includes all location fields (city, region, country) if any one is truthy, resulting in undefined values for unset fields. While the API may ignore these, it's cleaner to only include defined fields.

Apply this diff for cleaner object construction:

-      ...(city || region || country
-        ? {
-          location: {
-            city,
-            region,
-            country,
-          },
-        }
-        : undefined
-      ),
+      ...(city || region || country
+        ? {
+          location: Object.fromEntries(
+            Object.entries({ city, region, country })
+              .filter(([_, v]) => v !== undefined)
+          ),
+        }
+        : {}
+      ),
⛔ Skipped due to learnings
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18362
File: components/leonardo_ai/actions/generate-image/generate-image.mjs:103-105
Timestamp: 2025-09-15T22:01:11.472Z
Learning: In Pipedream components, pipedream/platform's axios implementation automatically excludes undefined values from HTTP requests, so there's no need to manually check for truthiness before including properties in request payloads.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ashby

2 participants