diff --git a/components/charthop/charthop.app.mjs b/components/charthop/charthop.app.mjs index ab0f6407ad1a9..746957318d73f 100644 --- a/components/charthop/charthop.app.mjs +++ b/components/charthop/charthop.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/instantly/actions/add-lead-campaign/add-lead-campaign.mjs b/components/instantly/actions/add-lead-campaign/add-lead-campaign.mjs new file mode 100644 index 0000000000000..d85fc5392ffba --- /dev/null +++ b/components/instantly/actions/add-lead-campaign/add-lead-campaign.mjs @@ -0,0 +1,50 @@ +import { parseObject } from "../../common/utils.mjs"; +import instantly from "../../instantly.app.mjs"; + +export default { + key: "instantly-add-lead-campaign", + name: "Add Lead to Campaign", + description: "Adds a lead to a campaign for tracking or further actions. [See the documentation](https://developer.instantly.ai/lead/add-leads-to-a-campaign)", + version: "0.0.1", + type: "action", + props: { + instantly, + leads: { + propDefinition: [ + instantly, + "leads", + ], + }, + campaignId: { + propDefinition: [ + instantly, + "campaignId", + ], + }, + skipIfInWorkspace: { + type: "boolean", + label: "Skip if in Workspace", + description: "Skip lead if it exists in any campaigns in the workspace", + optional: true, + }, + skipIfInCampaign: { + type: "boolean", + label: "Skip if in Campaign", + description: "Skip lead if it exists in the campaign", + optional: true, + }, + }, + async run({ $ }) { + const response = await this.instantly.addLeadsToCampaign({ + $, + data: { + leads: parseObject(this.leads), + campaign_id: this.campaignId, + skip_if_in_workspace: this.skipIfInWorkspace, + skip_if_in_campaign: this.skipIfInCampaign, + }, + }); + $.export("$summary", `Added ${response.leads_uploaded} leads to campaign ${this.campaignId}`); + return response; + }, +}; diff --git a/components/instantly/actions/add-tags-campaign/add-tags-campaign.mjs b/components/instantly/actions/add-tags-campaign/add-tags-campaign.mjs new file mode 100644 index 0000000000000..6b59814d975ef --- /dev/null +++ b/components/instantly/actions/add-tags-campaign/add-tags-campaign.mjs @@ -0,0 +1,40 @@ +import { parseObject } from "../../common/utils.mjs"; +import instantly from "../../instantly.app.mjs"; + +export default { + key: "instantly-add-tags-campaign", + name: "Add Tags to Campaign", + description: "Adds tags to a specific campaign. [See the documentation](https://developer.instantly.ai/tags/assign-or-unassign-a-tag)", + version: "0.0.1", + type: "action", + props: { + instantly, + campaignIds: { + propDefinition: [ + instantly, + "campaignId", + ], + type: "string[]", + }, + tagIds: { + propDefinition: [ + instantly, + "tagIds", + ], + }, + }, + async run({ $ }) { + const response = await this.instantly.addTagsToCampaign({ + $, + data: { + campaign_id: this.campaignId, + tag_ids: parseObject(this.tagIds), + resource_type: 2, + assign: true, + resource_ids: parseObject(this.campaignIds), + }, + }); + $.export("$summary", response.message); + return response; + }, +}; diff --git a/components/instantly/actions/update-lead-status/update-lead-status.mjs b/components/instantly/actions/update-lead-status/update-lead-status.mjs new file mode 100644 index 0000000000000..db5bf892e2042 --- /dev/null +++ b/components/instantly/actions/update-lead-status/update-lead-status.mjs @@ -0,0 +1,47 @@ +import { ConfigurationError } from "@pipedream/platform"; +import instantly from "../../instantly.app.mjs"; + +export default { + key: "instantly-update-lead-status", + name: "Update Lead Status", + description: "Updates the status of a lead in a campaign. [See the documentation](https://developer.instantly.ai/lead/update-lead-status)", + version: "0.0.1", + type: "action", + props: { + instantly, + campaignId: { + propDefinition: [ + instantly, + "campaignId", + ], + }, + email: { + propDefinition: [ + instantly, + "email", + ], + }, + newStatus: { + propDefinition: [ + instantly, + "newStatus", + ], + }, + }, + async run({ $ }) { + try { + const response = await this.instantly.updateLeadStatus({ + $, + data: { + email: this.email, + new_status: this.newStatus, + campaign_id: this.campaignId, + }, + }); + $.export("$summary", `Updated lead ${this.email} to status '${this.newStatus}'`); + return response; + } catch ({ response }) { + throw new ConfigurationError(response.data.error); + } + }, +}; diff --git a/components/instantly/common/constants.mjs b/components/instantly/common/constants.mjs new file mode 100644 index 0000000000000..b0e103c9c6726 --- /dev/null +++ b/components/instantly/common/constants.mjs @@ -0,0 +1,77 @@ +export const LIMIT = 100; + +export const EVENT_TYPE_OPTIONS = [ + { + label: "Email Sent", + value: "email_sent", + }, + { + label: "Email Bounced", + value: "email_bounced", + }, + { + label: "Email Opened", + value: "email_opened", + }, + { + label: "Email Link Clicked", + value: "email_link_clicked", + }, + { + label: "Reply Received", + value: "reply_received", + }, + { + label: "Lead Unsubscribed", + value: "lead_unsubscribed", + }, + { + label: "Campaign Completed", + value: "campaign_completed", + }, + { + label: "Account Error", + value: "account_error", + }, + { + label: "Lead Not Interested", + value: "lead_not_interested", + }, + { + label: "Lead Neutral", + value: "lead_neutral", + }, + { + label: "Lead Meeting Booked", + value: "lead_meeting_booked", + }, + { + label: "Lead Meeting Completed", + value: "lead_meeting_completed", + }, + { + label: "Lead Closed", + value: "lead_closed", + }, + { + label: "Lead Out of Office", + value: "lead_out_of_office", + }, + { + label: "Lead Wrong Person", + value: "lead_wrong_person", + }, +]; + +export const NEW_STATUS_OPTIONS = [ + "Active", + "Completed", + "Unsubscribed", + "Interested", + "Meeting Booked", + "Meeting Completed", + "Closed", + "Out of Office", + "Not Interested", + "Wrong Person", +]; diff --git a/components/instantly/common/utils.mjs b/components/instantly/common/utils.mjs new file mode 100644 index 0000000000000..dcc9cc61f6f41 --- /dev/null +++ b/components/instantly/common/utils.mjs @@ -0,0 +1,24 @@ +export const parseObject = (obj) => { + if (!obj) return undefined; + + if (Array.isArray(obj)) { + return obj.map((item) => { + if (typeof item === "string") { + try { + return JSON.parse(item); + } catch (e) { + return item; + } + } + return item; + }); + } + if (typeof obj === "string") { + try { + return JSON.parse(obj); + } catch (e) { + return obj; + } + } + return obj; +}; diff --git a/components/instantly/instantly.app.mjs b/components/instantly/instantly.app.mjs index 40deb273427fb..2877295fecddc 100644 --- a/components/instantly/instantly.app.mjs +++ b/components/instantly/instantly.app.mjs @@ -1,11 +1,152 @@ +import { axios } from "@pipedream/platform"; +import { + EVENT_TYPE_OPTIONS, + LIMIT, + NEW_STATUS_OPTIONS, +} from "./common/constants.mjs"; + export default { type: "app", app: "instantly", - propDefinitions: {}, + propDefinitions: { + campaignId: { + type: "string", + label: "Campaign ID", + description: "The ID of the campaign", + async options({ page }) { + const campaigns = await this.listCampaigns({ + params: { + limit: LIMIT, + skip: LIMIT * page, + }, + }); + return campaigns.map(({ + id: value, name: label, + }) => ({ + label, + value, + })); + }, + }, + tagIds: { + type: "string[]", + label: "Tags Id", + description: "List of tag Ids to add", + async options({ page }) { + const { data } = await this.listTags({ + params: { + limit: LIMIT, + skip: LIMIT * page, + }, + }); + return data.map(({ + id: value, label, + }) => ({ + label, + value, + })); + }, + }, + leads: { + type: "string[]", + label: "Leads", + description: "An array of lead objects to add to the campaign. **Example: [{ \"email\":\"john2@abc.com\", \"first_name\":\"John\", \"last_name\":\"Doe\", \"company_name\":\"Instantly\", \"personalization\":\"Loved your latest post\", \"phone\":\"123456789\", \"website\":\"instantly.ai\", \"custom_variables\":{ \"favorite_restaurant\":\"Chipotle\", \"language\":\"English\"}}]**", + }, + skipIfInWorkspace: { + type: "boolean", + label: "Skip if in Workspace", + description: "Skip lead if it exists in any campaigns in the workspace", + optional: true, + }, + skipIfInCampaign: { + type: "boolean", + label: "Skip if in Campaign", + description: "Skip lead if it exists in the campaign", + optional: true, + }, + eventType: { + type: "string", + label: "Event Type", + description: "Type of event to filter", + options: EVENT_TYPE_OPTIONS, + }, + email: { + type: "string", + label: "Lead Email", + description: "Email address of the lead", + }, + newStatus: { + type: "string", + label: "New Status", + description: "New status to assign to the lead", + options: NEW_STATUS_OPTIONS, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + _baseUrl() { + return "https://api.instantly.ai/api/v1"; + }, + _params(params = {}) { + return { + ...params, + api_key: `${this.$auth.api_key}`, + }; + }, + _makeRequest({ + $ = this, params, path, ...opts + }) { + return axios($, { + url: this._baseUrl() + path, + params: this._params(params), + ...opts, + }); + }, + listCampaigns(opts = {}) { + return this._makeRequest({ + path: "/campaign/list", + ...opts, + }); + }, + listTags(opts = {}) { + return this._makeRequest({ + path: "/custom-tag", + ...opts, + }); + }, + addTagsToCampaign(opts = {}) { + return this._makeRequest({ + method: "POST", + path: "/custom-tag/toggle-tag-resource", + ...opts, + }); + }, + addLeadsToCampaign(opts = {}) { + return this._makeRequest({ + method: "POST", + path: "/lead/add", + ...opts, + }); + }, + updateLeadStatus(opts = {}) { + return this._makeRequest({ + method: "POST", + path: "/lead/update/status", + ...opts, + }); + }, + createWebhook(opts = {}) { + return this._makeRequest({ + method: "POST", + path: "/webhook/subscribe", + ...opts, + }); + }, + deleteWebhook(opts = {}) { + return this._makeRequest({ + method: "POST", + path: "/webhook/unsubscribe", + ...opts, + }); }, }, }; diff --git a/components/instantly/package.json b/components/instantly/package.json index 5845c7be0766f..cca202a1b1e66 100644 --- a/components/instantly/package.json +++ b/components/instantly/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/instantly", - "version": "0.0.1", + "version": "0.1.0", "description": "Pipedream Instantly Components", "main": "instantly.app.mjs", "keywords": [ @@ -11,5 +11,8 @@ "author": "Pipedream (https://pipedream.com/)", "publishConfig": { "access": "public" + }, + "dependencies": { + "@pipedream/platform": "^3.0.3" } -} \ No newline at end of file +} diff --git a/components/instantly/sources/new-event-instant/new-event-instant.mjs b/components/instantly/sources/new-event-instant/new-event-instant.mjs new file mode 100644 index 0000000000000..e6bed8eda4e29 --- /dev/null +++ b/components/instantly/sources/new-event-instant/new-event-instant.mjs @@ -0,0 +1,67 @@ +import instantly from "../../instantly.app.mjs"; +import sampleEmit from "./test-event.mjs"; + +export default { + key: "instantly-new-event-instant", + name: "New Event in Instantly (Instant)", + description: "Emit new event when an activity occurs in your Instantly workspace.", + version: "0.0.1", + type: "source", + dedupe: "unique", + props: { + instantly, + http: "$.interface.http", + db: "$.service.db", + campaignId: { + propDefinition: [ + instantly, + "campaignId", + ], + optional: true, + }, + eventType: { + propDefinition: [ + instantly, + "eventType", + ], + optional: true, + }, + }, + methods: { + _getHookId() { + return this.db.get("hookId"); + }, + _setHookId(hookId) { + this.db.set("hookId", hookId); + }, + }, + hooks: { + async activate() { + const response = await this.instantly.createWebhook({ + data: { + hookUrl: this.http.endpoint, + event_type: this.eventType, + campaign: this.campaignId, + }, + }); + this._setHookId(response.id); + }, + async deactivate() { + const webhookId = this._getHookId(); + await this.instantly.deleteWebhook({ + data: { + hook_id: webhookId, + }, + }); + }, + }, + async run({ body }) { + const ts = Date.parse(new Date()); + this.$emit(body, { + id: `${body.resource}-${ts}`, + summary: `New event from ${body.lead_email} for campaign ${body.campaign_name}`, + ts: ts, + }); + }, + sampleEmit, +}; diff --git a/components/instantly/sources/new-event-instant/test-event.mjs b/components/instantly/sources/new-event-instant/test-event.mjs new file mode 100644 index 0000000000000..da174700f93f5 --- /dev/null +++ b/components/instantly/sources/new-event-instant/test-event.mjs @@ -0,0 +1,18 @@ +export default { + "timestamp": "2025-01-08T22:06:16.129Z", + "event_type": "lead_not_interested", + "workspace": "c1b30c69-7fcd-88df-e1151d8f7ec7", + "campaign_id": "c7c1103b-0185-ba08-e925bc5ca574", + "unibox_url": null, + "campaign_name": "My Campaign", + "lead_email": "john@abc.com", + "email": "john@abc.com", + "phone": "123456789", + "website": "instantly.ai", + "language": "English", + "lastName": "Doe", + "firstName": "John", + "companyName": "Instantly", + "personalization": "Loved your latest post", + "favorite_restaurant": "Chipotle" +} \ No newline at end of file diff --git a/components/opensrs/opensrs.app.mjs b/components/opensrs/opensrs.app.mjs index ede5d6284c99d..7e487826a6670 100644 --- a/components/opensrs/opensrs.app.mjs +++ b/components/opensrs/opensrs.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/components/xverify/xverify.app.mjs b/components/xverify/xverify.app.mjs index 830b533f7b73d..8b26f4a7496d3 100644 --- a/components/xverify/xverify.app.mjs +++ b/components/xverify/xverify.app.mjs @@ -8,4 +8,4 @@ export default { console.log(Object.keys(this.$auth)); }, }, -}; \ No newline at end of file +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fcbdd2f45a6f1..2e7ad4e2746dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5218,7 +5218,11 @@ importers: specifier: ^1.5.1 version: 1.6.6 - components/instantly: {} + components/instantly: + dependencies: + '@pipedream/platform': + specifier: ^3.0.3 + version: 3.0.3 components/instapaper: dependencies: @@ -6085,8 +6089,7 @@ importers: specifier: ^2.29.4 version: 2.30.1 - components/mailboxlayer: - specifiers: {} + components/mailboxlayer: {} components/mailboxvalidator: dependencies: @@ -12389,10 +12392,10 @@ importers: version: 14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: latest - version: 3.3.1(@types/react@18.3.12)(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + version: 4.0.0(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) nextra-theme-docs: specifier: latest - version: 3.3.1(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@18.3.12)(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.0.0(@types/react@18.3.12)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@4.0.0(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -14718,12 +14721,6 @@ packages: '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} - '@mdx-js/react@3.1.0': - resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - '@memberstack/admin@1.3.1': resolution: {integrity: sha512-ulRCIpt6k/3RIag+YyU2eW+b0Ik1pF+gXx2b+hYI3Mk6/NxwzZWTVC+YJw3BO3tRUq9TOFy7IaPMfm8wQTJYIA==} @@ -16793,8 +16790,8 @@ packages: '@tediousjs/connection-string@0.5.0': resolution: {integrity: sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==} - '@theguild/remark-mermaid@0.1.3': - resolution: {integrity: sha512-2FjVlaaKXK7Zj7UJAgOVTyaahn/3/EAfqYhyXg0BfDBVUl+lXcoIWRaxzqfnDr2rv8ax6GsC5mNh6hAaT86PDw==} + '@theguild/remark-mermaid@0.2.0': + resolution: {integrity: sha512-o8n57TJy0OI4PCrNw8z6S+vpHtrwoQZzTA5Y3fL0U1NDRIoMg/78duWgEBFsCZcWM1G6zjE91yg1aKCsDwgE2Q==} peerDependencies: react: ^18.2.0 @@ -19665,10 +19662,6 @@ packages: ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -19917,9 +19910,6 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} - flush-write-stream@2.0.0: resolution: {integrity: sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==} @@ -20405,10 +20395,6 @@ packages: resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - gtoken@5.3.2: resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==} engines: {node: '>=10'} @@ -20881,10 +20867,6 @@ packages: is-electron@2.2.2: resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -22604,19 +22586,19 @@ packages: sass: optional: true - nextra-theme-docs@3.3.1: - resolution: {integrity: sha512-P305m2UcW2IDyQhjrcAu0qpdPArikofinABslUCAyixYShsmcdDRUhIMd4QBHYru4gQuVjGWX9PhWZZCbNvzDQ==} + nextra-theme-docs@4.0.0: + resolution: {integrity: sha512-IgX73GjkSLureZtP9gxanm3/N5hmznyXH4VCuDFZEk1DnX/PDyN77oXoaRYqDY8XaNwZ1EPGvYGd7RcMUiiGWw==} peerDependencies: - next: '>=13' - nextra: 3.3.1 + next: '>=14' + nextra: 4.0.0 react: '>=18' react-dom: '>=18' - nextra@3.3.1: - resolution: {integrity: sha512-jiwj+LfUPHHeAxJAEqFuglxnbjFgzAOnDWFsjv7iv3BWiX8OksDwd3I2Sv3j2zba00iIBDEPdNeylfzTtTLZVg==} + nextra@4.0.0: + resolution: {integrity: sha512-qcJ4cudhl7ooMWaqCtrpfkq93/OqtLzkQn98MncuHTZbjhAuqXQQz4rQqc5AI0GUX97cF//OhDgYjSEVpSRWEg==} engines: {node: '>=18'} peerDependencies: - next: '>=13' + next: '>=14' react: '>=18' react-dom: '>=18' @@ -22966,10 +22948,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@6.1.0: - resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} - engines: {node: '>=18'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -23635,6 +23613,11 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + react-compiler-runtime@0.0.0-experimental-22c6e49-20241219: + resolution: {integrity: sha512-bOAGaRL1ldfIIpbDsl+uV025Ta6RS6/cOjvvh8r2Vo7KtqB+RSvihVYRsWQz7ECKNPWdq5MClS845acwAwieDw==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -24170,10 +24153,6 @@ packages: search-insights@2.17.3: resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -24615,10 +24594,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -25983,6 +25958,24 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} @@ -29926,12 +29919,6 @@ snapshots: - acorn - supports-color - '@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.3.12 - react: 18.3.1 - '@memberstack/admin@1.3.1': dependencies: axios: 1.6.8 @@ -32367,7 +32354,7 @@ snapshots: '@tediousjs/connection-string@0.5.0': {} - '@theguild/remark-mermaid@0.1.3(react@18.3.1)': + '@theguild/remark-mermaid@0.2.0(react@18.3.1)': dependencies: mermaid: 11.4.1 react: 18.3.1 @@ -35866,10 +35853,6 @@ snapshots: dependencies: type: 2.7.3 - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - extend@3.0.2: {} external-editor@3.1.0: @@ -36153,8 +36136,6 @@ snapshots: flatten@1.0.3: {} - flexsearch@0.7.43: {} - flush-write-stream@2.0.0: dependencies: inherits: 2.0.4 @@ -36895,13 +36876,6 @@ snapshots: graphql@16.9.0: {} - gray-matter@4.0.3: - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - gtoken@5.3.2: dependencies: gaxios: 4.3.3 @@ -37493,8 +37467,6 @@ snapshots: is-electron@2.2.2: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -39928,37 +39900,40 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@3.3.1(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@18.3.12)(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@4.0.0(@types/react@18.3.12)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@4.0.0(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 - escape-string-regexp: 5.0.0 - flexsearch: 0.7.43 next: 14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 3.3.1(@types/react@18.3.12)(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + nextra: 4.0.0(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) react: 18.3.1 + react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@18.3.1) react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.23.8 + zod-validation-error: 3.4.0(zod@3.23.8) + zustand: 5.0.3(@types/react@18.3.12)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store - nextra@3.3.1(@types/react@18.3.12)(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3): + nextra@4.0.0(acorn@8.14.0)(next@14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3): dependencies: '@formatjs/intl-localematcher': 0.5.8 '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 3.1.0(acorn@8.14.0) - '@mdx-js/react': 3.1.0(@types/react@18.3.12)(react@18.3.1) '@napi-rs/simple-git': 0.1.19 '@shikijs/twoslash': 1.24.0(typescript@5.6.3) - '@theguild/remark-mermaid': 0.1.3(react@18.3.1) + '@theguild/remark-mermaid': 0.2.0(react@18.3.1) '@theguild/remark-npm2yarn': 0.3.3 better-react-mathjax: 2.0.3(react@18.3.1) clsx: 2.1.1 estree-util-to-js: 2.0.0 estree-util-value-to-estree: 3.2.1 + fast-glob: 3.3.2 github-slugger: 2.0.0 - graceful-fs: 4.2.11 - gray-matter: 4.0.3 hast-util-to-estree: 3.1.0 katex: 0.16.11 mdast-util-from-markdown: 2.0.2 @@ -39966,8 +39941,8 @@ snapshots: mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 next: 14.2.19(@babel/core@8.0.0-alpha.13)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - p-limit: 6.1.0 react: 18.3.1 + react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-medium-image-zoom: 5.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rehype-katex: 7.0.1 @@ -39987,7 +39962,6 @@ snapshots: zod: 3.23.8 zod-validation-error: 3.4.0(zod@3.23.8) transitivePeerDependencies: - - '@types/react' - acorn - supports-color - typescript @@ -40406,10 +40380,6 @@ snapshots: dependencies: yocto-queue: 1.1.1 - p-limit@6.1.0: - dependencies: - yocto-queue: 1.1.1 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -41324,6 +41294,10 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + react-compiler-runtime@0.0.0-experimental-22c6e49-20241219(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -42229,11 +42203,6 @@ snapshots: search-insights@2.17.3: {} - section-matter@1.0.0: - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - selderee@0.11.0: dependencies: parseley: 0.12.1 @@ -42783,8 +42752,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -44352,6 +44319,11 @@ snapshots: zod@3.23.8: {} + zustand@5.0.3(@types/react@18.3.12)(react@18.3.1): + optionalDependencies: + '@types/react': 18.3.12 + react: 18.3.1 + zwitch@1.0.5: {} zwitch@2.0.4: {}