diff --git a/components/algolia/actions/browse-records/browse-records.mjs b/components/algolia/actions/browse-records/browse-records.mjs new file mode 100644 index 0000000000000..34354ad817032 --- /dev/null +++ b/components/algolia/actions/browse-records/browse-records.mjs @@ -0,0 +1,37 @@ +import app from "../../algolia.app.mjs"; + +export default { + key: "algolia-browse-records", + name: "Browse Records", + description: "Browse for records in the given index. [See the documentation](https://www.algolia.com/doc/libraries/javascript/v5/methods/search/browse/?client=javascript).", + version: "0.0.1", + type: "action", + props: { + app, + indexName: { + propDefinition: [ + app, + "indexName", + ], + }, + }, + methods: { + browse(args) { + return this.app._client().browse(args); + }, + }, + async run({ $ }) { + const { + browse, + indexName, + } = this; + + const response = await browse({ + indexName, + }); + + $.export("$summary", `Successfully fetched records from ${indexName} index.`); + + return response; + }, +}; diff --git a/components/algolia/actions/create-objects/create-objects.mjs b/components/algolia/actions/create-objects/create-objects.mjs deleted file mode 100644 index 56c3c8a411d0f..0000000000000 --- a/components/algolia/actions/create-objects/create-objects.mjs +++ /dev/null @@ -1,54 +0,0 @@ -import algolia from "../../algolia.app.mjs"; - -export default { - key: "algolia-create-objects", - name: "Create Objects", - description: "Adds an array of JavaScript objects to the given index. [See docs here](https://www.algolia.com/doc/api-reference/api-methods/save-objects/)", - version: "0.0.3", - type: "action", - props: { - algolia, - indexName: { - propDefinition: [ - algolia, - "indexName", - ], - }, - objects: { - label: "Objects", - description: "An array of JavaScript objects, each corresponding to a new object in your search index. It's recommended you create this array of objects in a prior code step, then select expression mode and enter a variable reference to that array here", - type: "string[]", - }, - autoGenerateObjectIDIfNotExist: { - type: "boolean", - label: "Auto Generate Object ID If Not Present", - description: "If an objectID property is not present on objects, automatically assign on. Defaults to true", - optional: true, - default: true, - }, - }, - methods: { - parseObject(object) { - return (typeof object === "object") - ? object - : JSON.parse(object); - }, - }, - async run({ $ }) { - const parsedObjects = this.objects.length - ? this.objects.map((object) => this.parseObject(object)) - : this.parseObject(this.objects); - - const response = await this.algolia.createObjects({ - indexName: this.indexName, - objects: parsedObjects, - options: { - autoGenerateObjectIDIfNotExist: this.autoGenerateObjectIDIfNotExist, - }, - }); - - $.export("$summary", "Successfully created objects"); - - return response; - }, -}; diff --git a/components/algolia/actions/delete-objects/delete-objects.mjs b/components/algolia/actions/delete-objects/delete-objects.mjs deleted file mode 100644 index 75d96c7ae756a..0000000000000 --- a/components/algolia/actions/delete-objects/delete-objects.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import algolia from "../../algolia.app.mjs"; - -export default { - key: "algolia-delete-objects", - name: "Delete Objects", - description: "Delete objects from the given index. [See docs here](https://www.algolia.com/doc/api-reference/api-methods/delete-objects/)", - version: "0.0.2", - type: "action", - props: { - algolia, - indexName: { - propDefinition: [ - algolia, - "indexName", - ], - }, - objectIds: { - label: "Object Ids", - description: "An array of JavaScript object IDs, each corresponding to a existing object in your search index", - type: "string[]", - }, - }, - async run({ $ }) { - const response = await this.algolia.deleteObjects({ - indexName: this.indexName, - objectIds: typeof this.objectIds === "string" - ? JSON.parse(this.objectIds) - : this.objectIds, - }); - - $.export("$summary", "Successfully deleted objects"); - - return response; - }, -}; diff --git a/components/algolia/actions/delete-records/delete-records.mjs b/components/algolia/actions/delete-records/delete-records.mjs new file mode 100644 index 0000000000000..2e5868f085341 --- /dev/null +++ b/components/algolia/actions/delete-records/delete-records.mjs @@ -0,0 +1,46 @@ +import app from "../../algolia.app.mjs"; +import utils from "../../common/utils.mjs"; + +export default { + key: "algolia-delete-records", + name: "Delete Records", + description: "Delete records from the given index. [See the documentation](https://www.algolia.com/doc/libraries/javascript/v5/helpers/#delete-records)", + version: "0.0.1", + type: "action", + props: { + app, + indexName: { + propDefinition: [ + app, + "indexName", + ], + }, + recordIds: { + type: "string[]", + label: "Record IDs", + description: "IDs of the records to delete also known as `objectIDs`. Eg. `[\"1\", \"2\"]`. If you don't know the IDs, you can use the **Browse Records** action to find them, then map them and then use them here as a custom expression. Eg. `{{steps.map_records_to_objectids.$return_value}}`.", + }, + }, + methods: { + deleteRecords(args = {}) { + return this.app._client().deleteObjects(args); + }, + }, + async run({ $ }) { + const { + deleteRecords, + indexName, + recordIds, + } = this; + + const response = await deleteRecords({ + indexName, + objectIDs: utils.parseArray(recordIds), + waitForTasks: true, + }); + + $.export("$summary", "Successfully deleted records."); + + return response; + }, +}; diff --git a/components/algolia/actions/save-records/save-records.mjs b/components/algolia/actions/save-records/save-records.mjs new file mode 100644 index 0000000000000..00209544870e5 --- /dev/null +++ b/components/algolia/actions/save-records/save-records.mjs @@ -0,0 +1,45 @@ +import app from "../../algolia.app.mjs"; +import utils from "../../common/utils.mjs"; + +export default { + key: "algolia-save-records", + name: "Save Records", + description: "Adds records to an index. [See the documentation](https://www.algolia.com/doc/libraries/javascript/v5/helpers/#save-records).", + version: "0.0.1", + type: "action", + props: { + app, + indexName: { + propDefinition: [ + app, + "indexName", + ], + }, + records: { + type: "string[]", + label: "Records From JSON Objects", + description: "The records to add to the index. Each record should be a JSON object. Eg. `{\"objectID\": \"1\", \"name\": \"Jane Doe\"}`. For a better user experience, you can use the [**CSV File To Objects**](https://pipedream.com/apps/helper-functions/actions/csv-file-to-objects) **Helper Function** action to convert a CSV file to an array of objects and then map the objects to the records field here as a **Custom Expression**. Eg. `{{steps.csv_file_to_objects.$return_value}}`.", + }, + }, + methods: { + saveRecords(args = {}) { + return this.app._client().saveObjects(args); + }, + }, + async run({ $ }) { + const { + saveRecords, + indexName, + records, + } = this; + + const response = await saveRecords({ + indexName, + objects: utils.parseArrayAndMap(records), + waitForTasks: true, + }); + + $.export("$summary", "Successfully created records."); + return response; + }, +}; diff --git a/components/algolia/algolia.app.mjs b/components/algolia/algolia.app.mjs index bc48123215fec..d0d220f79cffc 100644 --- a/components/algolia/algolia.app.mjs +++ b/components/algolia/algolia.app.mjs @@ -9,8 +9,7 @@ export default { description: "The name of the index", type: "string", async options() { - const indexes = await this.getIndexes(); - + const { items: indexes } = await this.listIndices(); return indexes.map((index) => index.name); }, }, @@ -25,23 +24,8 @@ export default { _client() { return algoliasearch(this._applicationId(), this._apiKey()); }, - _index(indexName) { - return this._client().initIndex(indexName); - }, - async getIndexes() { - const response = await this._client().listIndices(); - - return response.items; - }, - async createObjects({ - indexName, objects, options, - }) { - return this._index(indexName).saveObjects(objects, options); - }, - async deleteObjects({ - indexName, objectIds, - }) { - return this._index(indexName).deleteObjects(objectIds); + listIndices() { + return this._client().listIndices(); }, }, }; diff --git a/components/algolia/common/utils.mjs b/components/algolia/common/utils.mjs new file mode 100644 index 0000000000000..7748d9d025164 --- /dev/null +++ b/components/algolia/common/utils.mjs @@ -0,0 +1,52 @@ +import { ConfigurationError } from "@pipedream/platform"; + +const parseJson = (input) => { + const parse = (value) => { + if (typeof(value) === "string") { + try { + return parseJson(JSON.parse(value)); + } catch (e) { + return value; + } + } else if (typeof(value) === "object" && value !== null) { + return Object.entries(value) + .reduce((acc, [ + key, + val, + ]) => Object.assign(acc, { + [key]: parse(val), + }), {}); + } + return value; + }; + + return parse(input); +}; + +function parseArray(value) { + try { + if (!value) { + return []; + } + + if (Array.isArray(value)) { + return value; + } + + const parsedValue = JSON.parse(value); + + if (!Array.isArray(parsedValue)) { + throw new Error("Not an array"); + } + + return parsedValue; + + } catch (e) { + throw new ConfigurationError("Make sure the custom expression contains a valid JSON array object"); + } +} + +export default { + parseArray, + parseArrayAndMap: (value) => parseArray(value)?.map(parseJson), +}; diff --git a/components/algolia/package.json b/components/algolia/package.json index f1e0cd0910539..23c566106e5bc 100644 --- a/components/algolia/package.json +++ b/components/algolia/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/algolia", - "version": "0.0.5", + "version": "0.1.0", "description": "Pipedream Algolia Components", "main": "algolia.app.js", "keywords": [ @@ -14,6 +14,6 @@ "access": "public" }, "dependencies": { - "algoliasearch": "^4.13.1" + "algoliasearch": "^5.17.1" } } diff --git a/components/helper_functions/actions/csv-file-to-objects/csv-file-to-objects.mjs b/components/helper_functions/actions/csv-file-to-objects/csv-file-to-objects.mjs new file mode 100644 index 0000000000000..7b8223bee667e --- /dev/null +++ b/components/helper_functions/actions/csv-file-to-objects/csv-file-to-objects.mjs @@ -0,0 +1,81 @@ +import { readFileSync } from "fs"; +import path from "path"; +import { parse } from "csv-parse/sync"; +import app from "../../helper_functions.app.mjs"; + +export default { + key: "helper_functions-csv-file-to-objects", + name: "CSV File To Objects", + description: "Convert a CSV file to an array of objects.", + version: "0.0.1", + type: "action", + props: { + app, + filePath: { + type: "string", + label: "CSV File Path", + description: "The path to the file saved to the `/tmp` directory (e.g. `/tmp/example.csv`). [See the documentation](https://pipedream.com/docs/workflows/steps/code/nodejs/working-with-files/#the-tmp-directory).", + }, + hasHeaders: { + type: "boolean", + label: "File Contains Headers", + description: "Set to `true` if the first row of the CSV contains headers. If there are headers in the file, the keys of the objects will be the header values. If there are no headers, each object will be an array of values.", + optional: true, + default: false, + }, + skipEmptyLines: { + type: "boolean", + label: "Skip Empty Lines", + description: "Set to `true` to skip empty lines in the file.", + optional: true, + default: true, + }, + skipRecordsWithEmptyValues: { + type: "boolean", + label: "Skip Records With Empty Values", + description: "Set to `true` to skip records with empty values. Don't generate records for lines containing empty values, empty Buffer or equals to `null` and `undefined` if their value was casted.", + optional: true, + default: false, + }, + skipRecordsWithError: { + type: "boolean", + label: "Skip Records With Error", + description: "Set to `true` to skip records with errors. Tolerates parsing errors. It skips the records containing an error inside and directly go process the next record.", + optional: true, + default: false, + }, + }, + async run({ $ }) { + const { + filePath, + hasHeaders, + skipEmptyLines, + skipRecordsWithEmptyValues, + skipRecordsWithError, + } = this; + + let fileContent; + try { + fileContent = readFileSync(path.resolve(filePath), "utf8"); + } catch (error) { + console.error("Error reading file:", error); + throw error; + } + + try { + const records = parse(fileContent, { + columns: hasHeaders, + skip_empty_lines: skipEmptyLines, + skip_records_with_empty_values: skipRecordsWithEmptyValues, + skip_records_with_error: skipRecordsWithError, + }); + + $.export("$summary", `Converted ${records.length} records from CSV to objects.`); + return records; + + } catch (error) { + console.error("Error converting CSV to objects:", error); + throw error; + } + }, +}; diff --git a/components/helper_functions/package.json b/components/helper_functions/package.json index 8eb5e60ee2519..76d6138c6880b 100644 --- a/components/helper_functions/package.json +++ b/components/helper_functions/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/helper_functions", - "version": "0.4.2", + "version": "0.5.0", "description": "Pipedream Helper_functions Components", "main": "helper_functions.app.mjs", "keywords": [ @@ -15,6 +15,7 @@ }, "dependencies": { "@pipedream/platform": "^3.0.0", + "csv-parse": "^5.5.6", "streamifier": "^0.1.1", "xml-js": "^1.6.11" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cad5eebd85fb4..b9b53bc91529b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -531,8 +531,8 @@ importers: components/algolia: dependencies: algoliasearch: - specifier: ^4.13.1 - version: 4.24.0 + specifier: ^5.17.1 + version: 5.17.1 components/algomo: {} @@ -4652,6 +4652,9 @@ importers: '@pipedream/platform': specifier: ^3.0.0 version: 3.0.3 + csv-parse: + specifier: ^5.5.6 + version: 5.6.0 streamifier: specifier: ^0.1.1 version: 0.1.1 @@ -12169,7 +12172,7 @@ importers: dependencies: '@docsearch/react': specifier: ^3.6.1 - version: 3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + 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) '@pipedream/sdk': specifier: ^0.1.9 version: 0.1.9 @@ -12478,102 +12481,109 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/cache-browser-local-storage@4.24.0': - resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==} - - '@algolia/cache-common@4.24.0': - resolution: {integrity: sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==} - - '@algolia/cache-in-memory@4.24.0': - resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==} - '@algolia/client-abtesting@5.15.0': resolution: {integrity: sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==} engines: {node: '>= 14.0.0'} - '@algolia/client-account@4.24.0': - resolution: {integrity: sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==} - - '@algolia/client-analytics@4.24.0': - resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==} + '@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-common@4.24.0': - resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==} + '@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-personalization@4.24.0': - resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==} + '@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-search@4.24.0': - resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==} + '@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/logger-common@4.24.0': - resolution: {integrity: sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==} - - '@algolia/logger-console@4.24.0': - resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==} + '@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/recommend@4.24.0': - resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==} + '@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/requester-browser-xhr@4.24.0': - resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==} + '@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-common@4.24.0': - resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==} + '@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-node-http@4.24.0': - resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==} + '@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/transporter@4.24.0': - resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==} + '@algolia/requester-node-http@5.17.1': + resolution: {integrity: sha512-PSnENJtl4/wBWXlGyOODbLYm6lSiFqrtww7UpQRCJdsHXlJKF8XAP6AME8NxvbE0Qo/RJUxK0mvyEh9sQcx6bg==} + engines: {node: '>= 14.0.0'} '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} @@ -17200,13 +17210,14 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@4.24.0: - resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} - 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'} + align-spaces@1.0.4: resolution: {integrity: sha512-JPl93xFbsX4OY7VFKjerJ9cjaelmKo1wt1EP0ScrKI578vro1WhGy+w9C0nAFup8qYADgAS2FvMb7uLPStTB6g==} engines: {node: '>=8.3.0'} @@ -25842,44 +25853,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@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) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) - '@algolia/client-search': 5.15.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0) + '@algolia/client-search': 5.17.1 algoliasearch: 5.15.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.17.1)(algoliasearch@5.15.0)': dependencies: - '@algolia/client-search': 5.15.0 + '@algolia/client-search': 5.17.1 algoliasearch: 5.15.0 - '@algolia/cache-browser-local-storage@4.24.0': - dependencies: - '@algolia/cache-common': 4.24.0 - - '@algolia/cache-common@4.24.0': {} - - '@algolia/cache-in-memory@4.24.0': - dependencies: - '@algolia/cache-common': 4.24.0 - '@algolia/client-abtesting@5.15.0': dependencies: '@algolia/client-common': 5.15.0 @@ -25887,18 +25888,12 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/client-account@4.24.0': + '@algolia/client-abtesting@5.17.1': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/transporter': 4.24.0 - - '@algolia/client-analytics@4.24.0': - dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@algolia/requester-fetch': 5.17.1 + '@algolia/requester-node-http': 5.17.1 '@algolia/client-analytics@5.15.0': dependencies: @@ -25907,13 +25902,17 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/client-common@4.24.0': + '@algolia/client-analytics@5.17.1': dependencies: - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@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 @@ -25921,11 +25920,12 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/client-personalization@4.24.0': + '@algolia/client-insights@5.17.1': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@algolia/requester-fetch': 5.17.1 + '@algolia/requester-node-http': 5.17.1 '@algolia/client-personalization@5.15.0': dependencies: @@ -25934,6 +25934,13 @@ snapshots: '@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 + '@algolia/requester-browser-xhr': 5.17.1 + '@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 @@ -25941,11 +25948,12 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/client-search@4.24.0': + '@algolia/client-query-suggestions@5.17.1': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@algolia/requester-fetch': 5.17.1 + '@algolia/requester-node-http': 5.17.1 '@algolia/client-search@5.15.0': dependencies: @@ -25954,6 +25962,13 @@ snapshots: '@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 + '@algolia/requester-browser-xhr': 5.17.1 + '@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 @@ -25961,11 +25976,12 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/logger-common@4.24.0': {} - - '@algolia/logger-console@4.24.0': + '@algolia/ingestion@1.17.1': dependencies: - '@algolia/logger-common': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@algolia/requester-fetch': 5.17.1 + '@algolia/requester-node-http': 5.17.1 '@algolia/monitoring@1.15.0': dependencies: @@ -25974,19 +25990,12 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/recommend@4.24.0': + '@algolia/monitoring@1.17.1': dependencies: - '@algolia/cache-browser-local-storage': 4.24.0 - '@algolia/cache-common': 4.24.0 - '@algolia/cache-in-memory': 4.24.0 - '@algolia/client-common': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/logger-common': 4.24.0 - '@algolia/logger-console': 4.24.0 - '@algolia/requester-browser-xhr': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/requester-node-http': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@algolia/requester-fetch': 5.17.1 + '@algolia/requester-node-http': 5.17.1 '@algolia/recommend@5.15.0': dependencies: @@ -25995,33 +26004,36 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 - '@algolia/requester-browser-xhr@4.24.0': + '@algolia/recommend@5.17.1': dependencies: - '@algolia/requester-common': 4.24.0 + '@algolia/client-common': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@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-common@4.24.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-node-http@4.24.0': + '@algolia/requester-fetch@5.17.1': dependencies: - '@algolia/requester-common': 4.24.0 + '@algolia/client-common': 5.17.1 '@algolia/requester-node-http@5.15.0': dependencies: '@algolia/client-common': 5.15.0 - '@algolia/transporter@4.24.0': + '@algolia/requester-node-http@5.17.1': dependencies: - '@algolia/cache-common': 4.24.0 - '@algolia/logger-common': 4.24.0 - '@algolia/requester-common': 4.24.0 + '@algolia/client-common': 5.17.1 '@alloc/quick-lru@5.2.0': {} @@ -28615,10 +28627,10 @@ snapshots: '@docsearch/css@3.8.0': {} - '@docsearch/react@3.8.0(@algolia/client-search@5.15.0)(@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.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)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@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 optionalDependencies: @@ -32873,24 +32885,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@4.24.0: - dependencies: - '@algolia/cache-browser-local-storage': 4.24.0 - '@algolia/cache-common': 4.24.0 - '@algolia/cache-in-memory': 4.24.0 - '@algolia/client-account': 4.24.0 - '@algolia/client-analytics': 4.24.0 - '@algolia/client-common': 4.24.0 - '@algolia/client-personalization': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/logger-common': 4.24.0 - '@algolia/logger-console': 4.24.0 - '@algolia/recommend': 4.24.0 - '@algolia/requester-browser-xhr': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/requester-node-http': 4.24.0 - '@algolia/transporter': 4.24.0 - algoliasearch@5.15.0: dependencies: '@algolia/client-abtesting': 5.15.0 @@ -32907,6 +32901,22 @@ snapshots: '@algolia/requester-fetch': 5.15.0 '@algolia/requester-node-http': 5.15.0 + algoliasearch@5.17.1: + dependencies: + '@algolia/client-abtesting': 5.17.1 + '@algolia/client-analytics': 5.17.1 + '@algolia/client-common': 5.17.1 + '@algolia/client-insights': 5.17.1 + '@algolia/client-personalization': 5.17.1 + '@algolia/client-query-suggestions': 5.17.1 + '@algolia/client-search': 5.17.1 + '@algolia/ingestion': 1.17.1 + '@algolia/monitoring': 1.17.1 + '@algolia/recommend': 5.17.1 + '@algolia/requester-browser-xhr': 5.17.1 + '@algolia/requester-fetch': 5.17.1 + '@algolia/requester-node-http': 5.17.1 + align-spaces@1.0.4: {} ansi-align@3.0.1: