diff --git a/components/pingone/actions/create-user/create-user.mjs b/components/pingone/actions/create-user/create-user.mjs new file mode 100644 index 0000000000000..fba62d71043e1 --- /dev/null +++ b/components/pingone/actions/create-user/create-user.mjs @@ -0,0 +1,84 @@ +import app from "../../pingone.app.mjs"; + +export default { + key: "pingone-create-user", + name: "Create User", + description: "Creates a new user in PingOne. [See the documentation](https://apidocs.pingidentity.com/pingone/platform/v1/api/#post-create-user).", + version: "0.0.1", + type: "action", + props: { + app, + username: { + propDefinition: [ + app, + "username", + ], + }, + email: { + propDefinition: [ + app, + "email", + ], + }, + givenName: { + propDefinition: [ + app, + "givenName", + ], + }, + familyName: { + propDefinition: [ + app, + "familyName", + ], + }, + department: { + propDefinition: [ + app, + "department", + ], + }, + locales: { + propDefinition: [ + app, + "locales", + ], + }, + }, + methods: { + createUser(args = {}) { + return this.app.post({ + path: "/users", + ...args, + }); + }, + }, + async run({ $ }) { + const { + createUser, + username, + email, + givenName, + familyName, + department, + locales, + } = this; + + const response = await createUser({ + $, + data: { + username, + email, + name: { + given: givenName, + family: familyName, + }, + department, + locales, + }, + }); + + $.export("$summary", "Successfully created user."); + return response; + }, +}; diff --git a/components/pingone/actions/update-user/update-user.mjs b/components/pingone/actions/update-user/update-user.mjs new file mode 100644 index 0000000000000..3aa5176a9a12f --- /dev/null +++ b/components/pingone/actions/update-user/update-user.mjs @@ -0,0 +1,93 @@ +import app from "../../pingone.app.mjs"; + +export default { + key: "pingone-update-user", + name: "Update User in PingOne", + description: "Update an existing user's attributes in PingOne. [See the documentation](https://apidocs.pingidentity.com/pingone/platform/v1/api/#patch-update-user).", + version: "0.0.1", + type: "action", + props: { + app, + userId: { + propDefinition: [ + app, + "userId", + ], + }, + username: { + optional: false, + propDefinition: [ + app, + "username", + ], + }, + email: { + propDefinition: [ + app, + "email", + ], + }, + givenName: { + propDefinition: [ + app, + "givenName", + ], + }, + familyName: { + propDefinition: [ + app, + "familyName", + ], + }, + department: { + propDefinition: [ + app, + "department", + ], + }, + locales: { + propDefinition: [ + app, + "locales", + ], + }, + }, + methods: { + updateUser({ + userId, ...args + } = {}) { + return this.app.patch({ + path: `/users/${userId}`, + ...args, + }); + }, + }, + async run({ $ }) { + const { + updateUser, + userId, + username, + email, + givenName, + familyName, + department, + locales, + } = this; + + const response = await updateUser({ + $, + userId, + data: { + username, + email, + givenName, + familyName, + department, + locales, + }, + }); + + $.export("$summary", "Successfully updated user."); + return response; + }, +}; diff --git a/components/pingone/common/constants.mjs b/components/pingone/common/constants.mjs new file mode 100644 index 0000000000000..46272637bb525 --- /dev/null +++ b/components/pingone/common/constants.mjs @@ -0,0 +1,11 @@ +const BASE_URL = "https://api.pingone.com"; +const VERSION_PATH = "/v1"; +const ENV_PATH = "/environments"; +const SUBSCRIPTION_ID = "subscriptionId"; + +export default { + BASE_URL, + VERSION_PATH, + ENV_PATH, + SUBSCRIPTION_ID, +}; diff --git a/components/pingone/pingone.app.mjs b/components/pingone/pingone.app.mjs index a10b29800fbb4..cd44b42d07487 100644 --- a/components/pingone/pingone.app.mjs +++ b/components/pingone/pingone.app.mjs @@ -1,11 +1,191 @@ +import { axios } from "@pipedream/platform"; +import constants from "./common/constants.mjs"; + export default { type: "app", app: "pingone", - propDefinitions: {}, + propDefinitions: { + username: { + type: "string", + label: "Username", + description: "The user's username. This must either be a well-formed email address or another unique identifier.", + }, + email: { + type: "string", + label: "Email", + description: "The user's email address.", + optional: true, + }, + givenName: { + type: "string", + label: "First Name", + description: "The user's first name.", + optional: true, + }, + familyName: { + type: "string", + label: "Last Name", + description: "The user's last name.", + optional: true, + }, + department: { + type: "string", + label: "Department", + description: "The user's department. E.g., `Engineering`.", + optional: true, + }, + locales: { + type: "string[]", + label: "Locales", + description: "The user's locales. E.g., `London`.", + optional: true, + async options({ prevContext: { url } }) { + if (url === null) { + return []; + } + const { + _embedded: { languages }, + _links: { next }, + } = await this.listLanguages({ + url, + }); + return { + options: languages.map(({ name }) => name), + context: { + url: next?.href || null, + }, + }; + }, + }, + userId: { + type: "string", + label: "User ID", + description: "The unique identifier for the user.", + async options({ prevContext: { url } }) { + if (url === null) { + return []; + } + const { + _embedded: { users }, + _links: { next }, + } = await this.listUsers({ + url, + }); + return { + options: users.map(({ + id: value, username: label, + }) => ({ + label, + value, + })), + context: { + url: next?.href || null, + }, + }; + }, + }, + applicationId: { + type: "string", + label: "Application ID", + description: "The unique identifier for the application.", + async options({ prevContext: { url } }) { + if (url === null) { + return []; + } + const { + _embedded: { applications }, + _links: { next }, + } = await this.listApplications({ + url, + }); + return { + options: applications.map(({ + id: value, name: label, + }) => ({ + label, + value, + })), + context: { + url: next?.href || null, + }, + }; + }, + }, + userAttributes: { + type: "object", + label: "User Attributes", + description: "The attributes to update the user with.", + optional: true, + }, + groupId: { + type: "string", + label: "Group ID", + description: "The unique identifier for the group.", + optional: true, + }, + status: { + type: "string", + label: "User Status", + description: "The current status of the user, e.g., active, inactive.", + optional: true, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + getUrl(path) { + return `${constants.BASE_URL}${constants.VERSION_PATH}${constants.ENV_PATH}/${this.$auth.environment_id}${path}`; + }, + getHeaders(headers) { + return { + "Content-Type": "application/json", + "Authorization": `Bearer ${this.$auth.oauth_access_token}`, + ...headers, + }; + }, + _makeRequest({ + $ = this, url, path, headers, ...args + } = {}) { + return axios($, { + ...args, + debug: true, + url: url || this.getUrl(path), + headers: this.getHeaders(headers), + }); + }, + post(args = {}) { + return this._makeRequest({ + method: "POST", + ...args, + }); + }, + patch(args = {}) { + return this._makeRequest({ + method: "PATCH", + ...args, + }); + }, + delete(args = {}) { + return this._makeRequest({ + method: "DELETE", + ...args, + }); + }, + listUsers(args = {}) { + return this._makeRequest({ + path: "/users", + ...args, + }); + }, + listApplications(args = {}) { + return this._makeRequest({ + path: "/applications", + ...args, + }); + }, + listLanguages(args = {}) { + return this._makeRequest({ + path: "/languages", + ...args, + }); }, }, }; diff --git a/components/pingone/sources/common/events.mjs b/components/pingone/sources/common/events.mjs new file mode 100644 index 0000000000000..3441e32841719 --- /dev/null +++ b/components/pingone/sources/common/events.mjs @@ -0,0 +1,340 @@ +export default { + ACCOUNT_LINKED: "ACCOUNT.LINKED", + ACCOUNT_UNLINKED: "ACCOUNT.UNLINKED", + ACTION_CREATED: "ACTION.CREATED", + ACTION_DELETED: "ACTION.DELETED", + ACTION_UPDATED: "ACTION.UPDATED", + ADVANCEDSERVICES_ORCHESTRATION_CREATION_COMPLETED: "ADVANCEDSERVICES_ORCHESTRATION.CREATION_COMPLETED", + ADVANCEDSERVICES_ORCHESTRATION_CREATION_FAILED: "ADVANCEDSERVICES_ORCHESTRATION.CREATION_FAILED", + ADVANCEDSERVICES_ORCHESTRATION_CREATION_STARTED: "ADVANCEDSERVICES_ORCHESTRATION.CREATION_STARTED", + ADVANCEDSERVICES_ORCHESTRATION_CREATION_START_FAILED: "ADVANCEDSERVICES_ORCHESTRATION.CREATION_START_FAILED", + ADVANCEDSERVICES_ORCHESTRATION_DELETION_COMPLETED: "ADVANCEDSERVICES_ORCHESTRATION.DELETION_COMPLETED", + ADVANCEDSERVICES_ORCHESTRATION_DELETION_FAILED: "ADVANCEDSERVICES_ORCHESTRATION.DELETION_FAILED", + ADVANCEDSERVICES_ORCHESTRATION_DELETION_STARTED: "ADVANCEDSERVICES_ORCHESTRATION.DELETION_STARTED", + ADVANCEDSERVICES_ORCHESTRATION_DELETION_START_FAILED: "ADVANCEDSERVICES_ORCHESTRATION.DELETION_START_FAILED", + AGREEMENT_CREATED: "AGREEMENT.CREATED", + AGREEMENT_DELETED: "AGREEMENT.DELETED", + AGREEMENT_UPDATED: "AGREEMENT.UPDATED", + AGREEMENT_CONSENT_ACCEPTED: "AGREEMENT_CONSENT.ACCEPTED", + AGREEMENT_CONSENT_REVOKED: "AGREEMENT_CONSENT.REVOKED", + AGREEMENT_LANGUAGE_CREATED: "AGREEMENT_LANGUAGE.CREATED", + AGREEMENT_LANGUAGE_DELETED: "AGREEMENT_LANGUAGE.DELETED", + AGREEMENT_LANGUAGE_UPDATED: "AGREEMENT_LANGUAGE.UPDATED", + AGREEMENT_LANGUAGE_REVISION_CREATED: "AGREEMENT_LANGUAGE_REVISION.CREATED", + AGREEMENT_LANGUAGE_REVISION_DELETED: "AGREEMENT_LANGUAGE_REVISION.DELETED", + AGREEMENT_LANGUAGE_REVISION_UPDATED: "AGREEMENT_LANGUAGE_REVISION.UPDATED", + API_ACCESS_LOG_ENTRY_HTTP_REQUEST_POLICY_EVALUATED: "API_ACCESS_LOG_ENTRY.HTTP_REQUEST_POLICY_EVALUATED", + API_ACCESS_LOG_ENTRY_HTTP_RESPONSE_POLICY_EVALUATED: "API_ACCESS_LOG_ENTRY.HTTP_RESPONSE_POLICY_EVALUATED", + API_SERVER_CREATED: "API_SERVER.CREATED", + API_SERVER_DELETED: "API_SERVER.DELETED", + API_SERVER_POLICIES_DEPLOYED: "API_SERVER.POLICIES_DEPLOYED", + API_SERVER_UPDATED: "API_SERVER.UPDATED", + APPLICATION_CREATED: "APPLICATION.CREATED", + APPLICATION_DELETED: "APPLICATION.DELETED", + APPLICATION_PLAY_INTEGRITY_MISCONFIGURATION: "APPLICATION.PLAY_INTEGRITY_MISCONFIGURATION", + APPLICATION_UPDATED: "APPLICATION.UPDATED", + ASSERTION_CHECK_FAILED: "ASSERTION.CHECK_FAILED", + ASSERTION_CHECK_SUCCESS: "ASSERTION.CHECK_SUCCESS", + AUTHENTICATION_CREATED: "AUTHENTICATION.CREATED", + AUTHENTICATION_UPDATED: "AUTHENTICATION.UPDATED", + AUTHENTICATION_CODE_CREATED: "AUTHENTICATION_CODE.CREATED", + AUTHENTICATION_CODE_DELETED: "AUTHENTICATION_CODE.DELETED", + AUTHENTICATION_CODE_UPDATED: "AUTHENTICATION_CODE.UPDATED", + AUTHORIZE_ATTRIBUTE_CREATED: "AUTHORIZE_ATTRIBUTE.CREATED", + AUTHORIZE_ATTRIBUTE_DELETED: "AUTHORIZE_ATTRIBUTE.DELETED", + AUTHORIZE_ATTRIBUTE_UPDATED: "AUTHORIZE_ATTRIBUTE.UPDATED", + AUTHORIZE_CONDITION_CREATED: "AUTHORIZE_CONDITION.CREATED", + AUTHORIZE_CONDITION_DELETED: "AUTHORIZE_CONDITION.DELETED", + AUTHORIZE_CONDITION_UPDATED: "AUTHORIZE_CONDITION.UPDATED", + AUTHORIZE_POLICY_CREATED: "AUTHORIZE_POLICY.CREATED", + AUTHORIZE_POLICY_DELETED: "AUTHORIZE_POLICY.DELETED", + AUTHORIZE_POLICY_UPDATED: "AUTHORIZE_POLICY.UPDATED", + AUTHORIZE_PROCESSOR_CREATED: "AUTHORIZE_PROCESSOR.CREATED", + AUTHORIZE_PROCESSOR_DELETED: "AUTHORIZE_PROCESSOR.DELETED", + AUTHORIZE_PROCESSOR_UPDATED: "AUTHORIZE_PROCESSOR.UPDATED", + AUTHORIZE_SERVICE_CREATED: "AUTHORIZE_SERVICE.CREATED", + AUTHORIZE_SERVICE_DELETED: "AUTHORIZE_SERVICE.DELETED", + AUTHORIZE_SERVICE_UPDATED: "AUTHORIZE_SERVICE.UPDATED", + AUTHORIZE_SHARED_ADVICE_CREATED: "AUTHORIZE_SHARED_ADVICE.CREATED", + AUTHORIZE_SHARED_ADVICE_DELETED: "AUTHORIZE_SHARED_ADVICE.DELETED", + AUTHORIZE_SHARED_ADVICE_UPDATED: "AUTHORIZE_SHARED_ADVICE.UPDATED", + AUTHORIZE_SHARED_RULE_CREATED: "AUTHORIZE_SHARED_RULE.CREATED", + AUTHORIZE_SHARED_RULE_DELETED: "AUTHORIZE_SHARED_RULE.DELETED", + AUTHORIZE_SHARED_RULE_UPDATED: "AUTHORIZE_SHARED_RULE.UPDATED", + AUTHORIZE_TAG_DELETED: "AUTHORIZE_TAG.DELETED", + AUTHORIZE_TAG_UPDATED: "AUTHORIZE_TAG.UPDATED", + BRANDING_DELETED: "BRANDING.DELETED", + BRANDING_UPDATED: "BRANDING.UPDATED", + CERTIFICATE_CREATED: "CERTIFICATE.CREATED", + CERTIFICATE_DELETED: "CERTIFICATE.DELETED", + CERTIFICATE_READ: "CERTIFICATE.READ", + CERTIFICATE_UPDATED: "CERTIFICATE.UPDATED", + CONTENT_CREATED: "CONTENT.CREATED", + CONTENT_DELETED: "CONTENT.DELETED", + CONTENT_UPDATED: "CONTENT.UPDATED", + CONTENTS_DELETED: "CONTENTS.DELETED", + CONTENTS_UPDATED: "CONTENTS.UPDATED", + CREDENTIAL_TYPE_CREATED: "CREDENTIAL_TYPE.CREATED", + CREDENTIAL_TYPE_DELETED: "CREDENTIAL_TYPE.DELETED", + CREDENTIAL_TYPE_UPDATED: "CREDENTIAL_TYPE.UPDATED", + CUSTOM_DOMAIN_CREATED: "CUSTOM_DOMAIN.CREATED", + CUSTOM_DOMAIN_DELETED: "CUSTOM_DOMAIN.DELETED", + CUSTOM_DOMAIN_UPDATED: "CUSTOM_DOMAIN.UPDATED", + DAVINCI_INTERACTION_CUSTOM_ANALYTICS: "DAVINCI_INTERACTION.CUSTOM_ANALYTICS", + DAVINCI_INTERACTION_RECEIVE_REQUEST: "DAVINCI_INTERACTION.RECEIVE_REQUEST", + DAVINCI_INTERACTION_SEND_ERROR_RESPONSE: "DAVINCI_INTERACTION.SEND_ERROR_RESPONSE", + DAVINCI_INTERACTION_SEND_RESPONSE: "DAVINCI_INTERACTION.SEND_RESPONSE", + DAVINCI_INTERACTION_START_INTERACTION: "DAVINCI_INTERACTION.START_INTERACTION", + DECISION_ENDPOINT_CREATED: "DECISION_ENDPOINT.CREATED", + DECISION_ENDPOINT_DECISION_REQUEST_EVALUATED: "DECISION_ENDPOINT.DECISION_REQUEST_EVALUATED", + DECISION_ENDPOINT_DELETED: "DECISION_ENDPOINT.DELETED", + DECISION_ENDPOINT_UPDATED: "DECISION_ENDPOINT.UPDATED", + DEVICE_ACTIVATED: "DEVICE.ACTIVATED", + DEVICE_ACTIVATION_FAILED: "DEVICE.ACTIVATION_FAILED", + DEVICE_ACTIVATION_OTP_FAILED: "DEVICE.ACTIVATION_OTP_FAILED", + DEVICE_ACTIVATION_OTP_INVALID: "DEVICE.ACTIVATION_OTP_INVALID", + DEVICE_BLOCKED: "DEVICE.BLOCKED", + DEVICE_CREATED: "DEVICE.CREATED", + DEVICE_DELETED: "DEVICE.DELETED", + DEVICE_FRAUD_REPORTED: "DEVICE.FRAUD_REPORTED", + DEVICE_KEY_ROTATION_FAILED: "DEVICE.KEY_ROTATION_FAILED", + DEVICE_KEY_ROTATION_SUCCEEDED: "DEVICE.KEY_ROTATION_SUCCEEDED", + DEVICE_LOCKED: "DEVICE.LOCKED", + DEVICE_LOGS_RECEIVED: "DEVICE.LOGS_RECEIVED", + DEVICE_NICKNAME_UPDATED: "DEVICE.NICKNAME_UPDATED", + DEVICE_PAIRING_FAILED_COMPROMISED: "DEVICE.PAIRING_FAILED_COMPROMISED", + DEVICE_UNBLOCKED: "DEVICE.UNBLOCKED", + DEVICE_UNLOCKED: "DEVICE.UNLOCKED", + DEVICE_UPDATED: "DEVICE.UPDATED", + DEVICES_ORDER_CREATED: "DEVICES.ORDER_CREATED", + DEVICES_ORDER_DELETED: "DEVICES.ORDER_DELETED", + DEVICES_ORDER_UPDATED: "DEVICES.ORDER_UPDATED", + DEVICE_AUTHENTICATION_POLICY_CREATED: "DEVICE_AUTHENTICATION_POLICY.CREATED", + DEVICE_AUTHENTICATION_POLICY_DELETED: "DEVICE_AUTHENTICATION_POLICY.DELETED", + DEVICE_AUTHENTICATION_POLICY_UPDATED: "DEVICE_AUTHENTICATION_POLICY.UPDATED", + DIGITAL_WALLET_ACTIVE: "DIGITAL_WALLET.ACTIVE", + DIGITAL_WALLET_DELETED: "DIGITAL_WALLET.DELETED", + DIGITAL_WALLET_DISABLED: "DIGITAL_WALLET.DISABLED", + DIGITAL_WALLET_EXPIRED: "DIGITAL_WALLET.EXPIRED", + DIGITAL_WALLET_PAIRING_REQUIRED: "DIGITAL_WALLET.PAIRING_REQUIRED", + DIGITAL_WALLET_APPLICATION_CREATED: "DIGITAL_WALLET_APPLICATION.CREATED", + DIGITAL_WALLET_APPLICATION_DELETED: "DIGITAL_WALLET_APPLICATION.DELETED", + DIGITAL_WALLET_APPLICATION_UPDATED: "DIGITAL_WALLET_APPLICATION.UPDATED", + EMAIL_DOMAIN_CREATED: "EMAIL_DOMAIN.CREATED", + EMAIL_DOMAIN_DELETED: "EMAIL_DOMAIN.DELETED", + ENVIRONMENT_CAPABILITIES: "ENVIRONMENT.CAPABILITIES", + ENVIRONMENT_CREATED: "ENVIRONMENT.CREATED", + ENVIRONMENT_DELETED: "ENVIRONMENT.DELETED", + ENVIRONMENT_DEMOTED: "ENVIRONMENT.DEMOTED", + ENVIRONMENT_PROMOTED: "ENVIRONMENT.PROMOTED", + ENVIRONMENT_UPDATED: "ENVIRONMENT.UPDATED", + FIDO_METADATA_CREATED: "FIDO_METADATA.CREATED", + FIDO_METADATA_DELETED: "FIDO_METADATA.DELETED", + FIDO_POLICY_CREATED: "FIDO_POLICY.CREATED", + FIDO_POLICY_DELETED: "FIDO_POLICY.DELETED", + FIDO_POLICY_UPDATED: "FIDO_POLICY.UPDATED", + FLOW_CREATED: "FLOW.CREATED", + FLOW_DELETED: "FLOW.DELETED", + FLOW_UPDATED: "FLOW.UPDATED", + FLOW_DEFINITION_CREATED: "FLOW_DEFINITION.CREATED", + FLOW_DEFINITION_DELETED: "FLOW_DEFINITION.DELETED", + FLOW_DEFINITION_UPDATED: "FLOW_DEFINITION.UPDATED", + FLOW_EXECUTION_CREATED: "FLOW_EXECUTION.CREATED", + FLOW_EXECUTION_UPDATED: "FLOW_EXECUTION.UPDATED", + GATEWAY_CREATED: "GATEWAY.CREATED", + GATEWAY_DELETED: "GATEWAY.DELETED", + GATEWAY_UPDATED: "GATEWAY.UPDATED", + GATEWAY_INSTANCE_CREATED: "GATEWAY_INSTANCE.CREATED", + GATEWAY_INSTANCE_DELETED: "GATEWAY_INSTANCE.DELETED", + GATEWAY_INSTANCE_UPDATED: "GATEWAY_INSTANCE.UPDATED", + GRANT_CREATED: "GRANT.CREATED", + GRANT_DELETED: "GRANT.DELETED", + GRANT_UPDATED: "GRANT.UPDATED", + GROUP_CREATED: "GROUP.CREATED", + GROUP_DELETED: "GROUP.DELETED", + GROUP_UPDATED: "GROUP.UPDATED", + IDENTITY_PROVIDER_CREATED: "IDENTITY_PROVIDER.CREATED", + IDENTITY_PROVIDER_DELETED: "IDENTITY_PROVIDER.DELETED", + IDENTITY_PROVIDER_UPDATED: "IDENTITY_PROVIDER.UPDATED", + IDP_ATTRIBUTE_CREATED: "IDP_ATTRIBUTE.CREATED", + IDP_ATTRIBUTE_DELETED: "IDP_ATTRIBUTE.DELETED", + IDP_ATTRIBUTE_UPDATED: "IDP_ATTRIBUTE.UPDATED", + IMAGE_ACTIVATED: "IMAGE.ACTIVATED", + IMAGE_CREATED: "IMAGE.CREATED", + IMAGE_DELETED: "IMAGE.DELETED", + INSTANT_MESSAGING_DELIVERY_SETTINGS_CREATED: "INSTANT_MESSAGING_DELIVERY_SETTINGS.CREATED", + INSTANT_MESSAGING_DELIVERY_SETTINGS_DELETED: "INSTANT_MESSAGING_DELIVERY_SETTINGS.DELETED", + INSTANT_MESSAGING_DELIVERY_SETTINGS_UPDATED: "INSTANT_MESSAGING_DELIVERY_SETTINGS.UPDATED", + ISSUANCE_CREATED: "ISSUANCE.CREATED", + ISSUANCE_RULE_CREATED: "ISSUANCE_RULE.CREATED", + ISSUANCE_RULE_DELETED: "ISSUANCE_RULE.DELETED", + ISSUANCE_RULE_UPDATED: "ISSUANCE_RULE.UPDATED", + KEY_CREATED: "KEY.CREATED", + KEY_DELETED: "KEY.DELETED", + KEY_READ: "KEY.READ", + KEY_UPDATED: "KEY.UPDATED", + KRP_CREATED: "KRP.CREATED", + KRP_DELETED: "KRP.DELETED", + KRP_ROTATED: "KRP.ROTATED", + KRP_UPDATED: "KRP.UPDATED", + LICENSE_CREATED: "LICENSE.CREATED", + LICENSE_DELETED: "LICENSE.DELETED", + LICENSE_UPDATED: "LICENSE.UPDATED", + MEMBER_OF_GROUP_CREATED: "MEMBER_OF_GROUP.CREATED", + MEMBER_OF_GROUP_DELETED: "MEMBER_OF_GROUP.DELETED", + MFA_SETTINGS_UPDATED: "MFA_SETTINGS.UPDATED", + NOTIFICATION_CREATED: "NOTIFICATION.CREATED", + NOTIFICATION_REJECTED: "NOTIFICATION.REJECTED", + NOTIFICATION_UPDATED: "NOTIFICATION.UPDATED", + NOTIFICATIONS_SETTINGS_UPDATED: "NOTIFICATIONS_SETTINGS.UPDATED", + NOTIFICATION_POLICY_CREATED: "NOTIFICATION_POLICY.CREATED", + NOTIFICATION_POLICY_DELETED: "NOTIFICATION_POLICY.DELETED", + NOTIFICATION_POLICY_UPDATED: "NOTIFICATION_POLICY.UPDATED", + OATH_TOKEN_CREATED: "OATH_TOKEN.CREATED", + OATH_TOKEN_RESYNC_INVALID_OTP: "OATH_TOKEN.RESYNC_INVALID_OTP", + OATH_TOKEN_RESYNC_MAX_ATTEMPTS: "OATH_TOKEN.RESYNC_MAX_ATTEMPTS", + OATH_TOKEN_RESYNC_SUCCESS: "OATH_TOKEN.RESYNC_SUCCESS", + OATH_TOKEN_RESYNC_USER_NOT_PAIRED: "OATH_TOKEN.RESYNC_USER_NOT_PAIRED", + OATH_TOKEN_REVOKED: "OATH_TOKEN.REVOKED", + OATH_TOKENS_BULK_CREATED: "OATH_TOKENS_BULK.CREATED", + OATH_TOKENS_BULK_REVOKED: "OATH_TOKENS_BULK.REVOKED", + OAUTH_CONSENT_ACCEPTED: "OAUTH_CONSENT.ACCEPTED", + OAUTH_CONSENT_DECLINED: "OAUTH_CONSENT.DECLINED", + OAUTH_CONSENT_REVOKED: "OAUTH_CONSENT.REVOKED", + ORGANIZATION_CAPABILITIES: "ORGANIZATION.CAPABILITIES", + ORGANIZATION_CREATED: "ORGANIZATION.CREATED", + ORGANIZATION_DELETED: "ORGANIZATION.DELETED", + ORGANIZATION_UPDATED: "ORGANIZATION.UPDATED", + OTP_CHECK_FAILED: "OTP.CHECK_FAILED", + OTP_CHECK_INVALID: "OTP.CHECK_INVALID", + OTP_CHECK_SUCCESS: "OTP.CHECK_SUCCESS", + PASSWORD_CHECK_FAILED: "PASSWORD.CHECK_FAILED", + PASSWORD_CHECK_SUCCEEDED: "PASSWORD.CHECK_SUCCEEDED", + PASSWORD_EXTERNAL_SET: "PASSWORD.EXTERNAL_SET", + PASSWORD_FORCE_CHANGE: "PASSWORD.FORCE_CHANGE", + PASSWORD_RECOVERY: "PASSWORD.RECOVERY", + PASSWORD_RESET: "PASSWORD.RESET", + PASSWORD_SET: "PASSWORD.SET", + PASSWORD_UNLOCKED: "PASSWORD.UNLOCKED", + PASSWORD_UNSET: "PASSWORD.UNSET", + PHONE_DELIVERY_SETTINGS_CREATED: "PHONE_DELIVERY_SETTINGS.CREATED", + PHONE_DELIVERY_SETTINGS_DELETED: "PHONE_DELIVERY_SETTINGS.DELETED", + PHONE_DELIVERY_SETTINGS_UPDATED: "PHONE_DELIVERY_SETTINGS.UPDATED", + POLICY_CREATED: "POLICY.CREATED", + POLICY_DELETED: "POLICY.DELETED", + POLICY_UPDATED: "POLICY.UPDATED", + POPULATION_CREATED: "POPULATION.CREATED", + POPULATION_DELETED: "POPULATION.DELETED", + POPULATION_UPDATED: "POPULATION.UPDATED", + PREVIOUS_SECRET_REVOKED: "PREVIOUS_SECRET.REVOKED", + PREVIOUS_SECRET_USED: "PREVIOUS_SECRET.USED", + PROVISIONING_CONNECTION_CREATED: "PROVISIONING_CONNECTION.CREATED", + PROVISIONING_CONNECTION_DELETED: "PROVISIONING_CONNECTION.DELETED", + PROVISIONING_CONNECTION_UPDATED: "PROVISIONING_CONNECTION.UPDATED", + PROVISIONING_GROUP_MEMBERSHIP_SYNC_FAILURE: "PROVISIONING_GROUP_MEMBERSHIP_SYNC.FAILURE", + PROVISIONING_GROUP_SYNC_FAILURE: "PROVISIONING_GROUP_SYNC.FAILURE", + PROVISIONING_IDENTITY_SYNC_FAILURE: "PROVISIONING_IDENTITY_SYNC.FAILURE", + PROVISIONING_MAPPING_CREATED: "PROVISIONING_MAPPING.CREATED", + PROVISIONING_MAPPING_DELETED: "PROVISIONING_MAPPING.DELETED", + PROVISIONING_MAPPING_UPDATED: "PROVISIONING_MAPPING.UPDATED", + PROVISIONING_POLL_FAILURE: "PROVISIONING_POLL.FAILURE", + PROVISIONING_RULE_CREATED: "PROVISIONING_RULE.CREATED", + PROVISIONING_RULE_DELETED: "PROVISIONING_RULE.DELETED", + PROVISIONING_RULE_UPDATED: "PROVISIONING_RULE.UPDATED", + PROVISIONING_SYNC_FAILURE: "PROVISIONING_SYNC.FAILURE", + PROVISIONING_SYNC_STARTED: "PROVISIONING_SYNC.STARTED", + PROVISION_CREDENTIAL_ACCEPTED: "PROVISION_CREDENTIAL.ACCEPTED", + PROVISION_CREDENTIAL_CREATED: "PROVISION_CREDENTIAL.CREATED", + PROVISION_CREDENTIAL_DELETED: "PROVISION_CREDENTIAL.DELETED", + PROVISION_CREDENTIAL_DELETED_FROM_WALLET: "PROVISION_CREDENTIAL.DELETED_FROM_WALLET", + PROVISION_CREDENTIAL_REJECTED: "PROVISION_CREDENTIAL.REJECTED", + PROVISION_CREDENTIAL_REVOKED: "PROVISION_CREDENTIAL.REVOKED", + PUSH_CREDENTIALS_CREATED: "PUSH_CREDENTIALS.CREATED", + PUSH_CREDENTIALS_DELETED: "PUSH_CREDENTIALS.DELETED", + PUSH_CREDENTIALS_UPDATED: "PUSH_CREDENTIALS.UPDATED", + RADIUS_SESSION_CREATED: "RADIUS_SESSION.CREATED", + RADIUS_SESSION_UPDATED: "RADIUS_SESSION.UPDATED", + RESCUE_IDENTITY_CREATED: "RESCUE_IDENTITY.CREATED", + RESOURCE_CREATED: "RESOURCE.CREATED", + RESOURCE_DELETED: "RESOURCE.DELETED", + RESOURCE_UPDATED: "RESOURCE.UPDATED", + RESOURCE_ATTRIBUTE_CREATED: "RESOURCE_ATTRIBUTE.CREATED", + RESOURCE_ATTRIBUTE_DELETED: "RESOURCE_ATTRIBUTE.DELETED", + RESOURCE_ATTRIBUTE_UPDATED: "RESOURCE_ATTRIBUTE.UPDATED", + RISK_EVALUATION_CREATED: "RISK_EVALUATION.CREATED", + RISK_EVALUATION_STAGING_CREATED: "RISK_EVALUATION.STAGING_CREATED", + RISK_EVALUATION_UPDATED: "RISK_EVALUATION.UPDATED", + RISK_FEEDBACK_CREATED: "RISK_FEEDBACK.CREATED", + RISK_POLICY_SET_CREATED: "RISK_POLICY_SET.CREATED", + RISK_POLICY_SET_DELETED: "RISK_POLICY_SET.DELETED", + RISK_POLICY_SET_UPDATED: "RISK_POLICY_SET.UPDATED", + RISK_PREDICTOR_CREATED: "RISK_PREDICTOR.CREATED", + RISK_PREDICTOR_DELETED: "RISK_PREDICTOR.DELETED", + RISK_PREDICTOR_UPDATED: "RISK_PREDICTOR.UPDATED", + ROLE_ASSIGNMENT_CREATED: "ROLE_ASSIGNMENT.CREATED", + ROLE_ASSIGNMENT_DELETED: "ROLE_ASSIGNMENT.DELETED", + SAML_ATTRIBUTE_CREATED: "SAML_ATTRIBUTE.CREATED", + SAML_ATTRIBUTE_DELETED: "SAML_ATTRIBUTE.DELETED", + SAML_ATTRIBUTE_UPDATED: "SAML_ATTRIBUTE.UPDATED", + SCHEMA_ATTRIBUTE_CREATED: "SCHEMA_ATTRIBUTE.CREATED", + SCHEMA_ATTRIBUTE_DELETED: "SCHEMA_ATTRIBUTE.DELETED", + SCHEMA_ATTRIBUTE_UPDATED: "SCHEMA_ATTRIBUTE.UPDATED", + SCOPE_CREATED: "SCOPE.CREATED", + SCOPE_DELETED: "SCOPE.DELETED", + SCOPE_UPDATED: "SCOPE.UPDATED", + SECRET_READ: "SECRET.READ", + SECRET_UPDATED: "SECRET.UPDATED", + SESSION_CREATED: "SESSION.CREATED", + SESSION_DELETED: "SESSION.DELETED", + SESSION_UPDATED: "SESSION.UPDATED", + SETTINGS_UPDATED: "SETTINGS.UPDATED", + SIGN_ON_POLICY_ASSIGNMENT_CREATED: "SIGN_ON_POLICY_ASSIGNMENT.CREATED", + SIGN_ON_POLICY_ASSIGNMENT_DELETED: "SIGN_ON_POLICY_ASSIGNMENT.DELETED", + SIGN_ON_POLICY_ASSIGNMENT_UPDATED: "SIGN_ON_POLICY_ASSIGNMENT.UPDATED", + STAGED_CHANGE_COMPLETED: "STAGED_CHANGE.COMPLETED", + STAGED_CHANGE_CREATED: "STAGED_CHANGE.CREATED", + STAGED_CHANGE_DELETED: "STAGED_CHANGE.DELETED", + STAGED_CHANGE_FAILED: "STAGED_CHANGE.FAILED", + STAGED_CHANGE_UPDATED: "STAGED_CHANGE.UPDATED", + SUBSCRIPTION_CREATED: "SUBSCRIPTION.CREATED", + SUBSCRIPTION_DELETED: "SUBSCRIPTION.DELETED", + SUBSCRIPTION_UPDATED: "SUBSCRIPTION.UPDATED", + THEME_CREATED: "THEME.CREATED", + THEME_DELETED: "THEME.DELETED", + THEME_UPDATED: "THEME.UPDATED", + TRUSTED_EMAIL_ACTIVE: "TRUSTED_EMAIL.ACTIVE", + TRUSTED_EMAIL_CREATED: "TRUSTED_EMAIL.CREATED", + TRUSTED_EMAIL_DELETED: "TRUSTED_EMAIL.DELETED", + TRUSTED_EMAIL_SEND_CODE: "TRUSTED_EMAIL.SEND_CODE", + USER_ACCESS_ALLOWED: "USER.ACCESS_ALLOWED", + USER_ACCESS_DENIED: "USER.ACCESS_DENIED", + USER_CREATED: "USER.CREATED", + USER_DELETED: "USER.DELETED", + USER_INVITED: "USER.INVITED", + USER_KERBEROS_FAILED: "USER.KERBEROS_FAILED", + USER_KERBEROS_SUCCEEDED: "USER.KERBEROS_SUCCEEDED", + USER_LOCKED: "USER.LOCKED", + USER_MOVED: "USER.MOVED", + USER_QUOTA_RESET: "USER.QUOTA_RESET", + USER_SLO_FAILURE: "USER.SLO_FAILURE", + USER_SLO_PARTIAL_LOGOUT: "USER.SLO_PARTIAL_LOGOUT", + USER_SLO_REQUESTED: "USER.SLO_REQUESTED", + USER_SLO_SUCCESS: "USER.SLO_SUCCESS", + USER_UNLOCKED: "USER.UNLOCKED", + USER_UPDATED: "USER.UPDATED", + USER_UPDATE_ON_AUTH_FAILED: "USER.UPDATE_ON_AUTH_FAILED", + USER_UPDATE_ON_AUTH_SUCCEEDED: "USER.UPDATE_ON_AUTH_SUCCEEDED", + USER_CREDENTIAL_DELETED: "USER_CREDENTIAL.DELETED", + USER_CREDENTIAL_ISSUED: "USER_CREDENTIAL.ISSUED", + USER_CREDENTIAL_PENDING: "USER_CREDENTIAL.PENDING", + USER_CREDENTIAL_REVOKED: "USER_CREDENTIAL.REVOKED", + USER_CREDENTIAL_UPDATED: "USER_CREDENTIAL.UPDATED", + VALIDATION_TRANSACTION_CREATED: "VALIDATION_TRANSACTION.CREATED", + VALIDATION_TRANSACTION_DELETED: "VALIDATION_TRANSACTION.DELETED", + VALIDATION_TRANSACTION_UPDATED: "VALIDATION_TRANSACTION.UPDATED", + VERIFY_APPEVENT_CREATED: "VERIFY_APPEVENT.CREATED", + VERIFY_METADATA_CREATED: "VERIFY_METADATA.CREATED", + VERIFY_POLICY_CREATED: "VERIFY_POLICY.CREATED", + VERIFY_POLICY_DELETED: "VERIFY_POLICY.DELETED", + VERIFY_POLICY_UPDATED: "VERIFY_POLICY.UPDATED", +}; diff --git a/components/pingone/sources/common/webhook.mjs b/components/pingone/sources/common/webhook.mjs new file mode 100644 index 0000000000000..cb5110ed956a7 --- /dev/null +++ b/components/pingone/sources/common/webhook.mjs @@ -0,0 +1,85 @@ +import { ConfigurationError } from "@pipedream/platform"; +import app from "../../pingone.app.mjs"; +import constants from "../../common/constants.mjs"; + +export default { + props: { + app, + db: "$.service.db", + http: "$.interface.http", + }, + hooks: { + async activate() { + const { + createSubscription, + http: { endpoint: url }, + setSubscriptionId, + getSubscriptionData, + } = this; + + const response = + await createSubscription({ + data: { + enabled: true, + httpEndpoint: { + url, + }, + ...getSubscriptionData(), + }, + }); + + setSubscriptionId(response.id); + }, + async deactivate() { + const { + deleteSubscription, + getSubscriptionId, + } = this; + + const webhookId = getSubscriptionId(); + if (webhookId) { + await deleteSubscription({ + webhookId, + }); + } + }, + }, + methods: { + setSubscriptionId(value) { + this.db.set(constants.SUBSCRIPTION_ID, value); + }, + getSubscriptionId() { + return this.db.get(constants.SUBSCRIPTION_ID); + }, + generateMeta() { + throw new ConfigurationError("generateMeta is not implemented"); + }, + getSubscriptionData() { + throw new ConfigurationError("getSubscriptionData is not implemented"); + }, + processResource(resource) { + this.$emit(resource, this.generateMeta(resource)); + }, + createSubscription(args = {}) { + return this.app.post({ + path: "/subscriptions", + ...args, + }); + }, + deleteSubscription({ + subscriptionId, ...args + } = {}) { + return this.app.delete({ + path: `/subscriptions/${subscriptionId}`, + ...args, + }); + }, + }, + async run({ body }) { + this.http.respond({ + status: 200, + }); + + this.processResource(body); + }, +}; diff --git a/components/pingone/sources/new-user-assigned-to-app-instant/new-user-assigned-to-app-instant.mjs b/components/pingone/sources/new-user-assigned-to-app-instant/new-user-assigned-to-app-instant.mjs new file mode 100644 index 0000000000000..fa337dec0f7f7 --- /dev/null +++ b/components/pingone/sources/new-user-assigned-to-app-instant/new-user-assigned-to-app-instant.mjs @@ -0,0 +1,37 @@ +import common from "../common/webhook.mjs"; +import events from "../common/events.mjs"; + +export default { + ...common, + key: "pingone-new-user-assigned-to-app-instant", + name: "New User Assigned to Application (Instant)", + description: "Emit new event when a user is assigned to an application in PingOne.", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + getSubscriptionData() { + return { + name: "New Login Activity", + format: "ACTIVITY", + filterOptions: { + includedActionTypes: [ + // An end user accepted an agreement in PingOne. + // Agreements can include terms and conditions, + // as well as permissions for an application. + events.OAUTH_CONSENT_ACCEPTED, + ], + }, + }; + }, + generateMeta() { + const ts = Date.now(); + return { + id: ts, + summary: "New User Assigned to Application", + ts, + }; + }, + }, +}; diff --git a/components/pingone/sources/new-user-created-instant/new-user-created-instant.mjs b/components/pingone/sources/new-user-created-instant/new-user-created-instant.mjs new file mode 100644 index 0000000000000..f0272b80547eb --- /dev/null +++ b/components/pingone/sources/new-user-created-instant/new-user-created-instant.mjs @@ -0,0 +1,34 @@ +import common from "../common/webhook.mjs"; +import events from "../common/events.mjs"; + +export default { + ...common, + key: "pingone-new-user-created-instant", + name: "New User Created (Instant)", + description: "Emit new event when a new user is created in PingOne. Configure optional filters for specific user attributes or groups.", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + getSubscriptionData() { + return { + name: "New User Created", + format: "ACTIVITY", + filterOptions: { + includedActionTypes: [ + events.USER_CREATED, + ], + }, + }; + }, + generateMeta() { + const ts = Date.now(); + return { + id: ts, + summary: "New User Created", + ts, + }; + }, + }, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c26f9e0e30bd..c0c976035c0df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1233,8 +1233,7 @@ importers: components/bluecart_api: {} - components/bluesky: - specifiers: {} + components/bluesky: {} components/bluesky_by_unshape: dependencies: @@ -12221,10 +12220,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.0(@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: 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-theme-docs: specifier: latest - version: 3.3.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))(nextra@3.3.0(@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: 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) react: specifier: ^18.3.1 version: 18.3.1 @@ -22400,16 +22399,16 @@ packages: sass: optional: true - nextra-theme-docs@3.3.0: - resolution: {integrity: sha512-4JSbDmsbtaYa2eKHsNymWy6So4/fAAXuNPSkjgQ3S+aLRiC730mR9djdkTd1iRca4+czetzBWaqxu+HwTVSSCA==} + nextra-theme-docs@3.3.1: + resolution: {integrity: sha512-P305m2UcW2IDyQhjrcAu0qpdPArikofinABslUCAyixYShsmcdDRUhIMd4QBHYru4gQuVjGWX9PhWZZCbNvzDQ==} peerDependencies: next: '>=13' - nextra: 3.3.0 + nextra: 3.3.1 react: '>=18' react-dom: '>=18' - nextra@3.3.0: - resolution: {integrity: sha512-//+bQW3oKrpLrrIFD5HJow310+YcNYhGIgdM4y+EjYuIXScJcgp6Q4Upsq8c2s2fQKEJjeuf+hXKusx9fvH/2w==} + nextra@3.3.1: + resolution: {integrity: sha512-jiwj+LfUPHHeAxJAEqFuglxnbjFgzAOnDWFsjv7iv3BWiX8OksDwd3I2Sv3j2zba00iIBDEPdNeylfzTtTLZVg==} engines: {node: '>=18'} peerDependencies: next: '>=13' @@ -39627,7 +39626,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@3.3.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))(nextra@3.3.0(@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@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): dependencies: '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 @@ -39635,13 +39634,13 @@ snapshots: 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.0(@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: 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: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.23.8 - nextra@3.3.0(@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@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): 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)