diff --git a/components/lucca/actions/approve-leave-request/approve-leave-request.mjs b/components/lucca/actions/approve-leave-request/approve-leave-request.mjs new file mode 100644 index 0000000000000..1c0efc3ac2288 --- /dev/null +++ b/components/lucca/actions/approve-leave-request/approve-leave-request.mjs @@ -0,0 +1,43 @@ +import lucca from "../../lucca.app.mjs"; + +export default { + key: "lucca-approve-leave-request", + name: "Approve Or Deny Leave Request", + description: "Approve or Deny a pending leave request. [See the documentation](https://developers.lucca.fr/api-reference/legacy/timmi-absences/leave-requests/approve-or-deny-a-leave-request)", + version: "0.0.1", + type: "action", + props: { + lucca, + leaveRequestId: { + propDefinition: [ + lucca, + "leaveRequestId", + ], + }, + approved: { + type: "boolean", + label: "Approved", + description: "Whether the leave request should be approved.", + optional: true, + }, + comment: { + type: "string", + label: "Comment", + description: "Optional comment about the approval decision.", + optional: true, + }, + }, + async run({ $ }) { + const response = await this.lucca.approveLeaveRequest({ + $, + leaveRequestId: this.leaveRequestId, + data: { + approved: this.approved, + comment: this.comment, + }, + }); + + $.export("$summary", `Leave request ${this.leaveRequestId} was successfully processed.`); + return response; + }, +}; diff --git a/components/lucca/actions/update-user-info/update-user-info.mjs b/components/lucca/actions/update-user-info/update-user-info.mjs new file mode 100644 index 0000000000000..be58c646ac512 --- /dev/null +++ b/components/lucca/actions/update-user-info/update-user-info.mjs @@ -0,0 +1,146 @@ +import { ConfigurationError } from "@pipedream/platform"; +import lucca from "../../lucca.app.mjs"; + +export default { + key: "lucca-update-user-info", + name: "Update User Info", + description: "Update profile or HR information for an existing user. [See the documentation](https://developers.lucca.fr/api-reference/legacy/directory/update-a-user-by-id)", + version: "0.0.1", + type: "action", + props: { + lucca, + userId: { + propDefinition: [ + lucca, + "userId", + ], + }, + firstName: { + type: "string", + label: "First Name", + description: "The user's first name", + optional: true, + }, + lastName: { + type: "string", + label: "Last Name", + description: "The user's last name", + optional: true, + }, + mail: { + type: "string", + label: "Email", + description: "The user's email", + optional: true, + }, + login: { + type: "string", + label: "Login", + description: "The user's login", + optional: true, + }, + legalEntityId: { + propDefinition: [ + lucca, + "legalEntityId", + ], + optional: true, + }, + calendarId: { + type: "integer", + label: "Calendar ID", + description: "The ID of the calendar", + optional: true, + }, + employeeNumber: { + type: "string", + label: "Employee Number", + description: "The employee number", + optional: true, + }, + birthDate: { + type: "string", + label: "Birth Date", + description: "The birth date of the user. Format: 'YYYY-MM-DD'.", + optional: true, + }, + address: { + type: "string", + label: "Address", + description: "The address of the user", + optional: true, + }, + bankName: { + type: "string", + label: "Bank Name", + description: "The name of the bank", + optional: true, + }, + directLine: { + type: "string", + label: "Direct Line", + description: "The direct line of the user", + optional: true, + }, + gender: { + type: "string", + label: "Gender", + description: "The gender of the user", + optional: true, + }, + nationality: { + propDefinition: [ + lucca, + "nationalityId", + ], + optional: true, + }, + personalEmail: { + type: "string", + label: "Personal Email", + description: "The personal email of the user", + optional: true, + }, + personalMobile: { + type: "string", + label: "Personal Mobile", + description: "The personal mobile of the user", + optional: true, + }, + professionalMobile: { + type: "string", + label: "Professional Mobile", + description: "The professional mobile of the user", + optional: true, + }, + quote: { + type: "string", + label: "Quote", + description: "The quote of the user", + optional: true, + }, + }, + async run({ $ }) { + try { + const { + lucca, + userId, + ...data + } = this; + + const response = await lucca.updateUserProfile({ + $, + userId, + data, + }); + + $.export("$summary", `Successfully updated user with ID: ${this.userId}`); + return response; + } catch ({ message }) { + console.log("message: ", message); + + const parsedError = JSON.parse(message); + throw new ConfigurationError(parsedError.Message || parsedError[0].message); + } + }, +}; diff --git a/components/lucca/common/constants.mjs b/components/lucca/common/constants.mjs new file mode 100644 index 0000000000000..ea830c15a04cb --- /dev/null +++ b/components/lucca/common/constants.mjs @@ -0,0 +1 @@ +export const LIMIT = 100; diff --git a/components/lucca/lucca.app.mjs b/components/lucca/lucca.app.mjs index 6c2a44bc7dc69..264ad7783bd60 100644 --- a/components/lucca/lucca.app.mjs +++ b/components/lucca/lucca.app.mjs @@ -1,11 +1,204 @@ +import { axios } from "@pipedream/platform"; +import { LIMIT } from "./common/constants.mjs"; + export default { type: "app", app: "lucca", - propDefinitions: {}, + propDefinitions: { + userId: { + type: "string", + label: "User ID", + description: "The ID of the user", + async options({ page }) { + const { data: { items } } = await this.listUsers({ + params: { + paging: `${LIMIT * page},${LIMIT}`, + }, + }); + + return items.map(({ + id: value, name: label, + }) => ({ + label, + value, + })); + }, + }, + leaveRequestId: { + type: "string", + label: "Leave Request ID", + description: "The ID of the leave request to approve", + async options({ page }) { + const { data: { items } } = await this.listLeaveRequests({ + params: { + paging: `${LIMIT * page},${LIMIT}`, + status: 0, + }, + }); + return items.map(({ + id: value, name: label, + }) => ({ + label, + value, + })); + }, + }, + legalEntityId: { + type: "integer", + label: "Legal Entity ID", + description: "The ID of the legal entity", + async options({ page }) { + const { items } = await this.listEstablishments({ + params: { + paging: `${LIMIT * page},${LIMIT}`, + status: 0, + }, + }); + + return items.map(({ + id: value, name: label, + }) => ({ + label, + value, + })); + }, + }, + departmentId: { + type: "integer", + label: "Department ID", + description: "The ID of the department", + async options({ page }) { + const { data: { items } } = await this.listDepartments({ + params: { + paging: `${LIMIT * page},${LIMIT}`, + }, + }); + return items.map(({ + id: value, name: label, + }) => ({ + label, + value, + })); + }, + }, + nationalityId: { + type: "string", + label: "Nationality", + description: "The nationality of the user", + async options() { + const { items } = await this.listCountries(); + return items.map(({ + id: value, name: label, + }) => ({ + label, + value, + })); + }, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + _baseUrl() { + return `${this.$auth.api_url}`; + }, + _headers() { + return { + "authorization": `lucca application=${this.$auth.api_key}`, + }; + }, + _makeRequest({ + $ = this, path, ...opts + }) { + return axios($, { + url: this._baseUrl() + path, + headers: this._headers(), + ...opts, + }); + }, + listLeaveTypes(opts = {}) { + return this._makeRequest({ + path: "/api/v3/leaveperiods/leavetypes", + ...opts, + }); + }, + listUsers(opts = {}) { + return this._makeRequest({ + path: "/api/v3/users", + ...opts, + }); + }, + listLeaveRequests(opts = {}) { + return this._makeRequest({ + path: "/api/v3/leaveRequests", + ...opts, + }); + }, + listEstablishments(opts = {}) { + return this._makeRequest({ + path: "/organization/structure/api/establishments", + ...opts, + }); + }, + listCountries(opts = {}) { + return this._makeRequest({ + path: "/organization/structure/api/countries", + ...opts, + }); + }, + listDepartments(opts = {}) { + return this._makeRequest({ + path: "/api/v3/departments", + ...opts, + }); + }, + approveLeaveRequest({ + leaveRequestId, ...opts + }) { + return this._makeRequest({ + method: "POST", + path: `/api/v3/leaveRequests/${leaveRequestId}/approvals`, + ...opts, + }); + }, + updateUserProfile({ + userId, ...opts + }) { + return this._makeRequest({ + method: "PUT", + path: `/api/v3/users/${userId}`, + ...opts, + }); + }, + listExpenseClaims(opts = {}) { + return this._makeRequest({ + path: "/api/v3/expenseClaims", + ...opts, + }); + }, + async *paginate({ + fn, params = {}, maxResults = null, ...opts + }) { + let hasMore = false; + let count = 0; + let page = 0; + + do { + params.paging = `${LIMIT * page},${LIMIT}`; + page++; + const { data: { items } } = await fn({ + params, + ...opts, + }); + for (const d of items) { + yield d; + + if (maxResults && ++count === maxResults) { + return count; + } + } + + hasMore = items.length; + + } while (hasMore); }, }, -}; \ No newline at end of file +}; diff --git a/components/lucca/package.json b/components/lucca/package.json index e53759b922e86..bb3de410413ef 100644 --- a/components/lucca/package.json +++ b/components/lucca/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/lucca", - "version": "0.0.1", + "version": "0.1.0", "description": "Pipedream Lucca Components", "main": "lucca.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/lucca/sources/common/base.mjs b/components/lucca/sources/common/base.mjs new file mode 100644 index 0000000000000..7bea268e8ec73 --- /dev/null +++ b/components/lucca/sources/common/base.mjs @@ -0,0 +1,63 @@ +import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform"; +import app from "../../lucca.app.mjs"; + +export default { + props: { + app, + db: "$.service.db", + timer: { + type: "$.interface.timer", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, + }, + }, + methods: { + _getLastId() { + return this.db.get("lastId") || 0; + }, + _setLastId(lastId) { + this.db.set("lastId", lastId); + }, + async emitEvent(maxResults = false) { + const lastId = this._getLastId(); + + const response = this.app.paginate({ + fn: this.getFunction(), + maxResults, + params: { + orderBy: "id,desc", + }, + }); + + let responseArray = []; + for await (const item of response) { + if (item.id <= lastId) break; + responseArray.push(item); + } + + if (responseArray.length) { + if (maxResults && (responseArray.length > maxResults)) { + responseArray.length = maxResults; + } + this._setLastId(responseArray[0].id); + } + + for (const item of responseArray.reverse()) { + this.$emit(item, { + id: item.id, + summary: this.getSummary(item), + ts: Date.parse(item.created || new Date()), + }); + } + }, + }, + hooks: { + async deploy() { + await this.emitEvent(25); + }, + }, + async run() { + await this.emitEvent(); + }, +}; diff --git a/components/lucca/sources/new-expense-report/new-expense-report.mjs b/components/lucca/sources/new-expense-report/new-expense-report.mjs new file mode 100644 index 0000000000000..b22658d7c0f3d --- /dev/null +++ b/components/lucca/sources/new-expense-report/new-expense-report.mjs @@ -0,0 +1,22 @@ +import common from "../common/base.mjs"; +import sampleEmit from "./test-event.mjs"; + +export default { + ...common, + key: "lucca-new-expense-report", + name: "New Expense Report Created", + description: "Emit new event when a new expense report is created by an employee. Useful for automating approval or finance workflows. [See the documentation](https://developers.lucca.fr/api-reference/legacy/cleemy-expenses/expenseclaims/list-expenseclaims)", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + getFunction() { + return this.app.listExpenseClaims; + }, + getSummary(item) { + return `New expense report: ${item.name}`; + }, + }, + sampleEmit, +}; diff --git a/components/lucca/sources/new-expense-report/test-event.mjs b/components/lucca/sources/new-expense-report/test-event.mjs new file mode 100644 index 0000000000000..a7192b6f6dbe6 --- /dev/null +++ b/components/lucca/sources/new-expense-report/test-event.mjs @@ -0,0 +1,181 @@ +export default { + "id": 1, + "expenseClaimId": 1, + "lineNumber": 1, + "isControlled": true, + "purchasedOn": "2023-11-07T05:31:56Z", + "createdOn": "2023-11-07T05:31:56Z", + "modifiedOn": "2023-11-07T05:31:56Z", + "originalTransaction": { + "grossAmount": 123, + "currencyId": "", + "isExpenseAbroad": true, + "currency": { + "id": "", + "name": "", + "url": "" + } + }, + "processedAmounts": { + "grossAmount": 123, + "currencyId": "", + "currency": { + "id": "", + "name": "", + "url": "" + }, + "netAmount": 123, + "vatBases": [ + { + "countryVatRateId": 2, + "countryVatRate": { + "id": 2, + "name": "", + "url": "" + }, + "vatAmount": 123, + "amountExcludingVat": 123 + } + ] + }, + "expenseNatureId": 1, + "mileage": { + "distance": 123, + "power": 123, + "waypoints": [ + "" + ] + }, + "quantity": 1, + "effectiveQuantity": 2, + "attendees": { + "internal": [ + { + "id": 123, + "name": "", + "url": "", + "displayName": "", + "modifiedOn": "", + "lastName": "", + "firstName": "", + "login": "", + "mail": "", + "dtContractStart": "", + "dtContractEnd": "", + "birthDate": "", + "employeeNumber": "", + "calendar": { + "id": 123, + "url": "", + "name": "" + }, + "culture": { + "id": 123, + "name": "", + "url": "" + }, + "picture": { + "id": "", + "url": "", + "name": "" + }, + "applicationData": { + "profile_figgo": { + "id": 123, + "name": "", + "url": "" + }, + "profile_utime": { + "id": 123, + "name": "", + "url": "" + } + }, + "legalEntity": { + "id": 123, + "name": "", + "url": "" + }, + "department": { + "id": 123, + "name": "", + "url": "" + }, + "manager": { + "id": 123, + "name": "", + "url": "" + }, + "rolePrincipal": { + "id": 123, + "name": "", + "url": "" + }, + "habilitedRoles": [ + { + "id": 123, + "name": "", + "url": "" + } + ], + "userWorkCycles": [ + { + "Id": 123, + "OwnerID": 123, + "WorkCycleID": 123, + "StartsOn": "", + "EndsOn": "" + } + ] + } + ], + "external": [ + { + "id": 2, + "displayName": "" + } + ] + }, + "axisSections": [ + { + "id": 2, + "code": "", + "name": "", + "multilingualName": "", + "description": "", + "ownerId": 2, + "startOn": "2023-11-07T05:31:56Z", + "endOn": "2023-11-07T05:31:56Z", + "active": true, + "axisId": 123, + "parentAxisSections": [ + {} + ], + "childrenAxisSections": [ + {} + ] + } + ], + "customFields": {}, + "merchant": "", + "comment": "", + "expenseReceipts": [ + { + "id": "" + } + ], + "authorizedActions": { + "isCancellable": true, + "isEditable": true + }, + "sourceId": { + "id": "" + }, + "source": { + "id": 123, + "name": "", + "code": "" + }, + "ownerId": 123, + "paymentMethodId": 0 +} \ No newline at end of file diff --git a/components/lucca/sources/new-leave-request/new-leave-request.mjs b/components/lucca/sources/new-leave-request/new-leave-request.mjs new file mode 100644 index 0000000000000..442cee30dba28 --- /dev/null +++ b/components/lucca/sources/new-leave-request/new-leave-request.mjs @@ -0,0 +1,22 @@ +import common from "../common/base.mjs"; +import sampleEmit from "./test-event.mjs"; + +export default { + ...common, + key: "lucca-new-leave-request", + name: "New Leave Request", + description: "Emit new event when a new leave request is submitted by an employee. [See the documentation](https://developers.lucca.fr/api-reference/legacy/timmi-absences/leave-requests/list-leave-requests)", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + getFunction() { + return this.app.listLeaveRequests; + }, + getSummary(item) { + return `New Leave Request with ID: ${item.id}`; + }, + }, + sampleEmit, +}; diff --git a/components/lucca/sources/new-leave-request/test-event.mjs b/components/lucca/sources/new-leave-request/test-event.mjs new file mode 100644 index 0000000000000..e746765c331c2 --- /dev/null +++ b/components/lucca/sources/new-leave-request/test-event.mjs @@ -0,0 +1,50 @@ +export default { + "id": 123, + "leavePeriodId": 123, + "leavePeriod": { + "id": 123, + "ownerId": 123, + "isConfirmed": true, + "confirmationDate": null, + "attachmentId": null, + "leaves": [ + {} + ], + "logs": [ + { + "id": 123, + "date": "2023-11-07T05:31:56Z", + "comment": "", + "status": 0 + } + ] + }, + "status": 0, + "creationDate": "2023-11-07T05:31:56Z", + "nextApproverId": null, + "cancellationUserId": null, + "cancellationDate": null, + "isActive": true, + "approvals": [ + { + "id": 123, + "date": "2023-11-07T05:31:56Z", + "approverId": 123, + "substitutedApproverId": null, + "approved": true, + "comment": "" + } + ], + "cancellationRequests": [ + { + "id": 123, + "authorId": 123, + "comment": "", + "rank": 0, + "approved": true, + "creationDate": "2023-11-07T05:31:56Z", + "nextApproverId": null, + "isActive": true + } + ] +} \ No newline at end of file diff --git a/components/lucca/sources/new-user/new-user.mjs b/components/lucca/sources/new-user/new-user.mjs new file mode 100644 index 0000000000000..c675713696111 --- /dev/null +++ b/components/lucca/sources/new-user/new-user.mjs @@ -0,0 +1,22 @@ +import common from "../common/base.mjs"; +import sampleEmit from "./test-event.mjs"; + +export default { + ...common, + key: "lucca-new-user", + name: "New User Created", + description: "Emit new event when a new user (employee) is created in Lucca. [See the documentation](https://developers.lucca.fr/api-reference/legacy/directory/list-users)", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + getFunction() { + return this.app.listUsers; + }, + getSummary(item) { + return `New User: ${item.name}`; + }, + }, + sampleEmit, +}; diff --git a/components/lucca/sources/new-user/test-event.mjs b/components/lucca/sources/new-user/test-event.mjs new file mode 100644 index 0000000000000..77d3985c43fb9 --- /dev/null +++ b/components/lucca/sources/new-user/test-event.mjs @@ -0,0 +1,67 @@ +export default { + "id": 123, + "name": "", + "url": "", + "displayName": "", + "modifiedOn": "", + "lastName": "", + "firstName": "", + "login": "", + "mail": "", + "dtContractStart": "", + "dtContractEnd": null, + "birthDate": "", + "employeeNumber": "", + "calendar": { + "id": 123, + "url": "", + "name": "" + }, + "culture": { + "id": 123, + "name": "", + "url": "" + }, + "picture": { + "id": "", + "href": "", + "name": "" + }, + "applicationData": {}, + "legalEntity": { + "id": 123, + "name": "", + "url": "" + }, + "department": { + "id": 123, + "name": "", + "url": "" + }, + "manager": { + "id": 123, + "name": "", + "url": "" + }, + "rolePrincipal": { + "id": 123, + "name": "", + "url": "" + }, + "habilitedRoles": [ + { + "id": 123, + "name": "", + "url": "" + } + ], + "userWorkCycles": [ + { + "Id": 123, + "OwnerID": 123, + "WorkCycleID": 123, + "StartsOn": "", + "EndsOn": "" + } + ] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18ebccc160460..78c6ad7133e9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -379,8 +379,7 @@ importers: specifier: ^20.0.0 version: 20.0.0 - components/adyntel: - specifiers: {} + components/adyntel: {} components/aerisweather: dependencies: @@ -5771,8 +5770,7 @@ importers: specifier: ^3.0.0 version: 3.0.3 - components/hamsa: - specifiers: {} + components/hamsa: {} components/handwrytten: {} @@ -7486,7 +7484,11 @@ importers: specifier: ^1.6.0 version: 1.6.6 - components/lucca: {} + components/lucca: + dependencies: + '@pipedream/platform': + specifier: ^3.0.3 + version: 3.0.3 components/lucid: dependencies: @@ -14898,8 +14900,8 @@ importers: docs-v2: dependencies: '@docsearch/react': - specifier: ^3.6.1 - version: 3.8.0(@algolia/client-search@5.17.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + specifier: ^3.8.1 + version: 3.9.0(@algolia/client-search@5.17.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@vercel/analytics': specifier: ^1.3.1 version: 1.4.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))(react@18.3.1)(vue@2.7.16) @@ -15194,126 +15196,74 @@ packages: resolution: {integrity: sha512-C+jj5XBTCNs7AFwufOkPLhuqn9bdgSDcqLB6b/Ppi9Fujwt613vWmA1hxeG76RX49vzHZIDJLq6N/v0o2SY1sA==} engines: {node: '>=18'} - '@algolia/autocomplete-core@1.17.7': - resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + '@algolia/autocomplete-core@1.17.9': + resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} - '@algolia/autocomplete-plugin-algolia-insights@1.17.7': - resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + '@algolia/autocomplete-plugin-algolia-insights@1.17.9': + resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} peerDependencies: search-insights: '>= 1 < 3' - '@algolia/autocomplete-preset-algolia@1.17.7': - resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + '@algolia/autocomplete-preset-algolia@1.17.9': + resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/autocomplete-shared@1.17.7': - resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + '@algolia/autocomplete-shared@1.17.9': + resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.15.0': - resolution: {integrity: sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==} - engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.17.1': resolution: {integrity: sha512-Os/xkQbDp5A5RdGYq1yS3fF69GoBJH5FIfrkVh+fXxCSe714i1Xdl9XoXhS4xG76DGKm6EFMlUqP024qjps8cg==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.15.0': - resolution: {integrity: sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==} - engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.17.1': resolution: {integrity: sha512-WKpGC+cUhmdm3wndIlTh8RJXoVabUH+4HrvZHC4hXtvCYojEXYeep8RZstatwSZ7Ocg6Y2u67bLw90NEINuYEw==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.15.0': - resolution: {integrity: sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==} - engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.17.1': resolution: {integrity: sha512-5rb5+yPIie6912riAypTSyzbE23a7UM1UpESvD8GEPI4CcWQvA9DBlkRNx9qbq/nJ5pvv8VjZjUxJj7rFkzEAA==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.15.0': - resolution: {integrity: sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==} - engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.17.1': resolution: {integrity: sha512-nb/tfwBMn209TzFv1DDTprBKt/wl5btHVKoAww9fdEVdoKK02R2KAqxe5tuXLdEzAsS+LevRyOM/YjXuLmPtjQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.15.0': - resolution: {integrity: sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==} - engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.17.1': resolution: {integrity: sha512-JuNlZe1SdW9KbV0gcgdsiVkFfXt0mmPassdS3cBSGvZGbPB9JsHthD719k5Y6YOY4dGvw1JmC1i9CwCQHAS8hg==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.15.0': - resolution: {integrity: sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==} - engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.17.1': resolution: {integrity: sha512-RBIFIv1QE3IlAikJKWTOpd6pwE4d2dY6t02iXH7r/SLXWn0HzJtsAPPeFg/OKkFvWAXt0H7In2/Mp7a1/Dy2pw==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.15.0': - resolution: {integrity: sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==} - engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.17.1': resolution: {integrity: sha512-bd5JBUOP71kPsxwDcvOxqtqXXVo/706NFifZ/O5Rx5GB8ZNVAhg4l7aGoT6jBvEfgmrp2fqPbkdIZ6JnuOpGcw==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.15.0': - resolution: {integrity: sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==} - engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.17.1': resolution: {integrity: sha512-T18tvePi1rjRYcIKhd82oRukrPWHxG/Iy1qFGaxCplgRm9Im5z96qnYOq75MSKGOUHkFxaBKJOLmtn8xDR+Mcw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.15.0': - resolution: {integrity: sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==} - engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.17.1': resolution: {integrity: sha512-gDtow+AUywTehRP8S1tWKx2IvhcJOxldAoqBxzN3asuQobF7er5n72auBeL++HY4ImEuzMi7PDOA/Iuwxs2IcA==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.15.0': - resolution: {integrity: sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==} - engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.17.1': resolution: {integrity: sha512-2992tTHkRe18qmf5SP57N78kN1D3e5t4PO1rt10sJncWtXBZWiNOK6K/UcvWsFbNSGAogFcIcvIMAl5mNp6RWA==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.15.0': - resolution: {integrity: sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.17.1': resolution: {integrity: sha512-XpKgBfyczVesKgr7DOShNyPPu5kqlboimRRPjdqAw5grSyHhCmb8yoTIKy0TCqBABZeXRPMYT13SMruUVRXvHA==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.15.0': - resolution: {integrity: sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.17.1': resolution: {integrity: sha512-EhUomH+DZP5vb6DnEjT0GvXaXBSwzZnuU6hPGNU1EYKRXDouRjII/bIWpVjt7ycMgL2D2oQruqDh6rAWUhQwRw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.15.0': - resolution: {integrity: sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.17.1': resolution: {integrity: sha512-PSnENJtl4/wBWXlGyOODbLYm6lSiFqrtww7UpQRCJdsHXlJKF8XAP6AME8NxvbE0Qo/RJUxK0mvyEh9sQcx6bg==} engines: {node: '>= 14.0.0'} @@ -16483,15 +16433,15 @@ packages: resolution: {integrity: sha512-4JINx4Rttha29f50PBsJo48xZXx/He5yaIWJRwVarhYAN947+S84YciHl+AIhQNRPAFkg8+5qFngEGtKxQDWXA==} engines: {node: '>=18.18.0'} - '@docsearch/css@3.8.0': - resolution: {integrity: sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==} + '@docsearch/css@3.9.0': + resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} - '@docsearch/react@3.8.0': - resolution: {integrity: sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==} + '@docsearch/react@3.9.0': + resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' search-insights: '>= 1 < 3' peerDependenciesMeta: '@types/react': @@ -20234,10 +20184,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@5.15.0: - resolution: {integrity: sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==} - engines: {node: '>= 14.0.0'} - algoliasearch@5.17.1: resolution: {integrity: sha512-3CcbT5yTWJDIcBe9ZHgsPi184SkT1kyZi3GWlQU5EFgvq1V73X2sqHRkPCQMe0RA/uvZbB+1sFeAk73eWygeLg==} engines: {node: '>= 14.0.0'} @@ -29122,40 +29068,33 @@ snapshots: transitivePeerDependencies: - supports-color - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)': + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1) '@algolia/client-search': 5.17.1 - algoliasearch: 5.15.0 + algoliasearch: 5.17.1 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)': + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1)': dependencies: '@algolia/client-search': 5.17.1 - algoliasearch: 5.15.0 - - '@algolia/client-abtesting@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 + algoliasearch: 5.17.1 '@algolia/client-abtesting@5.17.1': dependencies: @@ -29164,13 +29103,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/client-analytics@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/client-analytics@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29178,17 +29110,8 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/client-common@5.15.0': {} - '@algolia/client-common@5.17.1': {} - '@algolia/client-insights@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/client-insights@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29196,13 +29119,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/client-personalization@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/client-personalization@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29210,13 +29126,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/client-query-suggestions@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/client-query-suggestions@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29224,13 +29133,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/client-search@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/client-search@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29238,13 +29140,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/ingestion@1.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/ingestion@1.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29252,13 +29147,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/monitoring@1.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/monitoring@1.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29266,13 +29154,6 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/recommend@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - '@algolia/recommend@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -29280,26 +29161,14 @@ snapshots: '@algolia/requester-fetch': 5.17.1 '@algolia/requester-node-http': 5.17.1 - '@algolia/requester-browser-xhr@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-browser-xhr@5.17.1': dependencies: '@algolia/client-common': 5.17.1 - '@algolia/requester-fetch@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-fetch@5.17.1': dependencies: '@algolia/client-common': 5.17.1 - '@algolia/requester-node-http@5.15.0': - dependencies: - '@algolia/client-common': 5.15.0 - '@algolia/requester-node-http@5.17.1': dependencies: '@algolia/client-common': 5.17.1 @@ -32233,14 +32102,14 @@ snapshots: tar-stream: 3.1.7 which: 4.0.0 - '@docsearch/css@3.8.0': {} + '@docsearch/css@3.9.0': {} - '@docsearch/react@3.8.0(@algolia/client-search@5.17.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/react@3.9.0(@algolia/client-search@5.17.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0) - '@docsearch/css': 3.8.0 - algoliasearch: 5.15.0 + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.17.1)(algoliasearch@5.17.1) + '@docsearch/css': 3.9.0 + algoliasearch: 5.17.1 optionalDependencies: '@types/react': 18.3.12 react: 18.3.1 @@ -36842,22 +36711,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.15.0: - dependencies: - '@algolia/client-abtesting': 5.15.0 - '@algolia/client-analytics': 5.15.0 - '@algolia/client-common': 5.15.0 - '@algolia/client-insights': 5.15.0 - '@algolia/client-personalization': 5.15.0 - '@algolia/client-query-suggestions': 5.15.0 - '@algolia/client-search': 5.15.0 - '@algolia/ingestion': 1.15.0 - '@algolia/monitoring': 1.15.0 - '@algolia/recommend': 5.15.0 - '@algolia/requester-browser-xhr': 5.15.0 - '@algolia/requester-fetch': 5.15.0 - '@algolia/requester-node-http': 5.15.0 - algoliasearch@5.17.1: dependencies: '@algolia/client-abtesting': 5.17.1