Skip to content

Conversation

@luancazarine
Copy link
Collaborator

@luancazarine luancazarine commented Nov 24, 2025

Resolves #13409

Summary by CodeRabbit

  • New Features

    • Intelliprint integration: create print jobs with many configurable options (splitting, double‑sided, postage, envelope types, metadata, backgrounds, nudges, etc.).
    • Added standard option sets and input utilities to simplify configuration and parsing.
  • Documentation

    • Removed the Overview and Example Use Cases sections from the Intelliprint README.
  • Chores

    • Bumped package version to 0.1.0 and updated dependencies.

✏️ Tip: You can customize this high-level summary in your review settings.

- Added methods for API interaction in intelliprint.app.mjs, including authentication and request handling.
- Introduced create-a-print-job action with detailed properties for job configuration.
- Updated package version to 0.1.0 and added dependency on @pipedream/platform.
- Removed outdated README.md file and added utility function for camelCase to snake_case conversion.
@luancazarine luancazarine linked an issue Nov 24, 2025 that may be closed by this pull request
@vercel
Copy link

vercel bot commented Nov 24, 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 Dec 8, 2025 6:01pm
pipedream-docs-redirect-do-not-edit Ignored Ignored Dec 8, 2025 6:01pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 24, 2025

Walkthrough

Adds an Intelliprint create-print-job action, supporting app request helpers, option constants, and utilities (camelCase→snake_case, parseObject); removes README content and updates package version and dependencies.

Changes

Cohort / File(s) Summary
Documentation
components/intelliprint/README.md
Removed the "Overview" and "Example Use Cases" documentation content.
New Action
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
Added an action that reads a file via getFileStreamAndMetadata, builds multipart/form-data (converting camelCase props to snake_case and parsing fields), calls intelliprint.createPrintJob, returns the API response, and exports a summary; API errors are converted to ConfigurationError.
App Integration
components/intelliprint/intelliprint.app.mjs
Replaced authKeys() with helper methods: _apiUrl(), _getAuth(), _makeRequest() and added createPrintJob(args = {}) which POSTs to /prints using basic auth via the helper layer.
Utilities
components/intelliprint/common/utils.mjs
Added parseObject(obj) (parses arrays/strings with JSON fallback) and camelCaseToSnakeCase(str) (safe camelCase→snake_case conversion).
Constants
components/intelliprint/common/constants.mjs
Added option arrays: SPLITTING_METHOD_OPTIONS, DOUBLE_SIDED_OPTIONS, POSTAGE_SERVICE_OPTIONS, IDEAL_ENVELOPE_OPTIONS.
Metadata / deps
components/intelliprint/package.json
Bumped version to 0.1.0 and added dependency @pipedream/platform@^3.1.1.

Sequence Diagram(s)

sequenceDiagram
    participant Action as Create Print Job Action
    participant Utils as common/utils
    participant App as intelliprint.app
    participant API as Intelliprint API

    Action->>Action: getFileStreamAndMetadata(filePath)
    Action->>Action: build FormData, append file stream
    loop per prop
        Action->>Utils: camelCaseToSnakeCase(propName)
        Utils-->>Action: snake_case name
        Action->>Utils: parseObject(value) when needed
        Utils-->>Action: parsed value
        Action->>Action: append field to FormData
    end
    Action->>App: createPrintJob(FormData, headers)
    App->>App: _apiUrl() and _getAuth() prepare request
    App->>API: POST /prints (FormData + auth)
    alt Success
        API-->>App: 200 OK (response)
        App-->>Action: return response
    else Error
        API-->>App: error response
        App-->>Action: propagate as ConfigurationError
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Focus areas:
    • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs: prop schema, file stream handling, FormData encoding, snake_case conversion, error wrapping.
    • components/intelliprint/intelliprint.app.mjs: request helper correctness, auth construction, axios usage and error propagation.
    • components/intelliprint/common/utils.mjs: JSON parse fallbacks and regex edge cases for camelCase conversion.
    • components/intelliprint/common/constants.mjs: verify option values.

Pre-merge checks and finishing touches

❌ Failed checks (3 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning The description is minimal and provides only the issue reference without explaining the changes, context, or implementation details. Complete the description by filling in the 'WHY' section to explain the purpose, scope, and key changes made in this pull request.
Linked Issues check ⚠️ Warning The PR implements a create-print-job action but does not implement the required send-letter action specified in issue #13409. Implement the send-letter action as specified in #13409 with required 'content' and 'address' props, and optional 'subject' prop.
Out of Scope Changes check ⚠️ Warning The PR includes infrastructure changes (constants, utilities) and a create-print-job action that are beyond the send-letter action scope defined in #13409. Review and clarify whether the out-of-scope changes are intentional infrastructure for future actions, or focus on implementing only the required send-letter action.
Title check ❓ Inconclusive The title is vague and generic, using only an issue number without describing the actual changes made to the codebase. Rename the title to clearly describe the main change, such as 'Add intelliprint component with create-print-job action' or similar.
✅ Passed checks (1 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ 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 13409-components-intelliprint

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

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 6845b85 and 70da9d0.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (5)
  • components/intelliprint/README.md (0 hunks)
  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1 hunks)
  • components/intelliprint/common/utils.mjs (1 hunks)
  • components/intelliprint/intelliprint.app.mjs (1 hunks)
  • components/intelliprint/package.json (2 hunks)
💤 Files with no reviewable changes (1)
  • components/intelliprint/README.md
🧰 Additional context used
🧠 Learnings (2)
📚 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/intelliprint/package.json
📚 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/intelliprint/intelliprint.app.mjs
🧬 Code graph analysis (2)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1)
components/intelliprint/common/utils.mjs (2)
  • camelCaseToSnakeCase (1-3)
  • camelCaseToSnakeCase (1-3)
components/intelliprint/intelliprint.app.mjs (1)
components/gmail/gmail.app.mjs (1)
  • axios (415-423)
⏰ 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). (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Lint Code Base
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
🔇 Additional comments (3)
components/intelliprint/package.json (1)

3-3: LGTM! Dependency and version bump are appropriate.

The version bump to 0.1.0 and addition of @pipedream/platform dependency align with the new action functionality introduced in this PR.

Also applies to: 15-16

components/intelliprint/intelliprint.app.mjs (1)

8-32: LGTM! API wrapper implementation is clean and correct.

The authentication setup using basic auth with the API key as username and empty password is appropriate. The request abstraction with _makeRequest provides a good foundation for additional API methods.

components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1)

10-178: Review comment appears to be based on incorrect PR objectives.

The commit message for this implementation states: "Implement Intelliprint API integration with new create print job action" — not a "send-letter" action. The directory structure confirms only a create-a-print-job action exists in this PR, and the implemented properties (postage service, envelope size, mail date, backgrounds, double-sided options) align with print job creation for a mail-printing service, not letter composition.

The review comment references PR objectives from issue #13409 calling for a "send-letter" action with content, address, and subject props, but this does not match the actual PR scope or implementation. The filePath prop (referencing a document to print) serves the analogous purpose to content, and the action supports postage/delivery configuration rather than recipient address in the traditional sense, as Intelliprint handles the physical delivery.

Likely an incorrect or invalid review comment.

Copy link
Collaborator

@lcaresia lcaresia left a comment

Choose a reason for hiding this comment

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

Just some few changes.

- Introduced a new constants file to define options for splitting methods, double-sided printing, postage services, and ideal envelope sizes.
- Updated the create-a-print-job action to utilize these constants for improved maintainability and clarity.
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: 2

♻️ Duplicate comments (4)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (4)

1-1: Remove the unnecessary eslint-disable comment.

All imports are used: ConfigurationError (line 200), getFileStreamAndMetadata (line 176), FormData (line 178), constants (lines 56, 75, 94, 101), camelCaseToSnakeCase (line 188), and intelliprint (line 191).


158-163: Remove unused required prop syncDir.

The syncDir prop is marked as required but is never used in the run method. It's destructured at line 170 but serves no purpose since the action uses getFileStreamAndMetadata with the filePath string prop.

Apply this diff to remove the unused prop:

     metadata: {
       type: "object",
       label: "Metadata",
       description: "A key-value object for storing any information you want to along with this Print Job.",
       optional: true,
     },
-    syncDir: {
-      type: "dir",
-      accessMode: "read",
-      sync: true,
-      optional: false,
-    },

And remove it from the destructuring:

     const {
       intelliprint,
       filePath,
-      syncDir,
       ...data
     } = this;

184-189: Critical: String conversion breaks object and boolean values.

Converting all values to strings with template literals will corrupt the metadata object (becomes "[object Object]") and misrepresent booleans as strings. The API likely expects proper JSON for objects and correct types for booleans.

Apply this diff to handle different value types correctly:

      for (const [
        key,
        value,
      ] of Object.entries(data)) {
-        formData.append(camelCaseToSnakeCase(key), `${value}`);
+        if (value !== undefined && value !== null) {
+          const fieldValue = typeof value === "object" ? JSON.stringify(value) : value;
+          formData.append(camelCaseToSnakeCase(key), fieldValue);
+        }
      }

199-201: Unsafe error property access could cause runtime error.

Line 200 assumes error.response.data.error.message exists. If any part of this chain is undefined, it will throw a TypeError instead of the intended ConfigurationError.

Apply this diff to safely access the error message:

     } catch (error) {
-      throw new ConfigurationError(`Error creating print job: ${error.response.data.error.message}`);
+      const errorMessage = error?.response?.data?.error?.message || error?.message || "Unknown error";
+      throw new ConfigurationError(`Error creating print job: ${errorMessage}`);
     }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 70da9d0 and c7a8420.

📒 Files selected for processing (2)
  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1 hunks)
  • components/intelliprint/common/constants.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-01-29T22:59:38.825Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 15436
File: components/printful/printful.app.mjs:55-63
Timestamp: 2025-01-29T22:59:38.825Z
Learning: Console.log statements should be removed before merging PRs to maintain code quality and prevent potential security risks from exposing sensitive information in logs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:07:48.193Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/zerobounce/actions/get-validation-results-file/get-validation-results-file.mjs:23-27
Timestamp: 2025-07-01T17:07:48.193Z
Learning: For "dir" props in Pipedream components, whether to mark them as optional depends on the action's file I/O behavior - if an action always writes files as output, the "dir" prop should not be marked as optional.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:01:46.327Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/tinypng/actions/compress-image/compress-image.mjs:18-23
Timestamp: 2025-07-01T17:01:46.327Z
Learning: In TinyPNG compress-image action (components/tinypng/actions/compress-image/compress-image.mjs), the syncDir property uses accessMode: "read" because this action only reads input files and returns API responses without writing files to /tmp, unlike other TinyPNG actions that save processed files to disk.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
🧬 Code graph analysis (1)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (2)
components/intelliprint/common/constants.mjs (8)
  • SPLITTING_METHOD_OPTIONS (1-5)
  • SPLITTING_METHOD_OPTIONS (1-5)
  • DOUBLE_SIDED_OPTIONS (7-11)
  • DOUBLE_SIDED_OPTIONS (7-11)
  • POSTAGE_SERVICE_OPTIONS (13-20)
  • POSTAGE_SERVICE_OPTIONS (13-20)
  • IDEAL_ENVELOPE_OPTIONS (22-27)
  • IDEAL_ENVELOPE_OPTIONS (22-27)
components/intelliprint/common/utils.mjs (2)
  • camelCaseToSnakeCase (1-3)
  • camelCaseToSnakeCase (1-3)
⏰ 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). (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Lint Code Base
🔇 Additional comments (2)
components/intelliprint/common/constants.mjs (1)

1-27: LGTM! Well-structured constants.

The constant arrays are properly defined and use consistent snake_case naming that aligns with the API expectations. These will provide good validation options for the action props.

components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1)

16-26: Verify alignment with PR objectives.

The PR objectives mention implementing a "send-letter" action with content, address, and subject props, but this implements "create-a-print-job" with filePath, no address prop, and reference instead of subject. While the implementation correctly follows the Intelliprint API documentation, please confirm this matches the intended requirements from issue #13409.

…int-job.mjs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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: 1

♻️ Duplicate comments (5)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (5)

1-6: Remove global no-unused-vars disable and fix the underlying unused symbol instead.

All imports are used, and the only unused symbol is syncDir (see lines 158-163 and 167-172). Keeping /* eslint-disable no-unused-vars */ at the top hides real issues going forward. Once you remove or use syncDir, this disable should be dropped.


78-83: Resolve type/description mismatch for doubleSidedSpecificPages.

The prop is typed as string but described as “The array of pages to print double sided” with an array example. This is ambiguous for users and also interacts poorly with the generic FormData serialization.

Consider either:

  • Keeping type: "string" and updating the description to explicitly say it expects a JSON-encoded string (e.g., "JSON-encoded array of page ranges, e.g. [[1,3],[6,7]]"), or
  • Changing the prop to an array / object type and ensuring it’s JSON.stringified in the payload.

158-163: Remove unused required syncDir prop and destructuring.

syncDir is defined as a required dir prop but is never used in the action (it’s only destructured on line 170). This:

  • Forces users to configure an irrelevant prop, and
  • Is the root cause for the no-unused-vars suppression at the top.

Since you’re only using getFileStreamAndMetadata(filePath) and not interacting with the directory directly, remove syncDir from props and from the destructuring.

Based on learnings, dir props should only be present (and required) when the action actually interacts with files in that directory.

Also applies to: 167-172


184-188: Fix FormData serialization: skip undefined and JSON-encode objects.

The current loop unconditionally appends all entries as template-string values:

for (const [key, value] of Object.entries(data)) {
  formData.append(camelCaseToSnakeCase(key), `${value}`);
}

Problems:

  • Optional props that are not set become "undefined" in the payload.
  • Objects like metadata are sent as "[object Object]" instead of JSON.
  • Potential future array/object props will be corrupted similarly.

Suggested fix:

-      for (const [
-        key,
-        value,
-      ] of Object.entries(data)) {
-        formData.append(camelCaseToSnakeCase(key), `${value}`);
-      }
+      for (const [key, value] of Object.entries(data)) {
+        if (value === undefined || value === null) continue;
+
+        const fieldName = camelCaseToSnakeCase(key);
+        const fieldValue = typeof value === "object"
+          ? JSON.stringify(value)
+          : String(value);
+
+        formData.append(fieldName, fieldValue);
+      }

This preserves booleans / numbers as strings while correctly encoding objects and omitting unset values.

#!/bin/bash
# Quick check: ensure no "undefined" values are appended to FormData
rg -n 'Object\\.entries\\(data\\)' -n components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs -n -C3

199-201: Harden error handling to avoid secondary TypeErrors.

error.response.data.error.message assumes every property in the chain exists. If any is missing, this throws a TypeError and masks the original API error.

Use safe access with fallbacks, e.g.:

-    } catch (error) {
-      throw new ConfigurationError(`Error creating print job: ${error.response.data.error.message}`);
-    }
+    } catch (error) {
+      const errorMessage =
+        error?.response?.data?.error?.message
+        || error?.response?.data?.message
+        || error?.message
+        || "Unknown error";
+
+      throw new ConfigurationError(`Error creating print job: ${errorMessage}`);
+    }
#!/bin/bash
# Grep for unsafe nested error access patterns for consistency
rg -n 'error\\.response\\.data\\.error\\.message' -C2
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7a8420 and 2426314.

📒 Files selected for processing (1)
  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-01-29T22:59:38.825Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 15436
File: components/printful/printful.app.mjs:55-63
Timestamp: 2025-01-29T22:59:38.825Z
Learning: Console.log statements should be removed before merging PRs to maintain code quality and prevent potential security risks from exposing sensitive information in logs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:07:48.193Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/zerobounce/actions/get-validation-results-file/get-validation-results-file.mjs:23-27
Timestamp: 2025-07-01T17:07:48.193Z
Learning: For "dir" props in Pipedream components, whether to mark them as optional depends on the action's file I/O behavior - if an action always writes files as output, the "dir" prop should not be marked as optional.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:01:46.327Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/tinypng/actions/compress-image/compress-image.mjs:18-23
Timestamp: 2025-07-01T17:01:46.327Z
Learning: In TinyPNG compress-image action (components/tinypng/actions/compress-image/compress-image.mjs), the syncDir property uses accessMode: "read" because this action only reads input files and returns API responses without writing files to /tmp, unlike other TinyPNG actions that save processed files to disk.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2024-10-08T16:42:59.225Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 14229
File: components/americommerce/actions/update-customer/update-customer.mjs:89-94
Timestamp: 2024-10-08T16:42:59.225Z
Learning: When defining boolean properties in AmeriCommerce components (e.g., in `update-customer.mjs`), ensure that the label and description are consistent and clearly indicate the intent, especially when using negations like "No Account", to avoid confusion.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
⏰ 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). (4)
  • GitHub Check: Lint Code Base
  • GitHub Check: pnpm publish
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Publish TypeScript components

Comment on lines +146 to +151
confirmationEmail: {
type: "string",
label: "Confirmation Email",
description: "Whether a confirmation email should be sent to the user or account's email address when this letter is confirmed.",
optional: true,
},
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# First, let's look at the full context of the file
cat -n components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs | head -160 | tail -30

Repository: PipedreamHQ/pipedream

Length of output: 1411


🏁 Script executed:

# Search for other confirmationEmail usage in the codebase
rg -i "confirmationemail" --type=mjs -C 3

Repository: PipedreamHQ/pipedream

Length of output: 92


🏁 Script executed:

# Look for the Intelliprint integration file to understand the app structure
fd -e mjs intelliprint

Repository: PipedreamHQ/pipedream

Length of output: 109


🌐 Web query:

Intelliprint API documentation create print job confirmation email field type

💡 Result:

The Print Job parameter confirmation_email is a boolean (true/false). [1]


Fix confirmationEmail type from string to boolean.

The Intelliprint API expects confirmation_email as a boolean (true/false) per the API documentation, but the property is currently typed as string. The description correctly describes boolean behavior ("Whether a confirmation email should be sent..."), so the type should match. Change type: "string" to type: "boolean" on line 147.

🤖 Prompt for AI Agents
In components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
around lines 146 to 151, the confirmationEmail property is incorrectly typed as
"string"; update the property definition to use type: "boolean" (keeping label,
description and optional: true intact) so it matches the Intelliprint API
expectation for confirmation_email being a true/false value.

lcaresia
lcaresia previously approved these changes Dec 1, 2025
Copy link
Collaborator

@lcaresia lcaresia left a comment

Choose a reason for hiding this comment

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

LGTM!

@vunguyenhung
Copy link
Collaborator

Hello everyone, I have tested this PR and there're some test cases failed or needed improvement.

Please check test reports below for more information:

- Added 'removeLettersSeries' and updated 'removeLettersWithPhrase' properties to the create-a-print-job action for improved letter management.
- Introduced 'parseObject' utility function to handle parsing of letter series input.
- Updated form data submission to include new properties for better API interaction.
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: 3

♻️ Duplicate comments (7)
components/intelliprint/common/utils.mjs (1)

26-28: Fix leading underscore and improve robustness in camelCaseToSnakeCase.

Inputs starting with a capital produce a leading underscore ("Foo""_foo"), which can break API field names.

You can strip a single leading underscore after replacement:

 export const camelCaseToSnakeCase = (str) => {
-  return str?.replace(/([A-Z])/g, "_$1").toLowerCase();
+  return str
+    ?.replace(/([A-Z])/g, "_$1")
+    .replace(/^_/, "")
+    .toLowerCase();
 };

This keeps the existing behavior for internal capitals while avoiding a leading _.

components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (6)

1-1: Remove unnecessary no-unused-vars eslint disable.

All imports are used, and after fixing the unused syncDir prop (see below), there should be no unused variables. Keeping a file‑wide no-unused-vars disable can hide real issues later; please remove it once the unused prop is cleaned up.


80-85: Align doubleSidedSpecificPages type/description with payload serialization.

doubleSidedSpecificPages is typed as string (Line 81) but described as an array (Line 83). In the payload (Line 209) you embed it directly inside a JSON-serialized object, so:

  • If users pass a JSON string (e.g. "[[1,3],[6,7]]"), the API sees a string instead of an array.
  • If they pass a non‑JSON string, JSON won’t match the documented example.

To avoid ambiguous behavior:

  1. Keep the prop as a string but document that it must be JSON, and
  2. Parse it before including it in the printing object:
     doubleSidedSpecificPages: {
       type: "string",
       label: "Double Sided Specific Pages",
-      description: "The array of pages to print double sided. Only used when **Double Sided** is set to `mixed`. Example: **[[1, 3], [6, 7]]**.",
+      description: "JSON-encoded array of pages to print double sided. Only used when **Double Sided** is set to `mixed`. Example: **[[1, 3], [6, 7]]**.",
       optional: true,
     },
@@
-      formData.append("printing", JSON.stringify({
-        double_sided: doubleSided,
-        double_sided_specific_pages: doubleSidedSpecificPages,
-        premium_quality: premiumQuality,
-      }));
+      formData.append("printing", JSON.stringify({
+        double_sided: doubleSided,
+        double_sided_specific_pages: parseObject(doubleSidedSpecificPages),
+        premium_quality: premiumQuality,
+      }));

This matches the documented example and ensures the API receives an actual array instead of a raw string.

Check the Intelliprint "create print job" API documentation to confirm the expected type/format of the `double_sided_specific_pages` parameter (array vs string, and JSON encoding requirements).

Also applies to: 207-211


154-159: Change confirmationEmail to boolean to match API semantics.

confirmationEmail is typed as string (Line 155) but its description and the Intelliprint API both imply a boolean flag ("Whether a confirmation email should be sent..."). In the payload builder (Lines 234–239) it’s appended with other props and ends up as a string, which is misleading at the component level.

Recommend:

     confirmationEmail: {
-      type: "string",
+      type: "boolean",
       label: "Confirmation Email",
       description: "Whether a confirmation email should be sent to the user or account's email address when this letter is confirmed.",
       optional: true,
     },

The FormData loop will then serialize true / false as strings, which is typical for boolean query/form parameters, while the component API exposes it correctly as a boolean.

Verify in the Intelliprint API documentation that `confirmation_email` on the create print job endpoint is a boolean field and note any specific expectations about its serialization in requests.

Also applies to: 234-239


166-171: Remove unused required syncDir prop.

syncDir is defined as a required dir prop (Lines 166–171) and destructured in run (Lines 176–179) but never used. This:

  • Forces users to configure an irrelevant directory.
  • Necessitated the no-unused-vars eslint disable.
  • Conflicts with established patterns where dir props are reserved for actions that write files.

Since this action only reads an input file (via filePath) and doesn’t write to /tmp, you can safely remove syncDir:

-    syncDir: {
-      type: "dir",
-      accessMode: "read",
-      sync: true,
-      optional: false,
-    },
@@
       const {
         intelliprint,
         filePath,
-        syncDir,
         splittingMethod,

Once removed, you can also drop the no-unused-vars eslint disable.

Also applies to: 176-179


160-165: Avoid blindly stringifying all remaining props (breaks objects like metadata).

The generic loop (Lines 234–239) appends every remaining prop as `${value}`. For objects (e.g., metadata, Line 160–165) this yields "[object Object]", and arrays would also be corrupted. Booleans and numbers become stringified without control.

Handle complex types explicitly and skip nullish values:

-      for (const [
-        key,
-        value,
-      ] of Object.entries(data)) {
-        formData.append(camelCaseToSnakeCase(key), `${value}`);
-      }
+      for (const [key, value] of Object.entries(data)) {
+        if (value === undefined || value === null) continue;
+
+        const fieldName = camelCaseToSnakeCase(key);
+        const fieldValue = typeof value === "object"
+          ? JSON.stringify(value)
+          : value;
+
+        formData.append(fieldName, fieldValue);
+      }

This preserves objects/arrays as JSON and keeps primitives as-is while avoiding accidental "undefined" / "null" strings.

Also applies to: 234-239


249-251: Harden error handling to avoid crashing on unexpected error shapes.

error.response.data.error.message assumes a fully populated error object. If any segment is missing, this will throw a new TypeError instead of surfacing the original API error.

Use optional chaining with sensible fallbacks:

-    } catch (error) {
-      throw new ConfigurationError(`Error creating print job: ${error.response.data.error.message}`);
-    }
+    } catch (error) {
+      const errorMessage =
+        error?.response?.data?.error?.message
+        || error?.message
+        || "Unknown error";
+
+      throw new ConfigurationError(`Error creating print job: ${errorMessage}`);
+    }

This ensures the action always throws a meaningful ConfigurationError without risking an additional runtime exception.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2426314 and 2132ccb.

📒 Files selected for processing (2)
  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1 hunks)
  • components/intelliprint/common/utils.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (7)
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-01-29T22:59:38.825Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 15436
File: components/printful/printful.app.mjs:55-63
Timestamp: 2025-01-29T22:59:38.825Z
Learning: Console.log statements should be removed before merging PRs to maintain code quality and prevent potential security risks from exposing sensitive information in logs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:07:48.193Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/zerobounce/actions/get-validation-results-file/get-validation-results-file.mjs:23-27
Timestamp: 2025-07-01T17:07:48.193Z
Learning: For "dir" props in Pipedream components, whether to mark them as optional depends on the action's file I/O behavior - if an action always writes files as output, the "dir" prop should not be marked as optional.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:01:46.327Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/tinypng/actions/compress-image/compress-image.mjs:18-23
Timestamp: 2025-07-01T17:01:46.327Z
Learning: In TinyPNG compress-image action (components/tinypng/actions/compress-image/compress-image.mjs), the syncDir property uses accessMode: "read" because this action only reads input files and returns API responses without writing files to /tmp, unlike other TinyPNG actions that save processed files to disk.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2024-10-08T16:42:59.225Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 14229
File: components/americommerce/actions/update-customer/update-customer.mjs:89-94
Timestamp: 2024-10-08T16:42:59.225Z
Learning: When defining boolean properties in AmeriCommerce components (e.g., in `update-customer.mjs`), ensure that the label and description are consistent and clearly indicate the intent, especially when using negations like "No Account", to avoid confusion.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-02-05T21:58:03.118Z
Learnt from: jverce
Repo: PipedreamHQ/pipedream PR: 15479
File: packages/connect-react/src/components/ComponentForm.tsx:23-24
Timestamp: 2025-02-05T21:58:03.118Z
Learning: In the connect-react package, the `enableDebugging` property should be of type `boolean` as it's used for toggling debugging features and conditional rendering.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-09-11T01:53:51.070Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18334
File: components/buddee/actions/list-employees/list-employees.mjs:147-155
Timestamp: 2025-09-11T01:53:51.070Z
Learning: In Buddee list-employees action, the "manager" prop should be a boolean type to filter employees who have direct reports, not an employeeId propDefinition which would send an employee ID instead of the expected boolean value.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
🧬 Code graph analysis (1)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (2)
components/intelliprint/common/constants.mjs (8)
  • SPLITTING_METHOD_OPTIONS (1-5)
  • SPLITTING_METHOD_OPTIONS (1-5)
  • DOUBLE_SIDED_OPTIONS (7-11)
  • DOUBLE_SIDED_OPTIONS (7-11)
  • POSTAGE_SERVICE_OPTIONS (13-20)
  • POSTAGE_SERVICE_OPTIONS (13-20)
  • IDEAL_ENVELOPE_OPTIONS (22-27)
  • IDEAL_ENVELOPE_OPTIONS (22-27)
components/intelliprint/common/utils.mjs (4)
  • parseObject (1-24)
  • parseObject (1-24)
  • camelCaseToSnakeCase (26-28)
  • camelCaseToSnakeCase (26-28)
⏰ 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). (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Lint Code Base
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Publish TypeScript components
🔇 Additional comments (1)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1)

173-248: Overall multipart payload construction looks solid (once field issues are fixed).

Aside from the specific field/type issues noted in other comments, the general structure here—using getFileStreamAndMetadata, attaching the file with metadata, grouping related settings into printing, splitting, postage, backgrounds, nudge, and remove_letters, and delegating to intelliprint.createPrintJob—is clear and consistent with typical Pipedream actions.

- Renamed 'removeLettersSeries' to 'nudgeX' with updated description for horizontal page adjustment.
- Changed 'firstPageBackground' and 'otherPagesBackground' to 'backgroundFirstPage' and 'backgroundOtherPages' for consistency.
- Updated form data handling to reflect new property names.
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: 1

♻️ Duplicate comments (6)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (6)

1-1: Remove the unnecessary eslint-disable comment.

All imports are used in the code, so the no-unused-vars disable is unnecessary.


80-85: Clarify the type and format for doubleSidedSpecificPages.

The prop is typed as string but the description says "array of pages" with example [[1, 3], [6, 7]]. This creates ambiguity. At line 209, it's passed directly to JSON.stringify, which will work if users provide a JSON string but expects users to know this format requirement.

Consider either:

  1. Keep type as string and update description to: "JSON-encoded array of page ranges (e.g., [[1, 3], [6, 7]])"
  2. Change type to object and ensure proper serialization

154-159: Fix confirmationEmail type to boolean.

The prop is typed as string but the description ("Whether a confirmation email should be sent...") describes boolean behavior. The Intelliprint API expects a boolean value for confirmation_email.

Apply this diff:

     confirmationEmail: {
-      type: "string",
+      type: "boolean",
       label: "Confirmation Email",
       description: "Whether a confirmation email should be sent to the user or account's email address when this letter is confirmed.",
       optional: true,
     },

166-171: Remove unused required syncDir prop.

The syncDir prop is marked as required (optional: false) but is destructured at line 178 and never used. Remove it entirely.


249-251: Add safe error property access.

The error handler assumes error.response.data.error.message exists. If any part of this chain is undefined, it will throw a TypeError instead of the intended ConfigurationError.

Apply this diff:

     } catch (error) {
-      throw new ConfigurationError(`Error creating print job: ${error.response.data.error.message}`);
+      const errorMessage = error?.response?.data?.error?.message || error?.message || "Unknown error";
+      throw new ConfigurationError(`Error creating print job: ${errorMessage}`);
     }

234-239: String conversion still breaks object and boolean values.

Despite a past review comment marked as "addressed in commit 2132ccb", line 238 still uses ${value} template literal, which converts all values to strings. This corrupts:

  • metadata object → "[object Object]"
  • Boolean props (confirmed, testmode, confidential) → string representations

Apply this diff to handle types correctly:

       for (const [
         key,
         value,
       ] of Object.entries(data)) {
-        formData.append(camelCaseToSnakeCase(key), `${value}`);
+        if (value !== undefined && value !== null) {
+          const fieldValue = typeof value === "object" ? JSON.stringify(value) : value;
+          formData.append(camelCaseToSnakeCase(key), fieldValue);
+        }
       }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2132ccb and d1060ad.

📒 Files selected for processing (1)
  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (8)
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-01-29T22:59:38.825Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 15436
File: components/printful/printful.app.mjs:55-63
Timestamp: 2025-01-29T22:59:38.825Z
Learning: Console.log statements should be removed before merging PRs to maintain code quality and prevent potential security risks from exposing sensitive information in logs.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:07:48.193Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/zerobounce/actions/get-validation-results-file/get-validation-results-file.mjs:23-27
Timestamp: 2025-07-01T17:07:48.193Z
Learning: For "dir" props in Pipedream components, whether to mark them as optional depends on the action's file I/O behavior - if an action always writes files as output, the "dir" prop should not be marked as optional.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-07-01T17:01:46.327Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/tinypng/actions/compress-image/compress-image.mjs:18-23
Timestamp: 2025-07-01T17:01:46.327Z
Learning: In TinyPNG compress-image action (components/tinypng/actions/compress-image/compress-image.mjs), the syncDir property uses accessMode: "read" because this action only reads input files and returns API responses without writing files to /tmp, unlike other TinyPNG actions that save processed files to disk.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2024-10-08T16:42:59.225Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 14229
File: components/americommerce/actions/update-customer/update-customer.mjs:89-94
Timestamp: 2024-10-08T16:42:59.225Z
Learning: When defining boolean properties in AmeriCommerce components (e.g., in `update-customer.mjs`), ensure that the label and description are consistent and clearly indicate the intent, especially when using negations like "No Account", to avoid confusion.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-02-05T21:58:03.118Z
Learnt from: jverce
Repo: PipedreamHQ/pipedream PR: 15479
File: packages/connect-react/src/components/ComponentForm.tsx:23-24
Timestamp: 2025-02-05T21:58:03.118Z
Learning: In the connect-react package, the `enableDebugging` property should be of type `boolean` as it's used for toggling debugging features and conditional rendering.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 Learning: 2025-09-11T01:53:51.070Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18334
File: components/buddee/actions/list-employees/list-employees.mjs:147-155
Timestamp: 2025-09-11T01:53:51.070Z
Learning: In Buddee list-employees action, the "manager" prop should be a boolean type to filter employees who have direct reports, not an employeeId propDefinition which would send an employee ID instead of the expected boolean value.

Applied to files:

  • components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
📚 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/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
🧬 Code graph analysis (1)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (2)
components/intelliprint/common/constants.mjs (8)
  • SPLITTING_METHOD_OPTIONS (1-5)
  • SPLITTING_METHOD_OPTIONS (1-5)
  • DOUBLE_SIDED_OPTIONS (7-11)
  • DOUBLE_SIDED_OPTIONS (7-11)
  • POSTAGE_SERVICE_OPTIONS (13-20)
  • POSTAGE_SERVICE_OPTIONS (13-20)
  • IDEAL_ENVELOPE_OPTIONS (22-27)
  • IDEAL_ENVELOPE_OPTIONS (22-27)
components/intelliprint/common/utils.mjs (4)
  • parseObject (1-24)
  • parseObject (1-24)
  • camelCaseToSnakeCase (26-28)
  • camelCaseToSnakeCase (26-28)
⏰ 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). (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
🔇 Additional comments (1)
components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs (1)

207-233: No changes needed – JSON.stringify already omits undefined properties.

Undefined values are not included in the JSON output. JavaScript's native JSON.stringify() automatically omits properties with undefined values, so nested objects like printing, splitting, and postage will only include defined properties in the resulting JSON string. No additional filtering is required.

Comment on lines +136 to +141
removeLettersSeries: {
type: "string",
label: "Remove Letters Series",
description: "An array of letters' indexes that have been removed.",
optional: true,
},
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Clarify the expected format for removeLettersSeries.

The prop is typed as string but the description says "array of letters' indexes". While parseObject (line 232) can handle both formats, the type/description mismatch creates ambiguity for users.

Update the description to clarify:

     removeLettersSeries: {
       type: "string",
       label: "Remove Letters Series",
-      description: "An array of letters' indexes that have been removed.",
+      description: "An array of letters' indexes that have been removed. Provide as JSON-encoded array (e.g., `[1, 3, 5]`).",
       optional: true,
     },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
removeLettersSeries: {
type: "string",
label: "Remove Letters Series",
description: "An array of letters' indexes that have been removed.",
optional: true,
},
removeLettersSeries: {
type: "string",
label: "Remove Letters Series",
description: "An array of letters' indexes that have been removed. Provide as JSON-encoded array (e.g., `[1, 3, 5]`).",
optional: true,
},
🤖 Prompt for AI Agents
In components/intelliprint/actions/create-a-print-job/create-a-print-job.mjs
around lines 136 to 141, the prop removeLettersSeries is declared as type
"string" but described as "an array", causing ambiguity; update the description
to clearly state the accepted string formats (e.g., a JSON-encoded array like
"[0,1,2]" or a comma-separated list "0,1,2") and note that parseObject will
convert either format into an array of letter indexes, and keep optional: true.

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.

[Components] intelliprint

4 participants