diff --git a/components/_3commas/_3commas.app.mjs b/components/_3commas/_3commas.app.mjs index bd5e5ead50704..61446b66a8355 100644 --- a/components/_3commas/_3commas.app.mjs +++ b/components/_3commas/_3commas.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/azure_storage/package.json b/components/azure_storage/package.json index 7f55f95f94bf6..bf7517a7d01fb 100644 --- a/components/azure_storage/package.json +++ b/components/azure_storage/package.json @@ -15,6 +15,6 @@ "dependencies": { "@pipedream/platform": "^3.2.5", "mime-types": "^2.1.35", - "fast-xml-parser": "^5.5.7" + "fast-xml-parser": "^5.7.0" } } diff --git a/components/beeper/beeper.app.mjs b/components/beeper/beeper.app.mjs index 8fbe1d5f4f864..49175fcd3120b 100644 --- a/components/beeper/beeper.app.mjs +++ b/components/beeper/beeper.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/bokun/bokun.app.mjs b/components/bokun/bokun.app.mjs index 830bea69cc161..d682c240d36c3 100644 --- a/components/bokun/bokun.app.mjs +++ b/components/bokun/bokun.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/element/element.app.mjs b/components/element/element.app.mjs index 979a2d1171a22..f3a75e6705f86 100644 --- a/components/element/element.app.mjs +++ b/components/element/element.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/email_on_acid/email_on_acid.app.mjs b/components/email_on_acid/email_on_acid.app.mjs index 6c592197b31f4..9310e399d7750 100644 --- a/components/email_on_acid/email_on_acid.app.mjs +++ b/components/email_on_acid/email_on_acid.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/event_tickets/event_tickets.app.mjs b/components/event_tickets/event_tickets.app.mjs index e6ef349900243..8f9a211ce9228 100644 --- a/components/event_tickets/event_tickets.app.mjs +++ b/components/event_tickets/event_tickets.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/filepost/README.md b/components/filepost/README.md new file mode 100644 index 0000000000000..3876255b0c209 --- /dev/null +++ b/components/filepost/README.md @@ -0,0 +1,11 @@ +# Overview + +The FilePost API lets you upload files and get back permanent, fast CDN URLs in seconds. With Pipedream, you can integrate FilePost into any workflow to automate file hosting — upload images, PDFs, videos, or any binary data, retrieve file metadata, list your stored files, or delete files programmatically. + +# Example Use Cases + +- **Automated Screenshot Archiving**: Capture screenshots of web pages using a headless browser step, then upload them to FilePost to get a permanent CDN URL. Store the URL in a database (Supabase, Airtable, Google Sheets) for easy retrieval and sharing. + +- **Email Attachment Hosting**: When a new email arrives with attachments in Gmail or Outlook, trigger a Pipedream workflow that uploads the attachments to FilePost and sends back a shareable CDN link via Slack or email. + +- **AI-Generated Image Pipeline**: Generate images with OpenAI's DALL-E or Stability AI, upload the resulting binary to FilePost, and store the permanent CDN URL in Notion or post it to a Discord channel — all in one automated workflow. diff --git a/components/filepost/actions/delete-file/delete-file.mjs b/components/filepost/actions/delete-file/delete-file.mjs new file mode 100644 index 0000000000000..0d193775d0a1d --- /dev/null +++ b/components/filepost/actions/delete-file/delete-file.mjs @@ -0,0 +1,31 @@ +import filepost from "../../filepost.app.mjs"; + +export default { + key: "filepost-delete-file", + name: "Delete File", + description: "Delete an uploaded file from FilePost by its ID. [See the documentation](https://filepost.dev/docs#delete-file)", + version: "0.0.1", + annotations: { + destructiveHint: true, + openWorldHint: true, + readOnlyHint: false, + }, + type: "action", + props: { + filepost, + fileId: { + propDefinition: [ + filepost, + "fileId", + ], + }, + }, + async run({ $ }) { + const response = await this.filepost.deleteFile({ + $, + fileId: this.fileId, + }); + $.export("$summary", `File ${this.fileId} deleted successfully.`); + return response; + }, +}; diff --git a/components/filepost/actions/get-file/get-file.mjs b/components/filepost/actions/get-file/get-file.mjs new file mode 100644 index 0000000000000..d9fb26cac97a0 --- /dev/null +++ b/components/filepost/actions/get-file/get-file.mjs @@ -0,0 +1,31 @@ +import filepost from "../../filepost.app.mjs"; + +export default { + key: "filepost-get-file", + name: "Get File", + description: "Retrieve details of a specific file by its ID. [See the documentation](https://filepost.dev/docs#get-file)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + type: "action", + props: { + filepost, + fileId: { + propDefinition: [ + filepost, + "fileId", + ], + }, + }, + async run({ $ }) { + const response = await this.filepost.getFile({ + $, + fileId: this.fileId, + }); + $.export("$summary", `Retrieved file: ${response.url}`); + return response; + }, +}; diff --git a/components/filepost/actions/list-files/list-files.mjs b/components/filepost/actions/list-files/list-files.mjs new file mode 100644 index 0000000000000..dd367213407f3 --- /dev/null +++ b/components/filepost/actions/list-files/list-files.mjs @@ -0,0 +1,42 @@ +import filepost from "../../filepost.app.mjs"; + +export default { + key: "filepost-list-files", + name: "List Files", + description: "Retrieve a list of files uploaded to your FilePost account. [See the documentation](https://filepost.dev/docs#list-files)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + type: "action", + props: { + filepost, + page: { + type: "integer", + label: "Page", + description: "Page number to retrieve.", + default: 1, + optional: true, + }, + perPage: { + type: "integer", + label: "Per Page", + description: "Number of results per page (max 100).", + default: 50, + optional: true, + }, + }, + async run({ $ }) { + const response = await this.filepost.listFiles({ + $, + params: { + page: this.page, + per_page: this.perPage, + }, + }); + $.export("$summary", `Retrieved ${response.files?.length ?? 0} file(s).`); + return response; + }, +}; diff --git a/components/filepost/actions/upload-file/upload-file.mjs b/components/filepost/actions/upload-file/upload-file.mjs new file mode 100644 index 0000000000000..0226dfe95ea0a --- /dev/null +++ b/components/filepost/actions/upload-file/upload-file.mjs @@ -0,0 +1,53 @@ +import filepost from "../../filepost.app.mjs"; +import { getFileStreamAndMetadata } from "@pipedream/platform"; +import FormData from "form-data"; + +export default { + key: "filepost-upload-file", + name: "Upload File", + description: "Upload a file from a path in `/tmp` or a public URL, and get back a permanent CDN URL. [See the documentation](https://filepost.dev/docs#upload)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + type: "action", + props: { + filepost, + filePathOrUrl: { + propDefinition: [ + filepost, + "filePath", + ], + }, + syncDir: { + type: "dir", + accessMode: "read", + sync: true, + optional: true, + }, + }, + async run({ $ }) { + const input = this.filePathOrUrl.trim(); + const form = new FormData(); + const { + stream, metadata, + } = await getFileStreamAndMetadata(input); + + form.append("file", stream, { + contentType: metadata.contentType, + knownLength: metadata.size, + filename: metadata.name, + }); + + const response = await this.filepost.uploadFile({ + $, + data: form, + headers: form.getHeaders(), + }); + + $.export("$summary", `File uploaded successfully. CDN URL: ${response.url}`); + return response; + }, +}; diff --git a/components/filepost/filepost.app.mjs b/components/filepost/filepost.app.mjs new file mode 100644 index 0000000000000..e353324d64864 --- /dev/null +++ b/components/filepost/filepost.app.mjs @@ -0,0 +1,82 @@ +import { axios } from "@pipedream/platform"; + +export default { + type: "app", + app: "filepost", + propDefinitions: { + fileId: { + type: "string", + label: "File ID", + description: "The unique ID of the uploaded file (the `file_id` field returned by the Upload File action). Obtain this from **List Files**", + async options({ page }) { + const { files } = await this.listFiles({ + params: { + page: page + 1, + }, + }); + return files?.map(({ + file_id: value, name: label, + }) => ({ + label, + value, + })) || []; + }, + }, + filePath: { + type: "string", + label: "File Path or URL", + description: "A file path in `/tmp` (e.g. `/tmp/image.png`) or a public URL to upload to FilePost CDN.", + format: "file-ref", + }, + }, + methods: { + _apiKey() { + return this.$auth.api_key; + }, + _baseUrl() { + return "https://filepost.dev/v1"; + }, + async _makeRequest({ + $ = this, headers, ...opts + }) { + return axios($, { + baseURL: this._baseUrl(), + headers: { + ...headers, + "X-API-Key": this._apiKey(), + }, + ...opts, + }); + }, + async uploadFile(opts = {}) { + return this._makeRequest({ + method: "POST", + url: "/upload", + ...opts, + }); + }, + async listFiles(opts = {}) { + return this._makeRequest({ + url: "/files", + ...opts, + }); + }, + async getFile({ + fileId, ...opts + }) { + return this._makeRequest({ + url: `/files/${fileId}`, + ...opts, + }); + }, + async deleteFile({ + fileId, ...opts + }) { + return this._makeRequest({ + method: "DELETE", + url: `/files/${fileId}`, + ...opts, + }); + }, + }, +}; diff --git a/components/filepost/package.json b/components/filepost/package.json new file mode 100644 index 0000000000000..05956e44c2182 --- /dev/null +++ b/components/filepost/package.json @@ -0,0 +1,19 @@ +{ + "name": "@pipedream/filepost", + "version": "0.1.0", + "description": "Pipedream FilePost Components", + "main": "filepost.app.mjs", + "keywords": [ + "pipedream", + "filepost" + ], + "homepage": "https://pipedream.com/apps/filepost", + "author": "Pipedream (https://www.pipedream.com/)", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@pipedream/platform": "^3.3.1", + "form-data": "^4.0.0" + } +} diff --git a/components/fitbit/actions/get-activity-summary/get-activity-summary.mjs b/components/fitbit/actions/get-activity-summary/get-activity-summary.mjs new file mode 100644 index 0000000000000..6d0f8ac30df80 --- /dev/null +++ b/components/fitbit/actions/get-activity-summary/get-activity-summary.mjs @@ -0,0 +1,71 @@ +import fitbit from "../../fitbit.app.mjs"; + +export default { + key: "fitbit-get-activity-summary", + name: "Get Activity Summary", + description: "Get a daily activity summary including calories, distance, and active minutes. [See the documentation](https://dev.fitbit.com/build/reference/web-api/activity/get-daily-activity-summary/)", + version: "0.0.2", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + type: "action", + props: { + fitbit, + date: { + propDefinition: [ + fitbit, + "date", + ], + }, + }, + async run({ $ }) { + const date = this.date || new Date() + .toISOString() + .slice(0, 10); + const response = await this.fitbit.getActivitySummary({ + $, + date, + }); + + const summary = response?.summary ?? {}; + const distanceByActivity = {}; + for (const item of summary.distances || []) { + if (item?.activity) { + distanceByActivity[item.activity] = item.distance; + } + } + + const veryActiveMinutes = summary.veryActiveMinutes ?? 0; + const fairlyActiveMinutes = summary.fairlyActiveMinutes ?? 0; + const lightlyActiveMinutes = summary.lightlyActiveMinutes ?? 0; + + const activitySummary = { + date, + calories: { + out: summary.caloriesOut ?? null, + bmr: summary.caloriesBMR ?? null, + }, + distance: { + total: distanceByActivity.total ?? null, + tracker: distanceByActivity.tracker ?? null, + logged: distanceByActivity.loggedActivities ?? null, + byActivity: distanceByActivity, + }, + activeMinutes: { + very: veryActiveMinutes, + fairly: fairlyActiveMinutes, + lightly: lightlyActiveMinutes, + sedentary: summary.sedentaryMinutes ?? null, + total: veryActiveMinutes + fairlyActiveMinutes + lightlyActiveMinutes, + }, + summary, + goals: response?.goals ?? null, + activities: response?.activities ?? [], + }; + + $.export("$summary", `Successfully retrieved Fitbit activity summary for ${date}.`); + return activitySummary; + }, +}; diff --git a/components/fitbit/actions/get-body-weight/get-body-weight.mjs b/components/fitbit/actions/get-body-weight/get-body-weight.mjs new file mode 100644 index 0000000000000..64249c54f7161 --- /dev/null +++ b/components/fitbit/actions/get-body-weight/get-body-weight.mjs @@ -0,0 +1,35 @@ +import fitbit from "../../fitbit.app.mjs"; + +export default { + name: "Get Body Weight and BMI Logs", + description: "Gets body weight and BMI log entries for a given date. [See the docs](https://dev.fitbit.com/build/reference/web-api/body/get-weight-logs/)", + key: "fitbit-get-body-weight", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + fitbit, + date: { + propDefinition: [ + fitbit, + "date", + ], + }, + }, + + async run({ $ }) { + const date = this.fitbit._getDateOrToday(this.date); + + const response = await this.fitbit.getWeightLogs({ + $, + date, + }); + + $.export("$summary", `Successfully retrieved weight/BMI logs for ${date}`); + return response; + }, +}; diff --git a/components/fitbit/actions/get-daily-steps/get-daily-steps.mjs b/components/fitbit/actions/get-daily-steps/get-daily-steps.mjs new file mode 100644 index 0000000000000..c9e4f4786f61c --- /dev/null +++ b/components/fitbit/actions/get-daily-steps/get-daily-steps.mjs @@ -0,0 +1,35 @@ +import fitbit from "../../fitbit.app.mjs"; + +export default { + name: "Get Daily Step Count", + description: "Gets the daily step count for a specific date. [See the docs](https://dev.fitbit.com/build/reference/web-api/activity/get-activity-time-series/)", + key: "fitbit-get-daily-steps", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + fitbit, + date: { + propDefinition: [ + fitbit, + "date", + ], + }, + }, + + async run({ $ }) { + const date = this.fitbit._getDateOrToday(this.date); + + const response = await this.fitbit.getDailySteps({ + $, + date, + }); + + $.export("$summary", `Successfully retrieved step count for ${date}`); + return response; + }, +}; diff --git a/components/fitbit/actions/get-heart-rate/get-heart-rate.mjs b/components/fitbit/actions/get-heart-rate/get-heart-rate.mjs new file mode 100644 index 0000000000000..39c3497a7ae16 --- /dev/null +++ b/components/fitbit/actions/get-heart-rate/get-heart-rate.mjs @@ -0,0 +1,95 @@ +import fitbit from "../../fitbit.app.mjs"; + +export default { + key: "fitbit-get-heart-rate", + name: "Get Heart Rate", + description: "Gets the heart rate intraday time series data on a specific date range for a 24 hour period. [See the documentation](https://dev.fitbit.com/build/reference/web-api/intraday/get-heartrate-intraday-by-interval/)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + type: "action", + props: { + fitbit, + startDate: { + propDefinition: [ + fitbit, + "startDate", + ], + }, + endDate: { + propDefinition: [ + fitbit, + "endDate", + ], + }, + detailLevel: { + type: "string", + label: "Detail Level", + description: "The granularity of intraday heart rate data points.", + options: [ + { + label: "1 Second", + value: "1sec", + }, + { + label: "1 Minute", + value: "1min", + }, + { + label: "5 Minutes", + value: "5min", + }, + { + label: "15 Minutes", + value: "15min", + }, + ], + default: "1min", + }, + startTime: { + type: "string", + label: "Start Time", + description: "Optional. Limit results to a time window starting at this time, in `HH:mm` format (e.g. `08:00`).", + optional: true, + }, + endTime: { + type: "string", + label: "End Time", + description: "Optional. Limit results to a time window ending at this time, in `HH:mm` format (e.g. `08:30`). Requires Start Time.", + optional: true, + }, + timezone: { + type: "string", + label: "Timezone", + description: "Optional. Return data in `UTC`. Fitbit's heart rate intraday endpoint only supports `UTC` for this parameter.", + optional: true, + }, + }, + async run({ $ }) { + const { + startDate, + endDate, + detailLevel, + startTime, + endTime, + timezone, + } = this; + const resolvedEndDate = endDate || startDate; + + const response = await this.fitbit.getHeartRate({ + $, + startDate, + endDate: resolvedEndDate, + detailLevel, + startTime, + endTime, + timezone, + }); + + $.export("$summary", `Retrieved heart rate data from ${startDate} to ${resolvedEndDate} at ${detailLevel} detail`); + return response; + }, +}; diff --git a/components/fitbit/actions/get-nutrition-water/get-nutrition-water.mjs b/components/fitbit/actions/get-nutrition-water/get-nutrition-water.mjs new file mode 100644 index 0000000000000..94eb3faae2df6 --- /dev/null +++ b/components/fitbit/actions/get-nutrition-water/get-nutrition-water.mjs @@ -0,0 +1,59 @@ +import fitbit from "../../fitbit.app.mjs"; + +export default { + key: "fitbit-get-nutrition-water", + name: "Get Nutrition and Water Logs", + description: "Get nutrition and water logs for a date, including food entries, meals, water intake, and daily summaries. [See the Fitbit Web API documentation](https://dev.fitbit.com/build/reference/web-api/)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + type: "action", + props: { + fitbit, + date: { + propDefinition: [ + fitbit, + "date", + ], + }, + }, + async run({ $ }) { + const date = this.fitbit._getDateOrToday(this.date); + const [ + nutritionResponse, + waterResponse, + ] = await Promise.all([ + this.fitbit.getNutritionLogs({ + $, + date, + }), + this.fitbit.getWaterLogs({ + $, + date, + }), + ]); + + $.export("$summary", `Successfully retrieved Fitbit nutrition and water logs for ${date}.`); + return { + date, + nutrition: { + summary: nutritionResponse?.summary ?? null, + goals: nutritionResponse?.goals ?? null, + foods: nutritionResponse?.foods ?? [], + meals: nutritionResponse?.meals ?? [], + }, + water: { + summary: waterResponse?.summary ?? null, + goal: waterResponse?.goal ?? null, + entries: waterResponse?.water ?? [], + }, + raw: { + nutrition: nutritionResponse, + water: waterResponse, + }, + }; + }, +}; diff --git a/components/fitbit/actions/get-sleep-data/get-sleep-data.mjs b/components/fitbit/actions/get-sleep-data/get-sleep-data.mjs new file mode 100644 index 0000000000000..b25532aa9bd71 --- /dev/null +++ b/components/fitbit/actions/get-sleep-data/get-sleep-data.mjs @@ -0,0 +1,62 @@ +import fitbit from "../../fitbit.app.mjs"; + +export default { + key: "fitbit-get-sleep-data", + name: "Get Sleep Data", + description: "Get sleep data for a date, including duration, stages, and sleep score when available. [See the Fitbit Web API documentation](https://dev.fitbit.com/build/reference/web-api/)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + type: "action", + props: { + fitbit, + date: { + propDefinition: [ + fitbit, + "date", + ], + }, + }, + async run({ $ }) { + const date = this.fitbit._getDateOrToday(this.date); + const response = await this.fitbit.getSleep({ + $, + date, + }); + + const sleepEntries = response?.sleep ?? []; + const mainSleep = sleepEntries.find((entry) => entry?.isMainSleep) ?? sleepEntries[0] ?? null; + const levelsSummary = mainSleep?.levels?.summary ?? {}; + + $.export("$summary", `Successfully retrieved Fitbit sleep data for ${date}.`); + return { + date, + summary: response?.summary ?? null, + mainSleep: mainSleep + ? { + durationMs: mainSleep.duration ?? null, + startTime: mainSleep.startTime ?? null, + endTime: mainSleep.endTime ?? null, + minutesAsleep: mainSleep.minutesAsleep ?? null, + timeInBed: mainSleep.timeInBed ?? null, + efficiency: mainSleep.efficiency ?? null, + stages: { + deep: levelsSummary?.deep ?? null, + light: levelsSummary?.light ?? null, + rem: levelsSummary?.rem ?? null, + wake: levelsSummary?.wake ?? null, + }, + sleepScore: mainSleep?.levels?.shortData?.sleepScore + ?? mainSleep?.score + ?? mainSleep?.sleepScore + ?? null, + } + : null, + entries: sleepEntries, + raw: response, + }; + }, +}; diff --git a/components/fitbit/fitbit.app.mjs b/components/fitbit/fitbit.app.mjs index d94b1d38a984b..7d72e938c019f 100644 --- a/components/fitbit/fitbit.app.mjs +++ b/components/fitbit/fitbit.app.mjs @@ -1,11 +1,140 @@ +import { axios } from "@pipedream/platform"; + export default { type: "app", app: "fitbit", - propDefinitions: {}, + propDefinitions: { + date: { + type: "string", + label: "Date", + description: "Date in `YYYY-MM-DD` format. Defaults to today.", + optional: true, + }, + startDate: { + type: "string", + label: "Start Date", + description: "Start date in `YYYY-MM-DD` format, or `today`.", + default: "today", + }, + endDate: { + type: "string", + label: "End Date", + description: "End date in `YYYY-MM-DD` format. Defaults to Start Date and must stay within 24 hours of it.", + optional: true, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + _getDateOrToday(date) { + return date || new Date() + .toISOString() + .slice(0, 10); + }, + _getHeaders(headers = {}) { + return { + "Authorization": `Bearer ${this.$auth.oauth_access_token}`, + "Content-Type": "application/json", + "User-Agent": "@PipedreamHQ/pipedream v0.1", + ...headers, + }; + }, + _getUrl(path) { + return `https://api.fitbit.com${path}`; + }, + async _makeRequest({ + $, + path, + headers, + ...otherConfig + } = {}) { + return axios($ ?? this, { + url: this._getUrl(path), + headers: this._getHeaders(headers), + ...otherConfig, + }); + }, + async getActivitySummary({ + date, + ...args + } = {}) { + return this._makeRequest({ + method: "GET", + path: `/1/user/-/activities/date/${date}.json`, + ...args, + }); + }, + async getHeartRate({ + startDate, + endDate, + detailLevel = "1min", + startTime, + endTime, + timezone, + ...args + } = {}) { + let path; + if (startTime && endTime) { + path = `/1/user/-/activities/heart/date/${startDate}/${endDate}/${detailLevel}/time/${startTime}/${endTime}.json`; + } else { + path = `/1/user/-/activities/heart/date/${startDate}/${endDate}/${detailLevel}.json`; + } + + const params = {}; + if (timezone) params.timezone = timezone; + + return this._makeRequest({ + method: "GET", + path, + params, + ...args, + }); + }, + async getDailySteps({ + date, ...args + } = {}) { + return this._makeRequest({ + method: "GET", + path: `/1/user/-/activities/steps/date/${date}/1d.json`, + ...args, + }); + }, + async getWeightLogs({ + date, ...args + } = {}) { + return this._makeRequest({ + method: "GET", + path: `/1/user/-/body/log/weight/date/${date}.json`, + ...args, + }); + }, + async getSleep({ + date, + ...args + } = {}) { + return this._makeRequest({ + method: "GET", + path: `/1.2/user/-/sleep/date/${date}.json`, + ...args, + }); + }, + async getNutritionLogs({ + date, + ...args + } = {}) { + return this._makeRequest({ + method: "GET", + path: `/1/user/-/foods/log/date/${date}.json`, + ...args, + }); + }, + async getWaterLogs({ + date, + ...args + } = {}) { + return this._makeRequest({ + method: "GET", + path: `/1/user/-/foods/log/water/date/${date}.json`, + ...args, + }); }, }, }; diff --git a/components/fitbit/package.json b/components/fitbit/package.json index 8ecec14f3ca7e..ed8b9af248bd8 100644 --- a/components/fitbit/package.json +++ b/components/fitbit/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/fitbit", - "version": "0.6.0", + "version": "0.8.0", "description": "Pipedream fitbit Components", "main": "fitbit.app.mjs", "keywords": [ diff --git a/components/google_sheets/actions/get-cell/get-cell.mjs b/components/google_sheets/actions/get-cell/get-cell.mjs index ffb022bd5167b..b53910bea237d 100644 --- a/components/google_sheets/actions/get-cell/get-cell.mjs +++ b/components/google_sheets/actions/get-cell/get-cell.mjs @@ -7,7 +7,7 @@ export default { key: "google_sheets-get-cell", name: "Get Cell", description: "Fetch the contents of a specific cell in a spreadsheet. [See the documentation](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get)", - version: "0.1.17", + version: "0.1.18", annotations: { destructiveHint: false, openWorldHint: true, @@ -47,7 +47,7 @@ export default { ], }, }, - async run() { + async run({ $ }) { const worksheet = await this.getWorksheetById(this.sheetId, this.worksheetId); const sheets = this.googleSheets.sheets(); @@ -55,8 +55,10 @@ export default { spreadsheetId: this.sheetId, range: `${worksheet?.properties?.title}!${this.cell}:${this.cell}`, })).data.values; - if (values?.length) { - return values[0][0]; - } + const ret = values?.[0]?.[0] ?? null; + $.export("$summary", ret === null + ? `No value found in cell ${this.cell}.` + : `Retrieved value from cell ${this.cell}.`); + return ret; }, }; diff --git a/components/google_sheets/actions/get-values-in-range/get-values-in-range.mjs b/components/google_sheets/actions/get-values-in-range/get-values-in-range.mjs index 86b2e21c533e0..fb863561f2b88 100644 --- a/components/google_sheets/actions/get-values-in-range/get-values-in-range.mjs +++ b/components/google_sheets/actions/get-values-in-range/get-values-in-range.mjs @@ -7,7 +7,7 @@ export default { key: "google_sheets-get-values-in-range", name: "Get Values in Range", description: "Get all values or values from a range of cells using A1 notation. [See the documentation](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get)", - version: "0.1.17", + version: "0.1.18", annotations: { destructiveHint: false, openWorldHint: true, @@ -48,15 +48,17 @@ export default { optional: true, }, }, - async run() { + async run({ $ }) { const worksheet = await this.getWorksheetById(this.sheetId, this.worksheetId); const sheets = this.googleSheets.sheets(); - return (await sheets.spreadsheets.values.get({ + const values = (await sheets.spreadsheets.values.get({ spreadsheetId: this.sheetId, range: this.range ? `${worksheet?.properties?.title}!${this.range}` : `${worksheet?.properties?.title}`, - })).data.values; + })).data.values ?? []; + $.export("$summary", `Returned ${values.length} row(s) of values.`); + return values; }, }; diff --git a/components/google_sheets/actions/list-worksheets/list-worksheets.mjs b/components/google_sheets/actions/list-worksheets/list-worksheets.mjs index 5def218e8b06e..f8a95e443434b 100644 --- a/components/google_sheets/actions/list-worksheets/list-worksheets.mjs +++ b/components/google_sheets/actions/list-worksheets/list-worksheets.mjs @@ -4,7 +4,7 @@ export default { key: "google_sheets-list-worksheets", name: "List Worksheets", description: "Get a list of all worksheets in a spreadsheet. [See the documentation](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get)", - version: "0.1.15", + version: "0.1.16", annotations: { destructiveHint: false, openWorldHint: true, @@ -31,8 +31,11 @@ export default { description: "List worksheets in the specified spreadsheet", }, }, - async run() { - const { sheets } = await this.googleSheets.getSpreadsheet(this.sheetId); + async run({ $ }) { + const { sheets = [] } = await this.googleSheets.getSpreadsheet(this.sheetId); + $.export("$summary", `Returned ${sheets.length} worksheet${sheets.length === 1 + ? "" + : "s"}.`); return sheets; }, }; diff --git a/components/google_sheets/package.json b/components/google_sheets/package.json index 2f43e7ee06abb..48d05631ae1fb 100644 --- a/components/google_sheets/package.json +++ b/components/google_sheets/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/google_sheets", - "version": "0.14.1", + "version": "0.14.2", "description": "Pipedream Google_sheets Components", "main": "google_sheets.app.mjs", "keywords": [ diff --git a/components/hubspot/actions/create-engagement/create-engagement.mjs b/components/hubspot/actions/create-engagement/create-engagement.mjs index 96a8ba186b0e3..5ffdff154fe35 100644 --- a/components/hubspot/actions/create-engagement/create-engagement.mjs +++ b/components/hubspot/actions/create-engagement/create-engagement.mjs @@ -11,11 +11,11 @@ export default { name: "Create Engagement", description: "Create a **task, meeting, email, call, or note** engagement with optional associations. " - + "MCP/AI: **Do not use this action for a simple note on a contact by ID** — use **Add Note to Contact** (`hubspot-add-note-to-contact`) instead; it avoids the engagement-type reload step that confuses agents. " - + "**Engagement Type** has `reloadProps: true`: set `engagementType` first to exactly one of `notes`, `tasks`, `meetings`, `emails`, `calls` (lowercase strings). " - + "After that, the host reloads props and HubSpot-specific fields appear; use the **CONFIGURE_COMPONENT** tool with `componentKey` `hubspot-create-engagement` and the relevant `propName` to load remote options (object IDs, association types, etc.). " + + "Set **Engagement Type** and pass engagement fields in **Object Properties** (HubSpot property names, e.g. `hs_note_body` for notes). " + + "No `reloadProps` step and no **CONFIGURE_COMPONENT** requirement: association fields accept raw HubSpot IDs (use **Search CRM** or the Associations API to resolve `associationType` when needed). " + + "For **only** a note on a contact by ID, **Add Note to Contact** (`hubspot-add-note-to-contact`) is still simpler. " + "[See the documentation](https://developers.hubspot.com/docs/api/crm/engagements)", - version: "0.0.35", + version: "0.0.36", annotations: { destructiveHint: false, openWorldHint: true, @@ -28,53 +28,51 @@ export default { type: "string", label: "Engagement Type", description: - "Set this **before** other engagement fields load (`reloadProps`). " - + "Value must be exactly: `notes`, `tasks`, `meetings`, `emails`, or `calls`. " - + "For **note on contact by ID**, use **Add Note to Contact** instead.", - reloadProps: true, + "One of: `notes`, `tasks`, `meetings`, `emails`, or `calls`. " + + "Defines the CRM object type created and which properties belong in **Object Properties**. " + + "For **note on contact by ID**, consider **Add Note to Contact** instead.", options: ENGAGEMENT_TYPE_OPTIONS, }, toObjectType: { - propDefinition: [ - common.props.hubspot, - "objectType", - ], + type: "string", label: "Associated Object Type", - description: "Type of object the engagement is being associated with", + description: + "HubSpot object type to associate (e.g. `contacts`, `companies`, `deals`, `tickets`). " + + "Use the plural object name or your custom object’s API name / `fullyQualifiedName`. " + + "Optional unless you set **Associated Object ID**.", optional: true, }, toObjectId: { - propDefinition: [ - common.props.hubspot, - "objectId", - (c) => ({ - objectType: c.toObjectType, - }), - ], - label: "Associated Object", - description: "ID of object the engagement is being associated with", + type: "string", + label: "Associated Object ID", + description: + "Numeric record ID to associate (string is fine). Optional unless you set **Association Type ID**.", optional: true, }, associationType: { - propDefinition: [ - common.props.hubspot, - "associationType", - (c) => ({ - fromObjectType: c.engagementType, - toObjectType: c.toObjectType, - }), - ], + type: "string", + label: "Association Type ID", description: - "Association type ID between this engagement and the other object. " - + "Use **CONFIGURE_COMPONENT** with `propName` `associationType` after `toObjectType` and `engagementType` are set to load valid options.", + "HubSpot association `typeId` between this engagement type and **Associated Object Type** (integer as string or number). " + + "Resolve via HubSpot associations API or **Search CRM**; omit if you are not associating a record.", optional: true, }, objectProperties: { type: "object", label: "Object Properties", - description: "Enter the `engagement` properties as a JSON object", + description: + "Writable HubSpot properties for the engagement as key/value pairs (same shape as the CRM API `properties` object). " + + "Example for a note: `{ \"hs_note_body\": \"Hello from Pipedream\" }`.", }, }, + /** + * Skip common-create’s schema-driven `additionalProps` so engagement fields stay in + * `objectProperties` only — avoids `reloadProps` on `engagementType` and remote options + * that require CONFIGURE_COMPONENT in MCP/agent hosts. + */ + async additionalProps() { + return {}; + }, methods: { ...common.methods, getObjectType() { @@ -110,9 +108,15 @@ export default { ...otherProperties } = this; - if ((toObjectId && !associationType) || (!toObjectId && associationType)) { + if (!engagementType) { throw new ConfigurationError( - "Both `toObjectId` and `associationType` must be entered", + "`engagementType` is required (one of notes, tasks, meetings, emails, calls).", + ); + } + + if ((toObjectId && (associationType === undefined || associationType === null || associationType === "")) || (!toObjectId && associationType !== undefined && associationType !== null && associationType !== "")) { + throw new ConfigurationError( + "Both **Associated Object ID** and **Association Type ID** must be set together, or both omitted.", ); } @@ -124,15 +128,25 @@ export default { const objectType = this.getObjectType(); + const associationTypeId = associationType !== undefined && associationType !== null && associationType !== "" + ? Number(associationType) + : undefined; + + if (toObjectId && Number.isNaN(associationTypeId)) { + throw new ConfigurationError( + "`associationType` must be a numeric HubSpot association type ID.", + ); + } + const associations = toObjectId ? [ { to: { - id: toObjectId, + id: String(toObjectId), }, types: [ { - associationTypeId: associationType, + associationTypeId: associationTypeId, associationCategory: ASSOCIATION_CATEGORY.HUBSPOT_DEFINED, }, ], @@ -140,7 +154,7 @@ export default { ] : undefined; - if (properties.hs_task_reminders) { + if (properties?.hs_task_reminders) { properties.hs_task_reminders = Date.parse(properties.hs_task_reminders); } @@ -152,7 +166,7 @@ export default { ); const objectName = hubspot.getObjectTypeName(objectType); - $.export("$summary", `Successfully created ${objectName} for the contact`); + $.export("$summary", `Successfully created ${objectName}`); return engagement; }, diff --git a/components/huntress/huntress.app.mjs b/components/huntress/huntress.app.mjs new file mode 100644 index 0000000000000..5a7e1755d64e4 --- /dev/null +++ b/components/huntress/huntress.app.mjs @@ -0,0 +1,11 @@ +export default { + type: "app", + app: "huntress", + propDefinitions: {}, + methods: { + // this.$auth contains connected account data + authKeys() { + console.log(Object.keys(this.$auth)); + }, + }, +}; \ No newline at end of file diff --git a/components/huntress/package.json b/components/huntress/package.json new file mode 100644 index 0000000000000..37ab72dc95d38 --- /dev/null +++ b/components/huntress/package.json @@ -0,0 +1,15 @@ +{ + "name": "@pipedream/huntress", + "version": "0.0.1", + "description": "Pipedream Huntress Components", + "main": "huntress.app.mjs", + "keywords": [ + "pipedream", + "huntress" + ], + "homepage": "https://pipedream.com/apps/huntress", + "author": "Pipedream (https://pipedream.com/)", + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/components/jenkins/jenkins.app.mjs b/components/jenkins/jenkins.app.mjs index 516f15f260369..8d967a8bbb5b7 100644 --- a/components/jenkins/jenkins.app.mjs +++ b/components/jenkins/jenkins.app.mjs @@ -5,6 +5,13 @@ import { axios } from "@pipedream/platform"; const parser = new XMLParser({ ignoreAttributes: false, + processEntities: true, + htmlEntities: true, + maxEntitySize: 1024 * 1024, // 1MB + maxExpansionDepth: 10, + maxTotalExpansions: 1000, + maxExpandedLength: 10 * 1024 * 1024, // 10MB + maxEntityCount: 100, }); const builder = new XMLBuilder({ diff --git a/components/jenkins/package.json b/components/jenkins/package.json index f575f482b8c7b..ad579bca62b73 100644 --- a/components/jenkins/package.json +++ b/components/jenkins/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/jenkins", - "version": "0.1.0", + "version": "0.1.1", "description": "Pipedream Jenkins Components", "main": "jenkins.app.mjs", "keywords": [ @@ -14,6 +14,6 @@ }, "dependencies": { "@pipedream/platform": "^3.1.1", - "fast-xml-parser": "^5.5.7" + "fast-xml-parser": "^5.7.0" } } diff --git a/components/jenkins/sources/new-job-status-notification-instant/new-job-status-notification-instant.mjs b/components/jenkins/sources/new-job-status-notification-instant/new-job-status-notification-instant.mjs index 07b57cf51d7f2..e924f9703bcd2 100644 --- a/components/jenkins/sources/new-job-status-notification-instant/new-job-status-notification-instant.mjs +++ b/components/jenkins/sources/new-job-status-notification-instant/new-job-status-notification-instant.mjs @@ -6,7 +6,7 @@ export default { key: "jenkins-new-job-status-notification-instant", name: "New Jenkins Job Status Notification (Instant)", description: "Emit new event when a Jenkins job sends a status notification via the notification plugin. [See the documentation](https://github.com/jenkinsci/notification-plugin).", - version: "0.0.1", + version: "0.0.2", type: "source", dedupe: "unique", methods: { diff --git a/components/jlcpcb/jlcpcb.app.mjs b/components/jlcpcb/jlcpcb.app.mjs index 8c52de7ffdb14..d1b45f98a35bc 100644 --- a/components/jlcpcb/jlcpcb.app.mjs +++ b/components/jlcpcb/jlcpcb.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/microsoft_entra_id/actions/add-member-to-group/add-member-to-group.mjs b/components/microsoft_entra_id/actions/add-member-to-group/add-member-to-group.mjs index b55dd3051486e..f0f34d1e470f5 100644 --- a/components/microsoft_entra_id/actions/add-member-to-group/add-member-to-group.mjs +++ b/components/microsoft_entra_id/actions/add-member-to-group/add-member-to-group.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-add-member-to-group", name: "Add Member To Group", description: "Adds a member to a group Microsoft Entra ID. [See the documentation](https://learn.microsoft.com/en-us/graph/api/user-update?view=graph-rest-1.0&tabs=http)", - version: "0.0.6", + version: "0.0.7", annotations: { destructiveHint: true, openWorldHint: true, diff --git a/components/microsoft_entra_id/actions/create-group/create-group.mjs b/components/microsoft_entra_id/actions/create-group/create-group.mjs new file mode 100644 index 0000000000000..3fffa4488fe81 --- /dev/null +++ b/components/microsoft_entra_id/actions/create-group/create-group.mjs @@ -0,0 +1,50 @@ +import microsoftEntraId from "../../microsoft_entra_id.app.mjs"; + +export default { + key: "microsoft_entra_id-create-group", + name: "Create Group", + description: "Creates a new group in Microsoft Entra ID. [See the documentation](https://learn.microsoft.com/en-us/graph/api/group-post-groups?view=graph-rest-1.0&tabs=http)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + microsoftEntraId, + displayName: { + type: "string", + label: "Display Name", + description: "The name to display in the address book for the group", + }, + mailEnabled: { + type: "boolean", + label: "Mail Enabled", + description: "Set to `true` for mail-enabled groups", + }, + mailNickname: { + type: "string", + label: "Mail Nickname", + description: "The mail alias for the group, unique for groups in the organization. Maximum length is 64 characters. This property can contain only characters in the ASCII character set 0 - 127 except the following characters: @ () \\ [] \" ; : <> , SPACE.", + }, + securityEnabled: { + type: "boolean", + label: "Security Enabled", + description: "Set to `true` for security-enabled groups", + }, + }, + async run({ $ }) { + const response = await this.microsoftEntraId.createGroup({ + data: { + displayName: this.displayName, + mailEnabled: this.mailEnabled, + mailNickname: this.mailNickname, + securityEnabled: this.securityEnabled, + }, + }); + $.export("$summary", `Successfully created group with ID ${response.id}.`); + + return response; + }, +}; diff --git a/components/microsoft_entra_id/actions/delete-group/delete-group.mjs b/components/microsoft_entra_id/actions/delete-group/delete-group.mjs new file mode 100644 index 0000000000000..432d9dbfa2cd5 --- /dev/null +++ b/components/microsoft_entra_id/actions/delete-group/delete-group.mjs @@ -0,0 +1,30 @@ +import microsoftEntraId from "../../microsoft_entra_id.app.mjs"; + +export default { + key: "microsoft_entra_id-delete-group", + name: "Delete Group", + description: "Deletes a group in Microsoft Entra ID. [See the documentation](https://learn.microsoft.com/en-us/graph/api/group-delete?view=graph-rest-1.0&tabs=http)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: true, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + microsoftEntraId, + groupId: { + propDefinition: [ + microsoftEntraId, + "groupId", + ], + }, + }, + async run({ $ }) { + const response = await this.microsoftEntraId.deleteGroup({ + groupId: this.groupId, + }); + $.export("$summary", `Successfully deleted group with ID ${this.groupId}.`); + return response; + }, +}; diff --git a/components/microsoft_entra_id/actions/get-manager/get-manager.mjs b/components/microsoft_entra_id/actions/get-manager/get-manager.mjs index ad7738f0857d1..6cb5422779a3b 100644 --- a/components/microsoft_entra_id/actions/get-manager/get-manager.mjs +++ b/components/microsoft_entra_id/actions/get-manager/get-manager.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-get-manager", name: "Get Manager", description: "Get the user's manager information. Returns the user or organizational contact assigned as the user's manager. [See the documentation](https://learn.microsoft.com/en-us/graph/api/user-list-manager?view=graph-rest-1.0&tabs=http)", - version: "0.0.1", + version: "0.0.2", type: "action", annotations: { destructiveHint: false, diff --git a/components/microsoft_entra_id/actions/get-ms365-groups/get-ms365-groups.mjs b/components/microsoft_entra_id/actions/get-ms365-groups/get-ms365-groups.mjs index d6d7519d1ab39..bf1098b59b5c4 100644 --- a/components/microsoft_entra_id/actions/get-ms365-groups/get-ms365-groups.mjs +++ b/components/microsoft_entra_id/actions/get-ms365-groups/get-ms365-groups.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-get-ms365-groups", name: "Get MS365 Groups", description: "Get the user's Microsoft 365 groups (unified groups). Returns groups the user is a direct member of. [See the documentation](https://learn.microsoft.com/en-us/graph/api/user-list-memberof?view=graph-rest-1.0&tabs=http)", - version: "0.0.1", + version: "0.0.2", type: "action", annotations: { destructiveHint: false, diff --git a/components/microsoft_entra_id/actions/get-organization-groups/get-organization-groups.mjs b/components/microsoft_entra_id/actions/get-organization-groups/get-organization-groups.mjs index a94c4ab763e71..bb06adfcbc99b 100644 --- a/components/microsoft_entra_id/actions/get-organization-groups/get-organization-groups.mjs +++ b/components/microsoft_entra_id/actions/get-organization-groups/get-organization-groups.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-get-organization-groups", name: "Get Organization Groups", description: "List all groups in the organization (excluding dynamic distribution groups). [See the documentation](https://learn.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0&tabs=http)", - version: "0.0.1", + version: "0.0.2", type: "action", annotations: { destructiveHint: false, diff --git a/components/microsoft_entra_id/actions/get-organization-users/get-organization-users.mjs b/components/microsoft_entra_id/actions/get-organization-users/get-organization-users.mjs index 33de828475b9a..5f5365429d6e4 100644 --- a/components/microsoft_entra_id/actions/get-organization-users/get-organization-users.mjs +++ b/components/microsoft_entra_id/actions/get-organization-users/get-organization-users.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-get-organization-users", name: "Get Organization Users", description: "List all users in the organization. By default returns only enabled accounts. [See the documentation](https://learn.microsoft.com/en-us/graph/api/user-list?view=graph-rest-1.0&tabs=http)", - version: "0.0.2", + version: "0.0.3", type: "action", annotations: { destructiveHint: false, diff --git a/components/microsoft_entra_id/actions/get-profile/get-profile.mjs b/components/microsoft_entra_id/actions/get-profile/get-profile.mjs index ce808e8d3932a..2799eadf971c6 100644 --- a/components/microsoft_entra_id/actions/get-profile/get-profile.mjs +++ b/components/microsoft_entra_id/actions/get-profile/get-profile.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-get-profile", name: "Get Profile", description: "Get the user's profile information. Returns the signed-in user's profile by default. [See the documentation](https://learn.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http)", - version: "0.0.1", + version: "0.0.2", type: "action", annotations: { destructiveHint: false, diff --git a/components/microsoft_entra_id/actions/remove-member-from-group/remove-member-from-group.mjs b/components/microsoft_entra_id/actions/remove-member-from-group/remove-member-from-group.mjs index 8b715fbad9357..af991836474c3 100644 --- a/components/microsoft_entra_id/actions/remove-member-from-group/remove-member-from-group.mjs +++ b/components/microsoft_entra_id/actions/remove-member-from-group/remove-member-from-group.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-remove-member-from-group", name: "Remove Member From Group", description: "Removes a member from a group Microsoft Entra ID. [See the documentation](https://learn.microsoft.com/en-us/graph/api/group-delete-members?view=graph-rest-1.0&tabs=http)", - version: "0.0.6", + version: "0.0.7", annotations: { destructiveHint: true, openWorldHint: true, diff --git a/components/microsoft_entra_id/actions/search-groups/search-groups.mjs b/components/microsoft_entra_id/actions/search-groups/search-groups.mjs index e1423782d4e8a..3b661f5c92745 100644 --- a/components/microsoft_entra_id/actions/search-groups/search-groups.mjs +++ b/components/microsoft_entra_id/actions/search-groups/search-groups.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_entra_id-search-groups", name: "Search Groups", description: "Searches for groups by name or description. [See the documentation](https://learn.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0&tabs=http)", - version: "0.0.7", + version: "0.0.8", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/microsoft_entra_id/actions/update-group/update-group.mjs b/components/microsoft_entra_id/actions/update-group/update-group.mjs new file mode 100644 index 0000000000000..e7dfc95cd9fef --- /dev/null +++ b/components/microsoft_entra_id/actions/update-group/update-group.mjs @@ -0,0 +1,85 @@ +import microsoftEntraId from "../../microsoft_entra_id.app.mjs"; + +export default { + key: "microsoft_entra_id-update-group", + name: "Update Group", + description: "Updates an existing group in Microsoft Entra ID. [See the documentation](https://learn.microsoft.com/en-us/graph/api/group-update?view=graph-rest-1.0&tabs=http)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + microsoftEntraId, + groupId: { + propDefinition: [ + microsoftEntraId, + "groupId", + ], + }, + allowExternalSenders: { + type: "boolean", + label: "Allow External Senders", + description: "Indicates whether people external to the organization can send messages to the group", + optional: true, + }, + autoSubscribeNewMembers: { + type: "boolean", + label: "Auto Subscribe New Members", + description: "Indicates whether new members added to the group will be auto-subscribed to receive email notifications", + optional: true, + }, + description: { + type: "string", + label: "Description", + description: "An optional description for the group", + optional: true, + }, + displayName: { + type: "string", + label: "Display Name", + description: "The name to display in the address book for the group", + optional: true, + }, + mailNickname: { + type: "string", + label: "Mail Nickname", + description: "The mail alias for the group, unique for groups in the organization. Maximum length is 64 characters. This property can contain only characters in the ASCII character set 0 - 127 except the following characters: @ () \\ [] \" ; : <> , SPACE.", + optional: true, + }, + securityEnabled: { + type: "boolean", + label: "Security Enabled", + description: "Set to `true` for security-enabled groups", + optional: true, + }, + visibility: { + type: "string", + label: "Visibility", + description: "Specifies the visibility of the group", + options: [ + "Public", + "Private", + ], + optional: true, + }, + }, + async run({ $ }) { + const response = await this.microsoftEntraId.updateGroup({ + groupId: this.groupId, + data: { + allowExternalSenders: this.allowExternalSenders, + autoSubscribeNewMembers: this.autoSubscribeNewMembers, + description: this.description, + displayName: this.displayName, + mailNickname: this.mailNickname, + securityEnabled: this.securityEnabled, + visibility: this.visibility, + }, + }); + $.export("$summary", `Successfully updated group with ID ${this.groupId}.`); + return response; + }, +}; diff --git a/components/microsoft_entra_id/actions/update-user/update-user.mjs b/components/microsoft_entra_id/actions/update-user/update-user.mjs index 81963f9954282..1a67356d9f69b 100644 --- a/components/microsoft_entra_id/actions/update-user/update-user.mjs +++ b/components/microsoft_entra_id/actions/update-user/update-user.mjs @@ -5,9 +5,9 @@ export default { key: "microsoft_entra_id-update-user", name: "Update User", description: "Updates an existing user in Microsoft Entra ID. [See the documentation](https://learn.microsoft.com/en-us/graph/api/user-update?view=graph-rest-1.0&tabs=http)", - version: "0.0.7", + version: "0.0.8", annotations: { - destructiveHint: true, + destructiveHint: false, openWorldHint: true, readOnlyHint: false, }, diff --git a/components/microsoft_entra_id/microsoft_entra_id.app.mjs b/components/microsoft_entra_id/microsoft_entra_id.app.mjs index 2b5bbcb7192e0..4672fd914daff 100644 --- a/components/microsoft_entra_id/microsoft_entra_id.app.mjs +++ b/components/microsoft_entra_id/microsoft_entra_id.app.mjs @@ -130,6 +130,23 @@ export default { .header("ConsistencyLevel", "eventual") .delete(); }, + createGroup({ data = {} } = {}) { + return this.client().api("/groups") + .header("ConsistencyLevel", "eventual") + .post(data); + }, + updateGroup({ + groupId, data = {}, + } = {}) { + return this.client().api(`/groups/${groupId}`) + .header("ConsistencyLevel", "eventual") + .patch(data); + }, + deleteGroup({ groupId } = {}) { + return this.client().api(`/groups/${groupId}`) + .header("ConsistencyLevel", "eventual") + .delete(); + }, /** * Paginate an OData collection via @odata.nextLink (dedupes repeated links, caps page count). * @param {Object} opts diff --git a/components/microsoft_entra_id/package.json b/components/microsoft_entra_id/package.json index 312e860cb91e3..2df61ff9d03d0 100644 --- a/components/microsoft_entra_id/package.json +++ b/components/microsoft_entra_id/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/microsoft_entra_id", - "version": "0.3.1", + "version": "0.4.0", "description": "Pipedream Microsoft Entra ID Components", "main": "microsoft_entra_id.app.mjs", "keywords": [ diff --git a/components/microsoft_power_bi/actions/add-rows-dataset-table/add-rows-dataset-table.mjs b/components/microsoft_power_bi/actions/add-rows-dataset-table/add-rows-dataset-table.mjs deleted file mode 100644 index bc29b7a23c954..0000000000000 --- a/components/microsoft_power_bi/actions/add-rows-dataset-table/add-rows-dataset-table.mjs +++ /dev/null @@ -1,64 +0,0 @@ -import { ConfigurationError } from "@pipedream/platform"; -import powerBi from "../../microsoft_power_bi.app.mjs"; - -export default { - key: "microsoft_power_bi-add-rows-dataset-table", - name: "Add Rows to Dataset Table", - description: "Adds new data rows to the specified table within the specified dataset from My workspace. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post-rows)", - version: "0.0.6", - annotations: { - destructiveHint: false, - openWorldHint: true, - readOnlyHint: false, - }, - type: "action", - props: { - powerBi, - datasetId: { - propDefinition: [ - powerBi, - "datasetId", - () => ({ - addRowsAPIEnabled: true, - }), - ], - description: "Select a Dataset or provide a custom Dataset ID. Note: Only Datasets created via API (Push Datasets) can be added to.", - }, - tableName: { - propDefinition: [ - powerBi, - "tableName", - ({ datasetId }) => ({ - datasetId, - }), - ], - }, - rows: { - propDefinition: [ - powerBi, - "rows", - ], - }, - }, - async run({ $ }) { - const response = await this.powerBi.addRowsToTable({ - $, - datasetId: this.datasetId, - tableName: this.tableName, - data: { - rows: this.rows.map((row, index) => { - try { - return typeof row === "object" - ? row - : JSON.parse(row); - } catch (err) { - throw new ConfigurationError(`Error parsing entry index ${index} as JSON: \`${row}\``); - } - }), - }, - }); - - $.export("$summary", `Successfully added rows to table "${this.tableName}"`); - return response; - }, -}; diff --git a/components/microsoft_power_bi/actions/add-rows-to-push-dataset/add-rows-to-push-dataset.mjs b/components/microsoft_power_bi/actions/add-rows-to-push-dataset/add-rows-to-push-dataset.mjs new file mode 100644 index 0000000000000..6693446f8ac4c --- /dev/null +++ b/components/microsoft_power_bi/actions/add-rows-to-push-dataset/add-rows-to-push-dataset.mjs @@ -0,0 +1,91 @@ +import { ConfigurationError } from "@pipedream/platform"; +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-add-rows-to-push-dataset", + name: "Add Rows To Push Dataset", + description: "Append rows to a table in a Power BI Push Dataset (streaming / realtime data)." + + " Only works for datasets created via the REST API with `defaultMode: Push` — these datasets expose `addRowsAPIEnabled: true` on the object returned by **List Datasets**." + + " Use **List Datasets** first to resolve a dataset name → `datasetId` and inspect its `tables` for the exact `tableName` (case-sensitive)." + + " Pass `workspaceId` (from **List Workspaces**) or `workspaceName` to target a specific workspace, or omit both for My workspace." + + " Rows must match the table's column schema. `rows` accepts either a JSON array (`[{...}, {...}]`) or a JSON-stringified array. Each row is an object of `columnName → value`." + + " Common mistakes: (1) case mismatch on `tableName` returns 404 — copy the exact string from the dataset's `tables` array. (2) Sending values that don't match the declared column data type returns `RequestedResourceNotFound` or `DMTS_DatasourceHasNoCredentialsError`." + + " Push-dataset rows have no individual IDs and cannot be updated or deleted — only appended or bulk-cleared." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post-rows-in-group)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + datasetId: { + type: "string", + label: "Dataset ID", + description: "ID of the Push Dataset. Use **List Datasets** to find IDs — Push Datasets have `addRowsAPIEnabled: true`.", + }, + tableName: { + type: "string", + label: "Table Name", + description: "Exact (case-sensitive) name of the table within the dataset. Found in the dataset's `tables` array via **List Datasets**. Example: `Species`.", + }, + rows: { + type: "string", + label: "Rows", + description: "JSON array of row objects matching the table's column schema." + + " Example: `[{\"id\": \"sp-100\", \"name\": \"Indominus Rex\", \"dietType\": \"Carnivore\", \"heightCm\": 550, \"weightKg\": 7000}]`." + + " Accepts a JSON string or a pre-parsed array.", + }, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + + let rows = this.rows; + if (typeof rows === "string") { + try { + rows = JSON.parse(rows); + } catch { + throw new ConfigurationError("`rows` must be a JSON array or a JSON-stringified array."); + } + } + if (!Array.isArray(rows)) { + throw new ConfigurationError("`rows` must be an array of row objects."); + } + + const response = await this.app.addRowsToTable({ + $, + datasetId: this.datasetId, + tableName: this.tableName, + groupId, + data: { + rows, + }, + }); + + $.export("$summary", `Appended ${rows.length} row${rows.length === 1 + ? "" + : "s"} to table "${this.tableName}" in dataset ${this.datasetId}`); + return response ?? { + success: true, + rowsAdded: rows.length, + }; + }, +}; diff --git a/components/microsoft_power_bi/actions/cancel-refresh/cancel-refresh.mjs b/components/microsoft_power_bi/actions/cancel-refresh/cancel-refresh.mjs deleted file mode 100644 index 7b204682510f6..0000000000000 --- a/components/microsoft_power_bi/actions/cancel-refresh/cancel-refresh.mjs +++ /dev/null @@ -1,42 +0,0 @@ -import powerBi from "../../microsoft_power_bi.app.mjs"; - -export default { - key: "microsoft_power_bi-cancel-refresh", - name: "Cancel Dataset Refresh", - description: "Cancels a refresh operation for a specified dataset in Power BI. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/cancel-refresh)", - version: "0.0.5", - annotations: { - destructiveHint: true, - openWorldHint: true, - readOnlyHint: false, - }, - type: "action", - props: { - powerBi, - datasetId: { - propDefinition: [ - powerBi, - "datasetId", - ], - }, - refreshId: { - propDefinition: [ - powerBi, - "refreshId", - ({ datasetId }) => ({ - datasetId, - }), - ], - }, - }, - async run({ $ }) { - const response = await this.powerBi.cancelRefresh({ - $, - datasetId: this.datasetId, - refreshId: this.refreshId, - }); - - $.export("$summary", `Successfully cancelled refresh operation for dataset ID ${this.datasetId}`); - return response; - }, -}; diff --git a/components/microsoft_power_bi/actions/create-dataset/create-dataset.mjs b/components/microsoft_power_bi/actions/create-dataset/create-dataset.mjs deleted file mode 100644 index 7a02e0eadada0..0000000000000 --- a/components/microsoft_power_bi/actions/create-dataset/create-dataset.mjs +++ /dev/null @@ -1,63 +0,0 @@ -import powerBi from "../../microsoft_power_bi.app.mjs"; -import { ConfigurationError } from "@pipedream/platform"; - -export default { - key: "microsoft_power_bi-create-dataset", - name: "Create Dataset", - description: "Creates a new Push Dataset in Power BI. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post-dataset)", - version: "0.0.4", - annotations: { - destructiveHint: false, - openWorldHint: true, - readOnlyHint: false, - }, - type: "action", - props: { - powerBi, - name: { - type: "string", - label: "Name", - description: "Name of the new dataset", - }, - tables: { - type: "string", - label: "Tables", - description: `An array of [Table](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post-dataset#table) objects. Custom expression recommended. - Example: [{ - "name": "Product", - "columns": [ - { - "name": "ProductID", - "dataType": "Int64" - }, - { - "name": "Name", - "dataType": "string" - } - ] - }]`, - }, - }, - async run({ $ }) { - let tables = this.tables; - if (!Array.isArray(tables)) { - try { - tables = JSON.parse(tables); - } catch { - throw new ConfigurationError("Could not parse Tables array."); - } - } - const response = await this.powerBi.createDataset({ - data: { - name: this.name, - defaultMode: "Push", - tables, - }, - $, - }); - - $.export("$summary", `Successfully created new dataset "${this.name}".`); - - return response; - }, -}; diff --git a/components/microsoft_power_bi/actions/execute-dax-query/execute-dax-query.mjs b/components/microsoft_power_bi/actions/execute-dax-query/execute-dax-query.mjs new file mode 100644 index 0000000000000..3902949c90b62 --- /dev/null +++ b/components/microsoft_power_bi/actions/execute-dax-query/execute-dax-query.mjs @@ -0,0 +1,96 @@ +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-execute-dax-query", + name: "Execute DAX Query", + description: "Execute a DAX (Data Analysis Expressions) query against a Power BI dataset (semantic model)." + + " This is the primary analytics tool — use it to answer questions about values, aggregates, or filtered rows in a dataset." + + " Use **List Datasets** first to resolve a dataset name → `datasetId`." + + " The query must be a single valid DAX expression starting with `EVALUATE`." + + " Common patterns:" + + " • List all rows of a table — `EVALUATE 'Species'`" + + " • Filter — `EVALUATE FILTER('Species', 'Species'[dietType] = \"Carnivore\")`" + + " • Top N by column — `EVALUATE TOPN(5, 'Species', 'Species'[weightKg], DESC)`" + + " • Aggregate single value — `EVALUATE ROW(\"Total\", SUMX('Species', 'Species'[weightKg]))`" + + " • Peek at a table's columns — `EVALUATE TOPN(0, 'Species')` (returns an empty rowset with column names in the response)." + + " Limits: max 100,000 rows or 1,000,000 values per query, and `DEFINE`/multiple-statement queries are not supported via REST." + + " The tenant must have 'Dataset Execute Queries REST API' enabled (admin setting) or the call returns 401/403." + + " Pass `workspaceId` (from **List Workspaces**) or `workspaceName` to target a specific workspace, or omit both for My workspace." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/execute-queries-in-group)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + datasetId: { + type: "string", + label: "Dataset ID", + description: "ID of the dataset to query. Use **List Datasets** to find IDs by name.", + }, + query: { + type: "string", + label: "DAX Query", + description: "A single DAX expression. Must start with `EVALUATE`. Example: `EVALUATE FILTER('Species', 'Species'[dietType] = \"Carnivore\")`.", + }, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + includeNulls: { + type: "boolean", + label: "Include Nulls", + description: "If true (default), null values are included in the response. Set to false for compacter output when nulls are not meaningful.", + optional: true, + default: true, + }, + impersonatedUserName: { + type: "string", + label: "Impersonated User Name", + description: "UPN of an effective identity to use for Row-Level Security (RLS). Typically only needed for datasets with RLS roles configured. Example: `someuser@mycompany.com`", + optional: true, + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + const data = { + queries: [ + { + query: this.query, + }, + ], + serializerSettings: { + includeNulls: this.includeNulls ?? true, + }, + }; + if (this.impersonatedUserName) { + data.impersonatedUserName = this.impersonatedUserName; + } + const response = await this.app.executeQueries({ + $, + datasetId: this.datasetId, + groupId, + data, + }); + const rowCount = response.results?.[0]?.tables?.[0]?.rows?.length ?? 0; + $.export("$summary", `DAX query returned ${rowCount} row${rowCount === 1 + ? "" + : "s"}`); + return response; + }, +}; diff --git a/components/microsoft_power_bi/actions/export-report/export-report.mjs b/components/microsoft_power_bi/actions/export-report/export-report.mjs new file mode 100644 index 0000000000000..e550a98225cd2 --- /dev/null +++ b/components/microsoft_power_bi/actions/export-report/export-report.mjs @@ -0,0 +1,164 @@ +import { setTimeout as sleep } from "timers/promises"; +import app from "../../microsoft_power_bi.app.mjs"; + +const TERMINAL_STATUSES = new Set([ + "Succeeded", + "Failed", +]); + +export default { + key: "microsoft_power_bi-export-report", + name: "Export Report", + description: "Export a Power BI report to a file format such as PDF, PPTX, or PNG. Requires a report ID (use **List Reports** to find it) and defaults to PDF if no format is given." + + " Pass `workspaceId` (from **List Workspaces**) or `workspaceName` to target a specific workspace, or omit both for My workspace." + + " Supported `format` values depend on the report type:" + + " Power BI reports support `PDF`, `PPTX`, `PNG`." + + " Paginated reports additionally support `CSV`, `XLSX`, `DOCX`, `XML`, `MHTML`." + + " This API is **Premium-only**: requires the workspace to be backed by Premium capacity, Premium Per User, or Embedded capacity. On shared (free) capacity it returns `FixedCapacityLimitExceeded` / 403." + + " The export is asynchronous — this tool starts the export, then polls until the job reaches `Succeeded` or `Failed` (or `pollTimeoutSeconds` elapses), then downloads the file and returns it as base64 along with the job metadata." + + " PNG exports only work for single-page reports. For PPTX/PDF, pass `pages` (array of page names, e.g., `[\"ReportSection\", \"ReportSection1\"]`) to limit the export." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/reports/export-to-file-in-group)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + reportId: { + type: "string", + label: "Report ID", + description: "ID of the report to export. Use **List Reports** to find IDs by name.", + }, + format: { + type: "string", + label: "Format", + description: "Output file format. Defaults to `PDF`. `PDF`/`PPTX`/`PNG` work for Power BI reports (PNG is single-page only). `CSV`/`XLSX`/`DOCX`/`XML`/`MHTML` are only supported for paginated reports.", + options: [ + "PDF", + "PPTX", + "PNG", + "CSV", + "XLSX", + "DOCX", + "XML", + "MHTML", + ], + optional: true, + default: "PDF", + }, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + pages: { + type: "string[]", + label: "Pages", + description: "Optional list of page names to include in the export. Page names are from the report's internal section IDs (e.g., `ReportSection1`), not visible page titles. If omitted, all pages are exported.", + optional: true, + }, + pollIntervalSeconds: { + type: "integer", + label: "Poll Interval (seconds)", + description: "How often to poll the export job status. Minimum 1.", + optional: true, + default: 5, + }, + pollTimeoutSeconds: { + type: "integer", + label: "Poll Timeout (seconds)", + description: "Maximum time to wait for the export to complete before returning the in-progress job metadata. Default 300s.", + optional: true, + default: 300, + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + + const format = this.format ?? "PDF"; + const exportRequest = { + format, + }; + if (this.pages?.length) { + exportRequest.powerBIReportConfiguration = { + pages: this.pages.map((name) => ({ + pageName: name, + })), + }; + } + + const startResponse = await this.app.startReportExport({ + $, + reportId: this.reportId, + groupId, + data: exportRequest, + }); + const exportId = startResponse.id; + + const pollInterval = Math.max(1, this.pollIntervalSeconds ?? 5) * 1000; + const timeoutMs = Math.max(pollInterval, (this.pollTimeoutSeconds ?? 300) * 1000); + const deadline = Date.now() + timeoutMs; + + let status = startResponse; + while (!TERMINAL_STATUSES.has(status.status) && Date.now() < deadline) { + await sleep(pollInterval); + status = await this.app.getReportExportStatus({ + $, + reportId: this.reportId, + exportId, + groupId, + }); + } + + if (status.status !== "Succeeded") { + const summary = TERMINAL_STATUSES.has(status.status) + ? `Report export ${exportId} finished with status ${status.status}` + : `Report export ${exportId} polling timed out at status ${status.status}`; + $.export("$summary", summary); + return { + exportId, + status: status.status, + percentComplete: status.percentComplete, + error: status.error, + reportId: this.reportId, + }; + } + + const fileResponse = await this.app.getReportExportFile({ + $, + reportId: this.reportId, + exportId, + groupId, + }); + const fileBuffer = Buffer.isBuffer(fileResponse.data) + ? fileResponse.data + : Buffer.from(fileResponse.data); + const base64 = fileBuffer.toString("base64"); + + $.export("$summary", `Exported report ${this.reportId} to ${format} (${fileBuffer.length} bytes)`); + return { + exportId, + status: "Succeeded", + reportId: this.reportId, + format, + resourceFileExtension: status.resourceFileExtension, + resourceLocation: status.resourceLocation, + fileSizeBytes: fileBuffer.length, + fileBase64: base64, + }; + }, +}; diff --git a/components/microsoft_power_bi/actions/get-dataset-refresh/get-dataset-refresh.mjs b/components/microsoft_power_bi/actions/get-dataset-refresh/get-dataset-refresh.mjs deleted file mode 100644 index 692b690adba15..0000000000000 --- a/components/microsoft_power_bi/actions/get-dataset-refresh/get-dataset-refresh.mjs +++ /dev/null @@ -1,59 +0,0 @@ -import { ConfigurationError } from "@pipedream/platform"; -import app from "../../microsoft_power_bi.app.mjs"; - -export default { - key: "microsoft_power_bi-get-dataset-refresh", - name: "Get Dataset Refresh", - description: "Triggers a refresh operation for a specified Power BI dataset. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history)", - version: "0.0.3", - annotations: { - destructiveHint: false, - openWorldHint: true, - readOnlyHint: true, - }, - type: "action", - props: { - app, - datasetId: { - propDefinition: [ - app, - "datasetId", - ], - optional: true, - }, - customDatasetId: { - propDefinition: [ - app, - "customDatasetId", - ], - }, - top: { - type: "integer", - label: "Top", - description: "The number of refresh history items to retrieve.", - optional: true, - }, - }, - async run({ $ }) { - const { - datasetId, - customDatasetId, - top, - } = this; - - if (!datasetId && !customDatasetId) { - throw new ConfigurationError("Must enter one of Dataset ID or custom Dataset ID"); - } - - const response = await this.app.getRefreshHistory({ - $, - datasetId: datasetId || customDatasetId, - params: { - ["$top"]: top, - }, - }); - - $.export("$summary", `Successfully retrieved refresh history for dataset (ID \`${datasetId || customDatasetId}\`)`); - return response; - }, -}; diff --git a/components/microsoft_power_bi/actions/get-refresh-history/get-refresh-history.mjs b/components/microsoft_power_bi/actions/get-refresh-history/get-refresh-history.mjs new file mode 100644 index 0000000000000..a120870fd6a90 --- /dev/null +++ b/components/microsoft_power_bi/actions/get-refresh-history/get-refresh-history.mjs @@ -0,0 +1,63 @@ +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-get-refresh-history", + name: "Get Refresh History", + description: "Get the refresh history for a Power BI dataset." + + " Use **List Datasets** first to resolve a dataset name → `datasetId`." + + " Pass `workspaceId` (from **List Workspaces**) or `workspaceName` to scope to a specific workspace, or omit both for My workspace." + + " Each entry includes `requestId`, `refreshType` (`OnDemand`, `Scheduled`, `ViaApi`, etc.), `startTime`, `endTime`, `status` (`Completed`, `Failed`, `Disabled`, `Cancelled`, `Unknown` — `Unknown` means still in progress), and `serviceExceptionJson` on failures." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history-in-group)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + datasetId: { + type: "string", + label: "Dataset ID", + description: "ID of the dataset. Use **List Datasets** to find IDs by name.", + }, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + top: { + type: "integer", + label: "Top", + description: "Number of refresh entries to return (most recent first). Max 200. Omit to return the default page.", + optional: true, + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + const history = await this.app.getRefreshHistory({ + $, + datasetId: this.datasetId, + groupId, + params: { + ["$top"]: this.top, + }, + }); + $.export("$summary", `Found ${history.length} refresh record${history.length === 1 + ? "" + : "s"} for dataset ${this.datasetId}`); + return history; + }, +}; diff --git a/components/microsoft_power_bi/actions/get-reports/get-reports.mjs b/components/microsoft_power_bi/actions/get-reports/get-reports.mjs index 02696a6635353..98567e5f96ba4 100644 --- a/components/microsoft_power_bi/actions/get-reports/get-reports.mjs +++ b/components/microsoft_power_bi/actions/get-reports/get-reports.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_power_bi-get-reports", name: "Get Reports", description: "Get reports from a Power BI workspace. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/reports/get-reports)", - version: "0.0.3", + version: "0.0.4", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/microsoft_power_bi/actions/list-dashboards/list-dashboards.mjs b/components/microsoft_power_bi/actions/list-dashboards/list-dashboards.mjs new file mode 100644 index 0000000000000..cce0634349d13 --- /dev/null +++ b/components/microsoft_power_bi/actions/list-dashboards/list-dashboards.mjs @@ -0,0 +1,52 @@ +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-list-dashboards", + name: "List Dashboards", + description: "List Power BI dashboards in a workspace." + + " Defaults to the authenticated user's personal My workspace when no workspace is specified." + + " Pass `workspaceId` (preferred, from **List Workspaces**) OR `workspaceName` to scope to a specific workspace." + + " Each dashboard includes `id`, `displayName`, `isReadOnly`, `webUrl`, and `embedUrl`." + + " Note: dashboards cannot be created via the REST API — they are built interactively in the Power BI service." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/dashboards/get-dashboards-in-group)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + const dashboards = await this.app.listDashboards({ + $, + groupId, + }); + const scope = groupId + ? `workspace ${this.workspaceName || groupId}` + : "My workspace"; + $.export("$summary", `Found ${dashboards.length} dashboard${dashboards.length === 1 + ? "" + : "s"} in ${scope}`); + return dashboards; + }, +}; diff --git a/components/microsoft_power_bi/actions/list-datasets/list-datasets.mjs b/components/microsoft_power_bi/actions/list-datasets/list-datasets.mjs new file mode 100644 index 0000000000000..6c5e7ac0b8bdf --- /dev/null +++ b/components/microsoft_power_bi/actions/list-datasets/list-datasets.mjs @@ -0,0 +1,53 @@ +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-list-datasets", + name: "List Datasets", + description: "List Power BI datasets (semantic models) in a workspace." + + " Defaults to the authenticated user's personal My workspace when no workspace is specified." + + " Pass `workspaceId` (preferred, from **List Workspaces**) OR `workspaceName` to scope to a specific workspace." + + " Each dataset includes `id`, `name`, `webUrl`, `addRowsAPIEnabled` (true for Push Datasets), `isRefreshable`, and `defaultMode` (`Push`, `Streaming`, `PushStreaming`, `AsOnPrem`, `AsAzure`)." + + " Use this tool to resolve a dataset name → ID before calling **Refresh Dataset**, **Execute DAX Query**, **Get Refresh History**, or **Add Rows To Push Dataset**." + + " For push-dataset row inserts, call the dataset's `GET tables` endpoint (not exposed as a separate tool) by inspecting the dataset's `name` → tables are defined at dataset creation; the table name is the string configured at creation time (e.g., `Species`)." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-datasets-in-group)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + const datasets = await this.app.listDatasets({ + $, + groupId, + }); + const scope = groupId + ? `workspace ${this.workspaceName || groupId}` + : "My workspace"; + $.export("$summary", `Found ${datasets.length} dataset${datasets.length === 1 + ? "" + : "s"} in ${scope}`); + return datasets; + }, +}; diff --git a/components/microsoft_power_bi/actions/list-reports/list-reports.mjs b/components/microsoft_power_bi/actions/list-reports/list-reports.mjs new file mode 100644 index 0000000000000..44b0466501455 --- /dev/null +++ b/components/microsoft_power_bi/actions/list-reports/list-reports.mjs @@ -0,0 +1,52 @@ +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-list-reports", + name: "List Reports", + description: "List Power BI reports in a workspace." + + " Defaults to the authenticated user's personal My workspace when no workspace is specified." + + " Pass `workspaceId` (preferred, from **List Workspaces**) OR `workspaceName` to scope to a specific workspace — the tool resolves the name to an ID server-side." + + " Each report includes `id`, `name`, `webUrl`, `embedUrl`, `datasetId`, and `reportType` (`PowerBIReport` or `PaginatedReport`)." + + " Note: reports cannot be created via the REST API — they are published from Power BI Desktop." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/reports/get-reports)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { + propDefinition: [ + app, + "workspaceName", + ], + }, + }, + async run({ $ }) { + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + const reports = await this.app.listReports({ + $, + groupId, + }); + const scope = groupId + ? `workspace ${this.workspaceName || groupId}` + : "My workspace"; + $.export("$summary", `Found ${reports.length} report${reports.length === 1 + ? "" + : "s"} in ${scope}`); + return reports; + }, +}; diff --git a/components/microsoft_power_bi/actions/list-workspaces/list-workspaces.mjs b/components/microsoft_power_bi/actions/list-workspaces/list-workspaces.mjs new file mode 100644 index 0000000000000..d4c45d818764c --- /dev/null +++ b/components/microsoft_power_bi/actions/list-workspaces/list-workspaces.mjs @@ -0,0 +1,31 @@ +import app from "../../microsoft_power_bi.app.mjs"; + +export default { + key: "microsoft_power_bi-list-workspaces", + name: "List Workspaces", + description: "List the Power BI workspaces (groups) the authenticated user can access." + + " Use this tool first whenever the user refers to a workspace by name — it returns the `id` you need to pass as `workspaceId` to other tools." + + " Power BI has no `/me` endpoint, so the set of accessible workspaces is the user's primary context (the 'who am I' signal for this app)." + + " Every item in the response includes `id`, `name`, `isReadOnly`, `isOnDedicatedCapacity`, and `type`." + + " Note: when a user says 'my workspace' without a name, they may mean personal My workspace (implicit — pass no `workspaceId` to other tools) OR a specific named workspace — ask only if ambiguous." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/groups/get-groups)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + }, + async run({ $ }) { + const groups = await this.app.listGroups({ + $, + }); + $.export("$summary", `Found ${groups.length} workspace${groups.length === 1 + ? "" + : "s"}`); + return groups; + }, +}; diff --git a/components/microsoft_power_bi/actions/refresh-dataset/refresh-dataset.mjs b/components/microsoft_power_bi/actions/refresh-dataset/refresh-dataset.mjs index 13c3ed7784b93..a939d0b7a3234 100644 --- a/components/microsoft_power_bi/actions/refresh-dataset/refresh-dataset.mjs +++ b/components/microsoft_power_bi/actions/refresh-dataset/refresh-dataset.mjs @@ -1,32 +1,87 @@ -import powerBi from "../../microsoft_power_bi.app.mjs"; +import app from "../../microsoft_power_bi.app.mjs"; export default { key: "microsoft_power_bi-refresh-dataset", name: "Refresh Dataset", - description: "Triggers a refresh operation for a specified Power BI dataset. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/refresh-dataset)", - version: "0.0.5", + description: "Trigger a refresh of a Power BI dataset. Returns 202 Accepted on success; the request ID is available in the `Location` response header (last path segment) and `x-ms-request-id` header — use **Get Refresh History** to check status." + + " Use **List Datasets** first to resolve a dataset name → `datasetId`." + + " Pass `workspaceId` (from **List Workspaces**) or `workspaceName` to target a specific workspace, or omit both for My workspace." + + " `notifyOption` controls email notifications on refresh outcome: `NoNotification` (default), `MailOnCompletion`, or `MailOnFailure`." + + " Power BI Pro licenses allow up to 8 scheduled refreshes per day; Premium allows 48." + + " Note: Push datasets accept this endpoint but the refresh is metadata-only (tile refresh), not a data refresh — no cancellable history entry is produced." + + " [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/refresh-dataset-in-group)", + version: "0.1.0", + type: "action", annotations: { destructiveHint: false, openWorldHint: true, readOnlyHint: false, }, - type: "action", props: { - powerBi, + app, datasetId: { + type: "string", + label: "Dataset ID", + description: "ID of the dataset to refresh. Example: `cfafbeb1-8037-4d0c-896e-a46fb27ff229`. Use **List Datasets** to find IDs by name.", + }, + workspaceId: { + propDefinition: [ + app, + "workspaceId", + ], + }, + workspaceName: { propDefinition: [ - powerBi, - "datasetId", + app, + "workspaceName", ], }, + notifyOption: { + type: "string", + label: "Notify Option", + description: "Email notification behavior on refresh outcome. Allowed values: `NoNotification` (default), `MailOnCompletion`, `MailOnFailure`.", + options: [ + "NoNotification", + "MailOnCompletion", + "MailOnFailure", + ], + optional: true, + default: "NoNotification", + }, }, async run({ $ }) { - const response = await this.powerBi.refreshDataset({ + const groupId = await this.app.resolveGroupId({ + $, + workspaceId: this.workspaceId, + workspaceName: this.workspaceName, + }); + const response = await this.app.refreshDataset({ $, datasetId: this.datasetId, + groupId, + data: { + notifyOption: this.notifyOption ?? "NoNotification", + }, + returnFullResponse: true, }); + const headers = response?.headers ?? {}; + const location = headers.location || headers.Location; + const requestIdFromLocation = location?.split("/").filter(Boolean) + .pop(); + const requestId = requestIdFromLocation + || headers["x-ms-request-id"] + || headers.requestid; - $.export("$summary", `Successfully triggered a refresh for dataset (ID ${this.datasetId})`); - return response; + $.export("$summary", `Triggered refresh of dataset ${this.datasetId}${requestId + ? ` (requestId ${requestId})` + : ""}`); + return { + status: response?.status ?? 202, + requestId, + datasetId: this.datasetId, + groupId, + location, + headers, + }; }, }; diff --git a/components/microsoft_power_bi/microsoft_power_bi.app.mjs b/components/microsoft_power_bi/microsoft_power_bi.app.mjs index cb0814d1fde11..23b7f75ea2d88 100644 --- a/components/microsoft_power_bi/microsoft_power_bi.app.mjs +++ b/components/microsoft_power_bi/microsoft_power_bi.app.mjs @@ -46,33 +46,34 @@ export default { label: "Rows", description: "An array of data rows to add to the dataset table. Each element should be a JSON object represented using key-value format.", }, - refreshId: { - type: "string", - label: "Refresh ID", - description: "Select a refresh operation or provide a custom ID. Refreshes that have already been completed are not listed.", - async options({ datasetId }) { - const refreshes = await this.getRefreshHistory({ - datasetId, - }); - return refreshes?.filter?.(({ status }) => status !== "Completed").map(({ - requestId, startTime, status, - }) => ({ - label: `${startTime} (${status})`, - value: requestId, - })); - }, - }, customDatasetId: { type: "string", label: "Custom Dataset ID", description: "You may enter a Dataset ID directly. Either Dataset ID or Custom Dataset ID must be entered.", optional: true, }, + workspaceId: { + type: "string", + label: "Workspace ID", + description: "ID of the workspace. Use **List Workspaces** to find IDs. Omit to target My workspace.", + optional: true, + }, + workspaceName: { + type: "string", + label: "Workspace Name", + description: "Name of the workspace (alternative to `workspaceId`). Resolved via **List Workspaces**.", + optional: true, + }, }, methods: { _baseUrl() { return "https://api.powerbi.com/v1.0/myorg"; }, + _groupPrefix(groupId) { + return groupId + ? `/groups/${groupId}` + : ""; + }, async _makeRequest({ $ = this, path, headers, ...otherOpts }) { @@ -90,55 +91,103 @@ export default { throw new ConfigurationError(error.message); } }, - addRowsToTable({ - datasetId, tableName, ...args + async resolveGroupId({ + $, workspaceId, workspaceName, }) { - return this._makeRequest({ - method: "POST", - path: `/datasets/${datasetId}/tables/${tableName}/rows`, - ...args, + if (workspaceId) return workspaceId; + if (!workspaceName) return undefined; + const groups = await this.listGroups({ + $, }); + const match = groups.find(({ name }) => name === workspaceName); + if (!match) { + throw new ConfigurationError(`No workspace found with name "${workspaceName}". Use the List Workspaces tool to see accessible workspaces.`); + } + return match.id; }, - refreshDataset({ - datasetId, ...args + async listGroups({ $ } = {}) { + const response = await this._makeRequest({ + $, + method: "GET", + path: "/groups", + }); + return response.value; + }, + async listReports({ + $, groupId, + } = {}) { + const response = await this._makeRequest({ + $, + method: "GET", + path: `${this._groupPrefix(groupId)}/reports`, + }); + return response.value; + }, + async listDatasets({ + $, groupId, + } = {}) { + const response = await this._makeRequest({ + $, + method: "GET", + path: `${this._groupPrefix(groupId)}/datasets`, + }); + return response.value; + }, + async listDashboards({ + $, groupId, + } = {}) { + const response = await this._makeRequest({ + $, + method: "GET", + path: `${this._groupPrefix(groupId)}/dashboards`, + }); + return response.value; + }, + addRowsToTable({ + $, datasetId, tableName, groupId, ...args }) { return this._makeRequest({ + $, method: "POST", - path: `/datasets/${datasetId}/refreshes`, + path: `${this._groupPrefix(groupId)}/datasets/${datasetId}/tables/${tableName}/rows`, ...args, }); }, - cancelRefresh({ - datasetId, refreshId, ...args + refreshDataset({ + $, datasetId, groupId, ...args }) { return this._makeRequest({ - method: "DELETE", - path: `/datasets/${datasetId}/refreshes/${refreshId}`, + $, + method: "POST", + path: `${this._groupPrefix(groupId)}/datasets/${datasetId}/refreshes`, ...args, }); }, async getRefreshHistory({ - datasetId, ...args + $, datasetId, groupId, ...args }) { const response = await this._makeRequest({ + $, method: "GET", - path: `/datasets/${datasetId}/refreshes`, + path: `${this._groupPrefix(groupId)}/datasets/${datasetId}/refreshes`, ...args, }); return response.value; }, async getTables({ - datasetId, ...args + $, datasetId, groupId, ...args }) { const response = await this._makeRequest({ + $, method: "GET", - path: `/datasets/${datasetId}/tables`, + path: `${this._groupPrefix(groupId)}/datasets/${datasetId}/tables`, ...args, }); return response.value; }, - async getDatasets() { + async getDatasets({ $ } = {}) { const response = await this._makeRequest({ + $, method: "GET", path: "/datasets/", }); @@ -151,5 +200,45 @@ export default { ...args, }); }, + executeQueries({ + $, datasetId, groupId, data, + }) { + return this._makeRequest({ + $, + method: "POST", + path: `${this._groupPrefix(groupId)}/datasets/${datasetId}/executeQueries`, + data, + }); + }, + startReportExport({ + $, reportId, groupId, data, + }) { + return this._makeRequest({ + $, + method: "POST", + path: `${this._groupPrefix(groupId)}/reports/${reportId}/ExportTo`, + data, + }); + }, + getReportExportStatus({ + $, reportId, exportId, groupId, + }) { + return this._makeRequest({ + $, + method: "GET", + path: `${this._groupPrefix(groupId)}/reports/${reportId}/exports/${exportId}`, + }); + }, + getReportExportFile({ + $, reportId, exportId, groupId, + }) { + return this._makeRequest({ + $, + method: "GET", + path: `${this._groupPrefix(groupId)}/reports/${reportId}/exports/${exportId}/file`, + responseType: "arraybuffer", + returnFullResponse: true, + }); + }, }, }; diff --git a/components/microsoft_power_bi/package.json b/components/microsoft_power_bi/package.json index 7b00422e5d06d..a204c2b1de3dd 100644 --- a/components/microsoft_power_bi/package.json +++ b/components/microsoft_power_bi/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/microsoft_power_bi", - "version": "0.4.1", + "version": "0.5.0", "description": "Pipedream Microsoft Power BI Components", "main": "microsoft_power_bi.app.mjs", "keywords": [ diff --git a/components/microsoft_power_bi/sources/dataset-refresh-completed/dataset-refresh-completed.mjs b/components/microsoft_power_bi/sources/dataset-refresh-completed/dataset-refresh-completed.mjs index a19ffe4f23028..332218acaf940 100644 --- a/components/microsoft_power_bi/sources/dataset-refresh-completed/dataset-refresh-completed.mjs +++ b/components/microsoft_power_bi/sources/dataset-refresh-completed/dataset-refresh-completed.mjs @@ -3,8 +3,8 @@ import common from "../common.mjs"; export default { key: "microsoft_power_bi-dataset-refresh-completed", name: "Dataset Refresh Completed", - description: "Emits a new event when a dataset refresh operation has completed. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history)", - version: "0.0.5", + description: "Emit new event when a dataset refresh operation has completed. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history)", + version: "0.0.6", type: "source", dedupe: "unique", ...common, diff --git a/components/microsoft_power_bi/sources/dataset-refresh-failed/dataset-refresh-failed.mjs b/components/microsoft_power_bi/sources/dataset-refresh-failed/dataset-refresh-failed.mjs index b00f603822fee..a5c11930ac25b 100644 --- a/components/microsoft_power_bi/sources/dataset-refresh-failed/dataset-refresh-failed.mjs +++ b/components/microsoft_power_bi/sources/dataset-refresh-failed/dataset-refresh-failed.mjs @@ -3,8 +3,8 @@ import common from "../common.mjs"; export default { key: "microsoft_power_bi-dataset-refresh-failed", name: "Dataset Refresh Failed", - description: "Emits an event when a dataset refresh operation has failed in Power BI. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history)", - version: "0.0.5", + description: "Emit new event when a dataset refresh operation has failed in Power BI. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history)", + version: "0.0.6", type: "source", dedupe: "unique", ...common, diff --git a/components/microsoft_power_bi/sources/new-dataset-refresh-created/new-dataset-refresh-created.mjs b/components/microsoft_power_bi/sources/new-dataset-refresh-created/new-dataset-refresh-created.mjs index 5f2636b17d05b..34abe0d884f04 100644 --- a/components/microsoft_power_bi/sources/new-dataset-refresh-created/new-dataset-refresh-created.mjs +++ b/components/microsoft_power_bi/sources/new-dataset-refresh-created/new-dataset-refresh-created.mjs @@ -4,7 +4,7 @@ export default { key: "microsoft_power_bi-new-dataset-refresh-created", name: "New Dataset Refresh Created", description: "Emit new event when a new dataset refresh operation is created. [See the documentation](https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/get-refresh-history)", - version: "0.0.2", + version: "0.0.3", type: "source", dedupe: "unique", ...common, diff --git a/components/niledesk/niledesk.app.mjs b/components/niledesk/niledesk.app.mjs index 86ce902d9b04f..d6ea48438a22e 100644 --- a/components/niledesk/niledesk.app.mjs +++ b/components/niledesk/niledesk.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/okx_wallet/okx_wallet.app.mjs b/components/okx_wallet/okx_wallet.app.mjs index d6b0478746b0f..9124c6f49df6b 100644 --- a/components/okx_wallet/okx_wallet.app.mjs +++ b/components/okx_wallet/okx_wallet.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/opensrs/package.json b/components/opensrs/package.json index 06de96360f313..3384d68baa45b 100644 --- a/components/opensrs/package.json +++ b/components/opensrs/package.json @@ -14,6 +14,6 @@ }, "dependencies": { "@pipedream/platform": "^3.1.1", - "fast-xml-parser": "^5.5.7" + "fast-xml-parser": "^5.7.0" } } diff --git a/components/phemex/phemex.app.mjs b/components/phemex/phemex.app.mjs index 44435ad8cdf8c..c0337759d5080 100644 --- a/components/phemex/phemex.app.mjs +++ b/components/phemex/phemex.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/polly_help/package.json b/components/polly_help/package.json new file mode 100644 index 0000000000000..c0fafe4911c5f --- /dev/null +++ b/components/polly_help/package.json @@ -0,0 +1,15 @@ +{ + "name": "@pipedream/polly_help", + "version": "0.0.1", + "description": "Pipedream Polly.Help Components", + "main": "polly_help.app.mjs", + "keywords": [ + "pipedream", + "polly_help" + ], + "homepage": "https://pipedream.com/apps/polly_help", + "author": "Pipedream (https://pipedream.com/)", + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/components/polly_help/polly_help.app.mjs b/components/polly_help/polly_help.app.mjs new file mode 100644 index 0000000000000..b13c1f759d9e9 --- /dev/null +++ b/components/polly_help/polly_help.app.mjs @@ -0,0 +1,11 @@ +export default { + type: "app", + app: "polly_help", + propDefinitions: {}, + methods: { + // this.$auth contains connected account data + authKeys() { + console.log(Object.keys(this.$auth)); + }, + }, +}; \ No newline at end of file diff --git a/components/privatebin/privatebin.app.mjs b/components/privatebin/privatebin.app.mjs index ee177394acb18..b18c00356994d 100644 --- a/components/privatebin/privatebin.app.mjs +++ b/components/privatebin/privatebin.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/salesforce_rest_api/package.json b/components/salesforce_rest_api/package.json index d586c28c41039..e2599aaad7bad 100644 --- a/components/salesforce_rest_api/package.json +++ b/components/salesforce_rest_api/package.json @@ -11,7 +11,7 @@ "author": "Pipedream (https://pipedream.com/)", "dependencies": { "@pipedream/platform": "^3.1.1", - "fast-xml-parser": "^5.5.7", + "fast-xml-parser": "^5.7.0", "handlebars": "^4.7.9", "lodash": "^4.18.1", "lodash-es": "^4.18.1", diff --git a/components/servicenow_oauth_/servicenow_oauth_.app.mjs b/components/servicenow_oauth_/servicenow_oauth_.app.mjs index 1fdadbcdeedee..e1eb535107d67 100644 --- a/components/servicenow_oauth_/servicenow_oauth_.app.mjs +++ b/components/servicenow_oauth_/servicenow_oauth_.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/shopify_developer_app/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs b/components/shopify_developer_app/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs index c7e062f16312e..07a46d0972ab2 100644 --- a/components/shopify_developer_app/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs +++ b/components/shopify_developer_app/actions/add-product-to-custom-collection/add-product-to-custom-collection.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-add-product-to-custom-collection", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/add-tags/add-tags.mjs b/components/shopify_developer_app/actions/add-tags/add-tags.mjs index a841190ca54f5..20ba20a15adcd 100644 --- a/components/shopify_developer_app/actions/add-tags/add-tags.mjs +++ b/components/shopify_developer_app/actions/add-tags/add-tags.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-add-tags", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/create-article/create-article.mjs b/components/shopify_developer_app/actions/create-article/create-article.mjs index 1d65fdc9df3ca..45c3b5d1e6b80 100644 --- a/components/shopify_developer_app/actions/create-article/create-article.mjs +++ b/components/shopify_developer_app/actions/create-article/create-article.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-article", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/create-blog/create-blog.mjs b/components/shopify_developer_app/actions/create-blog/create-blog.mjs index fdd4194b25f3d..b64bc4ade3e23 100644 --- a/components/shopify_developer_app/actions/create-blog/create-blog.mjs +++ b/components/shopify_developer_app/actions/create-blog/create-blog.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-blog", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/create-custom-collection/create-custom-collection.mjs b/components/shopify_developer_app/actions/create-custom-collection/create-custom-collection.mjs index 8c08d59e08e77..54a1981d1f9f3 100644 --- a/components/shopify_developer_app/actions/create-custom-collection/create-custom-collection.mjs +++ b/components/shopify_developer_app/actions/create-custom-collection/create-custom-collection.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-custom-collection", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/create-customer/create-customer.mjs b/components/shopify_developer_app/actions/create-customer/create-customer.mjs index 1bca0cda99df3..a2de82984e5f6 100644 --- a/components/shopify_developer_app/actions/create-customer/create-customer.mjs +++ b/components/shopify_developer_app/actions/create-customer/create-customer.mjs @@ -4,7 +4,7 @@ export default { key: "shopify_developer_app-create-customer", name: "Create Customer", description: "Create a new customer. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/mutations/customercreate)", - version: "0.0.13", + version: "0.0.14", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/create-fulfillment/create-fulfillment.mjs b/components/shopify_developer_app/actions/create-fulfillment/create-fulfillment.mjs index e8bc7d4a002e9..49b14f813721d 100644 --- a/components/shopify_developer_app/actions/create-fulfillment/create-fulfillment.mjs +++ b/components/shopify_developer_app/actions/create-fulfillment/create-fulfillment.mjs @@ -4,7 +4,7 @@ export default { key: "shopify_developer_app-create-fulfillment", name: "Create Fulfillment", description: "Create a fulfillment. [See the documentation](https://shopify.dev/docs/api/admin-graphql/unstable/mutations/fulfillmentcreate)", - version: "0.0.5", + version: "0.0.6", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/create-metafield/create-metafield.mjs b/components/shopify_developer_app/actions/create-metafield/create-metafield.mjs index d9945d4bdaad4..d93d7f540353d 100644 --- a/components/shopify_developer_app/actions/create-metafield/create-metafield.mjs +++ b/components/shopify_developer_app/actions/create-metafield/create-metafield.mjs @@ -10,7 +10,7 @@ const { export default { ...others, key: "shopify_developer_app-create-metafield", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/actions/create-metaobject/create-metaobject.mjs b/components/shopify_developer_app/actions/create-metaobject/create-metaobject.mjs index 8065d9ce1a9cf..779465ee4b969 100644 --- a/components/shopify_developer_app/actions/create-metaobject/create-metaobject.mjs +++ b/components/shopify_developer_app/actions/create-metaobject/create-metaobject.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-metaobject", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/create-order/create-order.mjs b/components/shopify_developer_app/actions/create-order/create-order.mjs index 117786c7437d6..40fd0e9f93110 100644 --- a/components/shopify_developer_app/actions/create-order/create-order.mjs +++ b/components/shopify_developer_app/actions/create-order/create-order.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-create-order", name: "Create Order", description: "Creates a new order. For full order object details [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/mutations/ordercreate)", - version: "0.0.14", + version: "0.0.15", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/create-page/create-page.mjs b/components/shopify_developer_app/actions/create-page/create-page.mjs index 82bb257ca939c..aa3ffeb8447cf 100644 --- a/components/shopify_developer_app/actions/create-page/create-page.mjs +++ b/components/shopify_developer_app/actions/create-page/create-page.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-page", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/create-product-variant/create-product-variant.mjs b/components/shopify_developer_app/actions/create-product-variant/create-product-variant.mjs index 4e4395ba87cb6..febaedb7c2d9a 100644 --- a/components/shopify_developer_app/actions/create-product-variant/create-product-variant.mjs +++ b/components/shopify_developer_app/actions/create-product-variant/create-product-variant.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-product-variant", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/actions/create-product/create-product.mjs b/components/shopify_developer_app/actions/create-product/create-product.mjs index b019697adcc93..32858c2a9c5e3 100644 --- a/components/shopify_developer_app/actions/create-product/create-product.mjs +++ b/components/shopify_developer_app/actions/create-product/create-product.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-product", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/create-smart-collection/create-smart-collection.mjs b/components/shopify_developer_app/actions/create-smart-collection/create-smart-collection.mjs index cc6fee5e80b2b..55a069eee5919 100644 --- a/components/shopify_developer_app/actions/create-smart-collection/create-smart-collection.mjs +++ b/components/shopify_developer_app/actions/create-smart-collection/create-smart-collection.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-create-smart-collection", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/delete-article/delete-article.mjs b/components/shopify_developer_app/actions/delete-article/delete-article.mjs index aa1a06ca9ed6f..65f2dc34aa5eb 100644 --- a/components/shopify_developer_app/actions/delete-article/delete-article.mjs +++ b/components/shopify_developer_app/actions/delete-article/delete-article.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-delete-article", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/delete-blog/delete-blog.mjs b/components/shopify_developer_app/actions/delete-blog/delete-blog.mjs index 38bb2288dd7dc..93331435f2862 100644 --- a/components/shopify_developer_app/actions/delete-blog/delete-blog.mjs +++ b/components/shopify_developer_app/actions/delete-blog/delete-blog.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-delete-blog", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/delete-metafield/delete-metafield.mjs b/components/shopify_developer_app/actions/delete-metafield/delete-metafield.mjs index 174b78255a711..30394ffdbf838 100644 --- a/components/shopify_developer_app/actions/delete-metafield/delete-metafield.mjs +++ b/components/shopify_developer_app/actions/delete-metafield/delete-metafield.mjs @@ -9,7 +9,7 @@ const { export default { ...others, key: "shopify_developer_app-delete-metafield", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/actions/delete-page/delete-page.mjs b/components/shopify_developer_app/actions/delete-page/delete-page.mjs index 5d09de1fcdb2e..4fc3653657d9f 100644 --- a/components/shopify_developer_app/actions/delete-page/delete-page.mjs +++ b/components/shopify_developer_app/actions/delete-page/delete-page.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-delete-page", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/get-articles/get-articles.mjs b/components/shopify_developer_app/actions/get-articles/get-articles.mjs index 6e81a904c1d7a..86bbb0415efae 100644 --- a/components/shopify_developer_app/actions/get-articles/get-articles.mjs +++ b/components/shopify_developer_app/actions/get-articles/get-articles.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-get-articles", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/get-metafields/get-metafields.mjs b/components/shopify_developer_app/actions/get-metafields/get-metafields.mjs index 7a8599e3e13d4..cc813c7889823 100644 --- a/components/shopify_developer_app/actions/get-metafields/get-metafields.mjs +++ b/components/shopify_developer_app/actions/get-metafields/get-metafields.mjs @@ -8,7 +8,7 @@ const { export default { key: "shopify_developer_app-get-metafields", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/actions/get-metaobjects/get-metaobjects.mjs b/components/shopify_developer_app/actions/get-metaobjects/get-metaobjects.mjs index 1e5db95582705..bf38ef130ecc2 100644 --- a/components/shopify_developer_app/actions/get-metaobjects/get-metaobjects.mjs +++ b/components/shopify_developer_app/actions/get-metaobjects/get-metaobjects.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-get-metaobjects", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/actions/get-order/get-order.mjs b/components/shopify_developer_app/actions/get-order/get-order.mjs index 872497d746586..b389b867efb63 100644 --- a/components/shopify_developer_app/actions/get-order/get-order.mjs +++ b/components/shopify_developer_app/actions/get-order/get-order.mjs @@ -6,7 +6,7 @@ export default { key: "shopify_developer_app-get-order", name: "Get Order", description: "Retrieve an order by specifying the order ID. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/queries/order)", - version: "0.0.13", + version: "0.0.14", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/get-pages/get-pages.mjs b/components/shopify_developer_app/actions/get-pages/get-pages.mjs index 862efb0e6a607..c1b9592ea26e2 100644 --- a/components/shopify_developer_app/actions/get-pages/get-pages.mjs +++ b/components/shopify_developer_app/actions/get-pages/get-pages.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-get-pages", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/refund-order/refund-order.mjs b/components/shopify_developer_app/actions/refund-order/refund-order.mjs index 102a5e0792fd7..910cf23be14e4 100644 --- a/components/shopify_developer_app/actions/refund-order/refund-order.mjs +++ b/components/shopify_developer_app/actions/refund-order/refund-order.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-refund-order", name: "Refund Order", description: "Refund an order. [See the documentation](https://shopify.dev/docs/api/admin-graphql/unstable/mutations/refundcreate)", - version: "0.0.6", + version: "0.0.7", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs b/components/shopify_developer_app/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs index ca7ac3a29aaff..347d81a80be56 100644 --- a/components/shopify_developer_app/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs +++ b/components/shopify_developer_app/actions/search-custom-collection-by-name/search-custom-collection-by-name.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-search-custom-collection-by-name", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/search-customers/search-customers.mjs b/components/shopify_developer_app/actions/search-customers/search-customers.mjs index aa1008e0710ea..ab682b12634f1 100644 --- a/components/shopify_developer_app/actions/search-customers/search-customers.mjs +++ b/components/shopify_developer_app/actions/search-customers/search-customers.mjs @@ -4,7 +4,7 @@ export default { key: "shopify_developer_app-search-customers", name: "Search for Customers", description: "Search for a customer or a list of customers. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/queries/customers)", - version: "0.0.13", + version: "0.0.14", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/search-fulfillment-orders/search-fulfillment-orders.mjs b/components/shopify_developer_app/actions/search-fulfillment-orders/search-fulfillment-orders.mjs index f0a3b547a1e7a..6db33e13dca92 100644 --- a/components/shopify_developer_app/actions/search-fulfillment-orders/search-fulfillment-orders.mjs +++ b/components/shopify_developer_app/actions/search-fulfillment-orders/search-fulfillment-orders.mjs @@ -4,7 +4,7 @@ export default { key: "shopify_developer_app-search-fulfillment-orders", name: "Search for Fulfillment Orders", description: "Search for a fulfillment order or a list of fulfillment orders. [See the documentation](https://shopify.dev/docs/api/admin-graphql/unstable/queries/fulfillmentorders)", - version: "0.0.5", + version: "0.0.6", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/search-orders/search-orders.mjs b/components/shopify_developer_app/actions/search-orders/search-orders.mjs index 854aef88bc4b8..3ecec5327abbf 100644 --- a/components/shopify_developer_app/actions/search-orders/search-orders.mjs +++ b/components/shopify_developer_app/actions/search-orders/search-orders.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-search-orders", name: "Search for Orders", description: "Search for an order or a list of orders. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/queries/orders)", - version: "0.0.8", + version: "0.0.9", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/search-product-variant/search-product-variant.mjs b/components/shopify_developer_app/actions/search-product-variant/search-product-variant.mjs index a97a3671f8ba6..3156c04e9e9f7 100644 --- a/components/shopify_developer_app/actions/search-product-variant/search-product-variant.mjs +++ b/components/shopify_developer_app/actions/search-product-variant/search-product-variant.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-search-product-variant", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/search-products/search-products.mjs b/components/shopify_developer_app/actions/search-products/search-products.mjs index b1fe68aac3a98..e66524bdbd898 100644 --- a/components/shopify_developer_app/actions/search-products/search-products.mjs +++ b/components/shopify_developer_app/actions/search-products/search-products.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-search-products", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/send-order-invoice/send-order-invoice.mjs b/components/shopify_developer_app/actions/send-order-invoice/send-order-invoice.mjs index fba5460c3af4a..b1584b8518c9c 100644 --- a/components/shopify_developer_app/actions/send-order-invoice/send-order-invoice.mjs +++ b/components/shopify_developer_app/actions/send-order-invoice/send-order-invoice.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-send-order-invoice", name: "Send Order Invoice", description: "Sends an invoice for an order. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/mutations/OrderInvoiceSend)", - version: "0.0.1", + version: "0.0.2", annotations: { destructiveHint: false, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/update-article/update-article.mjs b/components/shopify_developer_app/actions/update-article/update-article.mjs index 4d572dfef5ee2..c165d81a3552b 100644 --- a/components/shopify_developer_app/actions/update-article/update-article.mjs +++ b/components/shopify_developer_app/actions/update-article/update-article.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-update-article", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/update-customer/update-customer.mjs b/components/shopify_developer_app/actions/update-customer/update-customer.mjs index e880c60756bad..6f00b703f9753 100644 --- a/components/shopify_developer_app/actions/update-customer/update-customer.mjs +++ b/components/shopify_developer_app/actions/update-customer/update-customer.mjs @@ -6,7 +6,7 @@ export default { key: "shopify_developer_app-update-customer", name: "Update Customer", description: "Update a existing customer. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/mutations/customerupdate)", - version: "0.0.14", + version: "0.0.15", annotations: { destructiveHint: true, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/update-fulfillment-tracking-info/update-fulfillment-tracking-info.mjs b/components/shopify_developer_app/actions/update-fulfillment-tracking-info/update-fulfillment-tracking-info.mjs index f627eaa824a31..47459788ad367 100644 --- a/components/shopify_developer_app/actions/update-fulfillment-tracking-info/update-fulfillment-tracking-info.mjs +++ b/components/shopify_developer_app/actions/update-fulfillment-tracking-info/update-fulfillment-tracking-info.mjs @@ -4,7 +4,7 @@ export default { key: "shopify_developer_app-update-fulfillment-tracking-info", name: "Update Fulfillment Tracking Info", description: "Update the tracking info for a fulfillment. [See the documentation](https://shopify.dev/docs/api/admin-graphql/unstable/mutations/fulfillmenttrackinginfoupdate)", - version: "0.0.5", + version: "0.0.6", annotations: { destructiveHint: true, openWorldHint: true, diff --git a/components/shopify_developer_app/actions/update-inventory-level/update-inventory-level.mjs b/components/shopify_developer_app/actions/update-inventory-level/update-inventory-level.mjs index da3926a390d42..e07ecb10da6f6 100644 --- a/components/shopify_developer_app/actions/update-inventory-level/update-inventory-level.mjs +++ b/components/shopify_developer_app/actions/update-inventory-level/update-inventory-level.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-update-inventory-level", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/actions/update-metafield/update-metafield.mjs b/components/shopify_developer_app/actions/update-metafield/update-metafield.mjs index f791ebfea3093..715e226b74ddb 100644 --- a/components/shopify_developer_app/actions/update-metafield/update-metafield.mjs +++ b/components/shopify_developer_app/actions/update-metafield/update-metafield.mjs @@ -9,7 +9,7 @@ const { export default { ...others, key: "shopify_developer_app-update-metafield", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/actions/update-metaobject/update-metaobject.mjs b/components/shopify_developer_app/actions/update-metaobject/update-metaobject.mjs index a34ca07b2c36c..fc06d065a2ccb 100644 --- a/components/shopify_developer_app/actions/update-metaobject/update-metaobject.mjs +++ b/components/shopify_developer_app/actions/update-metaobject/update-metaobject.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-update-metaobject", - version: "0.0.16", + version: "0.0.17", name, description, type, diff --git a/components/shopify_developer_app/actions/update-page/update-page.mjs b/components/shopify_developer_app/actions/update-page/update-page.mjs index 462f1427c9ef1..6a72b9bd75e85 100644 --- a/components/shopify_developer_app/actions/update-page/update-page.mjs +++ b/components/shopify_developer_app/actions/update-page/update-page.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-update-page", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/update-product-variant/update-product-variant.mjs b/components/shopify_developer_app/actions/update-product-variant/update-product-variant.mjs index 23b469e1fb6c1..2c70fc3ae9b92 100644 --- a/components/shopify_developer_app/actions/update-product-variant/update-product-variant.mjs +++ b/components/shopify_developer_app/actions/update-product-variant/update-product-variant.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-update-product-variant", - version: "0.0.15", + version: "0.0.16", name, description, type, diff --git a/components/shopify_developer_app/actions/update-product/update-product.mjs b/components/shopify_developer_app/actions/update-product/update-product.mjs index b329c3d0cda96..d8ece5a7012af 100644 --- a/components/shopify_developer_app/actions/update-product/update-product.mjs +++ b/components/shopify_developer_app/actions/update-product/update-product.mjs @@ -6,7 +6,7 @@ export default { key: "shopify_developer_app-update-product", name: "Update Product", description: "Update an existing product. [See the documentation](https://shopify.dev/docs/api/admin-graphql/latest/mutations/productupdate)", - version: "0.0.14", + version: "0.0.15", annotations: { destructiveHint: true, openWorldHint: true, diff --git a/components/shopify_developer_app/common/queries.mjs b/components/shopify_developer_app/common/queries.mjs index 1c634632bb6d5..abb59a740336a 100644 --- a/components/shopify_developer_app/common/queries.mjs +++ b/components/shopify_developer_app/common/queries.mjs @@ -700,6 +700,13 @@ const LIST_ORDERS = ` id status displayStatus + createdAt + updatedAt + trackingInfo { + number + url + company + } } metafields (first: $first) { nodes { diff --git a/components/shopify_developer_app/package.json b/components/shopify_developer_app/package.json index 98a52eb825ea5..9b4b443799731 100644 --- a/components/shopify_developer_app/package.json +++ b/components/shopify_developer_app/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/shopify_developer_app", - "version": "0.10.6", + "version": "0.10.7", "description": "Pipedream Shopify (Developer App) Components", "main": "shopify_developer_app.app.mjs", "keywords": [ diff --git a/components/shopify_developer_app/sources/cart-updated/cart-updated.mjs b/components/shopify_developer_app/sources/cart-updated/cart-updated.mjs index 159de753744a3..91d8b98ff9dc5 100644 --- a/components/shopify_developer_app/sources/cart-updated/cart-updated.mjs +++ b/components/shopify_developer_app/sources/cart-updated/cart-updated.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-cart-updated", name: "Cart Updated (Instant)", description: "Emit new event when a cart is updated.", - version: "0.0.5", + version: "0.0.6", type: "source", dedupe: "unique", methods: { diff --git a/components/shopify_developer_app/sources/draft-order-updated/draft-order-updated.mjs b/components/shopify_developer_app/sources/draft-order-updated/draft-order-updated.mjs index 2951f866fdd62..e86648d083496 100644 --- a/components/shopify_developer_app/sources/draft-order-updated/draft-order-updated.mjs +++ b/components/shopify_developer_app/sources/draft-order-updated/draft-order-updated.mjs @@ -7,7 +7,7 @@ export default { name: "Draft Order Updated (Instant)", type: "source", description: "Emit new event for each draft order updated in a store.", - version: "0.0.5", + version: "0.0.6", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/inventory-level-updated/inventory-level-updated.mjs b/components/shopify_developer_app/sources/inventory-level-updated/inventory-level-updated.mjs index 2187d73c47381..7358dc77af6e4 100644 --- a/components/shopify_developer_app/sources/inventory-level-updated/inventory-level-updated.mjs +++ b/components/shopify_developer_app/sources/inventory-level-updated/inventory-level-updated.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-inventory-level-updated", name: "Inventory Level Updated (Instant)", description: "Emit new event when an inventory level is updated.", - version: "0.0.5", + version: "0.0.6", type: "source", dedupe: "unique", methods: { diff --git a/components/shopify_developer_app/sources/new-abandoned-cart/new-abandoned-cart.mjs b/components/shopify_developer_app/sources/new-abandoned-cart/new-abandoned-cart.mjs index 6a77b9eb89644..0a6d4b9f85a14 100644 --- a/components/shopify_developer_app/sources/new-abandoned-cart/new-abandoned-cart.mjs +++ b/components/shopify_developer_app/sources/new-abandoned-cart/new-abandoned-cart.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-new-abandoned-cart", - version: "0.0.14", + version: "0.0.15", name, description, type, diff --git a/components/shopify_developer_app/sources/new-article/new-article.mjs b/components/shopify_developer_app/sources/new-article/new-article.mjs index 2ff6de2e52546..890fb63e3f48d 100644 --- a/components/shopify_developer_app/sources/new-article/new-article.mjs +++ b/components/shopify_developer_app/sources/new-article/new-article.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-new-article", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/sources/new-cancelled-order/new-cancelled-order.mjs b/components/shopify_developer_app/sources/new-cancelled-order/new-cancelled-order.mjs index fa85c4541f426..7240fff82a561 100644 --- a/components/shopify_developer_app/sources/new-cancelled-order/new-cancelled-order.mjs +++ b/components/shopify_developer_app/sources/new-cancelled-order/new-cancelled-order.mjs @@ -6,7 +6,7 @@ export default { name: "New Cancelled Order (Instant)", type: "source", description: "Emit new event each time a new order is cancelled.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-cart-created/new-cart-created.mjs b/components/shopify_developer_app/sources/new-cart-created/new-cart-created.mjs index 949e7f46c0881..f58248bd51303 100644 --- a/components/shopify_developer_app/sources/new-cart-created/new-cart-created.mjs +++ b/components/shopify_developer_app/sources/new-cart-created/new-cart-created.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-new-cart-created", name: "New Cart Created (Instant)", description: "Emit new event when a new cart is created.", - version: "0.0.5", + version: "0.0.6", type: "source", dedupe: "unique", methods: { diff --git a/components/shopify_developer_app/sources/new-customer-created/new-customer-created.mjs b/components/shopify_developer_app/sources/new-customer-created/new-customer-created.mjs index 719c6329a2771..17d148002a40b 100644 --- a/components/shopify_developer_app/sources/new-customer-created/new-customer-created.mjs +++ b/components/shopify_developer_app/sources/new-customer-created/new-customer-created.mjs @@ -6,7 +6,7 @@ export default { name: "New Customer Created (Instant)", type: "source", description: "Emit new event for each new customer added to a store.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-draft-order/new-draft-order.mjs b/components/shopify_developer_app/sources/new-draft-order/new-draft-order.mjs index ba3dde52f25b0..79bb8c7cdb2b1 100644 --- a/components/shopify_developer_app/sources/new-draft-order/new-draft-order.mjs +++ b/components/shopify_developer_app/sources/new-draft-order/new-draft-order.mjs @@ -6,7 +6,7 @@ export default { name: "New Draft Order (Instant)", type: "source", description: "Emit new event for each new draft order submitted to a store.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-event-emitted/new-event-emitted.mjs b/components/shopify_developer_app/sources/new-event-emitted/new-event-emitted.mjs index ae3c3525bdd5f..29c0c3a314c61 100644 --- a/components/shopify_developer_app/sources/new-event-emitted/new-event-emitted.mjs +++ b/components/shopify_developer_app/sources/new-event-emitted/new-event-emitted.mjs @@ -7,7 +7,7 @@ export default { name: "New Event Emitted (Instant)", type: "source", description: "Emit new event for each new Shopify event.", - version: "0.0.18", + version: "0.0.19", dedupe: "unique", props: { ...common.props, diff --git a/components/shopify_developer_app/sources/new-fulfillment-event/new-fulfillment-event.mjs b/components/shopify_developer_app/sources/new-fulfillment-event/new-fulfillment-event.mjs index 87ae0f90e4ac7..e674b57642d1c 100644 --- a/components/shopify_developer_app/sources/new-fulfillment-event/new-fulfillment-event.mjs +++ b/components/shopify_developer_app/sources/new-fulfillment-event/new-fulfillment-event.mjs @@ -6,7 +6,7 @@ export default { name: "New Fulfillment Event (Instant)", type: "source", description: "Emit new event for each new fulfillment event for a store.", - version: "0.0.15", + version: "0.0.16", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-order-created/new-order-created.mjs b/components/shopify_developer_app/sources/new-order-created/new-order-created.mjs index fa37cd8fc36f3..df08468e0768d 100644 --- a/components/shopify_developer_app/sources/new-order-created/new-order-created.mjs +++ b/components/shopify_developer_app/sources/new-order-created/new-order-created.mjs @@ -6,7 +6,7 @@ export default { name: "New Order Created (Instant)", type: "source", description: "Emit new event for each new order submitted to a store.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-order-fulfilled/new-order-fulfilled.mjs b/components/shopify_developer_app/sources/new-order-fulfilled/new-order-fulfilled.mjs index 701cb2a13eed9..4a057148a8ad9 100644 --- a/components/shopify_developer_app/sources/new-order-fulfilled/new-order-fulfilled.mjs +++ b/components/shopify_developer_app/sources/new-order-fulfilled/new-order-fulfilled.mjs @@ -6,7 +6,7 @@ export default { name: "New Order Fulfilled (Instant)", type: "source", description: "Emit new event whenever an order is fulfilled.", - version: "0.0.14", + version: "0.0.15", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-page/new-page.mjs b/components/shopify_developer_app/sources/new-page/new-page.mjs index dafeea8425ae9..950d5954834d8 100644 --- a/components/shopify_developer_app/sources/new-page/new-page.mjs +++ b/components/shopify_developer_app/sources/new-page/new-page.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-new-page", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/sources/new-paid-order/new-paid-order.mjs b/components/shopify_developer_app/sources/new-paid-order/new-paid-order.mjs index 3b45661e2ab1d..e769d3edf5cf2 100644 --- a/components/shopify_developer_app/sources/new-paid-order/new-paid-order.mjs +++ b/components/shopify_developer_app/sources/new-paid-order/new-paid-order.mjs @@ -6,7 +6,7 @@ export default { name: "New Paid Order (Instant)", type: "source", description: "Emit new event each time a new order is paid.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-product-created/new-product-created.mjs b/components/shopify_developer_app/sources/new-product-created/new-product-created.mjs index c121ed85fb3b6..e0fe38d43feb2 100644 --- a/components/shopify_developer_app/sources/new-product-created/new-product-created.mjs +++ b/components/shopify_developer_app/sources/new-product-created/new-product-created.mjs @@ -6,7 +6,7 @@ export default { name: "New Product Created (Instant)", type: "source", description: "Emit new event for each product added to a store.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-product-updated/new-product-updated.mjs b/components/shopify_developer_app/sources/new-product-updated/new-product-updated.mjs index a4eff7e716db1..54a8eb26d09be 100644 --- a/components/shopify_developer_app/sources/new-product-updated/new-product-updated.mjs +++ b/components/shopify_developer_app/sources/new-product-updated/new-product-updated.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-new-product-updated", name: "New Product Updated (Instant)", description: "Emit new event for each product updated in a store.", - version: "0.0.15", + version: "0.0.16", type: "source", dedupe: "unique", props: { diff --git a/components/shopify_developer_app/sources/new-refund-created/new-refund-created.mjs b/components/shopify_developer_app/sources/new-refund-created/new-refund-created.mjs index 367f042f0623d..9f42c45ed69b0 100644 --- a/components/shopify_developer_app/sources/new-refund-created/new-refund-created.mjs +++ b/components/shopify_developer_app/sources/new-refund-created/new-refund-created.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-new-refund-created", name: "New Refund Created (Instant)", description: "Emit new event when a new refund is created.", - version: "0.0.14", + version: "0.0.15", type: "source", dedupe: "unique", methods: { diff --git a/components/shopify_developer_app/sources/new-updated-customer/new-updated-customer.mjs b/components/shopify_developer_app/sources/new-updated-customer/new-updated-customer.mjs index 573fa3ec02ce1..3fc0c03a0c5ee 100644 --- a/components/shopify_developer_app/sources/new-updated-customer/new-updated-customer.mjs +++ b/components/shopify_developer_app/sources/new-updated-customer/new-updated-customer.mjs @@ -6,7 +6,7 @@ export default { name: "New Updated Customer (Instant)", type: "source", description: "Emit new event each time a customer's information is updated.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/new-updated-order/new-updated-order.mjs b/components/shopify_developer_app/sources/new-updated-order/new-updated-order.mjs index 9d959db203f94..909ad7e3e898b 100644 --- a/components/shopify_developer_app/sources/new-updated-order/new-updated-order.mjs +++ b/components/shopify_developer_app/sources/new-updated-order/new-updated-order.mjs @@ -6,7 +6,7 @@ export default { name: "New Updated Order (Instant)", type: "source", description: "Emit new event each time an order is updated.", - version: "0.0.17", + version: "0.0.18", dedupe: "unique", methods: { ...common.methods, diff --git a/components/shopify_developer_app/sources/product-added-to-custom-collection/product-added-to-custom-collection.mjs b/components/shopify_developer_app/sources/product-added-to-custom-collection/product-added-to-custom-collection.mjs index a17ce7b66d925..b5fee220d73c8 100644 --- a/components/shopify_developer_app/sources/product-added-to-custom-collection/product-added-to-custom-collection.mjs +++ b/components/shopify_developer_app/sources/product-added-to-custom-collection/product-added-to-custom-collection.mjs @@ -11,7 +11,7 @@ const props = adjustPropDefinitions(others.props, shopify); export default { ...others, key: "shopify_developer_app-product-added-to-custom-collection", - version: "0.0.13", + version: "0.0.14", name, description, type, diff --git a/components/shopify_developer_app/sources/shop-update/shop-update.mjs b/components/shopify_developer_app/sources/shop-update/shop-update.mjs index ab18778bb4eb1..408c3a4515d85 100644 --- a/components/shopify_developer_app/sources/shop-update/shop-update.mjs +++ b/components/shopify_developer_app/sources/shop-update/shop-update.mjs @@ -5,7 +5,7 @@ export default { key: "shopify_developer_app-shop-update", name: "Shop Updated (Instant)", description: "Emit new event when a shop is updated.", - version: "0.0.5", + version: "0.0.6", type: "source", dedupe: "unique", methods: { diff --git a/components/the_events_calendar/the_events_calendar.app.mjs b/components/the_events_calendar/the_events_calendar.app.mjs index 15b2d0fe698dc..7d7947de58d61 100644 --- a/components/the_events_calendar/the_events_calendar.app.mjs +++ b/components/the_events_calendar/the_events_calendar.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/thunder_compute/thunder_compute.app.mjs b/components/thunder_compute/thunder_compute.app.mjs index fe45711a38883..e9a955fd8a02e 100644 --- a/components/thunder_compute/thunder_compute.app.mjs +++ b/components/thunder_compute/thunder_compute.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/upsales/actions/create-appointment/create-appointment.mjs b/components/upsales/actions/create-appointment/create-appointment.mjs new file mode 100644 index 0000000000000..ddda0b58aeeba --- /dev/null +++ b/components/upsales/actions/create-appointment/create-appointment.mjs @@ -0,0 +1,90 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-create-appointment", + name: "Create Appointment", + description: "Creates a new appointment in Upsales. [See the documentation](https://api.upsales.com/#b7fd1fe3-e88d-4f3c-8323-100e755ad3e2)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + clientId: { + type: "integer", + label: "Client ID", + description: "The client ID to associate with the appointment", + }, + users: { + propDefinition: [ + app, + "userId", + ], + type: "string[]", + label: "Users", + description: "User IDs to associate with the appointment", + optional: true, + }, + date: { + type: "string", + label: "Date", + description: "The date of the appointment. In ISO 8601 format. e.g. `2026-04-16`", + }, + endTime: { + type: "string", + label: "End Time", + description: "The end time of the appointment. In ISO 8601 format. e.g. `11:00:00`", + }, + description: { + type: "string", + label: "Description", + description: "The description of the appointment", + optional: true, + }, + activityType: { + propDefinition: [ + app, + "activityTypeId", + ], + }, + contactIds: { + propDefinition: [ + app, + "contactId", + ], + type: "string[]", + label: "Contact IDs", + description: "The contact IDs to associate with the appointment", + optional: true, + }, + }, + async run({ $ }) { + const response = await this.app.createAppointment({ + $, + data: { + client: this.clientId, + users: this.users + ? this.users.map((user) => ({ + id: user, + })) + : undefined, + date: this.date, + endTime: this.endTime, + description: this.description, + activityType: { + id: this.activityType, + }, + contacts: this.contactIds + ? this.contactIds.map((contact) => ({ + id: contact, + })) + : undefined, + }, + }); + $.export("$summary", `Successfully created appointment with ID: ${response.data.id}`); + return response; + }, +}; diff --git a/components/upsales/actions/create-company/create-company.mjs b/components/upsales/actions/create-company/create-company.mjs new file mode 100644 index 0000000000000..8b12a4852985f --- /dev/null +++ b/components/upsales/actions/create-company/create-company.mjs @@ -0,0 +1,53 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-create-company", + name: "Create Company", + description: "Creates a new company (account) in Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + name: { + propDefinition: [ + app, + "companyName", + ], + }, + phone: { + propDefinition: [ + app, + "companyPhone", + ], + }, + users: { + propDefinition: [ + app, + "userId", + ], + type: "string[]", + label: "Users", + description: "Select one or more users to associate with this company", + optional: true, + }, + }, + async run({ $ }) { + const response = await this.app.createCompany({ + $, + data: { + name: this.name, + phone: this.phone, + users: this.users, + }, + }); + + $.export("$summary", `Successfully created company: ${this.name}`); + return response; + }, +}; + diff --git a/components/upsales/actions/create-contact/create-contact.mjs b/components/upsales/actions/create-contact/create-contact.mjs new file mode 100644 index 0000000000000..18b6acdd6f781 --- /dev/null +++ b/components/upsales/actions/create-contact/create-contact.mjs @@ -0,0 +1,91 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-create-contact", + name: "Create Contact", + description: "Creates a new contact in Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + firstName: { + propDefinition: [ + app, + "contactFirstName", + ], + }, + lastName: { + propDefinition: [ + app, + "contactLastName", + ], + }, + phone: { + propDefinition: [ + app, + "contactPhone", + ], + }, + cellPhone: { + propDefinition: [ + app, + "contactCellPhone", + ], + }, + email: { + propDefinition: [ + app, + "contactEmail", + ], + }, + title: { + propDefinition: [ + app, + "contactTitle", + ], + }, + active: { + propDefinition: [ + app, + "contactActive", + ], + }, + clientId: { + propDefinition: [ + app, + "contactClientId", + ], + }, + }, + async run({ $ }) { + const data = { + firstName: this.firstName, + lastName: this.lastName, + phone: this.phone, + cellPhone: this.cellPhone, + email: this.email, + title: this.title, + active: this.active, + }; + + if (this.clientId) { + data.client = { + id: this.clientId, + }; + } + + const response = await this.app.createContact({ + $, + data, + }); + + $.export("$summary", `Successfully created contact: ${this.firstName} ${this.lastName}`); + return response; + }, +}; + diff --git a/components/upsales/actions/create-opportunity/create-opportunity.mjs b/components/upsales/actions/create-opportunity/create-opportunity.mjs new file mode 100644 index 0000000000000..cc7b4c259625e --- /dev/null +++ b/components/upsales/actions/create-opportunity/create-opportunity.mjs @@ -0,0 +1,96 @@ +import app from "../../upsales.app.mjs"; +import { ConfigurationError } from "@pipedream/platform"; + +export default { + key: "upsales-create-opportunity", + name: "Create Opportunity", + description: "Creates a new opportunity in Upsales. [See the documentation](https://api.upsales.com/#4dc98812-812d-4c4c-8594-3348e05e9742)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + description: { + type: "string", + label: "Description", + description: "Opportunity description", + }, + date: { + type: "string", + label: "Date", + description: "Opportunity date (ISO 8601 format, e.g., 2024-01-15T10:00:00Z)", + }, + userId: { + propDefinition: [ + app, + "userId", + ], + description: "User who created the opportunity", + }, + clientId: { + propDefinition: [ + app, + "companyId", + ], + label: "Client ID", + description: "Company this opportunity belongs to", + }, + stageId: { + propDefinition: [ + app, + "stageId", + ], + description: "Stage to which the opportunity belongs to", + }, + probability: { + type: "integer", + label: "Probability", + description: "Probability percentage, between 0-99", + min: 0, + max: 99, + }, + orderRow: { + type: "string[]", + label: "Order Rows", + description: "Array of order row objects in JSON format. Each entry should be a string like `{ \"product\": { \"id\": 123 }, \"quantity\": 2, \"price\": 100 }`. [See the documentation](https://api.upsales.com/#b62d7eee-7483-47e2-821e-70834a5b5c17) for all available properties.", + optional: true, + }, + }, + async run({ $ }) { + const orderRow = this.orderRow?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in orderRow field: ${item}`); + } + }); + + const response = await this.app.createOrder({ + $, + data: { + description: this.description, + date: this.date, + user: { + id: this.userId, + }, + client: { + id: this.clientId, + }, + stage: { + id: this.stageId, + }, + probability: this.probability, + orderRow, + }, + }); + + $.export("$summary", `Successfully created opportunity: ${this.description}`); + return response; + }, +}; diff --git a/components/upsales/actions/create-order/create-order.mjs b/components/upsales/actions/create-order/create-order.mjs new file mode 100644 index 0000000000000..8bd5a5c2922f5 --- /dev/null +++ b/components/upsales/actions/create-order/create-order.mjs @@ -0,0 +1,92 @@ +import { ConfigurationError } from "@pipedream/platform"; +import app from "../../upsales.app.mjs"; +import orderProps from "../../common/orderProps.mjs"; + +export default { + key: "upsales-create-order", + name: "Create Order", + description: "Creates a new order in Upsales. [See the documentation](https://api.upsales.com/#9c402e62-1951-4b50-9372-6f2664736431)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + ...orderProps, + }, + async run({ $ }) { + const custom = this.custom?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in custom field: ${item}`); + } + }); + + const orderRow = this.orderRow?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in orderRow field: ${item}`); + } + }); + + let projects = this.projects; + if (projects && typeof projects === "string") { + try { + projects = JSON.parse(projects); + } catch (e) { + throw new ConfigurationError(`Invalid JSON in projects field: ${projects}`); + } + } + + const response = await this.app.createOrder({ + $, + data: { + description: this.description, + date: this.date, + user: { + id: this.userId, + }, + client: { + id: this.clientId, + }, + stage: { + id: this.stageId, + }, + probability: this.probability, + closeDate: this.closeDate, + notes: this.notes, + contact: this.contactId + ? { + id: this.contactId, + } + : undefined, + projects, + clientConnection: this.clientConnectionId + ? { + id: this.clientConnectionId, + } + : undefined, + currencyRate: this.currencyRate, + currency: this.currency, + custom, + competitorId: this.competitorId, + lostReason: this.lostReason, + notify: this.notify, + orderRow, + }, + }); + + $.export("$summary", `Successfully created order: ${this.description}`); + return response; + }, +}; + diff --git a/components/upsales/actions/create-stage/create-stage.mjs b/components/upsales/actions/create-stage/create-stage.mjs new file mode 100644 index 0000000000000..551c423a0f65a --- /dev/null +++ b/components/upsales/actions/create-stage/create-stage.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-create-stage", + name: "Create Stage", + description: "Creates a new order stage in Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + name: { + propDefinition: [ + app, + "stageName", + ], + }, + probability: { + propDefinition: [ + app, + "stageProbability", + ], + }, + }, + async run({ $ }) { + const response = await this.app.createStage({ + $, + data: { + name: this.name, + probability: this.probability, + }, + }); + + $.export("$summary", `Successfully created stage: ${this.name}`); + return response; + }, +}; + diff --git a/components/upsales/actions/create-user/create-user.mjs b/components/upsales/actions/create-user/create-user.mjs new file mode 100644 index 0000000000000..4da1ce8b564ad --- /dev/null +++ b/components/upsales/actions/create-user/create-user.mjs @@ -0,0 +1,124 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-create-user", + name: "Create User", + description: "Creates a new user in Upsales. [See the documentation](https://api.upsales.com/#5d393f90-23a3-47fd-a52c-d40a8ae71a83)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + email: { + type: "string", + label: "Email", + description: "The email address of the user", + }, + clientId: { + type: "integer", + label: "Client ID", + description: "The client ID to associate with the user", + }, + name: { + type: "string", + label: "Name", + description: "The full name of the user", + }, + language: { + type: "string", + label: "Language", + description: "The language code for the user (e.g., `en-EN`, `sv-SE`)", + optional: true, + }, + password: { + type: "string", + label: "Password", + description: "The password for the user account", + secret: true, + }, + teamLeader: { + type: "boolean", + label: "Team Leader", + description: "Whether the user is a team leader", + optional: true, + }, + active: { + type: "boolean", + label: "Active", + description: "Whether the user is active", + optional: true, + default: true, + }, + ghost: { + type: "boolean", + label: "Ghost", + description: "Whether the user is a ghost user", + optional: true, + default: false, + }, + export: { + type: "boolean", + label: "Export", + description: "Whether the user can export data", + optional: true, + }, + administrator: { + type: "boolean", + label: "Administrator", + description: "Whether the user is an administrator", + optional: true, + }, + }, + async run({ $ }) { + const { + email, + clientId, + name, + language, + password, + teamLeader, + active, + ghost, + export: exportProp, + administrator, + } = this; + + const response = await this.app.createUser({ + $, + data: { + email, + clientId, + name, + language, + password, + teamLeader: teamLeader + ? 1 + : 0, + active: active + ? 1 + : 0, + ghost: ghost + ? 1 + : 0, + export: exportProp + ? 1 + : 0, + administrator: administrator + ? 1 + : 0, + }, + }); + + if (response.error) { + throw new Error(`Failed to create user: ${JSON.stringify(response.error)}`); + } + + $.export("$summary", `Successfully created user with ID: ${response.data.id}`); + return response.data; + }, +}; + diff --git a/components/upsales/actions/deactivate-user/deactivate-user.mjs b/components/upsales/actions/deactivate-user/deactivate-user.mjs new file mode 100644 index 0000000000000..36a6a0d0e56ac --- /dev/null +++ b/components/upsales/actions/deactivate-user/deactivate-user.mjs @@ -0,0 +1,32 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-deactivate-user", + name: "Deactivate User", + description: "Deactivates a user by ID in Upsales. [See the documentation](https://api.upsales.com/#31878497-b688-4034-9d88-ee99bf152730)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + userId: { + propDefinition: [ + app, + "userId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.deactivateUser({ + $, + userId: this.userId, + }); + + $.export("$summary", `Successfully deactivated user: ${response.data?.name || this.userId}`); + return response; + }, +}; diff --git a/components/upsales/actions/get-activity-list/get-activity-list.mjs b/components/upsales/actions/get-activity-list/get-activity-list.mjs new file mode 100644 index 0000000000000..2a8777b22e820 --- /dev/null +++ b/components/upsales/actions/get-activity-list/get-activity-list.mjs @@ -0,0 +1,44 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-activity-list", + name: "Get Activity List", + description: "Retrieves a list of activities from Upsales. [See the documentation](https://api.upsales.com/#ae3a30c0-dcc6-4abc-9be4-6ffe725f989f)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listActivities({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response.data?.length || 0} activit${response.data?.length === 1 + ? "y" + : "ies"}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-activity/get-activity.mjs b/components/upsales/actions/get-activity/get-activity.mjs new file mode 100644 index 0000000000000..b117b1fe43029 --- /dev/null +++ b/components/upsales/actions/get-activity/get-activity.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-activity", + name: "Get Activity", + description: "Retrieves a single activity by ID from Upsales. [See the documentation](https://api.upsales.com/#299df572-5151-4684-b4f4-dea0f9ba192c)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + activityId: { + propDefinition: [ + app, + "activityId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getActivity({ + $, + activityId: this.activityId, + }); + + $.export("$summary", `Successfully retrieved activity: ${response.data?.id || this.activityId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-appointment-list/get-appointment-list.mjs b/components/upsales/actions/get-appointment-list/get-appointment-list.mjs new file mode 100644 index 0000000000000..38e469f32534b --- /dev/null +++ b/components/upsales/actions/get-appointment-list/get-appointment-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-appointment-list", + name: "Get Appointment List", + description: "Retrieves a list of appointments from Upsales. [See the documentation](https://api.upsales.com/#1346adbc-3479-45b7-b75c-9a78c4d291e6)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listAppointments({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response.data?.length || 0} appointment(s)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-company-list/get-company-list.mjs b/components/upsales/actions/get-company-list/get-company-list.mjs new file mode 100644 index 0000000000000..fed5ccdfec6c5 --- /dev/null +++ b/components/upsales/actions/get-company-list/get-company-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-company-list", + name: "Get Company List", + description: "Retrieves a list of companies (accounts) from Upsales. [See the documentation](https://api.upsales.com/#a2a0dc79-a473-4ae4-891d-c31333a221d0)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listCompanies({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response?.data?.length || 0} company(ies)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-company/get-company.mjs b/components/upsales/actions/get-company/get-company.mjs new file mode 100644 index 0000000000000..20d9b57b91806 --- /dev/null +++ b/components/upsales/actions/get-company/get-company.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-company", + name: "Get Company", + description: "Retrieves a single company (account) by ID from Upsales. [See the documentation](https://api.upsales.com/#07e5839b-2043-4d89-97c3-61be8b8ffe93)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + companyId: { + propDefinition: [ + app, + "companyId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getCompany({ + $, + companyId: this.companyId, + }); + + $.export("$summary", `Successfully retrieved company: ${response.name || this.companyId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-contact-list/get-contact-list.mjs b/components/upsales/actions/get-contact-list/get-contact-list.mjs new file mode 100644 index 0000000000000..f5cee63dfd1b5 --- /dev/null +++ b/components/upsales/actions/get-contact-list/get-contact-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-contact-list", + name: "Get Contact List", + description: "Retrieves a list of contacts from Upsales. [See the documentation](https://api.upsales.com/#a2a0dc79-a473-4ae4-891d-c31333a221d0)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listContacts({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response?.data?.length || 0} contact(s)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-contact/get-contact.mjs b/components/upsales/actions/get-contact/get-contact.mjs new file mode 100644 index 0000000000000..dd58ad4da8b8e --- /dev/null +++ b/components/upsales/actions/get-contact/get-contact.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-contact", + name: "Get Contact", + description: "Retrieves a single contact by ID from Upsales. [See the documentation](https://api.upsales.com/#07e5839b-2043-4d89-97c3-61be8b8ffe93)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + contactId: { + propDefinition: [ + app, + "contactId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getContact({ + $, + contactId: this.contactId, + }); + + $.export("$summary", `Successfully retrieved contact: ${response.name || this.contactId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-nps-list/get-nps-list.mjs b/components/upsales/actions/get-nps-list/get-nps-list.mjs new file mode 100644 index 0000000000000..861dbf9611614 --- /dev/null +++ b/components/upsales/actions/get-nps-list/get-nps-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-nps-list", + name: "Get NPS List", + description: "Retrieves a list of NPS records from Upsales. [See the documentation](https://api.upsales.com/#def8b39a-95dc-4285-b2eb-992d9923dfdd)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listNps({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response.data?.length || 0} NPS record(s)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-nps/get-nps.mjs b/components/upsales/actions/get-nps/get-nps.mjs new file mode 100644 index 0000000000000..038044d6b5428 --- /dev/null +++ b/components/upsales/actions/get-nps/get-nps.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-nps", + name: "Get NPS", + description: "Retrieves a single NPS record by ID from Upsales. [See the documentation](https://api.upsales.com/#176e076b-ec7b-424d-afe2-32b2a652afc5)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + npsId: { + propDefinition: [ + app, + "npsId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getNps({ + $, + npsId: this.npsId, + }); + + $.export("$summary", `Successfully retrieved NPS record: ${response.data?.id || this.npsId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-opportunity-list/get-opportunity-list.mjs b/components/upsales/actions/get-opportunity-list/get-opportunity-list.mjs new file mode 100644 index 0000000000000..3f29c99efd633 --- /dev/null +++ b/components/upsales/actions/get-opportunity-list/get-opportunity-list.mjs @@ -0,0 +1,47 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-opportunity-list", + name: "Get Opportunity List", + description: "Retrieves a list of opportunities from Upsales. [See the documentation](https://api.upsales.com/#d448e686-69ab-4832-987b-f718abcb8c7e)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listOrders({ + $, + params: { + limit: this.limit, + offset: this.offset, + probability: [ + "gte:1", + "lte:99", + ], + }, + }); + + $.export("$summary", `Successfully retrieved ${response?.data?.length || 0} opportunit${response?.data?.length === 1 + ? "y" + : "ies"}`); + return response; + }, +}; diff --git a/components/upsales/actions/get-opportunity/get-opportunity.mjs b/components/upsales/actions/get-opportunity/get-opportunity.mjs new file mode 100644 index 0000000000000..e19ce32895f15 --- /dev/null +++ b/components/upsales/actions/get-opportunity/get-opportunity.mjs @@ -0,0 +1,31 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-opportunity", + name: "Get Opportunity", + description: "Retrieves a specific opportunity from Upsales. [See the documentation](https://api.upsales.com/#b8dfce4a-4627-427d-8aa4-50ce2487f0d1)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + opportunityId: { + propDefinition: [ + app, + "opportunityId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getOrder({ + $, + orderId: this.opportunityId, + }); + $.export("$summary", `Successfully retrieved opportunity: ${response.description || this.opportunityId}`); + return response; + }, +}; diff --git a/components/upsales/actions/get-order-list/get-order-list.mjs b/components/upsales/actions/get-order-list/get-order-list.mjs new file mode 100644 index 0000000000000..9c05972615c65 --- /dev/null +++ b/components/upsales/actions/get-order-list/get-order-list.mjs @@ -0,0 +1,45 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-order-list", + name: "Get Order List", + description: "Retrieves a list of orders from Upsales. [See the documentation](https://api.upsales.com/#9c402e62-1951-4b50-9372-6f2664736431)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listOrders({ + $, + params: { + limit: this.limit, + offset: this.offset, + probability: 100, + }, + }); + + $.export("$summary", `Successfully retrieved ${response?.data?.length || 0} order${response?.data?.length === 1 + ? "" + : "s"}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-order/get-order.mjs b/components/upsales/actions/get-order/get-order.mjs new file mode 100644 index 0000000000000..81e69b59f5690 --- /dev/null +++ b/components/upsales/actions/get-order/get-order.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-order", + name: "Get Order", + description: "Retrieves a single order by ID from Upsales. [See the documentation](https://api.upsales.com/#9c402e62-1951-4b50-9372-6f2664736431)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + orderId: { + propDefinition: [ + app, + "orderId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getOrder({ + $, + orderId: this.orderId, + }); + + $.export("$summary", `Successfully retrieved order: ${response.description || this.orderId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-phone-call-list/get-phone-call-list.mjs b/components/upsales/actions/get-phone-call-list/get-phone-call-list.mjs new file mode 100644 index 0000000000000..8d07058b66569 --- /dev/null +++ b/components/upsales/actions/get-phone-call-list/get-phone-call-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-phone-call-list", + name: "Get Phone Call List", + description: "Retrieves a list of phone calls from Upsales. [See the documentation](https://api.upsales.com/#61bbc6c1-04b9-4776-8073-aff47b69d302)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listPhoneCalls({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response.data?.length || 0} phone call(s)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-product-list/get-product-list.mjs b/components/upsales/actions/get-product-list/get-product-list.mjs new file mode 100644 index 0000000000000..8c38a29564a0d --- /dev/null +++ b/components/upsales/actions/get-product-list/get-product-list.mjs @@ -0,0 +1,41 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-product-list", + name: "Get Product List", + description: "Retrieves a list of products from Upsales. [See the documentation](https://api.upsales.com/#378f1b2f-11ce-409a-bf89-ee9f3dda854c)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listProducts({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response.data?.length || 0} product(s)`); + return response; + }, +}; diff --git a/components/upsales/actions/get-product/get-product.mjs b/components/upsales/actions/get-product/get-product.mjs new file mode 100644 index 0000000000000..0e61b9f2652db --- /dev/null +++ b/components/upsales/actions/get-product/get-product.mjs @@ -0,0 +1,31 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-product", + name: "Get Product", + description: "Retrieves a product from Upsales. [See the documentation](https://api.upsales.com/#ed8a1ae9-37dc-4292-818c-40d66c11bf99)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + productId: { + propDefinition: [ + app, + "productId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getProduct({ + $, + productId: this.productId, + }); + $.export("$summary", `Successfully retrieved the product "${response.data.name}" with ID: ${response.data.id}`); + return response; + }, +}; diff --git a/components/upsales/actions/get-stage-list/get-stage-list.mjs b/components/upsales/actions/get-stage-list/get-stage-list.mjs new file mode 100644 index 0000000000000..3adc8131122bf --- /dev/null +++ b/components/upsales/actions/get-stage-list/get-stage-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-stage-list", + name: "Get Stage List", + description: "Retrieves a list of order stages from Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listStages({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response?.data?.length || 0} stage(s)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-stage/get-stage.mjs b/components/upsales/actions/get-stage/get-stage.mjs new file mode 100644 index 0000000000000..d1e066fea592f --- /dev/null +++ b/components/upsales/actions/get-stage/get-stage.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-stage", + name: "Get Stage", + description: "Retrieves a single order stage by ID from Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + stageId: { + propDefinition: [ + app, + "stageId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getStage({ + $, + stageId: this.stageId, + }); + + $.export("$summary", `Successfully retrieved stage: ${response.name || this.stageId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-user-list/get-user-list.mjs b/components/upsales/actions/get-user-list/get-user-list.mjs new file mode 100644 index 0000000000000..a242847ae75f2 --- /dev/null +++ b/components/upsales/actions/get-user-list/get-user-list.mjs @@ -0,0 +1,42 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-user-list", + name: "Get User List", + description: "Retrieves a list of users from Upsales. [See the documentation](https://api.upsales.com/#a2a0dc79-a473-4ae4-891d-c31333a221d0)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + limit: { + propDefinition: [ + app, + "limit", + ], + }, + offset: { + propDefinition: [ + app, + "offset", + ], + }, + }, + async run({ $ }) { + const response = await this.app.listUsers({ + $, + params: { + limit: this.limit, + offset: this.offset, + }, + }); + + $.export("$summary", `Successfully retrieved ${response.data?.length || 0} user(s)`); + return response; + }, +}; + diff --git a/components/upsales/actions/get-user/get-user.mjs b/components/upsales/actions/get-user/get-user.mjs new file mode 100644 index 0000000000000..401f12ca3fc42 --- /dev/null +++ b/components/upsales/actions/get-user/get-user.mjs @@ -0,0 +1,33 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-get-user", + name: "Get User", + description: "Retrieves a single user by ID from Upsales. [See the documentation](https://api.upsales.com/#07e5839b-2043-4d89-97c3-61be8b8ffe93)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: true, + }, + props: { + app, + userId: { + propDefinition: [ + app, + "userId", + ], + }, + }, + async run({ $ }) { + const response = await this.app.getUser({ + $, + userId: this.userId, + }); + + $.export("$summary", `Successfully retrieved user: ${response.data?.name || this.userId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/update-appointment/update-appointment.mjs b/components/upsales/actions/update-appointment/update-appointment.mjs new file mode 100644 index 0000000000000..ef4e21325ba08 --- /dev/null +++ b/components/upsales/actions/update-appointment/update-appointment.mjs @@ -0,0 +1,114 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-update-appointment", + name: "Update Appointment", + description: "Updates an existing appointment in Upsales. [See the documentation](https://api.upsales.com/#79919ae8-cef0-40cd-a505-22a5a7ad0611)", + version: "0.0.2", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + appointmentId: { + type: "string", + label: "Appointment ID", + description: "The ID of the appointment to update", + async options({ page }) { + const { data } = await this.app.listAppointments({ + params: { + limit: 100, + offset: 100 * page, + }, + }); + return data?.map((appointment) => ({ + label: appointment.description || `Appointment ${appointment.id}`, + value: appointment.id, + })) || []; + }, + }, + clientId: { + type: "integer", + label: "Client ID", + description: "The client ID to associate with the appointment", + optional: true, + }, + users: { + propDefinition: [ + app, + "userId", + ], + type: "string[]", + label: "Users", + description: "Select one or more users to associate with the appointment", + optional: true, + }, + date: { + type: "string", + label: "Date", + description: "The date of the appointment. In ISO 8601 format. e.g. `2026-04-16`", + optional: true, + }, + endTime: { + type: "string", + label: "End Time", + description: "The end time of the appointment. In ISO 8601 format. e.g. `11:00:00`", + optional: true, + }, + description: { + type: "string", + label: "Description", + description: "The description of the appointment", + optional: true, + }, + activityType: { + propDefinition: [ + app, + "activityTypeId", + ], + optional: true, + }, + contactIds: { + propDefinition: [ + app, + "contactId", + ], + type: "string[]", + label: "Contact IDs", + description: "The contact IDs to associate with the appointment", + optional: true, + }, + }, + async run({ $ }) { + const response = await this.app.updateAppointment({ + $, + appointmentId: this.appointmentId, + data: { + client: this.clientId, + users: this.users + ? this.users.map((user) => ({ + id: user, + })) + : undefined, + date: this.date, + endTime: this.endTime, + description: this.description, + activityType: this.activityType + ? { + id: this.activityType, + } + : undefined, + contacts: this.contactIds + ? this.contactIds.map((contact) => ({ + id: contact, + })) + : undefined, + }, + }); + $.export("$summary", `Successfully updated appointment with ID: ${this.appointmentId}`); + return response; + }, +}; diff --git a/components/upsales/actions/update-company/update-company.mjs b/components/upsales/actions/update-company/update-company.mjs new file mode 100644 index 0000000000000..0cfa9ab0dbee6 --- /dev/null +++ b/components/upsales/actions/update-company/update-company.mjs @@ -0,0 +1,86 @@ +import { ConfigurationError } from "@pipedream/platform"; +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-update-company", + name: "Update Company", + description: "Updates an existing company (account) in Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + companyId: { + propDefinition: [ + app, + "companyId", + ], + }, + name: { + propDefinition: [ + app, + "companyName", + ], + optional: true, + }, + phone: { + propDefinition: [ + app, + "companyPhone", + ], + }, + webpage: { + propDefinition: [ + app, + "companyWebpage", + ], + }, + users: { + propDefinition: [ + app, + "userId", + ], + type: "string[]", + label: "Users", + description: "User IDs to associate with this company. Example: [\"12345\", \"67890\"]", + optional: true, + }, + custom: { + propDefinition: [ + app, + "companyCustom", + ], + }, + }, + async run({ $ }) { + const custom = this.custom?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in custom field: ${item}`); + } + }); + + const response = await this.app.updateCompany({ + $, + companyId: this.companyId, + data: { + name: this.name, + phone: this.phone, + webpage: this.webpage, + users: this.users, + custom, + }, + }); + + $.export("$summary", `Successfully updated company: ${this.name || this.companyId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/update-contact/update-contact.mjs b/components/upsales/actions/update-contact/update-contact.mjs new file mode 100644 index 0000000000000..0b9695049ddf9 --- /dev/null +++ b/components/upsales/actions/update-contact/update-contact.mjs @@ -0,0 +1,98 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-update-contact", + name: "Update Contact", + description: "Updates an existing contact in Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + contactId: { + propDefinition: [ + app, + "contactId", + ], + }, + firstName: { + propDefinition: [ + app, + "contactFirstName", + ], + }, + lastName: { + propDefinition: [ + app, + "contactLastName", + ], + }, + phone: { + propDefinition: [ + app, + "contactPhone", + ], + }, + cellPhone: { + propDefinition: [ + app, + "contactCellPhone", + ], + }, + email: { + propDefinition: [ + app, + "contactEmail", + ], + }, + title: { + propDefinition: [ + app, + "contactTitle", + ], + }, + active: { + propDefinition: [ + app, + "contactActive", + ], + }, + clientId: { + propDefinition: [ + app, + "contactClientId", + ], + }, + }, + async run({ $ }) { + const data = { + firstName: this.firstName, + lastName: this.lastName, + phone: this.phone, + cellPhone: this.cellPhone, + email: this.email, + title: this.title, + active: this.active, + }; + + if (this.clientId) { + data.client = { + id: this.clientId, + }; + } + + const response = await this.app.updateContact({ + $, + contactId: this.contactId, + data, + }); + + $.export("$summary", `Successfully updated contact: ${this.firstName || this.lastName || this.contactId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/update-opportunity/update-opportunity.mjs b/components/upsales/actions/update-opportunity/update-opportunity.mjs new file mode 100644 index 0000000000000..1b3f15934afdb --- /dev/null +++ b/components/upsales/actions/update-opportunity/update-opportunity.mjs @@ -0,0 +1,107 @@ +import app from "../../upsales.app.mjs"; +import { ConfigurationError } from "@pipedream/platform"; + +export default { + key: "upsales-update-opportunity", + name: "Update Opportunity", + description: "Updates an existing opportunity in Upsales. [See the documentation](https://api.upsales.com/#c0ea716a-24ce-4e57-82ac-4bb75b303277)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + opportunityId: { + propDefinition: [ + app, + "opportunityId", + ], + }, + description: { + type: "string", + label: "Description", + description: "Opportunity description", + optional: true, + }, + date: { + type: "string", + label: "Date", + description: "Opportunity date (ISO 8601 format, e.g., 2024-01-15T10:00:00Z)", + optional: true, + }, + userId: { + propDefinition: [ + app, + "userId", + ], + description: "User who created the opportunity", + optional: true, + }, + clientId: { + propDefinition: [ + app, + "companyId", + ], + label: "Client ID", + description: "Company this opportunity belongs to", + optional: true, + }, + stageId: { + propDefinition: [ + app, + "stageId", + ], + description: "Stage to which the opportunity belongs to", + optional: true, + }, + orderRow: { + type: "string[]", + label: "Order Rows", + description: "Array of order row objects in JSON format. Each entry should be a string like `{ \"product\": { \"id\": 123 }, \"quantity\": 2, \"price\": 100 }`. [See the documentation](https://api.upsales.com/#b62d7eee-7483-47e2-821e-70834a5b5c17) for all available properties.", + optional: true, + }, + }, + async run({ $ }) { + const orderRow = this.orderRow?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in orderRow field: ${item}`); + } + }); + + const response = await this.app.updateOrder({ + $, + orderId: this.opportunityId, + data: { + description: this.description, + date: this.date, + user: this.userId + ? { + id: this.userId, + } + : undefined, + client: this.clientId + ? { + id: this.clientId, + } + : undefined, + stage: this.stageId + ? { + id: this.stageId, + } + : undefined, + probability: this.probability, + orderRow, + }, + }); + + $.export("$summary", `Successfully updated opportunity: ${this.description}`); + return response; + }, +}; diff --git a/components/upsales/actions/update-order/update-order.mjs b/components/upsales/actions/update-order/update-order.mjs new file mode 100644 index 0000000000000..6a384f61dcfa9 --- /dev/null +++ b/components/upsales/actions/update-order/update-order.mjs @@ -0,0 +1,106 @@ +import { ConfigurationError } from "@pipedream/platform"; +import app from "../../upsales.app.mjs"; +import orderProps from "../../common/orderProps.mjs"; +import { makePropsOptional } from "../../common/utils.mjs"; + +export default { + key: "upsales-update-order", + name: "Update Order", + description: "Updates an existing order in Upsales. [See the documentation](https://api.upsales.com/#eec6ead8-d121-40e6-9910-185ca06ac323)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + orderId: { + propDefinition: [ + app, + "orderId", + ], + }, + ...makePropsOptional(orderProps), + }, + async run({ $ }) { + const custom = this.custom?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in custom field: ${item}`); + } + }); + + const orderRow = this.orderRow?.map((item) => { + try { + return typeof item === "string" + ? JSON.parse(item) + : item; + } catch (e) { + throw new ConfigurationError(`Invalid JSON in orderRow field: ${item}`); + } + }); + + let projects = this.projects; + if (projects && typeof projects === "string") { + try { + projects = JSON.parse(projects); + } catch (e) { + throw new ConfigurationError(`Invalid JSON in projects field: ${projects}`); + } + } + + const response = await this.app.updateOrder({ + $, + orderId: this.orderId, + data: { + description: this.description, + date: this.date, + user: this.userId + ? { + id: this.userId, + } + : undefined, + client: this.clientId + ? { + id: this.clientId, + } + : undefined, + stage: this.stageId + ? { + id: this.stageId, + } + : undefined, + probability: this.probability, + closeDate: this.closeDate, + notes: this.notes, + contact: this.contactId + ? { + id: this.contactId, + } + : undefined, + projects, + clientConnection: this.clientConnectionId + ? { + id: this.clientConnectionId, + } + : undefined, + currencyRate: this.currencyRate, + currency: this.currency, + custom, + competitorId: this.competitorId, + lostReason: this.lostReason, + notify: this.notify, + orderRow, + }, + }); + + $.export("$summary", `Successfully updated order: ${this.description || this.orderId}`); + return response; + }, +}; + diff --git a/components/upsales/actions/update-stage/update-stage.mjs b/components/upsales/actions/update-stage/update-stage.mjs new file mode 100644 index 0000000000000..708aa579c83a3 --- /dev/null +++ b/components/upsales/actions/update-stage/update-stage.mjs @@ -0,0 +1,49 @@ +import app from "../../upsales.app.mjs"; + +export default { + key: "upsales-update-stage", + name: "Update Stage", + description: "Updates an existing order stage in Upsales. [See the documentation](https://api.upsales.com/#3e8b5e8d-3f4a-4e8e-8b5e-8d3f4a4e8e8b)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + stageId: { + propDefinition: [ + app, + "stageId", + ], + }, + name: { + propDefinition: [ + app, + "stageName", + ], + }, + probability: { + propDefinition: [ + app, + "stageProbability", + ], + }, + }, + async run({ $ }) { + const response = await this.app.updateStage({ + $, + stageId: this.stageId, + data: { + name: this.name, + probability: this.probability, + }, + }); + + $.export("$summary", `Successfully updated stage: ${this.name}`); + return response; + }, +}; + diff --git a/components/upsales/actions/upload-document/upload-document.mjs b/components/upsales/actions/upload-document/upload-document.mjs new file mode 100644 index 0000000000000..25273d21ad5be --- /dev/null +++ b/components/upsales/actions/upload-document/upload-document.mjs @@ -0,0 +1,56 @@ +import app from "../../upsales.app.mjs"; +import { getFileStreamAndMetadata } from "@pipedream/platform"; +import FormData from "form-data"; + +export default { + key: "upsales-upload-document", + name: "Upload Document", + description: "Uploads a document to Upsales. [See the documentation](https://api.upsales.com/#d9d71f21-919a-4ebc-b8e4-84c25b70de99)", + version: "0.0.1", + type: "action", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + props: { + app, + orderId: { + propDefinition: [ + app, + "orderId", + ], + }, + file: { + type: "string", + label: "File", + description: "The file to upload. Provide either a file URL or a path to a file in the `/tmp` directory (for example, `/tmp/myFile.txt`)", + format: "file-ref", + }, + syncDir: { + type: "dir", + accessMode: "read", + sync: true, + optional: true, + }, + }, + async run({ $ }) { + const data = new FormData(); + const { + stream, metadata, + } = await getFileStreamAndMetadata(this.file); + data.append("file", stream, { + contentType: metadata.contentType, + knownLength: metadata.size, + filename: metadata.name, + }); + const response = await this.app.uploadOrderDocument({ + $, + orderId: this.orderId, + data, + headers: data.getHeaders(), + }); + $.export("$summary", `Successfully uploaded document to order ${this.orderId}.`); + return response; + }, +}; diff --git a/components/upsales/common/orderProps.mjs b/components/upsales/common/orderProps.mjs new file mode 100644 index 0000000000000..611bfa938fc4d --- /dev/null +++ b/components/upsales/common/orderProps.mjs @@ -0,0 +1,122 @@ +import app from "../upsales.app.mjs"; + +export default { + description: { + type: "string", + label: "Description", + description: "Order description", + }, + date: { + type: "string", + label: "Date", + description: "Order date (ISO 8601 format, e.g., 2024-01-15T10:00:00Z)", + }, + userId: { + propDefinition: [ + app, + "userId", + ], + description: "User who created the order", + }, + clientId: { + propDefinition: [ + app, + "companyId", + ], + label: "Client ID", + description: "Company this order belongs to", + }, + stageId: { + propDefinition: [ + app, + "stageId", + ], + description: "Stage to which the order belongs to", + }, + probability: { + type: "integer", + label: "Probability", + description: "Probability percentage, between 0-100", + min: 0, + max: 100, + }, + closeDate: { + type: "string", + label: "Close Date", + description: "Date when Order became 100% or 0% (ISO 8601 format)", + optional: true, + }, + notes: { + type: "string", + label: "Notes", + description: "Order notes", + optional: true, + }, + contactId: { + propDefinition: [ + app, + "contactId", + ], + description: "Contact reference of the company that ordered", + optional: true, + }, + projects: { + type: "object", + label: "Projects", + description: "Campaign payload as a JSON object, e.g. { \"id\": 42, \"name\": \"Q1 Retention\" }", + optional: true, + }, + clientConnectionId: { + propDefinition: [ + app, + "companyId", + ], + label: "Client Connection ID", + description: "Second company connected to this order", + optional: true, + }, + currencyRate: { + type: "string", + label: "Currency Rate", + description: "Currency rate in relation to the base currency of the account", + optional: true, + }, + currency: { + type: "string", + label: "Currency", + description: "Currency for the order (e.g., USD, EUR, SEK)", + optional: true, + }, + custom: { + type: "string[]", + label: "Custom Fields", + description: "Array of custom field/value pairs in JSON format. Each entry should be a string like `{ \"fieldId\": 1, \"value\": \"my value\" }`", + optional: true, + }, + competitorId: { + type: "integer", + label: "Competitor ID", + description: "Competitor ID. Find competitors at https://integration.upsales.com/api/v2/competitors/", + optional: true, + }, + lostReason: { + type: "integer", + label: "Lost Reason", + description: "Lost Reason ID. Find lost reasons at https://integration.upsales.com/api/v2/fieldTranslations/?type=orderlostreason", + optional: true, + }, + notify: { + type: "boolean", + label: "Notify", + description: "Whether to notify other users in the account about this order. Default is true.", + optional: true, + default: true, + }, + orderRow: { + type: "string[]", + label: "Order Rows", + description: "Array of order row objects in JSON format. Each entry should be a string like `{ \"product\": { \"id\": 123 }, \"quantity\": 2, \"price\": 100 }`. [See the documentation](https://api.upsales.com/#b62d7eee-7483-47e2-821e-70834a5b5c17) for all available properties.", + optional: true, + }, +}; + diff --git a/components/upsales/common/utils.mjs b/components/upsales/common/utils.mjs new file mode 100644 index 0000000000000..77a16de4a73a7 --- /dev/null +++ b/components/upsales/common/utils.mjs @@ -0,0 +1,13 @@ +export function makePropsOptional(props) { + const optionalProps = {}; + for (const [ + key, + value, + ] of Object.entries(props)) { + optionalProps[key] = { + ...value, + optional: true, + }; + } + return optionalProps; +} diff --git a/components/upsales/package.json b/components/upsales/package.json index 4036a66ebaa36..fbd035b734da2 100644 --- a/components/upsales/package.json +++ b/components/upsales/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/upsales", - "version": "0.0.1", + "version": "0.1.1", "description": "Pipedream Upsales Components", "main": "upsales.app.mjs", "keywords": [ @@ -11,5 +11,9 @@ "author": "Pipedream (https://pipedream.com/)", "publishConfig": { "access": "public" + }, + "dependencies": { + "@pipedream/platform": "^3.1.1", + "form-data": "^4.0.5" } -} \ No newline at end of file +} diff --git a/components/upsales/upsales.app.mjs b/components/upsales/upsales.app.mjs index a25cb38c3794c..f41fec35d9a34 100644 --- a/components/upsales/upsales.app.mjs +++ b/components/upsales/upsales.app.mjs @@ -1,11 +1,533 @@ +import { axios } from "@pipedream/platform"; +const DEFAULT_LIMIT = 100; + export default { type: "app", app: "upsales", - propDefinitions: {}, + propDefinitions: { + userId: { + type: "string", + label: "User ID", + description: "The user's unique ID. Use **Get User List** to find an ID by name or email.", + async options({ page }) { + const { data } = await this.listUsers({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((user) => ({ + label: `${user.name} (${user.email})`, + value: user.clientid, + })); + }, + }, + stageId: { + type: "string", + label: "Stage ID", + description: "The stage's unique ID. Use **Get Stage List** to find an ID by name or probability.", + async options({ page }) { + const { data } = await this.listStages({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((stage) => ({ + label: `${stage.name} (${stage.probability}%)`, + value: stage.id, + })); + }, + }, + stageName: { + type: "string", + label: "Name", + description: "The name of the stage", + }, + stageProbability: { + type: "integer", + label: "Probability", + description: "The probability percentage (0-100) associated with this stage", + min: 0, + max: 100, + }, + companyId: { + type: "string", + label: "Company ID", + description: "The company's unique ID. Use **Get Company List** to find an ID by name.", + async options({ page }) { + const { data } = await this.listCompanies({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((company) => ({ + label: company.name, + value: company.id, + })); + }, + }, + companyName: { + type: "string", + label: "Name", + description: "The name of the company", + }, + companyPhone: { + type: "string", + label: "Phone", + description: "The phone number of the company", + optional: true, + }, + companyWebpage: { + type: "string", + label: "Webpage", + description: "The webpage URL of the company", + optional: true, + }, + companyCustom: { + type: "string[]", + label: "Custom Fields", + description: "Array of custom field/value pairs in JSON format. Each entry should be a string like `{ \"value\": \"2210\", \"fieldId\": 3 }`", + optional: true, + }, + contactId: { + type: "string", + label: "Contact ID", + description: "The contact's unique ID. Use **Get Contact List** to find an ID by name or email.", + async options({ page }) { + const { data } = await this.listContacts({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((contact) => ({ + label: `${contact.name || `${contact.firstName} ${contact.lastName}`} (${contact.email || "No email"})`, + value: contact.id, + })); + }, + }, + contactFirstName: { + type: "string", + label: "First Name", + description: "The first name of the contact", + optional: true, + }, + contactLastName: { + type: "string", + label: "Last Name", + description: "The last name of the contact", + optional: true, + }, + contactPhone: { + type: "string", + label: "Phone", + description: "The phone number of the contact", + optional: true, + }, + contactCellPhone: { + type: "string", + label: "Cell Phone", + description: "The cell phone number of the contact", + optional: true, + }, + contactEmail: { + type: "string", + label: "Email", + description: "The email address of the contact", + optional: true, + }, + contactTitle: { + type: "string", + label: "Title", + description: "The job title of the contact", + optional: true, + }, + contactActive: { + type: "boolean", + label: "Active", + description: "Whether the contact is active", + optional: true, + }, + contactClientId: { + type: "integer", + label: "Client ID", + description: "The client's unique ID to associate with this contact. Use **Get Company List** to find an ID by name.", + optional: true, + }, + activityId: { + type: "string", + label: "Activity ID", + description: "The activity's unique ID. Use **Get Activity List** to find an ID.", + async options({ page }) { + const { data } = await this.listActivities({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((activity) => ({ + label: `${activity.description || activity.type || "Activity"} (ID: ${activity.id})`, + value: activity.id, + })); + }, + }, + npsId: { + type: "string", + label: "NPS ID", + description: "The NPS record's unique ID. Use **Get NPS List** to find an ID.", + async options({ page }) { + const { data } = await this.listNps({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((nps) => ({ + label: `NPS ${nps.id} - Score: ${nps.score || "N/A"}`, + value: nps.id, + })); + }, + }, + orderId: { + type: "string", + label: "Order ID", + description: "The order's unique ID. Use **Get Order List** to find an ID.", + async options({ page }) { + const { data } = await this.listOrders({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + probability: 100, + }, + }); + return data.map((order) => ({ + label: `${order.description || `Order ${order.id}`} - ${order.value || "N/A"}`, + value: order.id, + })); + }, + }, + productId: { + type: "string", + label: "Product ID", + description: "The product's unique ID. Use **Get Product List** to find an ID by name.", + async options({ page }) { + const { data } = await this.listProducts({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((product) => ({ + label: product.name, + value: product.id, + })); + }, + }, + activityTypeId: { + type: "string", + label: "Activity Type ID", + description: "The activity type's unique ID", + async options({ page }) { + const { data } = await this.listActivityTypes({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + }, + }); + return data.map((activityType) => ({ + label: activityType.name, + value: activityType.id, + })); + }, + }, + opportunityId: { + type: "string", + label: "Opportunity ID", + description: "The opportunity's unique ID. Use **Get Opportunity List** to find an ID.", + async options({ page }) { + const { data } = await this.listOrders({ + params: { + limit: DEFAULT_LIMIT, + offset: page * DEFAULT_LIMIT, + probability: [ + "gte:1", + "lte:99", + ], + }, + }); + return data.map((opportunity) => ({ + label: opportunity.name, + value: opportunity.id, + })); + }, + }, + limit: { + type: "integer", + label: "Limit", + description: "The maximum number of results to return. Defaults to 1000.", + default: 1000, + optional: true, + }, + offset: { + type: "integer", + label: "Offset", + description: "The number of results to skip. Defaults to 0.", + default: 0, + optional: true, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + _baseUrl() { + return "https://integration.upsales.com/api/v2"; + }, + async _makeRequest({ + $ = this, params, ...args + }) { + return axios($, { + baseURL: this._baseUrl(), + params: { + token: this.$auth.api_key, + ...params, + }, + ...args, + }); + }, + async createUser(args = {}) { + return this._makeRequest({ + method: "POST", + url: "/master/users", + ...args, + }); + }, + async listUsers(args = {}) { + return this._makeRequest({ + url: "/users", + ...args, + }); + }, + async getUser({ + userId, ...args + }) { + return this._makeRequest({ + url: `/master/users/${userId}`, + ...args, + }); + }, + async deactivateUser({ + userId, ...args + }) { + return this._makeRequest({ + method: "PUT", + url: `/master/users/${userId}`, + ...args, + }); + }, + async listStages(args = {}) { + return this._makeRequest({ + url: "/orderstages", + ...args, + }); + }, + async getStage({ + stageId, ...args + }) { + return this._makeRequest({ + url: `/orderstages/${stageId}`, + ...args, + }); + }, + async createStage(args = {}) { + return this._makeRequest({ + method: "POST", + url: "/orderstages", + ...args, + }); + }, + async updateStage({ + stageId, ...args + }) { + return this._makeRequest({ + method: "PUT", + url: `/orderstages/${stageId}`, + ...args, + }); + }, + async listCompanies(args = {}) { + return this._makeRequest({ + url: "/accounts", + ...args, + }); + }, + async getCompany({ + companyId, ...args + }) { + return this._makeRequest({ + url: `/accounts/${companyId}`, + ...args, + }); + }, + async createCompany(args = {}) { + return this._makeRequest({ + method: "POST", + url: "/accounts", + ...args, + }); + }, + async updateCompany({ + companyId, ...args + }) { + return this._makeRequest({ + method: "PUT", + url: `/accounts/${companyId}`, + ...args, + }); + }, + async listContacts(args = {}) { + return this._makeRequest({ + url: "/contacts", + ...args, + }); + }, + async getContact({ + contactId, ...args + }) { + return this._makeRequest({ + url: `/contacts/${contactId}`, + ...args, + }); + }, + async createContact(args = {}) { + return this._makeRequest({ + method: "POST", + url: "/contacts", + ...args, + }); + }, + async updateContact({ + contactId, ...args + }) { + return this._makeRequest({ + method: "PUT", + url: `/contacts/${contactId}`, + ...args, + }); + }, + async listActivities(args = {}) { + return this._makeRequest({ + url: "/activities", + ...args, + }); + }, + async getActivity({ + activityId, ...args + }) { + return this._makeRequest({ + url: `/activities/${activityId}`, + ...args, + }); + }, + async listAppointments(args = {}) { + return this._makeRequest({ + url: "/appointments", + ...args, + }); + }, + async createAppointment(args = {}) { + return this._makeRequest({ + method: "POST", + url: "/appointments", + ...args, + }); + }, + async updateAppointment({ + appointmentId, ...args + }) { + return this._makeRequest({ + method: "PUT", + url: `/appointments/${appointmentId}`, + ...args, + }); + }, + async listPhoneCalls(args = {}) { + return this._makeRequest({ + url: "/phoneCall", + ...args, + }); + }, + async listNps(args = {}) { + return this._makeRequest({ + url: "/nps", + ...args, + }); + }, + async getNps({ + npsId, ...args + }) { + return this._makeRequest({ + url: `/nps/${npsId}`, + ...args, + }); + }, + async listOrders(args = {}) { + return this._makeRequest({ + url: "/orders", + ...args, + }); + }, + async getOrder({ + orderId, ...args + }) { + return this._makeRequest({ + url: `/orders/${orderId}`, + ...args, + }); + }, + async createOrder(args = {}) { + return this._makeRequest({ + method: "POST", + url: "/orders", + ...args, + }); + }, + async updateOrder({ + orderId, ...args + }) { + return this._makeRequest({ + method: "PUT", + url: `/orders/${orderId}`, + ...args, + }); + }, + async listProducts(args = {}) { + return this._makeRequest({ + url: "/products", + ...args, + }); + }, + async getProduct({ + productId, ...args + }) { + return this._makeRequest({ + url: `/products/${productId}`, + ...args, + }); + }, + async listActivityTypes(args = {}) { + return this._makeRequest({ + url: "/todoTypes", + ...args, + }); + }, + async uploadOrderDocument({ + orderId, ...args + }) { + return this._makeRequest({ + method: "POST", + url: `/resources/upload/internal/orders/${orderId}`, + ...args, + }); }, }, }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b5a9d8e4b8e1..0ee02e2046c69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1535,8 +1535,8 @@ importers: specifier: ^3.2.5 version: 3.3.0 fast-xml-parser: - specifier: ^5.5.7 - version: 5.5.7 + specifier: ^5.7.0 + version: 5.7.1 mime-types: specifier: ^2.1.35 version: 2.1.35 @@ -2826,7 +2826,7 @@ importers: version: 3.3.0 fast-xml-parser: specifier: ^5.5.8 - version: 5.5.8 + version: 5.7.0 components/chimp_rewriter: {} @@ -5451,6 +5451,15 @@ importers: specifier: 4.0.4 version: 4.0.4 + components/filepost: + dependencies: + '@pipedream/platform': + specifier: ^3.3.1 + version: 3.3.1 + form-data: + specifier: 4.0.4 + version: 4.0.4 + components/files_com: dependencies: '@pipedream/platform': @@ -7515,6 +7524,9 @@ importers: specifier: ^3.1.1 version: 3.1.1 + components/huntress: + specifiers: {} + components/hybrid_analysis: {} components/hygraph: {} @@ -8026,8 +8038,8 @@ importers: specifier: ^3.1.1 version: 3.1.1 fast-xml-parser: - specifier: ^5.5.7 - version: 5.5.7 + specifier: ^5.7.0 + version: 5.7.1 components/jibble: dependencies: @@ -8880,7 +8892,7 @@ importers: dependencies: linkup-sdk: specifier: ^1.0.3 - version: 1.2.0(@types/node@25.6.0)(typescript@5.9.3) + version: 1.2.0(@types/node@20.19.39)(typescript@5.6.3) components/linkupapi: dependencies: @@ -10326,7 +10338,7 @@ importers: version: 0.5.6 netlify: specifier: ^23.0.0 - version: 23.11.0(@azure/identity@4.13.1)(@azure/storage-blob@12.29.1)(@types/express@4.17.25)(@types/node@25.6.0)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2) + version: 23.11.0(@azure/identity@4.13.1)(@azure/storage-blob@12.29.1)(@types/express@4.17.25)(@types/node@20.19.39)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2) parse-link-header: specifier: ^2.0.0 version: 2.0.0 @@ -11013,8 +11025,8 @@ importers: specifier: ^3.1.1 version: 3.1.1 fast-xml-parser: - specifier: ^5.5.7 - version: 5.5.7 + specifier: ^5.7.0 + version: 5.7.1 components/openthesaurus: {} @@ -12102,6 +12114,9 @@ importers: specifier: ^3.1.1 version: 3.1.1 + components/polly_help: + specifiers: {} + components/polygon: dependencies: '@pipedream/platform': @@ -12162,7 +12177,7 @@ importers: devDependencies: dtslint: specifier: ^4.2.1 - version: 4.2.1(typescript@5.9.3) + version: 4.2.1(typescript@5.6.3) components/postgrid: dependencies: @@ -12558,7 +12573,7 @@ importers: dependencies: '@qdrant/js-client-rest': specifier: ^1.11.0 - version: 1.15.1(typescript@5.9.3) + version: 1.15.1(typescript@5.6.3) components/qntrl: dependencies: @@ -13543,8 +13558,8 @@ importers: specifier: ^3.1.1 version: 3.1.1 fast-xml-parser: - specifier: ^5.5.7 - version: 5.5.7 + specifier: ^5.7.0 + version: 5.7.1 handlebars: specifier: ^4.7.9 version: 4.7.9 @@ -16635,7 +16650,14 @@ importers: specifier: ^13.0.0 version: 13.0.0 - components/upsales: {} + components/upsales: + dependencies: + '@pipedream/platform': + specifier: ^3.1.1 + version: 3.3.1 + form-data: + specifier: 4.0.4 + version: 4.0.4 components/upstash_redis: dependencies: @@ -18376,7 +18398,7 @@ importers: version: 6.4.2(@types/node@25.6.0)(jiti@2.6.1)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.3.0 - version: 4.5.4(@types/node@25.6.0)(rollup@4.53.2)(typescript@5.9.3)(vite@6.4.2(@types/node@25.6.0)(jiti@2.6.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.5.4(@types/node@25.6.0)(rollup@4.53.2)(typescript@5.6.3)(vite@6.4.2(@types/node@25.6.0)(jiti@2.6.1)(tsx@4.20.6)(yaml@2.8.1)) packages/prompts: dependencies: @@ -18465,7 +18487,7 @@ importers: version: 3.1.0 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + version: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) type-fest: specifier: ^4.15.0 version: 4.41.0 @@ -21125,8 +21147,8 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -21363,6 +21385,9 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@nodable/entities@2.1.0': + resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -25238,8 +25263,8 @@ packages: bare-buffer: optional: true - bare-fs@4.7.0: - resolution: {integrity: sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==} + bare-fs@4.7.1: + resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -25285,6 +25310,9 @@ packages: bare-url@2.4.0: resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} + bare-url@2.4.2: + resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} + base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} @@ -27412,25 +27440,29 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-builder@1.1.4: - resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-xml-builder@1.1.5: + resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} - fast-xml-parser@4.5.4: - resolution: {integrity: sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==} + fast-xml-parser@4.5.6: + resolution: {integrity: sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==} hasBin: true fast-xml-parser@5.2.5: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true - fast-xml-parser@5.5.7: - resolution: {integrity: sha512-LteOsISQ2GEiDHZch6L9hB0+MLoYVLToR7xotrzU0opCICBkxOPgHAy1HxAvtxfJNXDJpgAsQN30mkrfpO2Prg==} - hasBin: true - fast-xml-parser@5.5.8: resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} hasBin: true + fast-xml-parser@5.7.0: + resolution: {integrity: sha512-MTcrUoRQ1GSQ9iG3QJzBGquYYYeA7piZaJoIWbPFGbRn6Jj6z7xgoAyi4DrZX4y2ZIQQBF59gc/zmvvejjgoFQ==} + hasBin: true + + fast-xml-parser@5.7.1: + resolution: {integrity: sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -31461,12 +31493,8 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-expression-matcher@1.1.3: - resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} - engines: {node: '>=14.0.0'} - - path-expression-matcher@1.2.0: - resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} engines: {node: '>=14.0.0'} path-is-absolute@1.0.1: @@ -31960,6 +31988,7 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qified@0.5.2: @@ -33221,8 +33250,8 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strnum@2.2.1: - resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} + strnum@2.2.3: + resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} @@ -36954,7 +36983,7 @@ snapshots: '@azure/core-xml@1.5.0': dependencies: - fast-xml-parser: 5.5.8 + fast-xml-parser: 5.7.1 tslib: 2.8.1 '@azure/identity@3.4.2': @@ -38158,11 +38187,11 @@ snapshots: - '@types/node' - typescript - '@commitlint/cli@19.8.1(@types/node@25.6.0)(typescript@5.9.3)': + '@commitlint/cli@19.8.1(@types/node@20.19.39)(typescript@5.6.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@25.6.0)(typescript@5.9.3) + '@commitlint/load': 19.8.1(@types/node@20.19.39)(typescript@5.6.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.2 @@ -38225,15 +38254,15 @@ snapshots: - '@types/node' - typescript - '@commitlint/load@19.8.1(@types/node@25.6.0)(typescript@5.9.3)': + '@commitlint/load@19.8.1(@types/node@20.19.39)(typescript@5.6.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 '@commitlint/resolve-extends': 19.8.1 '@commitlint/types': 19.8.1 chalk: 5.6.2 - cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.6.0)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig: 9.0.0(typescript@5.6.3) + cosmiconfig-typescript-loader: 6.2.0(@types/node@20.19.39)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -39126,7 +39155,7 @@ snapshots: duplexify: 4.1.3 ent: 2.2.2 extend: 3.0.2 - fast-xml-parser: 4.5.4 + fast-xml-parser: 4.5.6 gaxios: 5.1.3(encoding@0.1.13) google-auth-library: 8.9.0(encoding@0.1.13) mime: 3.0.0 @@ -39147,7 +39176,7 @@ snapshots: abort-controller: 3.0.0 async-retry: 1.3.3 duplexify: 4.1.3 - fast-xml-parser: 4.5.4 + fast-xml-parser: 4.5.6 gaxios: 6.7.1(encoding@0.1.13) google-auth-library: 9.15.1(encoding@0.1.13) html-entities: 2.6.0 @@ -39315,12 +39344,12 @@ snapshots: optionalDependencies: '@types/node': 17.0.45 - '@inquirer/external-editor@1.0.3(@types/node@25.6.0)': + '@inquirer/external-editor@1.0.3(@types/node@20.19.39)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.6.0 + '@types/node': 20.19.39 '@isaacs/balanced-match@4.0.1': {} @@ -39395,7 +39424,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -39409,7 +39438,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -39794,7 +39823,7 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': dependencies: '@emnapi/core': 1.9.1 '@emnapi/runtime': 1.9.1 @@ -39839,7 +39868,7 @@ snapshots: yaml: 2.8.1 yargs: 17.7.2 - '@netlify/build@35.3.1(@opentelemetry/api@1.8.0)(@types/node@25.6.0)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2)': + '@netlify/build@35.3.1(@opentelemetry/api@1.8.0)(@types/node@20.19.39)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2)': dependencies: '@bugsnag/js': 8.6.0 '@netlify/blobs': 10.3.3(supports-color@10.2.2) @@ -39887,7 +39916,7 @@ snapshots: string-width: 7.2.0 supports-color: 10.2.2 terminal-link: 4.0.0 - ts-node: 10.9.2(@types/node@25.6.0)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@20.19.39)(typescript@5.6.3) typescript: 5.6.3 uuid: 11.1.0 yaml: 2.8.1 @@ -40239,6 +40268,8 @@ snapshots: '@noble/hashes@1.8.0': {} + '@nodable/entities@2.1.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -41621,7 +41652,6 @@ snapshots: transitivePeerDependencies: - rolldown - rollup - - supports-color '@putout/operator-parens@2.0.0(rolldown@1.0.0-beta.60(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1))(rollup@4.53.2)': dependencies: @@ -42244,11 +42274,11 @@ snapshots: - rollup - supports-color - '@qdrant/js-client-rest@1.15.1(typescript@5.9.3)': + '@qdrant/js-client-rest@1.15.1(typescript@5.6.3)': dependencies: '@qdrant/openapi-typescript-fetch': 1.2.6 '@sevinf/maybe': 0.5.0 - typescript: 5.9.3 + typescript: 5.6.3 undici: 6.22.0 '@qdrant/openapi-typescript-fetch@1.2.6': {} @@ -42360,7 +42390,7 @@ snapshots: '@rolldown/binding-wasm32-wasi@1.0.0-beta.60(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -42617,20 +42647,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.9(typescript@5.9.3))': - dependencies: - conventional-changelog-angular: 8.1.0 - conventional-changelog-writer: 8.2.0 - conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 - debug: 4.4.3(supports-color@9.4.0) - import-from-esm: 2.0.0 - lodash-es: 4.18.1 - micromatch: 4.0.8 - semantic-release: 24.2.9(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - '@semantic-release/error@4.0.0': {} '@semantic-release/github@11.0.6(semantic-release@24.2.9(typescript@5.6.3))': @@ -42655,28 +42671,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.6(semantic-release@24.2.9(typescript@5.9.3))': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/plugin-paginate-rest': 13.2.1(@octokit/core@7.0.6) - '@octokit/plugin-retry': 8.0.3(@octokit/core@7.0.6) - '@octokit/plugin-throttling': 11.0.3(@octokit/core@7.0.6) - '@semantic-release/error': 4.0.0 - aggregate-error: 5.0.0 - debug: 4.4.3(supports-color@9.4.0) - dir-glob: 3.0.1 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - issue-parser: 7.0.1 - lodash-es: 4.18.1 - mime: 4.1.0 - p-filter: 4.1.0 - semantic-release: 24.2.9(typescript@5.9.3) - tinyglobby: 0.2.15 - url-join: 5.0.0 - transitivePeerDependencies: - - supports-color - '@semantic-release/npm@12.0.2(semantic-release@24.2.9(typescript@5.6.3))': dependencies: '@semantic-release/error': 4.0.0 @@ -42694,23 +42688,6 @@ snapshots: semver: 7.7.4 tempy: 3.1.0 - '@semantic-release/npm@12.0.2(semantic-release@24.2.9(typescript@5.9.3))': - dependencies: - '@semantic-release/error': 4.0.0 - aggregate-error: 5.0.0 - execa: 9.6.0 - fs-extra: 11.3.2 - lodash-es: 4.18.1 - nerf-dart: 1.0.0 - normalize-url: 8.1.0 - npm: 10.9.4 - rc: 1.2.8 - read-pkg: 9.0.1 - registry-auth-token: 5.1.0 - semantic-release: 24.2.9(typescript@5.9.3) - semver: 7.7.4 - tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.1.0(semantic-release@24.2.9(typescript@5.6.3))': dependencies: conventional-changelog-angular: 8.1.0 @@ -42727,22 +42704,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@semantic-release/release-notes-generator@14.1.0(semantic-release@24.2.9(typescript@5.9.3))': - dependencies: - conventional-changelog-angular: 8.1.0 - conventional-changelog-writer: 8.2.0 - conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 - debug: 4.4.3(supports-color@9.4.0) - get-stream: 7.0.1 - import-from-esm: 2.0.0 - into-stream: 7.0.0 - lodash-es: 4.18.1 - read-package-up: 11.0.0 - semantic-release: 24.2.9(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - '@sendgrid/client@7.7.0': dependencies: '@sendgrid/helpers': 7.7.0 @@ -44524,7 +44485,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.9.3)': + '@vue/language-core@2.2.0(typescript@5.6.3)': dependencies: '@volar/language-core': 2.4.23 '@vue/compiler-dom': 3.5.24 @@ -44535,7 +44496,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 5.6.3 '@vue/shared@3.5.24': {} @@ -45365,12 +45326,12 @@ snapshots: - react-native-b4a optional: true - bare-fs@4.7.0: + bare-fs@4.7.1: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 bare-stream: 2.13.0(bare-events@2.8.2) - bare-url: 2.4.0 + bare-url: 2.4.2 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller @@ -45404,6 +45365,11 @@ snapshots: bare-url@2.4.0: dependencies: bare-path: 3.0.0 + optional: true + + bare-url@2.4.2: + dependencies: + bare-path: 3.0.0 base-64@0.1.0: {} @@ -46322,12 +46288,12 @@ snapshots: jiti: 2.6.1 typescript: 5.6.3 - cosmiconfig-typescript-loader@6.2.0(@types/node@25.6.0)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.2.0(@types/node@20.19.39)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3): dependencies: - '@types/node': 25.6.0 - cosmiconfig: 9.0.0(typescript@5.9.3) + '@types/node': 20.19.39 + cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 2.6.1 - typescript: 5.9.3 + typescript: 5.6.3 cosmiconfig@5.2.1: dependencies: @@ -46353,15 +46319,6 @@ snapshots: optionalDependencies: typescript: 5.6.3 - cosmiconfig@9.0.0(typescript@5.9.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.9.3 - cp-file@6.2.0: dependencies: graceful-fs: 4.2.11 @@ -46424,13 +46381,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)): + create-jest@29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -46983,21 +46940,6 @@ snapshots: - react-native-b4a - supports-color - dts-critic@3.3.11(typescript@5.9.3): - dependencies: - '@definitelytyped/header-parser': 0.2.26 - command-exists: 1.2.9 - rimraf: 3.0.2 - semver: 6.3.1 - tmp: 0.2.5 - typescript: 5.9.3 - yargs: 15.4.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - dts-resolver@2.1.3: {} dtslint@4.2.1(typescript@5.6.3): @@ -47019,25 +46961,6 @@ snapshots: - react-native-b4a - supports-color - dtslint@4.2.1(typescript@5.9.3): - dependencies: - '@definitelytyped/header-parser': 0.2.26 - '@definitelytyped/typescript-versions': 0.1.11 - '@definitelytyped/utils': 0.1.13 - dts-critic: 3.3.11(typescript@5.9.3) - fs-extra: 6.0.1 - json-stable-stringify: 1.3.0 - strip-json-comments: 2.0.1 - tslint: 5.14.0(typescript@5.9.3) - tsutils: 2.29.0(typescript@5.9.3) - typescript: 5.9.3 - yargs: 15.4.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - duck@0.1.12: dependencies: underscore: 1.13.7 @@ -48143,29 +48066,37 @@ snapshots: fast-uri@3.1.0: {} - fast-xml-builder@1.1.4: + fast-xml-builder@1.1.5: dependencies: - path-expression-matcher: 1.2.0 + path-expression-matcher: 1.5.0 - fast-xml-parser@4.5.4: + fast-xml-parser@4.5.6: dependencies: strnum: 1.1.2 fast-xml-parser@5.2.5: dependencies: - strnum: 2.2.1 + strnum: 2.2.3 - fast-xml-parser@5.5.7: + fast-xml-parser@5.5.8: dependencies: - fast-xml-builder: 1.1.4 - path-expression-matcher: 1.1.3 - strnum: 2.2.1 + fast-xml-builder: 1.1.5 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 - fast-xml-parser@5.5.8: + fast-xml-parser@5.7.0: + dependencies: + '@nodable/entities': 2.1.0 + fast-xml-builder: 1.1.5 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 + + fast-xml-parser@5.7.1: dependencies: - fast-xml-builder: 1.1.4 - path-expression-matcher: 1.2.0 - strnum: 2.2.1 + '@nodable/entities': 2.1.0 + fast-xml-builder: 1.1.5 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 fastest-levenshtein@1.0.16: {} @@ -49783,12 +49714,12 @@ snapshots: inline-style-parser@0.2.6: {} - inquirer-autocomplete-prompt@1.4.0(inquirer@8.2.7(@types/node@25.6.0)): + inquirer-autocomplete-prompt@1.4.0(inquirer@8.2.7(@types/node@20.19.39)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 figures: 3.2.0 - inquirer: 8.2.7(@types/node@25.6.0) + inquirer: 8.2.7(@types/node@20.19.39) run-async: 2.4.1 rxjs: 6.6.7 @@ -49812,9 +49743,9 @@ snapshots: transitivePeerDependencies: - '@types/node' - inquirer@8.2.7(@types/node@25.6.0): + inquirer@8.2.7(@types/node@20.19.39): dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@25.6.0) + '@inquirer/external-editor': 1.0.3(@types/node@20.19.39) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -50357,16 +50288,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)): + jest-cli@29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + create-jest: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -50438,7 +50369,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)): dependencies: '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 @@ -50464,38 +50395,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.19.39 - ts-node: 10.9.2(@types/node@25.6.0)(typescript@5.6.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)): - dependencies: - '@babel/core': 7.28.5 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.5) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 25.6.0 - ts-node: 10.9.2(@types/node@25.6.0)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@20.19.39)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -50743,12 +50643,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)): + jest@29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@25.6.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3)) + jest-cli: 29.7.0(@types/node@20.19.39)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -51221,12 +51121,12 @@ snapshots: - supports-color - typescript - linkup-sdk@1.2.0(@types/node@25.6.0)(typescript@5.9.3): + linkup-sdk@1.2.0(@types/node@20.19.39)(typescript@5.6.3): dependencies: - '@commitlint/cli': 19.8.1(@types/node@25.6.0)(typescript@5.9.3) + '@commitlint/cli': 19.8.1(@types/node@20.19.39)(typescript@5.6.3) '@commitlint/config-conventional': 19.8.1 axios: 1.15.0(debug@3.2.7) - semantic-release: 24.2.9(typescript@5.9.3) + semantic-release: 24.2.9(typescript@5.6.3) zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) transitivePeerDependencies: @@ -52503,13 +52403,13 @@ snapshots: netlify-redirector@0.5.0: {} - netlify@23.11.0(@azure/identity@4.13.1)(@azure/storage-blob@12.29.1)(@types/express@4.17.25)(@types/node@25.6.0)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2): + netlify@23.11.0(@azure/identity@4.13.1)(@azure/storage-blob@12.29.1)(@types/express@4.17.25)(@types/node@20.19.39)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2): dependencies: '@fastify/static': 7.0.4 '@netlify/ai': 0.3.0(@netlify/api@14.0.9) '@netlify/api': 14.0.9 '@netlify/blobs': 10.1.0 - '@netlify/build': 35.3.1(@opentelemetry/api@1.8.0)(@types/node@25.6.0)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2) + '@netlify/build': 35.3.1(@opentelemetry/api@1.8.0)(@types/node@20.19.39)(encoding@0.1.13)(picomatch@4.0.3)(rollup@4.53.2) '@netlify/build-info': 10.0.9 '@netlify/config': 24.0.8 '@netlify/dev-utils': 4.3.0 @@ -52560,8 +52460,8 @@ snapshots: http-proxy: 1.18.1(debug@4.4.3) http-proxy-middleware: 2.0.9(@types/express@4.17.25)(debug@4.4.3) https-proxy-agent: 7.0.6 - inquirer: 8.2.7(@types/node@25.6.0) - inquirer-autocomplete-prompt: 1.4.0(inquirer@8.2.7(@types/node@25.6.0)) + inquirer: 8.2.7(@types/node@20.19.39) + inquirer-autocomplete-prompt: 1.4.0(inquirer@8.2.7(@types/node@20.19.39)) ipx: 3.1.1(@azure/identity@4.13.1)(@azure/storage-blob@12.29.1)(@netlify/blobs@10.1.0) is-docker: 3.0.0 is-stream: 4.0.1 @@ -53471,9 +53371,7 @@ snapshots: path-exists@5.0.0: {} - path-expression-matcher@1.1.3: {} - - path-expression-matcher@1.2.0: {} + path-expression-matcher@1.5.0: {} path-is-absolute@1.0.1: {} @@ -55205,41 +55103,6 @@ snapshots: - supports-color - typescript - semantic-release@24.2.9(typescript@5.9.3): - dependencies: - '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.9(typescript@5.9.3)) - '@semantic-release/error': 4.0.0 - '@semantic-release/github': 11.0.6(semantic-release@24.2.9(typescript@5.9.3)) - '@semantic-release/npm': 12.0.2(semantic-release@24.2.9(typescript@5.9.3)) - '@semantic-release/release-notes-generator': 14.1.0(semantic-release@24.2.9(typescript@5.9.3)) - aggregate-error: 5.0.0 - cosmiconfig: 9.0.0(typescript@5.9.3) - debug: 4.4.3(supports-color@9.4.0) - env-ci: 11.2.0 - execa: 9.6.0 - figures: 6.1.0 - find-versions: 6.0.0 - get-stream: 6.0.1 - git-log-parser: 1.2.1 - hook-std: 4.0.0 - hosted-git-info: 8.1.0 - import-from-esm: 2.0.0 - lodash-es: 4.18.1 - marked: 15.0.12 - marked-terminal: 7.3.0(marked@15.0.12) - micromatch: 4.0.8 - p-each-series: 3.0.0 - p-reduce: 3.0.0 - read-package-up: 11.0.0 - resolve-from: 5.0.0 - semver: 7.7.4 - semver-diff: 5.0.0 - signale: 1.4.0 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - - typescript - semver-compare@1.0.0: {} semver-diff@5.0.0: @@ -55551,7 +55414,7 @@ snapshots: debug: 3.2.7 expand-tilde: 2.0.2 extend: 3.0.2 - fast-xml-parser: 4.5.4 + fast-xml-parser: 4.5.6 generic-pool: 3.9.0 glob: 7.2.3 https-proxy-agent: 5.0.1 @@ -55594,7 +55457,7 @@ snapshots: bignumber.js: 9.3.1 browser-request: 0.3.3 expand-tilde: 2.0.2 - fast-xml-parser: 5.5.8 + fast-xml-parser: 5.7.1 fastest-levenshtein: 1.0.16 generic-pool: 3.9.0 google-auth-library: 10.5.0 @@ -55988,7 +55851,7 @@ snapshots: strnum@1.1.2: {} - strnum@2.2.1: {} + strnum@2.2.3: {} strtok3@10.3.4: dependencies: @@ -56268,7 +56131,7 @@ snapshots: tar-stream@3.1.8: dependencies: b4a: 1.8.0 - bare-fs: 4.7.0 + bare-fs: 4.7.1 fast-fifo: 1.3.2 streamx: 2.25.0 transitivePeerDependencies: @@ -56586,14 +56449,14 @@ snapshots: yn: 3.1.1 optional: true - ts-node@10.9.2(@types/node@25.6.0)(typescript@5.6.3): + ts-node@10.9.2(@types/node@20.19.39)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.6.0 + '@types/node': 20.19.39 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -56658,23 +56521,6 @@ snapshots: tsutils: 2.29.0(typescript@5.6.3) typescript: 5.6.3 - tslint@5.14.0(typescript@5.9.3): - dependencies: - babel-code-frame: 6.26.0 - builtin-modules: 1.1.1 - chalk: 2.4.2 - commander: 2.20.3 - diff: 3.5.0 - glob: 7.2.3 - js-yaml: 3.14.1 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.22.11 - semver: 5.7.2 - tslib: 1.14.1 - tsutils: 2.29.0(typescript@5.9.3) - typescript: 5.9.3 - tsup@8.5.1(@microsoft/api-extractor@7.55.0(@types/node@20.19.25))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.6.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) @@ -56738,11 +56584,6 @@ snapshots: tslib: 1.14.1 typescript: 5.6.3 - tsutils@2.29.0(typescript@5.9.3): - dependencies: - tslib: 1.14.1 - typescript: 5.9.3 - tsx@4.20.6: dependencies: esbuild: 0.25.12 @@ -57398,18 +57239,18 @@ snapshots: transitivePeerDependencies: - debug - vite-plugin-dts@4.5.4(@types/node@25.6.0)(rollup@4.53.2)(typescript@5.9.3)(vite@6.4.2(@types/node@25.6.0)(jiti@2.6.1)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@25.6.0)(rollup@4.53.2)(typescript@5.6.3)(vite@6.4.2(@types/node@25.6.0)(jiti@2.6.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.55.0(@types/node@25.6.0) '@rollup/pluginutils': 5.3.0(rollup@4.53.2) '@volar/typescript': 2.4.23 - '@vue/language-core': 2.2.0(typescript@5.9.3) + '@vue/language-core': 2.2.0(typescript@5.6.3) compare-versions: 6.1.1 debug: 4.4.3(supports-color@9.4.0) kolorist: 1.8.0 local-pkg: 1.1.2 magic-string: 0.30.21 - typescript: 5.9.3 + typescript: 5.6.3 optionalDependencies: vite: 6.4.2(@types/node@25.6.0)(jiti@2.6.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: