@sqlrooms/s3-browser 0.28.0-rc.0 → 0.28.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/S3CredentialsForm.js +1 -1
- package/dist/S3CredentialsForm.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ yarn add @sqlrooms/s3-browser
|
|
|
30
30
|
import {useState} from 'react';
|
|
31
31
|
import {S3FileBrowser, S3CredentialsForm, S3State} from '@sqlrooms/s3-browser';
|
|
32
32
|
import {S3FileOrDirectory, S3Config, S3Connection} from '@sqlrooms/s3-utils';
|
|
33
|
+
import {Button} from '@sqlrooms/ui';
|
|
33
34
|
|
|
34
35
|
type S3BrowserProps = {
|
|
35
36
|
listS3Files: (args: {
|
|
@@ -115,9 +116,9 @@ export const S3Browser = ({
|
|
|
115
116
|
}}
|
|
116
117
|
onCanConfirmChange={() => {}}
|
|
117
118
|
/>
|
|
118
|
-
<
|
|
119
|
+
<Button disabled={!selectedFiles.length} onClick={handleLoadFiles}>
|
|
119
120
|
Add Selected
|
|
120
|
-
</
|
|
121
|
+
</Button>
|
|
121
122
|
</div>
|
|
122
123
|
)}
|
|
123
124
|
</div>
|
|
@@ -102,7 +102,7 @@ export function S3CredentialsForm({ onConnect, isLoading, saveS3Credentials, loa
|
|
|
102
102
|
return () => {
|
|
103
103
|
isMounted = false;
|
|
104
104
|
};
|
|
105
|
-
}, []);
|
|
105
|
+
}, [loadS3Credentials]);
|
|
106
106
|
const resolver = zodResolver(formSchema);
|
|
107
107
|
const form = useForm({
|
|
108
108
|
resolver,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3CredentialsForm.js","sourceRoot":"","sources":["../src/S3CredentialsForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useState, useCallback, useEffect} from 'react';\nimport {useForm, SubmitHandler} from 'react-hook-form';\nimport {zodResolver} from '@hookform/resolvers/zod';\nimport * as z from 'zod';\nimport {Tabs, TabsList, TabsTrigger, TabsContent} from '@sqlrooms/ui';\nimport {S3Config, S3Credentials} from '@sqlrooms/s3-browser-config';\n\nimport {\n Input,\n Textarea,\n Button,\n Checkbox,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '@sqlrooms/ui';\n\nimport {\n Eye,\n EyeOff,\n Upload,\n Check,\n AlertCircle,\n Info,\n PlusIcon,\n Database,\n Trash2,\n} from 'lucide-react';\n\nconst S3_REGIONS = [\n {value: 'us-east-1', label: 'us-east-1'},\n {value: 'us-east-2', label: 'us-east-2'},\n {value: 'us-west-1', label: 'us-west-1'},\n {value: 'us-west-2', label: 'us-west-2'},\n {value: 'eu-west-1', label: 'eu-west-1'},\n {value: 'eu-central-1', label: 'eu-central-1'},\n {value: 'ap-northeast-1', label: 'ap-northeast-1'},\n {value: 'ap-southeast-1', label: 'ap-southeast-1'},\n];\n\nconst formSchema = z.object({\n accessKeyId: z.string().min(1, 'Required'),\n secretAccessKey: z.string().min(1, 'Required'),\n sessionToken: z.string().optional(),\n region: z.string().min(1, 'Required'),\n bucket: z.string().min(1, 'Required'),\n name: z.string().max(100, 'Max 100 characters').optional(),\n saveCredential: z.boolean().default(false).optional(),\n});\n\ntype FormData = z.infer<typeof formSchema>;\n\ntype ParsedType = {\n accessKeyId?: string;\n secretAccessKey?: string;\n sessionToken?: string;\n region?: string;\n};\n\nconst parseAWSExport = (text: string): ParsedType => {\n const lines = text.split('\\n');\n const parsed = {} as Record<string, string>;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith('export AWS_ACCESS_KEY_ID=')) {\n parsed.accessKeyId = trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n } else if (trimmed.startsWith('export AWS_SECRET_ACCESS_KEY=')) {\n parsed.secretAccessKey =\n trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n } else if (trimmed.startsWith('export AWS_SESSION_TOKEN=')) {\n parsed.sessionToken = trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n } else if (trimmed.startsWith('export AWS_DEFAULT_REGION=')) {\n parsed.region = trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n }\n }\n\n return parsed;\n};\n\nconst parseCredentialProcess = (text: string): ParsedType => {\n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const jsonStr = jsonMatch[0];\n const raw = JSON.parse(jsonStr);\n const parsed = {} as Record<string, string>;\n\n if (raw.AccessKeyId) {\n parsed.accessKeyId = raw.AccessKeyId;\n }\n if (raw.SecretAccessKey) {\n parsed.secretAccessKey = raw.SecretAccessKey;\n }\n if (raw.SessionToken) {\n parsed.sessionToken = raw.SessionToken;\n }\n if (raw.region) {\n // Check if region is present\n parsed.region = raw.region;\n }\n return parsed;\n }\n } catch (e) {\n console.error('Failed to parse JSON:', e);\n }\n return {};\n};\n\n/**\n * A form component for managing S3 credentials and connections.\n *\n * This component provides:\n * - Input fields for S3 credentials (access key, secret key, region, bucket)\n * - Option to save credentials for later use\n * - Ability to paste AWS credentials export format\n * - Management of saved credentials\n *\n * @example\n * ```tsx\n * const handleConnect = async (credentials) => {\n * // Handle the connection\n * console.log('Connecting with:', credentials);\n * };\n *\n * const handleSaveCredential = async (config) => {\n * // Save the credential to your storage\n * await saveToStorage(config);\n * };\n *\n * const handleLoadCredentials = async () => {\n * // Load saved credentials from your storage\n * return await loadFromStorage();\n * };\n *\n * const handleDeleteCredential = async (id) => {\n * // Delete a saved credential\n * await deleteFromStorage(id);\n * };\n *\n * return (\n * <S3CredentialsForm\n * onConnect={handleConnect}\n * isLoading={false}\n * saveS3Credentials={handleSaveCredential}\n * loadS3Credentials={handleLoadCredentials}\n * deleteS3Credentials={handleDeleteCredential}\n * />\n * );\n * ```\n */\nexport type S3CredentialsFormProps = {\n onConnect: (data: FormData) => void;\n isLoading?: boolean;\n saveS3Credentials: (data: S3Config) => Promise<void>;\n loadS3Credentials: () => Promise<S3Credentials[]>;\n deleteS3Credentials?: (id: string) => Promise<void>;\n onInputChange?: () => void;\n};\n\nexport function S3CredentialsForm({\n onConnect,\n isLoading,\n saveS3Credentials,\n loadS3Credentials,\n deleteS3Credentials,\n onInputChange,\n}: S3CredentialsFormProps) {\n const [showSecrets, setShowSecrets] = useState({\n secretAccessKey: false,\n sessionToken: false,\n });\n const [pasteText, setPasteText] = useState('');\n const [notification, setNotification] = useState({\n show: false,\n message: '',\n type: 'success',\n });\n const [savedCredentials, setSavedCredentials] = useState<S3Credentials[]>([]);\n const [tab, setTab] = useState('new');\n\n // Load saved connections on component mount\n useEffect(() => {\n let isMounted = true;\n async function fetchConnections() {\n // You can await here\n const response = await loadS3Credentials();\n if (response && response.length > 0 && isMounted) {\n // Assuming loadS3Credentials returns an array of connections\n setSavedCredentials(response);\n }\n }\n fetchConnections();\n return () => {\n isMounted = false;\n };\n }, []);\n\n const resolver = zodResolver(formSchema);\n const form = useForm<FormData>({\n resolver,\n defaultValues: {\n accessKeyId: '',\n secretAccessKey: '',\n sessionToken: '',\n region: 'us-east-1',\n bucket: '',\n saveCredential: false,\n },\n });\n const toggleVisibility = useCallback(\n (field: 'secretAccessKey' | 'sessionToken') => {\n setShowSecrets((prev) => ({\n ...prev,\n [field]: !prev[field],\n }));\n },\n [setShowSecrets],\n );\n const showNotification = useCallback(\n (message: string, type = 'success') => {\n setNotification({show: true, message, type});\n setTimeout(\n () => setNotification({show: false, message: '', type: 'success'}),\n 3000,\n );\n },\n [setNotification],\n );\n\n const handleAutofill = useCallback(() => {\n if (!pasteText.trim()) {\n showNotification('Please paste in aws credential first', 'error');\n return;\n }\n\n let parsed = null;\n\n // Try parsing as export format first\n if (pasteText.includes('export AWS_')) {\n parsed = parseAWSExport(pasteText);\n }\n // Try parsing as credential_process JSON format\n else if (pasteText.includes('AccessKeyId')) {\n parsed = parseCredentialProcess(pasteText);\n }\n\n if (parsed) {\n for (const key in parsed) {\n if (key in parsed) {\n form.setValue(\n key as keyof ParsedType,\n parsed[key as keyof ParsedType] || '',\n );\n }\n }\n\n showNotification('Credentials auto-filled successfully!');\n setPasteText('');\n onInputChange?.();\n } else {\n showNotification(\n 'Could not parse credentials. Please check the format.',\n 'error',\n );\n }\n }, [pasteText, form, showNotification, onInputChange]);\n\n const handleSubmit: SubmitHandler<FormData> = useCallback(\n async (data: FormData) => {\n onConnect(data);\n if (data.saveCredential) {\n try {\n await saveS3Credentials({\n accessKeyId: data.accessKeyId,\n secretAccessKey: data.secretAccessKey,\n sessionToken: data.sessionToken || undefined,\n region: data.region,\n bucket: data.bucket,\n name: data.name || `${data.bucket}-${data.region}`,\n });\n showNotification('Connection saved successfully!');\n } catch (err) {\n showNotification(`Error saving to S3: ${err}`, 'error');\n }\n }\n },\n [onConnect, saveS3Credentials, showNotification],\n );\n\n const deleteCredential = useCallback(\n async (id: string) => {\n if (deleteS3Credentials) {\n await deleteS3Credentials(id);\n const credentials = await loadS3Credentials();\n setSavedCredentials(credentials);\n }\n },\n [deleteS3Credentials, setSavedCredentials, loadS3Credentials],\n );\n\n // Add a handler for input changes\n const handleInputChange = useCallback(() => {\n onInputChange?.();\n }, [onInputChange]);\n\n return (\n <Tabs\n value={tab}\n onValueChange={setTab}\n orientation=\"vertical\"\n defaultValue=\"new\"\n className=\"flex w-full gap-6 px-4\"\n >\n <TabsList className=\"mb-4 flex h-auto flex-col items-stretch justify-start gap-4 border-r bg-transparent pr-6\">\n <TabsTrigger\n value=\"new\"\n className=\"data-[state=active]:border-primary data-[state=active]:text-primary rounded-md border px-4 py-2 data-[state=active]:shadow-none\"\n >\n <PlusIcon size={16} className=\"mr-2\" />\n New Credential\n </TabsTrigger>\n <TabsTrigger\n value=\"saved\"\n className=\"data-[state=active]:border-primary data-[state=active]:text-primary rounded-md border px-4 py-2 data-[state=active]:shadow-none\"\n >\n <Database size={16} className=\"mr-2\" />\n Saved Credential\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"new\" className=\"mt-0 w-full\">\n <Form<FormData> {...form}>\n <form onSubmit={form.handleSubmit(handleSubmit)} className=\"w-full\">\n <div className=\"grid h-full w-full grid-cols-[240px_1fr] gap-8\">\n <div className=\"flex flex-col gap-4\">\n <FormField<FormData, 'bucket'>\n control={form.control}\n name=\"bucket\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Bucket Name</FormLabel>\n <FormControl>\n <Input\n {...field}\n type=\"text\"\n placeholder=\"my-bucket-name\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'region'>\n control={form.control}\n name=\"region\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Region</FormLabel>\n <FormControl>\n <Select\n onValueChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n defaultValue={field.value}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select a Region\" />\n </SelectTrigger>\n <SelectContent>\n {S3_REGIONS.map((region) => (\n <SelectItem\n key={region.value}\n value={region.value}\n >\n {region.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'name'>\n control={form.control}\n name=\"name\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Connection Name (Optional)</FormLabel>\n <FormControl>\n <Input\n {...field}\n type=\"text\"\n placeholder=\"My S3 Connection\"\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'saveCredential'>\n control={form.control}\n name=\"saveCredential\"\n render={({field}) => (\n <FormItem className=\"flex items-center space-y-0 space-x-2\">\n <FormControl>\n <Checkbox\n onCheckedChange={field.onChange}\n checked={field.value}\n className=\"h-4 w-4\"\n />\n </FormControl>\n <FormLabel>Save credential</FormLabel>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info\n size={16}\n className=\"text-muted-foreground hover:cursor-pointer\"\n />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <pre className=\"w-[300px] text-xs text-wrap wrap-break-word\">\n Save this credential securely on your computer for\n future use. Credentials will be encrypted and stored\n locally\n </pre>\n </TooltipContent>\n </Tooltip>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {notification.show && (\n <div\n className={`mb-4 flex items-center gap-2 rounded-lg p-3 text-sm ${\n notification.type === 'error'\n ? 'text-destructive-foreground bg-destructive'\n : 'bg-green-50 text-green-700'\n }`}\n >\n {notification.type === 'error' ? (\n <AlertCircle size={16} />\n ) : (\n <Check size={16} />\n )}\n {notification.message}\n </div>\n )}\n </div>\n\n {/* From Section */}\n <div className=\"flex flex-col gap-4\">\n {/* Auto-fill Section */}\n <div className=\"space-y-2\">\n <label className=\"text-sm leading-none font-medium\">\n Auto-fill Credentials\n </label>\n <Textarea\n value={pasteText}\n onChange={(e) => setPasteText(e.target.value)}\n placeholder='Paste AWS cli command output here... Example export: export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/b... export AWS_SESSION_TOKEN=AQoEXAMPLEH4aoAH0gNCAPy... Example credential_process output: { \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\", \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCY...\", \"SessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPy...\" }'\n className=\"h-40\"\n />\n </div>\n <div className=\"flex gap-3\">\n <Button\n variant=\"secondary\"\n onClick={(e) => {\n e.preventDefault();\n handleAutofill();\n }}\n >\n <Upload size={16} />\n Auto-fill Credentials\n </Button>\n <Button variant=\"outline\" onClick={() => setPasteText('')}>\n Clear\n </Button>\n </div>\n <FormField<FormData, 'accessKeyId'>\n control={form.control}\n name=\"accessKeyId\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Access Key Id</FormLabel>\n <FormControl>\n <Input\n {...field}\n type=\"text\"\n className=\"w-full rounded-md border px-3 py-2\"\n placeholder=\"AKIAXXXXXXXXXXXXXXXX\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'secretAccessKey'>\n control={form.control}\n name=\"secretAccessKey\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Secret Access Key</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n {...field}\n type={\n showSecrets.secretAccessKey ? 'text' : 'password'\n }\n placeholder=\"••••••••••••••••••••••••\"\n className=\"pr-8\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n <div className=\"text-muted-foreground absolute top-0 right-3 flex h-9 gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n toggleVisibility('secretAccessKey')\n }\n className=\"ml-1\"\n >\n {showSecrets.secretAccessKey ? (\n <EyeOff size={16} />\n ) : (\n <Eye size={16} />\n )}\n </button>\n </div>\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <FormField<FormData, 'sessionToken'>\n control={form.control}\n name=\"sessionToken\"\n render={({field}) => (\n <FormItem>\n <FormLabel>\n Session Token (Optional - for temporary credentials)\n </FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n {...field}\n type={\n showSecrets.sessionToken ? 'text' : 'password'\n }\n placeholder=\"••••••••••••••••••••••••\"\n className=\"pr-8\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n <div className=\"text-muted-foreground absolute top-0 right-3 flex h-9 gap-1\">\n <button\n type=\"button\"\n onClick={() => toggleVisibility('sessionToken')}\n className=\"ml-1\"\n >\n {showSecrets.sessionToken ? (\n <EyeOff size={16} />\n ) : (\n <Eye size={16} />\n )}\n </button>\n </div>\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button\n type=\"submit\"\n disabled={\n form.formState.isSubmitting || !form.formState.isValid\n }\n className=\"w-full\"\n >\n {isLoading ? 'Connecting...' : 'Connect to S3'}\n </Button>\n </div>\n </div>\n </form>\n </Form>\n </TabsContent>\n <TabsContent value=\"saved\" className=\"mt-0 w-full\">\n <div className=\"space-y-4\">\n {savedCredentials.length === 0 ? (\n <div className=\"flex flex-col items-center justify-between py-12\">\n <Database className=\"text-muted-foreground mx-auto mb-4 h-8 w-8\" />\n <h3 className=\"mb-2 text-lg font-medium\">No saved credentials</h3>\n <p className=\"text-muted-foreground\">\n Create your first credential to get started\n </p>\n </div>\n ) : (\n <div className=\"grid gap-4\">\n {savedCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"rounded-lg border p-4 transition-shadow hover:cursor-pointer hover:shadow-sm\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <h3 className=\"mb-1 font-semibold\">{credential.name}</h3>\n <p className=\"text-muted-foreground mb-2 text-sm\">\n {credential.bucket}\n </p>\n <div className=\"text-muted-foreground flex items-center space-x-4 text-xs\">\n <span>Region: {credential.region}</span>\n <span>\n Created:{' '}\n {new Date(credential.createdAt).toLocaleDateString()}\n </span>\n </div>\n </div>\n <div className=\"flex space-x-2\">\n <button\n onClick={() => onConnect(credential)}\n className=\"text-primary rounded-md bg-blue-100 px-3 py-1 text-sm hover:bg-blue-200\"\n >\n Connect\n </button>\n {deleteCredential ? (\n <button\n onClick={() => deleteCredential(credential.id)}\n className=\"rounded-md bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </TabsContent>\n </Tabs>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"S3CredentialsForm.js","sourceRoot":"","sources":["../src/S3CredentialsForm.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAC,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAC,MAAM,cAAc,CAAC;AAGtE,OAAO,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,GAAG,EACH,MAAM,EACN,MAAM,EACN,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,GAAG;IACjB,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAC;IACxC,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAC;IACxC,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAC;IACxC,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAC;IACxC,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAC;IACxC,EAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAC;IAC9C,EAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAC;IAClD,EAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAC;CACnD,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;IAC1C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,QAAQ,EAAE;IAC1D,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC,CAAC;AAWH,MAAM,cAAc,GAAG,CAAC,IAAY,EAAc,EAAE;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,EAA4B,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACzE,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,eAAe;gBACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACtD,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAc,EAAE;IAC1D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,EAA4B,CAAC;YAE5C,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YACvC,CAAC;YACD,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxB,MAAM,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;YAC/C,CAAC;YACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrB,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;YACzC,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,6BAA6B;gBAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC7B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAqDF,MAAM,UAAU,iBAAiB,CAAC,EAChC,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACU;IACvB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC;QAC7C,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC;QAC/C,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtC,4CAA4C;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,UAAU,gBAAgB;YAC7B,qBAAqB;YACrB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAC3C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;gBACjD,6DAA6D;gBAC7D,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAW;QAC7B,QAAQ;QACR,aAAa,EAAE;YACb,WAAW,EAAE,EAAE;YACf,eAAe,EAAE,EAAE;YACnB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,KAAK;SACtB;KACF,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,KAAyC,EAAE,EAAE;QAC5C,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxB,GAAG,IAAI;YACP,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;SACtB,CAAC,CAAC,CAAC;IACN,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAAe,EAAE,IAAI,GAAG,SAAS,EAAE,EAAE;QACpC,eAAe,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;QAC7C,UAAU,CACR,GAAG,EAAE,CAAC,eAAe,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAC,CAAC,EAClE,IAAI,CACL,CAAC;IACJ,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,gBAAgB,CAAC,sCAAsC,EAAE,OAAO,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,MAAM,GAAG,IAAI,CAAC;QAElB,sCAAsC;QACtC,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,gDAAgD;aAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;oBAClB,IAAI,CAAC,QAAQ,CACX,GAAuB,EACvB,MAAM,CAAC,GAAuB,CAAC,IAAI,EAAE,CACtC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;YAC1D,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,aAAa,EAAE,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,gBAAgB,CACd,uDAAuD,EACvD,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC;IAEvD,MAAM,YAAY,GAA4B,WAAW,CACvD,KAAK,EAAE,IAAc,EAAE,EAAE;QACvB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,iBAAiB,CAAC;oBACtB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;oBAC5C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;iBACnD,CAAC,CAAC;gBACH,gBAAgB,CAAC,gCAAgC,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gBAAgB,CAAC,uBAAuB,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CACjD,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,EAAU,EAAE,EAAE;QACnB,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAC9C,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,EACD,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,CAC9D,CAAC;IAEF,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,aAAa,EAAE,EAAE,CAAC;IACpB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,MAAC,IAAI,IACH,KAAK,EAAE,GAAG,EACV,aAAa,EAAE,MAAM,EACrB,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAC,wBAAwB,aAElC,MAAC,QAAQ,IAAC,SAAS,EAAC,0FAA0F,aAC5G,MAAC,WAAW,IACV,KAAK,EAAC,KAAK,EACX,SAAS,EAAC,iIAAiI,aAE3I,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,MAAM,GAAG,sBAE3B,EACd,MAAC,WAAW,IACV,KAAK,EAAC,OAAO,EACb,SAAS,EAAC,iIAAiI,aAE3I,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,MAAM,GAAG,wBAE3B,IACL,EACX,KAAC,WAAW,IAAC,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,aAAa,YAC9C,KAAC,IAAI,OAAe,IAAI,YACtB,eAAM,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,SAAS,EAAC,QAAQ,YACjE,eAAK,SAAS,EAAC,gDAAgD,aAC7D,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,QAAQ,EACb,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,eACP,KAAC,SAAS,8BAAwB,EAClC,KAAC,WAAW,cACV,KAAC,KAAK,OACA,KAAK,EACT,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,gBAAgB,EAC5B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gEACd,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gEAClB,iBAAiB,EAAE,CAAC;4DACtB,CAAC,GACD,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,QAAQ,EACb,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,eACP,KAAC,SAAS,yBAAmB,EAC7B,KAAC,WAAW,cACV,MAAC,MAAM,IACL,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;gEACnB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gEAClB,iBAAiB,EAAE,CAAC;4DACtB,CAAC,EACD,YAAY,EAAE,KAAK,CAAC,KAAK,aAEzB,KAAC,aAAa,cACZ,KAAC,WAAW,IAAC,WAAW,EAAC,iBAAiB,GAAG,GAC/B,EAChB,KAAC,aAAa,cACX,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC1B,KAAC,UAAU,IAET,KAAK,EAAE,MAAM,CAAC,KAAK,YAElB,MAAM,CAAC,KAAK,IAHR,MAAM,CAAC,KAAK,CAIN,CACd,CAAC,GACY,IACT,GACG,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,eACP,KAAC,SAAS,6CAAuC,EACjD,KAAC,WAAW,cACV,KAAC,KAAK,OACA,KAAK,EACT,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,kBAAkB,GAC9B,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,gBAAgB,EACrB,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,IAAC,SAAS,EAAC,uCAAuC,aACzD,KAAC,WAAW,cACV,KAAC,QAAQ,IACP,eAAe,EAAE,KAAK,CAAC,QAAQ,EAC/B,OAAO,EAAE,KAAK,CAAC,KAAK,EACpB,SAAS,EAAC,SAAS,GACnB,GACU,EACd,KAAC,SAAS,kCAA4B,EACtC,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,IAAI,IACH,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,4CAA4C,GACtD,GACa,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,YAC3B,cAAK,SAAS,EAAC,6CAA6C,gIAItD,GACS,IACT,EACV,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EAED,YAAY,CAAC,IAAI,IAAI,CACpB,eACE,SAAS,EAAE,uDACT,YAAY,CAAC,IAAI,KAAK,OAAO;gDAC3B,CAAC,CAAC,4CAA4C;gDAC9C,CAAC,CAAC,4BACN,EAAE,aAED,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAC/B,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,GAAI,CAC1B,CAAC,CAAC,CAAC,CACF,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,CACpB,EACA,YAAY,CAAC,OAAO,IACjB,CACP,IACG,EAGN,eAAK,SAAS,EAAC,qBAAqB,aAElC,eAAK,SAAS,EAAC,WAAW,aACxB,gBAAO,SAAS,EAAC,kCAAkC,sCAE3C,EACR,KAAC,QAAQ,IACP,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,WAAW,EAAC,uZAA2b,EACvc,SAAS,EAAC,MAAM,GAChB,IACE,EACN,eAAK,SAAS,EAAC,YAAY,aACzB,MAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;wDACb,CAAC,CAAC,cAAc,EAAE,CAAC;wDACnB,cAAc,EAAE,CAAC;oDACnB,CAAC,aAED,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,6BAEb,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,sBAEhD,IACL,EACN,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,aAAa,EAClB,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,eACP,KAAC,SAAS,gCAA0B,EACpC,KAAC,WAAW,cACV,KAAC,KAAK,OACA,KAAK,EACT,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,oCAAoC,EAC9C,WAAW,EAAC,sBAAsB,EAClC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gEACd,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gEAClB,iBAAiB,EAAE,CAAC;4DACtB,CAAC,GACD,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,iBAAiB,EACtB,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,eACP,KAAC,SAAS,oCAA8B,EACxC,KAAC,WAAW,cACV,eAAK,SAAS,EAAC,UAAU,aACvB,KAAC,KAAK,OACA,KAAK,EACT,IAAI,EACF,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAEnD,WAAW,EAAC,kJAA0B,EACtC,SAAS,EAAC,MAAM,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wEACd,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wEAClB,iBAAiB,EAAE,CAAC;oEACtB,CAAC,GACD,EACF,cAAK,SAAS,EAAC,6DAA6D,YAC1E,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CACZ,gBAAgB,CAAC,iBAAiB,CAAC,EAErC,SAAS,EAAC,MAAM,YAEf,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAC7B,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,CACrB,CAAC,CAAC,CAAC,CACF,KAAC,GAAG,IAAC,IAAI,EAAE,EAAE,GAAI,CAClB,GACM,GACL,IACF,GACM,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EAEF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,cAAc,EACnB,MAAM,EAAE,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE,CAAC,CACnB,MAAC,QAAQ,eACP,KAAC,SAAS,uEAEE,EACZ,KAAC,WAAW,cACV,eAAK,SAAS,EAAC,UAAU,aACvB,KAAC,KAAK,OACA,KAAK,EACT,IAAI,EACF,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAEhD,WAAW,EAAC,kJAA0B,EACtC,SAAS,EAAC,MAAM,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wEACd,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wEAClB,iBAAiB,EAAE,CAAC;oEACtB,CAAC,GACD,EACF,cAAK,SAAS,EAAC,6DAA6D,YAC1E,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAC/C,SAAS,EAAC,MAAM,YAEf,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAC1B,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,CACrB,CAAC,CAAC,CAAC,CACF,KAAC,GAAG,IAAC,IAAI,EAAE,EAAE,GAAI,CAClB,GACM,GACL,IACF,GACM,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,QAAQ,EACN,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAExD,SAAS,EAAC,QAAQ,YAEjB,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,GACvC,IACL,IACF,GACD,GACF,GACK,EACd,KAAC,WAAW,IAAC,KAAK,EAAC,OAAO,EAAC,SAAS,EAAC,aAAa,YAChD,cAAK,SAAS,EAAC,WAAW,YACvB,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,eAAK,SAAS,EAAC,kDAAkD,aAC/D,KAAC,QAAQ,IAAC,SAAS,EAAC,4CAA4C,GAAG,EACnE,aAAI,SAAS,EAAC,0BAA0B,qCAA0B,EAClE,YAAG,SAAS,EAAC,uBAAuB,4DAEhC,IACA,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,YAAY,YACxB,gBAAgB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CACpC,cAEE,SAAS,EAAC,8EAA8E,YAExF,eAAK,SAAS,EAAC,kCAAkC,aAC/C,eAAK,SAAS,EAAC,QAAQ,aACrB,aAAI,SAAS,EAAC,oBAAoB,YAAE,UAAU,CAAC,IAAI,GAAM,EACzD,YAAG,SAAS,EAAC,oCAAoC,YAC9C,UAAU,CAAC,MAAM,GAChB,EACJ,eAAK,SAAS,EAAC,2DAA2D,aACxE,uCAAe,UAAU,CAAC,MAAM,IAAQ,EACxC,uCACW,GAAG,EACX,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,IAC/C,IACH,IACF,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,EACpC,SAAS,EAAC,yEAAyE,wBAG5E,EACR,gBAAgB,CAAC,CAAC,CAAC,CAClB,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,EAC9C,SAAS,EAAC,uEAAuE,YAEjF,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,GACvB,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,IAjCD,UAAU,CAAC,EAAE,CAkCd,CACP,CAAC,GACE,CACP,GACG,GACM,IACT,CACR,CAAC;AACJ,CAAC","sourcesContent":["import React, {useState, useCallback, useEffect} from 'react';\nimport {useForm, SubmitHandler} from 'react-hook-form';\nimport {zodResolver} from '@hookform/resolvers/zod';\nimport * as z from 'zod';\nimport {Tabs, TabsList, TabsTrigger, TabsContent} from '@sqlrooms/ui';\nimport {S3Config, S3Credentials} from '@sqlrooms/s3-browser-config';\n\nimport {\n Input,\n Textarea,\n Button,\n Checkbox,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '@sqlrooms/ui';\n\nimport {\n Eye,\n EyeOff,\n Upload,\n Check,\n AlertCircle,\n Info,\n PlusIcon,\n Database,\n Trash2,\n} from 'lucide-react';\n\nconst S3_REGIONS = [\n {value: 'us-east-1', label: 'us-east-1'},\n {value: 'us-east-2', label: 'us-east-2'},\n {value: 'us-west-1', label: 'us-west-1'},\n {value: 'us-west-2', label: 'us-west-2'},\n {value: 'eu-west-1', label: 'eu-west-1'},\n {value: 'eu-central-1', label: 'eu-central-1'},\n {value: 'ap-northeast-1', label: 'ap-northeast-1'},\n {value: 'ap-southeast-1', label: 'ap-southeast-1'},\n];\n\nconst formSchema = z.object({\n accessKeyId: z.string().min(1, 'Required'),\n secretAccessKey: z.string().min(1, 'Required'),\n sessionToken: z.string().optional(),\n region: z.string().min(1, 'Required'),\n bucket: z.string().min(1, 'Required'),\n name: z.string().max(100, 'Max 100 characters').optional(),\n saveCredential: z.boolean().default(false).optional(),\n});\n\ntype FormData = z.infer<typeof formSchema>;\n\ntype ParsedType = {\n accessKeyId?: string;\n secretAccessKey?: string;\n sessionToken?: string;\n region?: string;\n};\n\nconst parseAWSExport = (text: string): ParsedType => {\n const lines = text.split('\\n');\n const parsed = {} as Record<string, string>;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith('export AWS_ACCESS_KEY_ID=')) {\n parsed.accessKeyId = trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n } else if (trimmed.startsWith('export AWS_SECRET_ACCESS_KEY=')) {\n parsed.secretAccessKey =\n trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n } else if (trimmed.startsWith('export AWS_SESSION_TOKEN=')) {\n parsed.sessionToken = trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n } else if (trimmed.startsWith('export AWS_DEFAULT_REGION=')) {\n parsed.region = trimmed.split('=')[1]?.replace(/['\"]/g, '') || '';\n }\n }\n\n return parsed;\n};\n\nconst parseCredentialProcess = (text: string): ParsedType => {\n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const jsonStr = jsonMatch[0];\n const raw = JSON.parse(jsonStr);\n const parsed = {} as Record<string, string>;\n\n if (raw.AccessKeyId) {\n parsed.accessKeyId = raw.AccessKeyId;\n }\n if (raw.SecretAccessKey) {\n parsed.secretAccessKey = raw.SecretAccessKey;\n }\n if (raw.SessionToken) {\n parsed.sessionToken = raw.SessionToken;\n }\n if (raw.region) {\n // Check if region is present\n parsed.region = raw.region;\n }\n return parsed;\n }\n } catch (e) {\n console.error('Failed to parse JSON:', e);\n }\n return {};\n};\n\n/**\n * A form component for managing S3 credentials and connections.\n *\n * This component provides:\n * - Input fields for S3 credentials (access key, secret key, region, bucket)\n * - Option to save credentials for later use\n * - Ability to paste AWS credentials export format\n * - Management of saved credentials\n *\n * @example\n * ```tsx\n * const handleConnect = async (credentials) => {\n * // Handle the connection\n * console.log('Connecting with:', credentials);\n * };\n *\n * const handleSaveCredential = async (config) => {\n * // Save the credential to your storage\n * await saveToStorage(config);\n * };\n *\n * const handleLoadCredentials = async () => {\n * // Load saved credentials from your storage\n * return await loadFromStorage();\n * };\n *\n * const handleDeleteCredential = async (id) => {\n * // Delete a saved credential\n * await deleteFromStorage(id);\n * };\n *\n * return (\n * <S3CredentialsForm\n * onConnect={handleConnect}\n * isLoading={false}\n * saveS3Credentials={handleSaveCredential}\n * loadS3Credentials={handleLoadCredentials}\n * deleteS3Credentials={handleDeleteCredential}\n * />\n * );\n * ```\n */\nexport type S3CredentialsFormProps = {\n onConnect: (data: FormData) => void;\n isLoading?: boolean;\n saveS3Credentials: (data: S3Config) => Promise<void>;\n loadS3Credentials: () => Promise<S3Credentials[]>;\n deleteS3Credentials?: (id: string) => Promise<void>;\n onInputChange?: () => void;\n};\n\nexport function S3CredentialsForm({\n onConnect,\n isLoading,\n saveS3Credentials,\n loadS3Credentials,\n deleteS3Credentials,\n onInputChange,\n}: S3CredentialsFormProps) {\n const [showSecrets, setShowSecrets] = useState({\n secretAccessKey: false,\n sessionToken: false,\n });\n const [pasteText, setPasteText] = useState('');\n const [notification, setNotification] = useState({\n show: false,\n message: '',\n type: 'success',\n });\n const [savedCredentials, setSavedCredentials] = useState<S3Credentials[]>([]);\n const [tab, setTab] = useState('new');\n\n // Load saved connections on component mount\n useEffect(() => {\n let isMounted = true;\n async function fetchConnections() {\n // You can await here\n const response = await loadS3Credentials();\n if (response && response.length > 0 && isMounted) {\n // Assuming loadS3Credentials returns an array of connections\n setSavedCredentials(response);\n }\n }\n fetchConnections();\n return () => {\n isMounted = false;\n };\n }, [loadS3Credentials]);\n\n const resolver = zodResolver(formSchema);\n const form = useForm<FormData>({\n resolver,\n defaultValues: {\n accessKeyId: '',\n secretAccessKey: '',\n sessionToken: '',\n region: 'us-east-1',\n bucket: '',\n saveCredential: false,\n },\n });\n const toggleVisibility = useCallback(\n (field: 'secretAccessKey' | 'sessionToken') => {\n setShowSecrets((prev) => ({\n ...prev,\n [field]: !prev[field],\n }));\n },\n [setShowSecrets],\n );\n const showNotification = useCallback(\n (message: string, type = 'success') => {\n setNotification({show: true, message, type});\n setTimeout(\n () => setNotification({show: false, message: '', type: 'success'}),\n 3000,\n );\n },\n [setNotification],\n );\n\n const handleAutofill = useCallback(() => {\n if (!pasteText.trim()) {\n showNotification('Please paste in aws credential first', 'error');\n return;\n }\n\n let parsed = null;\n\n // Try parsing as export format first\n if (pasteText.includes('export AWS_')) {\n parsed = parseAWSExport(pasteText);\n }\n // Try parsing as credential_process JSON format\n else if (pasteText.includes('AccessKeyId')) {\n parsed = parseCredentialProcess(pasteText);\n }\n\n if (parsed) {\n for (const key in parsed) {\n if (key in parsed) {\n form.setValue(\n key as keyof ParsedType,\n parsed[key as keyof ParsedType] || '',\n );\n }\n }\n\n showNotification('Credentials auto-filled successfully!');\n setPasteText('');\n onInputChange?.();\n } else {\n showNotification(\n 'Could not parse credentials. Please check the format.',\n 'error',\n );\n }\n }, [pasteText, form, showNotification, onInputChange]);\n\n const handleSubmit: SubmitHandler<FormData> = useCallback(\n async (data: FormData) => {\n onConnect(data);\n if (data.saveCredential) {\n try {\n await saveS3Credentials({\n accessKeyId: data.accessKeyId,\n secretAccessKey: data.secretAccessKey,\n sessionToken: data.sessionToken || undefined,\n region: data.region,\n bucket: data.bucket,\n name: data.name || `${data.bucket}-${data.region}`,\n });\n showNotification('Connection saved successfully!');\n } catch (err) {\n showNotification(`Error saving to S3: ${err}`, 'error');\n }\n }\n },\n [onConnect, saveS3Credentials, showNotification],\n );\n\n const deleteCredential = useCallback(\n async (id: string) => {\n if (deleteS3Credentials) {\n await deleteS3Credentials(id);\n const credentials = await loadS3Credentials();\n setSavedCredentials(credentials);\n }\n },\n [deleteS3Credentials, setSavedCredentials, loadS3Credentials],\n );\n\n // Add a handler for input changes\n const handleInputChange = useCallback(() => {\n onInputChange?.();\n }, [onInputChange]);\n\n return (\n <Tabs\n value={tab}\n onValueChange={setTab}\n orientation=\"vertical\"\n defaultValue=\"new\"\n className=\"flex w-full gap-6 px-4\"\n >\n <TabsList className=\"mb-4 flex h-auto flex-col items-stretch justify-start gap-4 border-r bg-transparent pr-6\">\n <TabsTrigger\n value=\"new\"\n className=\"data-[state=active]:border-primary data-[state=active]:text-primary rounded-md border px-4 py-2 data-[state=active]:shadow-none\"\n >\n <PlusIcon size={16} className=\"mr-2\" />\n New Credential\n </TabsTrigger>\n <TabsTrigger\n value=\"saved\"\n className=\"data-[state=active]:border-primary data-[state=active]:text-primary rounded-md border px-4 py-2 data-[state=active]:shadow-none\"\n >\n <Database size={16} className=\"mr-2\" />\n Saved Credential\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"new\" className=\"mt-0 w-full\">\n <Form<FormData> {...form}>\n <form onSubmit={form.handleSubmit(handleSubmit)} className=\"w-full\">\n <div className=\"grid h-full w-full grid-cols-[240px_1fr] gap-8\">\n <div className=\"flex flex-col gap-4\">\n <FormField<FormData, 'bucket'>\n control={form.control}\n name=\"bucket\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Bucket Name</FormLabel>\n <FormControl>\n <Input\n {...field}\n type=\"text\"\n placeholder=\"my-bucket-name\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'region'>\n control={form.control}\n name=\"region\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Region</FormLabel>\n <FormControl>\n <Select\n onValueChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n defaultValue={field.value}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select a Region\" />\n </SelectTrigger>\n <SelectContent>\n {S3_REGIONS.map((region) => (\n <SelectItem\n key={region.value}\n value={region.value}\n >\n {region.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'name'>\n control={form.control}\n name=\"name\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Connection Name (Optional)</FormLabel>\n <FormControl>\n <Input\n {...field}\n type=\"text\"\n placeholder=\"My S3 Connection\"\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'saveCredential'>\n control={form.control}\n name=\"saveCredential\"\n render={({field}) => (\n <FormItem className=\"flex items-center space-y-0 space-x-2\">\n <FormControl>\n <Checkbox\n onCheckedChange={field.onChange}\n checked={field.value}\n className=\"h-4 w-4\"\n />\n </FormControl>\n <FormLabel>Save credential</FormLabel>\n <Tooltip>\n <TooltipTrigger asChild>\n <Info\n size={16}\n className=\"text-muted-foreground hover:cursor-pointer\"\n />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <pre className=\"w-[300px] text-xs text-wrap wrap-break-word\">\n Save this credential securely on your computer for\n future use. Credentials will be encrypted and stored\n locally\n </pre>\n </TooltipContent>\n </Tooltip>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {notification.show && (\n <div\n className={`mb-4 flex items-center gap-2 rounded-lg p-3 text-sm ${\n notification.type === 'error'\n ? 'text-destructive-foreground bg-destructive'\n : 'bg-green-50 text-green-700'\n }`}\n >\n {notification.type === 'error' ? (\n <AlertCircle size={16} />\n ) : (\n <Check size={16} />\n )}\n {notification.message}\n </div>\n )}\n </div>\n\n {/* From Section */}\n <div className=\"flex flex-col gap-4\">\n {/* Auto-fill Section */}\n <div className=\"space-y-2\">\n <label className=\"text-sm leading-none font-medium\">\n Auto-fill Credentials\n </label>\n <Textarea\n value={pasteText}\n onChange={(e) => setPasteText(e.target.value)}\n placeholder='Paste AWS cli command output here... Example export: export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/b... export AWS_SESSION_TOKEN=AQoEXAMPLEH4aoAH0gNCAPy... Example credential_process output: { \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\", \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCY...\", \"SessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPy...\" }'\n className=\"h-40\"\n />\n </div>\n <div className=\"flex gap-3\">\n <Button\n variant=\"secondary\"\n onClick={(e) => {\n e.preventDefault();\n handleAutofill();\n }}\n >\n <Upload size={16} />\n Auto-fill Credentials\n </Button>\n <Button variant=\"outline\" onClick={() => setPasteText('')}>\n Clear\n </Button>\n </div>\n <FormField<FormData, 'accessKeyId'>\n control={form.control}\n name=\"accessKeyId\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Access Key Id</FormLabel>\n <FormControl>\n <Input\n {...field}\n type=\"text\"\n className=\"w-full rounded-md border px-3 py-2\"\n placeholder=\"AKIAXXXXXXXXXXXXXXXX\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField<FormData, 'secretAccessKey'>\n control={form.control}\n name=\"secretAccessKey\"\n render={({field}) => (\n <FormItem>\n <FormLabel>Secret Access Key</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n {...field}\n type={\n showSecrets.secretAccessKey ? 'text' : 'password'\n }\n placeholder=\"••••••••••••••••••••••••\"\n className=\"pr-8\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n <div className=\"text-muted-foreground absolute top-0 right-3 flex h-9 gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n toggleVisibility('secretAccessKey')\n }\n className=\"ml-1\"\n >\n {showSecrets.secretAccessKey ? (\n <EyeOff size={16} />\n ) : (\n <Eye size={16} />\n )}\n </button>\n </div>\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <FormField<FormData, 'sessionToken'>\n control={form.control}\n name=\"sessionToken\"\n render={({field}) => (\n <FormItem>\n <FormLabel>\n Session Token (Optional - for temporary credentials)\n </FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n {...field}\n type={\n showSecrets.sessionToken ? 'text' : 'password'\n }\n placeholder=\"••••••••••••••••••••••••\"\n className=\"pr-8\"\n onChange={(e) => {\n field.onChange(e);\n handleInputChange();\n }}\n />\n <div className=\"text-muted-foreground absolute top-0 right-3 flex h-9 gap-1\">\n <button\n type=\"button\"\n onClick={() => toggleVisibility('sessionToken')}\n className=\"ml-1\"\n >\n {showSecrets.sessionToken ? (\n <EyeOff size={16} />\n ) : (\n <Eye size={16} />\n )}\n </button>\n </div>\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button\n type=\"submit\"\n disabled={\n form.formState.isSubmitting || !form.formState.isValid\n }\n className=\"w-full\"\n >\n {isLoading ? 'Connecting...' : 'Connect to S3'}\n </Button>\n </div>\n </div>\n </form>\n </Form>\n </TabsContent>\n <TabsContent value=\"saved\" className=\"mt-0 w-full\">\n <div className=\"space-y-4\">\n {savedCredentials.length === 0 ? (\n <div className=\"flex flex-col items-center justify-between py-12\">\n <Database className=\"text-muted-foreground mx-auto mb-4 h-8 w-8\" />\n <h3 className=\"mb-2 text-lg font-medium\">No saved credentials</h3>\n <p className=\"text-muted-foreground\">\n Create your first credential to get started\n </p>\n </div>\n ) : (\n <div className=\"grid gap-4\">\n {savedCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"rounded-lg border p-4 transition-shadow hover:cursor-pointer hover:shadow-sm\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <h3 className=\"mb-1 font-semibold\">{credential.name}</h3>\n <p className=\"text-muted-foreground mb-2 text-sm\">\n {credential.bucket}\n </p>\n <div className=\"text-muted-foreground flex items-center space-x-4 text-xs\">\n <span>Region: {credential.region}</span>\n <span>\n Created:{' '}\n {new Date(credential.createdAt).toLocaleDateString()}\n </span>\n </div>\n </div>\n <div className=\"flex space-x-2\">\n <button\n onClick={() => onConnect(credential)}\n className=\"text-primary rounded-md bg-blue-100 px-3 py-1 text-sm hover:bg-blue-200\"\n >\n Connect\n </button>\n {deleteCredential ? (\n <button\n onClick={() => deleteCredential(credential.id)}\n className=\"rounded-md bg-red-100 px-3 py-1 text-sm text-red-700 hover:bg-red-200\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </TabsContent>\n </Tabs>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/s3-browser",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.1-rc.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@hookform/resolvers": "^5.0.0",
|
|
23
|
-
"@sqlrooms/room-shell": "0.28.
|
|
24
|
-
"@sqlrooms/s3-browser-config": "0.28.
|
|
25
|
-
"@sqlrooms/ui": "0.28.
|
|
26
|
-
"@sqlrooms/utils": "0.28.
|
|
23
|
+
"@sqlrooms/room-shell": "0.28.1-rc.0",
|
|
24
|
+
"@sqlrooms/s3-browser-config": "0.28.1-rc.0",
|
|
25
|
+
"@sqlrooms/ui": "0.28.1-rc.0",
|
|
26
|
+
"@sqlrooms/utils": "0.28.1-rc.0",
|
|
27
27
|
"immer": "^11.0.1",
|
|
28
28
|
"lucide-react": "^0.556.0",
|
|
29
29
|
"react-hook-form": "^7.63.0",
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"typecheck": "tsc --noEmit",
|
|
42
42
|
"typedoc": "typedoc"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "1e0dcae95d1ccdbcd1b32df1d647d0f794b94e5e"
|
|
45
45
|
}
|