From 31cef16cc3f433f3c6b91a15f06d30afd9a87d2d Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Thu, 6 Apr 2023 16:18:36 -0400 Subject: [PATCH] fix: fileName formatting fixes --- client/package-lock.json | 96 +++++++++++++++++++ client/package.json | 1 + .../components/Endpoints/EditPresetDialog.jsx | 4 +- .../Nav/ExportConversation/ExportModel.jsx | 7 +- 4 files changed, 103 insertions(+), 5 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index b51767cba5..8db0845566 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -31,6 +31,7 @@ "downloadjs": "^1.4.7", "esbuild": "0.17.15", "export-from-json": "^1.7.2", + "filenamify": "^5.1.1", "html2canvas": "^1.4.1", "lodash": "^4.17.21", "lucide-react": "^0.113.0", @@ -6451,6 +6452,33 @@ "node": ">=10" } }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", + "dependencies": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.0.1", "license": "MIT", @@ -12170,6 +12198,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/style-loader": { "version": "3.3.2", "dev": true, @@ -12488,6 +12527,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/trough": { "version": "2.1.0", "license": "MIT", @@ -17634,6 +17695,21 @@ } } }, + "filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==" + }, + "filenamify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", + "requires": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + } + }, "fill-range": { "version": "7.0.1", "requires": { @@ -20915,6 +20991,11 @@ "version": "3.1.1", "dev": true }, + "strip-outer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==" + }, "style-loader": { "version": "3.3.2", "dev": true, @@ -21105,6 +21186,21 @@ "trim-lines": { "version": "3.0.1" }, + "trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "requires": { + "escape-string-regexp": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, "trough": { "version": "2.1.0" }, diff --git a/client/package.json b/client/package.json index 81b00b973c..75d8361f1a 100644 --- a/client/package.json +++ b/client/package.json @@ -43,6 +43,7 @@ "downloadjs": "^1.4.7", "esbuild": "0.17.15", "export-from-json": "^1.7.2", + "filenamify": "^5.1.1", "html2canvas": "^1.4.1", "lodash": "^4.17.21", "lucide-react": "^0.113.0", diff --git a/client/src/components/Endpoints/EditPresetDialog.jsx b/client/src/components/Endpoints/EditPresetDialog.jsx index 8457f27f57..e264920772 100644 --- a/client/src/components/Endpoints/EditPresetDialog.jsx +++ b/client/src/components/Endpoints/EditPresetDialog.jsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useSetRecoilState, useRecoilValue } from 'recoil'; +import filenamify from 'filenamify'; import axios from 'axios'; import exportFromJSON from 'export-from-json'; import DialogTemplate from '../ui/DialogTemplate'; @@ -51,9 +52,10 @@ const EditPresetDialog = ({ open, onOpenChange, preset: _preset, title }) => { }; const exportPreset = () => { + const fileName = filenamify(preset?.title || 'preset'); exportFromJSON({ data: cleanupPreset({ preset, endpointsFilter }), - fileName: `${preset?.title}.json`, + fileName, exportType: exportFromJSON.types.json }); }; diff --git a/client/src/components/Nav/ExportConversation/ExportModel.jsx b/client/src/components/Nav/ExportConversation/ExportModel.jsx index b4c0080c86..7a02dc96db 100644 --- a/client/src/components/Nav/ExportConversation/ExportModel.jsx +++ b/client/src/components/Nav/ExportConversation/ExportModel.jsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useRecoilValue, useRecoilCallback } from 'recoil'; +import filenamify from 'filenamify'; import exportFromJSON from 'export-from-json'; import download from 'downloadjs'; import DialogTemplate from '~/components/ui/DialogTemplate.jsx'; @@ -40,9 +41,7 @@ export default function ExportModel({ open, onOpenChange }) { useEffect(() => { setFileName( - String(conversation?.title) - .replace(/[^a-z0-9]/gi, '_') - .toLowerCase() || 'file' + filenamify(String(conversation?.title || 'file')) ); setType('text'); setIncludeOptions(true); @@ -292,7 +291,7 @@ export default function ExportModel({ open, onOpenChange }) { setFileName(e.target.value || '')} + onChange={e => setFileName(filenamify(e.target.value || ''))} placeholder="Set the filename" className={cn( defaultTextProps,