@onivoro/app-server-bucketvore 24.31.2 → 24.31.3

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.
Binary file
@@ -0,0 +1,2 @@
1
+ (()=>{"use strict";function e(){return{selectedBucket:"",currentPrefix:"",buckets:[],files:[],folders:[],viewMode:"list",bucketsHtml:'<div class="loading"><div class="spinner"></div><p>Loading buckets...</p></div>',filesHtml:"",breadcrumbsHtml:"",bucketFilter:"",fileFilter:"",showUpload:!1,showPreview:!1,uploadProgress:[],uploadProgressHtml:"",previewHtml:"",activeTab:"data",get filteredBucketsHtml(){if(!this.bucketFilter.trim())return this.bucketsHtml;const e=(new DOMParser).parseFromString(this.bucketsHtml,"text/html");return e.querySelectorAll(".bucket-item").forEach(e=>{(e.querySelector(".bucket-name")?.textContent?.toLowerCase()||"").includes(this.bucketFilter.toLowerCase())?e.style.display="":e.style.display="none"}),0===e.querySelectorAll('.bucket-item:not([style*="display: none"])').length?'<div class="empty-state"><div class="empty-state-icon">🔍</div><p>No buckets match your filter</p></div>':e.body.innerHTML},get filteredFilesHtml(){if(!this.fileFilter.trim()||!this.filesHtml)return this.filesHtml;const e=(new DOMParser).parseFromString(this.filesHtml,"text/html");return e.querySelectorAll(".file-item").forEach(e=>{(e.querySelector(".file-name")?.textContent?.toLowerCase()||"").includes(this.fileFilter.toLowerCase())?e.style.display="":e.style.display="none"}),0===e.querySelectorAll('.file-item:not([style*="display: none"])').length?'<div class="empty-state"><div class="empty-state-icon">🔍</div><p>No files match your filter</p></div>':e.body.innerHTML},async init(){await this.loadBuckets()},async loadBuckets(){try{const e=await fetch("/api/buckets");this.bucketsHtml=await e.text()}catch(e){this.bucketsHtml='<div class="error"><div class="error-icon">⚠️</div><p>Error loading buckets</p></div>'}},async selectBucket(e){this.selectedBucket=e,this.currentPrefix="",this.fileFilter="",await this.loadFiles()},async loadFiles(){try{const e=new URLSearchParams({bucket:this.selectedBucket,prefix:this.currentPrefix}),t=await fetch(`/api/files?${e}`),i=await t.json();this.filesHtml=i.filesHtml||"",this.breadcrumbsHtml=i.breadcrumbsHtml||""}catch(e){this.filesHtml='<div class="error"><div class="error-icon">⚠️</div><p>Error loading files</p></div>'}},async navigateToFolder(e){this.currentPrefix=e,this.fileFilter="",await this.loadFiles()},async previewFile(e){try{const t=new URLSearchParams({bucket:this.selectedBucket,key:e}),i=await fetch(`/api/files/preview?${t}`);this.previewHtml=await i.text(),this.showPreview=!0}catch(e){alert("Error loading preview")}},closePreview(){this.showPreview=!1,this.previewHtml=""},async downloadFile(e){try{const t=new URLSearchParams({bucket:this.selectedBucket,key:e}),i=await fetch(`/api/files/download?${t}`),s=await i.json();window.open(s.url,"_blank")}catch(e){alert("Error generating download link")}},async deleteFile(e){if(confirm(`Delete ${e}?`))try{await fetch("/api/files/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({bucket:this.selectedBucket,key:e})}),await this.loadFiles()}catch(e){alert("Error deleting file")}},async copyS3Path(e){const t=event?.target;await async function(e,t,i){try{const s=await fetch(`/api/buckets/${encodeURIComponent(e)}/region`),a=`https://s3.${(await s.json()).region||"us-east-1"}.amazonaws.com/${e}/${t}`;await async function(e,t){try{if(await navigator.clipboard.writeText(e),t){const e=t.textContent||"",i=t.style.backgroundColor;t.textContent="✓ Copied!",t.style.backgroundColor="var(--color-success)",setTimeout(()=>{t.textContent=e,t.style.backgroundColor=i},1500)}return!0}catch(t){return console.error("Clipboard API failed:",t),null!==prompt("Copy to clipboard:",e)}}(a,i)}catch(i){console.error("Error getting S3 URL:",i),prompt("Copy S3 path (fallback):",`s3://${e}/${t}`)}}(this.selectedBucket,e,t)},async deleteFolder(e){if(confirm(`Delete folder ${e} and all its contents?`))try{await fetch("/api/files/delete-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({bucket:this.selectedBucket,prefix:e})}),await this.loadFiles()}catch(e){alert("Error deleting folder")}},handleFileSelect(e){const t=e.target;if(t.files){const e=Array.from(t.files);this.uploadFiles(e)}},handleDrop(e){if(e.target.classList.remove("drag-over"),e.dataTransfer?.files){const t=Array.from(e.dataTransfer.files);this.uploadFiles(t)}},async uploadFiles(e){this.uploadProgress=e.map(e=>({name:e.name,status:"Uploading..."}));for(let t=0;t<e.length;t++){const i=e[t],s=new FormData;s.append("file",i),s.append("bucket",this.selectedBucket),s.append("prefix",this.currentPrefix);try{await fetch("/api/upload",{method:"POST",body:s}),this.uploadProgress[t].status="✓ Complete"}catch(e){this.uploadProgress[t].status="✗ Failed"}}setTimeout(async()=>{this.uploadProgress=[],this.showUpload=!1,await this.loadFiles()},2e3)},async refresh(){await this.loadFiles()},filterBuckets(){},filterFiles(){}}}"undefined"!=typeof window&&(window.Alpine?window.Alpine.data("s3Explorer",e):document.addEventListener("alpine:init",()=>{window.Alpine.data("s3Explorer",e)}))})();
2
+ //# sourceMappingURL=s3-explorer.bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-explorer.bundle.js","mappings":"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","sources":["webpack://onivoro/./apps/server/bucketvore/src/app/client/s3-explorer.client.ts","webpack://onivoro/./apps/server/bucketvore/src/app/client/utils/clipboard.client.ts"],"sourcesContent":["/**\n * S3 Explorer Alpine.js Component\n * Client-side TypeScript with full IDE support\n */\n\nimport { copyS3PathToClipboard } from './utils/clipboard.client';\nimport type { S3ClientState, UploadProgress } from '../shared/types.shared';\n\ndeclare global {\n interface Window {\n Alpine: any;\n }\n}\n\nexport function s3Explorer(): S3ClientState & Record<string, any> {\n return {\n // State\n selectedBucket: '',\n currentPrefix: '',\n buckets: [],\n files: [],\n folders: [],\n viewMode: 'list',\n bucketsHtml: '<div class=\"loading\"><div class=\"spinner\"></div><p>Loading buckets...</p></div>',\n filesHtml: '',\n breadcrumbsHtml: '',\n bucketFilter: '',\n fileFilter: '',\n showUpload: false,\n showPreview: false,\n uploadProgress: [] as UploadProgress[],\n uploadProgressHtml: '',\n previewHtml: '',\n activeTab: 'data',\n\n // Computed properties\n get filteredBucketsHtml(): string {\n if (!this.bucketFilter.trim()) {\n return this.bucketsHtml;\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.bucketsHtml, 'text/html');\n const bucketItems = doc.querySelectorAll('.bucket-item');\n\n bucketItems.forEach((item) => {\n const bucketName = item.querySelector('.bucket-name')?.textContent?.toLowerCase() || '';\n if (bucketName.includes(this.bucketFilter.toLowerCase())) {\n (item as HTMLElement).style.display = '';\n } else {\n (item as HTMLElement).style.display = 'none';\n }\n });\n\n const visibleCount = doc.querySelectorAll('.bucket-item:not([style*=\"display: none\"])').length;\n if (visibleCount === 0) {\n return '<div class=\"empty-state\"><div class=\"empty-state-icon\">🔍</div><p>No buckets match your filter</p></div>';\n }\n\n return doc.body.innerHTML;\n },\n\n get filteredFilesHtml(): string {\n if (!this.fileFilter.trim() || !this.filesHtml) {\n return this.filesHtml;\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.filesHtml, 'text/html');\n const fileItems = doc.querySelectorAll('.file-item');\n\n fileItems.forEach((item) => {\n const fileName = item.querySelector('.file-name')?.textContent?.toLowerCase() || '';\n if (fileName.includes(this.fileFilter.toLowerCase())) {\n (item as HTMLElement).style.display = '';\n } else {\n (item as HTMLElement).style.display = 'none';\n }\n });\n\n const visibleCount = doc.querySelectorAll('.file-item:not([style*=\"display: none\"])').length;\n if (visibleCount === 0) {\n return '<div class=\"empty-state\"><div class=\"empty-state-icon\">🔍</div><p>No files match your filter</p></div>';\n }\n\n return doc.body.innerHTML;\n },\n\n // Initialization\n async init(): Promise<void> {\n await this.loadBuckets();\n },\n\n // API Methods\n async loadBuckets(): Promise<void> {\n try {\n const response = await fetch('/api/buckets');\n this.bucketsHtml = await response.text();\n } catch (error) {\n this.bucketsHtml = '<div class=\"error\"><div class=\"error-icon\">⚠️</div><p>Error loading buckets</p></div>';\n }\n },\n\n async selectBucket(bucketName: string): Promise<void> {\n this.selectedBucket = bucketName;\n this.currentPrefix = '';\n this.fileFilter = '';\n await this.loadFiles();\n },\n\n async loadFiles(): Promise<void> {\n try {\n const params = new URLSearchParams({\n bucket: this.selectedBucket,\n prefix: this.currentPrefix\n });\n\n const response = await fetch(`/api/files?${params}`);\n const data = await response.json();\n\n this.filesHtml = data.filesHtml || '';\n this.breadcrumbsHtml = data.breadcrumbsHtml || '';\n } catch (error) {\n this.filesHtml = '<div class=\"error\"><div class=\"error-icon\">⚠️</div><p>Error loading files</p></div>';\n }\n },\n\n async navigateToFolder(prefix: string): Promise<void> {\n this.currentPrefix = prefix;\n this.fileFilter = '';\n await this.loadFiles();\n },\n\n async previewFile(key: string): Promise<void> {\n try {\n const params = new URLSearchParams({\n bucket: this.selectedBucket,\n key: key\n });\n\n const response = await fetch(`/api/files/preview?${params}`);\n this.previewHtml = await response.text();\n this.showPreview = true;\n } catch (error) {\n alert('Error loading preview');\n }\n },\n\n closePreview(): void {\n this.showPreview = false;\n this.previewHtml = '';\n },\n\n async downloadFile(key: string): Promise<void> {\n try {\n const params = new URLSearchParams({\n bucket: this.selectedBucket,\n key: key\n });\n\n const response = await fetch(`/api/files/download?${params}`);\n const data = await response.json();\n window.open(data.url, '_blank');\n } catch (error) {\n alert('Error generating download link');\n }\n },\n\n async deleteFile(key: string): Promise<void> {\n if (!confirm(`Delete ${key}?`)) return;\n\n try {\n await fetch(`/api/files/delete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ bucket: this.selectedBucket, key })\n });\n await this.loadFiles();\n } catch (error) {\n alert('Error deleting file');\n }\n },\n\n async copyS3Path(key: string): Promise<void> {\n const element = (event as any)?.target as HTMLElement | undefined;\n await copyS3PathToClipboard(this.selectedBucket, key, element);\n },\n\n async deleteFolder(prefix: string): Promise<void> {\n if (!confirm(`Delete folder ${prefix} and all its contents?`)) return;\n\n try {\n await fetch(`/api/files/delete-folder`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ bucket: this.selectedBucket, prefix })\n });\n await this.loadFiles();\n } catch (error) {\n alert('Error deleting folder');\n }\n },\n\n // Upload functionality\n handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const files = Array.from(input.files);\n this.uploadFiles(files);\n }\n },\n\n handleDrop(event: DragEvent): void {\n (event.target as HTMLElement).classList.remove('drag-over');\n if (event.dataTransfer?.files) {\n const files = Array.from(event.dataTransfer.files);\n this.uploadFiles(files);\n }\n },\n\n async uploadFiles(files: File[]): Promise<void> {\n this.uploadProgress = files.map(f => ({ name: f.name, status: 'Uploading...' }));\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const formData = new FormData();\n formData.append('file', file);\n formData.append('bucket', this.selectedBucket);\n formData.append('prefix', this.currentPrefix);\n\n try {\n await fetch('/api/upload', {\n method: 'POST',\n body: formData\n });\n this.uploadProgress[i].status = '✓ Complete';\n } catch (error) {\n this.uploadProgress[i].status = '✗ Failed';\n }\n }\n\n setTimeout(async () => {\n this.uploadProgress = [];\n this.showUpload = false;\n await this.loadFiles();\n }, 2000);\n },\n\n async refresh(): Promise<void> {\n await this.loadFiles();\n },\n\n filterBuckets(): void {\n // Reactive computed property handles this\n },\n\n filterFiles(): void {\n // Reactive computed property handles this\n }\n };\n}\n\n// Auto-register with Alpine when it initializes\nif (typeof window !== 'undefined') {\n // Register immediately if Alpine is already available\n if ((window as any).Alpine) {\n (window as any).Alpine.data('s3Explorer', s3Explorer);\n } else {\n // Otherwise wait for Alpine to initialize\n document.addEventListener('alpine:init', () => {\n (window as any).Alpine.data('s3Explorer', s3Explorer);\n });\n }\n}\n","/**\n * Client-side utility for clipboard operations\n */\n\nexport async function copyToClipboard(text: string, element?: HTMLElement): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n\n // Provide visual feedback if element is provided\n if (element) {\n const originalText = element.textContent || '';\n const originalBg = element.style.backgroundColor;\n\n element.textContent = '✓ Copied!';\n element.style.backgroundColor = 'var(--color-success)';\n\n setTimeout(() => {\n element.textContent = originalText;\n element.style.backgroundColor = originalBg;\n }, 1500);\n }\n\n return true;\n } catch (error) {\n console.error('Clipboard API failed:', error);\n\n // Fallback to prompt\n const userCopy = prompt('Copy to clipboard:', text);\n return userCopy !== null;\n }\n}\n\nexport async function copyS3PathToClipboard(\n bucket: string,\n key: string,\n element?: HTMLElement\n): Promise<void> {\n try {\n // Fetch bucket region\n const response = await fetch(`/api/buckets/${encodeURIComponent(bucket)}/region`);\n const data = await response.json();\n const region = data.region || 'us-east-1';\n\n // Construct HTTPS URL\n const url = `https://s3.${region}.amazonaws.com/${bucket}/${key}`;\n\n await copyToClipboard(url, element);\n } catch (error) {\n console.error('Error getting S3 URL:', error);\n\n // Fallback to s3:// protocol\n const s3Path = `s3://${bucket}/${key}`;\n prompt('Copy S3 path (fallback):', s3Path);\n }\n}\n"],"names":["s3Explorer","selectedBucket","currentPrefix","buckets","files","folders","viewMode","bucketsHtml","filesHtml","breadcrumbsHtml","bucketFilter","fileFilter","showUpload","showPreview","uploadProgress","uploadProgressHtml","previewHtml","activeTab","filteredBucketsHtml","this","trim","doc","DOMParser","parseFromString","querySelectorAll","forEach","item","querySelector","textContent","toLowerCase","includes","style","display","length","body","innerHTML","filteredFilesHtml","init","loadBuckets","response","fetch","text","error","selectBucket","bucketName","loadFiles","params","URLSearchParams","bucket","prefix","data","json","navigateToFolder","previewFile","key","alert","closePreview","downloadFile","window","open","url","deleteFile","confirm","method","headers","JSON","stringify","copyS3Path","element","event","target","async","encodeURIComponent","region","navigator","clipboard","writeText","originalText","originalBg","backgroundColor","setTimeout","console","prompt","copyToClipboard","copyS3PathToClipboard","deleteFolder","handleFileSelect","input","Array","from","uploadFiles","handleDrop","classList","remove","dataTransfer","map","f","name","status","i","file","formData","FormData","append","refresh","filterBuckets","filterFiles","Alpine","document","addEventListener"],"sourceRoot":""}
package/main.js CHANGED
@@ -10,10 +10,15 @@
10
10
  Object.defineProperty(exports, "__esModule", ({ value: true }));
11
11
  exports.bootstrap = bootstrap;
12
12
  const core_1 = __webpack_require__(2);
13
- const app_server_bucketvore_module_1 = __webpack_require__(3);
14
- const app_server_bucketvore_config_class_1 = __webpack_require__(43);
13
+ const path_1 = __webpack_require__(3);
14
+ const app_server_bucketvore_module_1 = __webpack_require__(4);
15
+ const app_server_bucketvore_config_class_1 = __webpack_require__(44);
15
16
  async function bootstrap() {
16
17
  const app = await core_1.NestFactory.create(app_server_bucketvore_module_1.AppServerBucketvoreModule, { logger: console });
18
+ // Serve static assets (including client bundles)
19
+ app.useStaticAssets((0, path_1.join)(__dirname, 'assets'), {
20
+ prefix: '/assets/',
21
+ });
17
22
  const port = Number(new app_server_bucketvore_config_class_1.AppServerBucketvoreConfig().HTTP_PORT);
18
23
  await app.listen(port);
19
24
  console.log(`BucketVore available at: http://localhost:${port}`);
@@ -28,23 +33,29 @@ module.exports = require("@nestjs/core");
28
33
 
29
34
  /***/ }),
30
35
  /* 3 */
36
+ /***/ ((module) => {
37
+
38
+ module.exports = require("path");
39
+
40
+ /***/ }),
41
+ /* 4 */
31
42
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
32
43
 
33
44
 
34
45
  Object.defineProperty(exports, "__esModule", ({ value: true }));
35
46
  exports.AppServerBucketvoreModule = void 0;
36
- const tslib_1 = __webpack_require__(4);
37
- const common_1 = __webpack_require__(5);
38
- const app_controller_1 = __webpack_require__(6);
39
- const buckets_controller_1 = __webpack_require__(45);
40
- const files_controller_1 = __webpack_require__(52);
41
- const upload_controller_1 = __webpack_require__(53);
42
- const app_server_bucketvore_config_class_1 = __webpack_require__(43);
43
- const client_s3_1 = __webpack_require__(47);
44
- const credential_providers_1 = __webpack_require__(49);
45
- const s3_service_1 = __webpack_require__(46);
46
- const html_generator_service_1 = __webpack_require__(50);
47
- const file_preview_service_1 = __webpack_require__(51);
47
+ const tslib_1 = __webpack_require__(5);
48
+ const common_1 = __webpack_require__(6);
49
+ const app_controller_1 = __webpack_require__(7);
50
+ const buckets_controller_1 = __webpack_require__(46);
51
+ const files_controller_1 = __webpack_require__(53);
52
+ const upload_controller_1 = __webpack_require__(54);
53
+ const app_server_bucketvore_config_class_1 = __webpack_require__(44);
54
+ const client_s3_1 = __webpack_require__(48);
55
+ const credential_providers_1 = __webpack_require__(50);
56
+ const s3_service_1 = __webpack_require__(47);
57
+ const html_generator_service_1 = __webpack_require__(51);
58
+ const file_preview_service_1 = __webpack_require__(52);
48
59
  const bucketvoreConfig = new app_server_bucketvore_config_class_1.AppServerBucketvoreConfig();
49
60
  let AppServerBucketvoreModule = class AppServerBucketvoreModule {
50
61
  };
@@ -81,30 +92,30 @@ exports.AppServerBucketvoreModule = AppServerBucketvoreModule = tslib_1.__decora
81
92
 
82
93
 
83
94
  /***/ }),
84
- /* 4 */
95
+ /* 5 */
85
96
  /***/ ((module) => {
86
97
 
87
98
  module.exports = require("tslib");
88
99
 
89
100
  /***/ }),
90
- /* 5 */
101
+ /* 6 */
91
102
  /***/ ((module) => {
92
103
 
93
104
  module.exports = require("@nestjs/common");
94
105
 
95
106
  /***/ }),
96
- /* 6 */
107
+ /* 7 */
97
108
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
98
109
 
99
110
 
100
111
  var _a;
101
112
  Object.defineProperty(exports, "__esModule", ({ value: true }));
102
113
  exports.AppController = void 0;
103
- const tslib_1 = __webpack_require__(4);
104
- const common_1 = __webpack_require__(5);
105
- const server_html_1 = __webpack_require__(7);
106
- const app_server_bucketvore_config_class_1 = __webpack_require__(43);
107
- const design_system_1 = __webpack_require__(44);
114
+ const tslib_1 = __webpack_require__(5);
115
+ const common_1 = __webpack_require__(6);
116
+ const server_html_1 = __webpack_require__(8);
117
+ const app_server_bucketvore_config_class_1 = __webpack_require__(44);
118
+ const design_system_1 = __webpack_require__(45);
108
119
  let AppController = class AppController {
109
120
  constructor(config) {
110
121
  this.config = config;
@@ -118,8 +129,12 @@ let AppController = class AppController {
118
129
  (0, server_html_1.$meta)({ charset: 'UTF-8' }),
119
130
  (0, server_html_1.$meta)({ name: 'viewport', content: 'width=device-width, initial-scale=1.0' }),
120
131
  (0, server_html_1.$title)({ textContent: 'BucketVore - S3 File Explorer' }),
121
- (0, server_html_1.$script)({ src: 'https://unpkg.com/alpinejs@3.13.5/dist/cdn.js', defer: true }),
122
- (0, server_html_1.$style)({ textContent: design_system_1.DESIGN_SYSTEM_STYLES })
132
+ (0, server_html_1.$link)({ rel: 'icon', type: 'image/x-icon', href: '/assets/images/bear.ico' }),
133
+ (0, server_html_1.$style)({ textContent: design_system_1.DESIGN_SYSTEM_STYLES }),
134
+ // Load our Alpine component first
135
+ (0, server_html_1.$script)({ src: '/assets/scripts/s3-explorer.bundle.js' }),
136
+ // Then load Alpine.js (will auto-start after DOM ready)
137
+ (0, server_html_1.$script)({ src: 'https://unpkg.com/alpinejs@3.13.5/dist/cdn.min.js', defer: true })
123
138
  ]
124
139
  }),
125
140
  (0, server_html_1.$body)({
@@ -312,270 +327,8 @@ let AppController = class AppController {
312
327
  })
313
328
  ]
314
329
  }),
315
- (0, server_html_1.$script)({
316
- textContent: `
317
- function s3Explorer() {
318
- return {
319
- selectedBucket: '',
320
- currentPrefix: '',
321
- viewMode: 'list',
322
- showUpload: false,
323
- showPreview: false,
324
- uploadProgress: [],
325
-
326
- bucketFilter: '',
327
- fileFilter: '',
328
- allBuckets: [],
329
- allFilesData: { filesHtml: '', breadcrumbsHtml: '' },
330
-
331
- bucketsHtml: '<div class="loading"><div class="spinner"></div><p>Loading buckets...</p></div>',
332
- breadcrumbsHtml: '',
333
- filesHtml: '<div class="empty-state"><div class="empty-state-icon">🪣</div><p>Select a bucket to browse files</p></div>',
334
- previewHtml: '',
335
-
336
- get filteredBucketsHtml() {
337
- if (!this.bucketFilter.trim()) {
338
- return this.bucketsHtml;
339
- }
340
-
341
- const filter = this.bucketFilter.toLowerCase();
342
- const parser = new DOMParser();
343
- const doc = parser.parseFromString(this.bucketsHtml, 'text/html');
344
- const bucketItems = doc.querySelectorAll('.bucket-item');
345
-
346
- let filtered = '';
347
- bucketItems.forEach(item => {
348
- const bucketName = item.querySelector('.bucket-name')?.textContent?.toLowerCase() || '';
349
- if (bucketName.includes(filter)) {
350
- filtered += item.outerHTML;
351
- }
352
- });
353
-
354
- if (!filtered) {
355
- return '<div class="empty-state"><div class="empty-state-icon">🔍</div><p>No buckets match your filter</p></div>';
356
- }
357
-
358
- return filtered;
359
- },
360
-
361
- get filteredFilesHtml() {
362
- if (!this.fileFilter.trim()) {
363
- return this.filesHtml;
364
- }
365
-
366
- const filter = this.fileFilter.toLowerCase();
367
- const parser = new DOMParser();
368
- const doc = parser.parseFromString(this.filesHtml, 'text/html');
369
- const fileItems = doc.querySelectorAll('.file-item');
370
-
371
- let filtered = '';
372
- fileItems.forEach(item => {
373
- const fileName = item.querySelector('.file-name')?.textContent?.toLowerCase() || '';
374
- if (fileName.includes(filter)) {
375
- filtered += item.outerHTML;
376
- }
377
- });
378
-
379
- if (!filtered) {
380
- return '<div class="empty-state"><div class="empty-state-icon">🔍</div><p>No files match your filter</p></div>';
381
- }
382
-
383
- return filtered;
384
- },
385
-
386
- get uploadProgressHtml() {
387
- return this.uploadProgress.map(f =>
388
- \`<div style="margin-bottom: var(--space-2)">
389
- <div style="display: flex; justify-content: space-between; font-size: var(--size-sm); margin-bottom: var(--space-1)">
390
- <span>\${f.name}</span>
391
- <span>\${f.status}</span>
392
- </div>
393
- </div>\`
394
- ).join('');
395
- },
396
-
397
- async init() {
398
- await this.loadBuckets();
399
- },
400
-
401
- async loadBuckets() {
402
- try {
403
- const response = await fetch('/api/buckets');
404
- this.bucketsHtml = await response.text();
405
- } catch (error) {
406
- this.bucketsHtml = '<div class="error"><div class="error-icon">⚠️</div><p>Error loading buckets</p></div>';
407
- }
408
- },
409
-
410
- async selectBucket(bucket) {
411
- this.selectedBucket = bucket;
412
- this.currentPrefix = '';
413
- await this.loadFiles();
414
- },
415
-
416
- async loadFiles() {
417
- try {
418
- this.filesHtml = '<div class="loading"><div class="spinner"></div><p>Loading files...</p></div>';
419
- this.fileFilter = ''; // Reset filter when navigating
420
- const url = \`/api/files?bucket=\${this.selectedBucket}&prefix=\${encodeURIComponent(this.currentPrefix)}\`;
421
- const response = await fetch(url);
422
-
423
- const data = await response.json();
424
- this.filesHtml = data.filesHtml;
425
- this.breadcrumbsHtml = data.breadcrumbsHtml;
426
- } catch (error) {
427
- this.filesHtml = '<div class="error"><div class="error-icon">⚠️</div><p>Error loading files</p></div>';
428
- }
429
- },
430
-
431
- async navigateToFolder(prefix) {
432
- this.currentPrefix = prefix;
433
- await this.loadFiles();
434
- },
435
-
436
- async previewFile(key) {
437
- try {
438
- this.showPreview = true;
439
- this.previewHtml = '<div class="loading"><div class="spinner"></div><p>Loading preview...</p></div>';
440
-
441
- const response = await fetch(\`/api/files/preview?bucket=\${this.selectedBucket}&key=\${encodeURIComponent(key)}\`);
442
- this.previewHtml = await response.text();
443
- } catch (error) {
444
- this.previewHtml = '<div class="error"><div class="error-icon">⚠️</div><p>Error loading preview</p></div>';
445
- }
446
- },
447
-
448
- closePreview() {
449
- this.showPreview = false;
450
- this.previewHtml = '';
451
- },
452
-
453
- async downloadFile(key) {
454
- try {
455
- const response = await fetch(\`/api/files/download?bucket=\${this.selectedBucket}&key=\${encodeURIComponent(key)}\`);
456
- const data = await response.json();
457
- window.open(data.url, '_blank');
458
- } catch (error) {
459
- alert('Error generating download link');
460
- }
461
- },
462
-
463
- async deleteFile(key) {
464
- if (!confirm(\`Delete \${key}?\`)) return;
465
-
466
- try {
467
- await fetch(\`/api/files/delete\`, {
468
- method: 'POST',
469
- headers: { 'Content-Type': 'application/json' },
470
- body: JSON.stringify({ bucket: this.selectedBucket, key })
471
- });
472
- await this.loadFiles();
473
- } catch (error) {
474
- alert('Error deleting file');
475
- }
476
- },
477
-
478
- async copyS3Path(key, target) {
479
- try {
480
- // First fetch the bucket region
481
- const regionResponse = await fetch(\`/api/buckets/\${this.selectedBucket}/region\`);
482
- const regionData = await regionResponse.json();
483
- console.warn({regionData});
484
- const region = regionData.region || 'us-east-1';
485
-
486
- // Construct proper HTTPS S3 URL
487
- const httpsUrl = \`https://s3.\${region}.amazonaws.com/\${this.selectedBucket}/\${key}\`;
488
-
489
- await navigator.clipboard.writeText(httpsUrl);
490
-
491
- // Show temporary success feedback
492
- const event = {target};
493
- const originalText = event.target.textContent;
494
- const originalBg = event.target.style.backgroundColor;
495
- event.target.textContent = '✓ Copied!';
496
- event.target.style.backgroundColor = 'var(--color-success)';
497
-
498
- setTimeout(() => {
499
- event.target.textContent = originalText;
500
- event.target.style.backgroundColor = originalBg;
501
- }, 1500);
502
- } catch (error) {
503
- console.error('Error copying S3 path:', error);
504
- // Fallback to s3:// protocol
505
- const s3Path = \`s3://\${this.selectedBucket}/\${key}\`;
506
- prompt('Copy S3 path (fallback):', s3Path);
507
- }
508
- },
509
-
510
- async deleteFolder(prefix) {
511
- if (!confirm(\`Delete folder \${prefix} and all its contents?\`)) return;
512
-
513
- try {
514
- await fetch(\`/api/files/delete-folder\`, {
515
- method: 'POST',
516
- headers: { 'Content-Type': 'application/json' },
517
- body: JSON.stringify({ bucket: this.selectedBucket, prefix })
518
- });
519
- await this.loadFiles();
520
- } catch (error) {
521
- alert('Error deleting folder');
522
- }
523
- },
524
-
525
- handleFileSelect(event) {
526
- const files = Array.from(event.target.files);
527
- this.uploadFiles(files);
528
- },
529
-
530
- handleDrop(event) {
531
- event.target.classList.remove('drag-over');
532
- const files = Array.from(event.dataTransfer.files);
533
- this.uploadFiles(files);
534
- },
535
-
536
- async uploadFiles(files) {
537
- this.uploadProgress = files.map(f => ({ name: f.name, status: 'Uploading...' }));
538
-
539
- for (let i = 0; i < files.length; i++) {
540
- const file = files[i];
541
- const formData = new FormData();
542
- formData.append('file', file);
543
- formData.append('bucket', this.selectedBucket);
544
- formData.append('prefix', this.currentPrefix);
545
-
546
- try {
547
- await fetch('/api/upload', {
548
- method: 'POST',
549
- body: formData
550
- });
551
- this.uploadProgress[i].status = '✓ Complete';
552
- } catch (error) {
553
- this.uploadProgress[i].status = '✗ Failed';
554
- }
555
- }
556
-
557
- setTimeout(async () => {
558
- this.uploadProgress = [];
559
- this.showUpload = false;
560
- await this.loadFiles();
561
- }, 2000);
562
- },
563
-
564
- async refresh() {
565
- await this.loadFiles();
566
- },
567
-
568
- filterBuckets() {
569
- // Reactive computed property handles this automatically
570
- },
571
-
572
- filterFiles() {
573
- // Reactive computed property handles this automatically
574
- }
575
- };
576
- }
577
- `
578
- })
330
+ // Load client bundle at end of body
331
+ (0, server_html_1.$script)({ src: '/assets/scripts/s3-explorer.bundle.js' })
579
332
  ]
580
333
  })
581
334
  ]
@@ -596,37 +349,37 @@ exports.AppController = AppController = tslib_1.__decorate([
596
349
 
597
350
 
598
351
  /***/ }),
599
- /* 7 */
352
+ /* 8 */
600
353
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
601
354
 
602
355
 
603
356
  Object.defineProperty(exports, "__esModule", ({ value: true }));
604
- const tslib_1 = __webpack_require__(4);
605
- tslib_1.__exportStar(__webpack_require__(8), exports);
357
+ const tslib_1 = __webpack_require__(5);
606
358
  tslib_1.__exportStar(__webpack_require__(9), exports);
607
359
  tslib_1.__exportStar(__webpack_require__(10), exports);
608
- tslib_1.__exportStar(__webpack_require__(17), exports);
609
- tslib_1.__exportStar(__webpack_require__(22), exports);
610
- tslib_1.__exportStar(__webpack_require__(12), exports);
611
- tslib_1.__exportStar(__webpack_require__(13), exports);
612
360
  tslib_1.__exportStar(__webpack_require__(11), exports);
613
- tslib_1.__exportStar(__webpack_require__(19), exports);
614
361
  tslib_1.__exportStar(__webpack_require__(18), exports);
362
+ tslib_1.__exportStar(__webpack_require__(23), exports);
363
+ tslib_1.__exportStar(__webpack_require__(13), exports);
615
364
  tslib_1.__exportStar(__webpack_require__(14), exports);
616
- tslib_1.__exportStar(__webpack_require__(16), exports);
365
+ tslib_1.__exportStar(__webpack_require__(12), exports);
617
366
  tslib_1.__exportStar(__webpack_require__(20), exports);
367
+ tslib_1.__exportStar(__webpack_require__(19), exports);
368
+ tslib_1.__exportStar(__webpack_require__(15), exports);
369
+ tslib_1.__exportStar(__webpack_require__(17), exports);
618
370
  tslib_1.__exportStar(__webpack_require__(21), exports);
619
- tslib_1.__exportStar(__webpack_require__(23), exports);
371
+ tslib_1.__exportStar(__webpack_require__(22), exports);
620
372
  tslib_1.__exportStar(__webpack_require__(24), exports);
621
- tslib_1.__exportStar(__webpack_require__(26), exports);
373
+ tslib_1.__exportStar(__webpack_require__(25), exports);
622
374
  tslib_1.__exportStar(__webpack_require__(27), exports);
623
375
  tslib_1.__exportStar(__webpack_require__(28), exports);
624
376
  tslib_1.__exportStar(__webpack_require__(29), exports);
625
377
  tslib_1.__exportStar(__webpack_require__(30), exports);
378
+ tslib_1.__exportStar(__webpack_require__(31), exports);
626
379
 
627
380
 
628
381
  /***/ }),
629
- /* 8 */
382
+ /* 9 */
630
383
  /***/ ((__unused_webpack_module, exports) => {
631
384
 
632
385
 
@@ -639,7 +392,7 @@ function a(text, href, cssClass) {
639
392
 
640
393
 
641
394
  /***/ }),
642
- /* 9 */
395
+ /* 10 */
643
396
  /***/ ((__unused_webpack_module, exports) => {
644
397
 
645
398
 
@@ -647,13 +400,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
647
400
 
648
401
 
649
402
  /***/ }),
650
- /* 10 */
403
+ /* 11 */
651
404
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
652
405
 
653
406
 
654
407
  Object.defineProperty(exports, "__esModule", ({ value: true }));
655
408
  exports.html = html;
656
- const tags_1 = __webpack_require__(11);
409
+ const tags_1 = __webpack_require__(12);
657
410
  function html(title, subtitle, markup, logoUrl) {
658
411
  return (0, tags_1._htm)([
659
412
  (0, tags_1._head)([
@@ -695,14 +448,14 @@ function html(title, subtitle, markup, logoUrl) {
695
448
 
696
449
 
697
450
  /***/ }),
698
- /* 11 */
451
+ /* 12 */
699
452
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
700
453
 
701
454
 
702
455
  Object.defineProperty(exports, "__esModule", ({ value: true }));
703
456
  exports._style = exports._tr = exports._thead = exports._th = exports._td = exports._tbody = exports._tab = exports._pre = exports._p = exports._main = exports._img = exports._htm = exports._header = exports._head = exports._h6 = exports._h5 = exports._h4 = exports._h3 = exports._h2 = exports._h1 = exports._div = exports._body = void 0;
704
- const self_closing_tag_function_1 = __webpack_require__(12);
705
- const tag_function_1 = __webpack_require__(13);
457
+ const self_closing_tag_function_1 = __webpack_require__(13);
458
+ const tag_function_1 = __webpack_require__(14);
706
459
  exports._body = tag_function_1.tag.bind(null, 'body');
707
460
  exports._div = tag_function_1.tag.bind(null, 'div');
708
461
  exports._h1 = tag_function_1.tag.bind(null, 'h1');
@@ -728,27 +481,27 @@ exports._style = tag_function_1.tag.bind(null, 'style');
728
481
 
729
482
 
730
483
  /***/ }),
731
- /* 12 */
484
+ /* 13 */
732
485
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
733
486
 
734
487
 
735
488
  Object.defineProperty(exports, "__esModule", ({ value: true }));
736
489
  exports.selfClosingTag = selfClosingTag;
737
- const tag_function_1 = __webpack_require__(13);
490
+ const tag_function_1 = __webpack_require__(14);
738
491
  function selfClosingTag(tag, cssClass, attributes, styles) {
739
492
  return (0, tag_function_1.tag)(tag, [], cssClass, attributes, styles).replace(`></${tag}>`, '/>');
740
493
  }
741
494
 
742
495
 
743
496
  /***/ }),
744
- /* 13 */
497
+ /* 14 */
745
498
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
746
499
 
747
500
 
748
501
  Object.defineProperty(exports, "__esModule", ({ value: true }));
749
502
  exports.tag = tag;
750
- const format_attributes_function_1 = __webpack_require__(14);
751
- const inline_style_function_1 = __webpack_require__(16);
503
+ const format_attributes_function_1 = __webpack_require__(15);
504
+ const inline_style_function_1 = __webpack_require__(17);
752
505
  function tag(tag, content, cssClass, attributes, styles) {
753
506
  const classExp = cssClass ? ` class="${cssClass}"` : '';
754
507
  const attributesExp = attributes ? ` ${(0, format_attributes_function_1.formatAttributes)(attributes)}` : '';
@@ -758,13 +511,13 @@ function tag(tag, content, cssClass, attributes, styles) {
758
511
 
759
512
 
760
513
  /***/ }),
761
- /* 14 */
514
+ /* 15 */
762
515
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
763
516
 
764
517
 
765
518
  Object.defineProperty(exports, "__esModule", ({ value: true }));
766
519
  exports.formatAttributes = formatAttributes;
767
- const escape_html_attr_function_1 = __webpack_require__(15);
520
+ const escape_html_attr_function_1 = __webpack_require__(16);
768
521
  function formatAttributes(attributes) {
769
522
  if (!attributes) {
770
523
  return '';
@@ -776,7 +529,7 @@ function formatAttributes(attributes) {
776
529
 
777
530
 
778
531
  /***/ }),
779
- /* 15 */
532
+ /* 16 */
780
533
  /***/ ((__unused_webpack_module, exports) => {
781
534
 
782
535
 
@@ -793,7 +546,7 @@ function escapeHtmlAttr(str) {
793
546
 
794
547
 
795
548
  /***/ }),
796
- /* 16 */
549
+ /* 17 */
797
550
  /***/ ((__unused_webpack_module, exports) => {
798
551
 
799
552
 
@@ -813,14 +566,14 @@ function inlineStyle(styles) {
813
566
 
814
567
 
815
568
  /***/ }),
816
- /* 17 */
569
+ /* 18 */
817
570
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
818
571
 
819
572
 
820
573
  Object.defineProperty(exports, "__esModule", ({ value: true }));
821
574
  exports.loginButton = loginButton;
822
- const elements_1 = __webpack_require__(18);
823
- const button_styles_constant_1 = __webpack_require__(21);
575
+ const elements_1 = __webpack_require__(19);
576
+ const button_styles_constant_1 = __webpack_require__(22);
824
577
  function loginButton(text, href, extraStyles) {
825
578
  return (0, elements_1.anchor)([text], {
826
579
  href,
@@ -833,15 +586,15 @@ function loginButton(text, href, extraStyles) {
833
586
 
834
587
 
835
588
  /***/ }),
836
- /* 18 */
589
+ /* 19 */
837
590
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
838
591
 
839
592
 
840
593
  Object.defineProperty(exports, "__esModule", ({ value: true }));
841
594
  exports.style = exports.tr = exports.thead = exports.th = exports.td = exports.tbody = exports.tab = exports.pre = exports.p = exports.main = exports.img = exports.htm = exports.header = exports.head = exports.h6 = exports.h5 = exports.h4 = exports.h3 = exports.h2 = exports.h1 = exports.div = exports.button = exports.body = exports.anchor = void 0;
842
- const element_function_1 = __webpack_require__(19);
843
- const self_closing_element_function_1 = __webpack_require__(20);
844
- const button_styles_constant_1 = __webpack_require__(21);
595
+ const element_function_1 = __webpack_require__(20);
596
+ const self_closing_element_function_1 = __webpack_require__(21);
597
+ const button_styles_constant_1 = __webpack_require__(22);
845
598
  const anchor = (content, attributes) => (0, element_function_1.element)('a', content, { ...attributes, style: { ...button_styles_constant_1.buttonStyles, ...attributes?.style } });
846
599
  exports.anchor = anchor;
847
600
  exports.body = element_function_1.element.bind(null, 'body');
@@ -873,14 +626,14 @@ exports.style = element_function_1.element.bind(null, 'style');
873
626
 
874
627
 
875
628
  /***/ }),
876
- /* 19 */
629
+ /* 20 */
877
630
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
878
631
 
879
632
 
880
633
  Object.defineProperty(exports, "__esModule", ({ value: true }));
881
634
  exports.element = element;
882
- const format_attributes_function_1 = __webpack_require__(14);
883
- const inline_style_function_1 = __webpack_require__(16);
635
+ const format_attributes_function_1 = __webpack_require__(15);
636
+ const inline_style_function_1 = __webpack_require__(17);
884
637
  function element(tag, content, attributes) {
885
638
  const { cssClass = '', style = undefined, ...attrs } = attributes || {};
886
639
  const classExp = cssClass ? ` class="${cssClass}"` : '';
@@ -891,20 +644,20 @@ function element(tag, content, attributes) {
891
644
 
892
645
 
893
646
  /***/ }),
894
- /* 20 */
647
+ /* 21 */
895
648
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
896
649
 
897
650
 
898
651
  Object.defineProperty(exports, "__esModule", ({ value: true }));
899
652
  exports.selfClosingElement = selfClosingElement;
900
- const element_function_1 = __webpack_require__(19);
653
+ const element_function_1 = __webpack_require__(20);
901
654
  function selfClosingElement(tag, attributes) {
902
655
  return (0, element_function_1.element)(tag, [], attributes).replace(`></${tag}>`, '/>');
903
656
  }
904
657
 
905
658
 
906
659
  /***/ }),
907
- /* 21 */
660
+ /* 22 */
908
661
  /***/ ((__unused_webpack_module, exports) => {
909
662
 
910
663
 
@@ -924,7 +677,7 @@ exports.buttonStyles = {
924
677
 
925
678
 
926
679
  /***/ }),
927
- /* 22 */
680
+ /* 23 */
928
681
  /***/ ((__unused_webpack_module, exports) => {
929
682
 
930
683
 
@@ -932,7 +685,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
932
685
 
933
686
 
934
687
  /***/ }),
935
- /* 23 */
688
+ /* 24 */
936
689
  /***/ ((__unused_webpack_module, exports) => {
937
690
 
938
691
 
@@ -948,18 +701,18 @@ exports.fontStyles = {
948
701
 
949
702
 
950
703
  /***/ }),
951
- /* 24 */
704
+ /* 25 */
952
705
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
953
706
 
954
707
 
955
708
  Object.defineProperty(exports, "__esModule", ({ value: true }));
956
709
  exports.CSSProperties = void 0;
957
- const css_properties_type_1 = __webpack_require__(25);
710
+ const css_properties_type_1 = __webpack_require__(26);
958
711
  Object.defineProperty(exports, "CSSProperties", ({ enumerable: true, get: function () { return css_properties_type_1.CSSProperties; } }));
959
712
 
960
713
 
961
714
  /***/ }),
962
- /* 25 */
715
+ /* 26 */
963
716
  /***/ ((__unused_webpack_module, exports) => {
964
717
 
965
718
 
@@ -967,7 +720,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
967
720
 
968
721
 
969
722
  /***/ }),
970
- /* 26 */
723
+ /* 27 */
971
724
  /***/ ((__unused_webpack_module, exports) => {
972
725
 
973
726
 
@@ -975,7 +728,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
975
728
 
976
729
 
977
730
  /***/ }),
978
- /* 27 */
731
+ /* 28 */
979
732
  /***/ ((__unused_webpack_module, exports) => {
980
733
 
981
734
 
@@ -983,14 +736,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
983
736
 
984
737
 
985
738
  /***/ }),
986
- /* 28 */
739
+ /* 29 */
987
740
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
988
741
 
989
742
 
990
743
  Object.defineProperty(exports, "__esModule", ({ value: true }));
991
744
  exports.emailBody = emailBody;
992
- const elements_1 = __webpack_require__(18);
993
- const font_styles_constant_1 = __webpack_require__(23);
745
+ const elements_1 = __webpack_require__(19);
746
+ const font_styles_constant_1 = __webpack_require__(24);
994
747
  function emailBody(title, subtitle, markup, logoUrl, extraStyles = {}) {
995
748
  return (0, elements_1.div)([
996
749
  (0, elements_1.div)([
@@ -1013,13 +766,13 @@ function emailBody(title, subtitle, markup, logoUrl, extraStyles = {}) {
1013
766
 
1014
767
 
1015
768
  /***/ }),
1016
- /* 29 */
769
+ /* 30 */
1017
770
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1018
771
 
1019
772
 
1020
773
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1021
774
  exports.table = table;
1022
- const elements_1 = __webpack_require__(18);
775
+ const elements_1 = __webpack_require__(19);
1023
776
  const padding = '0.5rem';
1024
777
  const color = 'inherit';
1025
778
  function table(columns, rows) {
@@ -1031,7 +784,7 @@ function table(columns, rows) {
1031
784
 
1032
785
 
1033
786
  /***/ }),
1034
- /* 30 */
787
+ /* 31 */
1035
788
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1036
789
 
1037
790
 
@@ -1039,33 +792,33 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
1039
792
  exports.$footer = exports.$figure = exports.$figcaption = exports.$fieldset = exports.$embed = exports.$em = exports.$dt = exports.$dl = exports.$div = exports.$dialog = exports.$dfn = exports.$details = exports.$del = exports.$dd = exports.$datalist = exports.$data = exports.$colgroup = exports.$col = exports.$code = exports.$cite = exports.$caption = exports.$canvas = exports.$button = exports.$br = exports.$body = exports.$blockquote = exports.$bdo = exports.$bdi = exports.$base = exports.$b = exports.$audio = exports.$aside = exports.$article = exports.$area = exports.$address = exports.$abbr = exports.$a = exports.styled = exports.styleOnPointerEnter = exports.styleOnFocus = exports.styleOn = exports.setElementStyles = exports.setElementStyle = exports.setAttrs = exports.extractStyle = exports.asElementFactory = exports.asId = exports.styleManager = exports.TElementProps = exports.CSSProperties = void 0;
1040
793
  exports.$slot = exports.$select = exports.$section = exports.$script = exports.$samp = exports.$s = exports.$ruby = exports.$rt = exports.$rp = exports.$q = exports.$progress = exports.$pre = exports.$picture = exports.$p = exports.$output = exports.$option = exports.$optgroup = exports.$ol = exports.$object = exports.$noscript = exports.$nav = exports.$meter = exports.$meta = exports.$menu = exports.$math = exports.$mark = exports.$map = exports.$main = exports.$link = exports.$li = exports.$legend = exports.$label = exports.$kbd = exports.$ins = exports.$input = exports.$img = exports.$iframe = exports.$i = exports.$html = exports.$hr = exports.$hgroup = exports.$header = exports.$head = exports.$h6 = exports.$h5 = exports.$h4 = exports.$h3 = exports.$h2 = exports.$h1 = exports.$form = void 0;
1041
794
  exports.$wbr = exports.$video = exports.$var = exports.$ul = exports.$u = exports.$track = exports.$tr = exports.$title = exports.$time = exports.$thead = exports.$th = exports.$tfoot = exports.$textarea = exports.$template = exports.$td = exports.$tbody = exports.$table = exports.$sup = exports.$summary = exports.$sub = exports.$style = exports.$strong = exports.$span = exports.$source = exports.$small = void 0;
1042
- const element_function_1 = __webpack_require__(19);
1043
- const self_closing_element_function_1 = __webpack_require__(20);
1044
- const css_properties_type_1 = __webpack_require__(25);
795
+ const element_function_1 = __webpack_require__(20);
796
+ const self_closing_element_function_1 = __webpack_require__(21);
797
+ const css_properties_type_1 = __webpack_require__(26);
1045
798
  Object.defineProperty(exports, "CSSProperties", ({ enumerable: true, get: function () { return css_properties_type_1.CSSProperties; } }));
1046
- const element_props_type_1 = __webpack_require__(31);
799
+ const element_props_type_1 = __webpack_require__(32);
1047
800
  Object.defineProperty(exports, "TElementProps", ({ enumerable: true, get: function () { return element_props_type_1.TElementProps; } }));
1048
- const style_manager_constant_1 = __webpack_require__(32);
801
+ const style_manager_constant_1 = __webpack_require__(33);
1049
802
  Object.defineProperty(exports, "styleManager", ({ enumerable: true, get: function () { return style_manager_constant_1.styleManager; } }));
1050
- const as_id_function_1 = __webpack_require__(33);
803
+ const as_id_function_1 = __webpack_require__(34);
1051
804
  Object.defineProperty(exports, "asId", ({ enumerable: true, get: function () { return as_id_function_1.asId; } }));
1052
- const as_element_factory_function_1 = __webpack_require__(34);
805
+ const as_element_factory_function_1 = __webpack_require__(35);
1053
806
  Object.defineProperty(exports, "asElementFactory", ({ enumerable: true, get: function () { return as_element_factory_function_1.asElementFactory; } }));
1054
- const extract_style_function_1 = __webpack_require__(35);
807
+ const extract_style_function_1 = __webpack_require__(36);
1055
808
  Object.defineProperty(exports, "extractStyle", ({ enumerable: true, get: function () { return extract_style_function_1.extractStyle; } }));
1056
- const set_element_attributes_function_1 = __webpack_require__(36);
809
+ const set_element_attributes_function_1 = __webpack_require__(37);
1057
810
  Object.defineProperty(exports, "setAttrs", ({ enumerable: true, get: function () { return set_element_attributes_function_1.setAttrs; } }));
1058
- const set_element_style_function_1 = __webpack_require__(37);
811
+ const set_element_style_function_1 = __webpack_require__(38);
1059
812
  Object.defineProperty(exports, "setElementStyle", ({ enumerable: true, get: function () { return set_element_style_function_1.setElementStyle; } }));
1060
- const set_element_styles_function_1 = __webpack_require__(38);
813
+ const set_element_styles_function_1 = __webpack_require__(39);
1061
814
  Object.defineProperty(exports, "setElementStyles", ({ enumerable: true, get: function () { return set_element_styles_function_1.setElementStyles; } }));
1062
- const style_on_function_1 = __webpack_require__(39);
815
+ const style_on_function_1 = __webpack_require__(40);
1063
816
  Object.defineProperty(exports, "styleOn", ({ enumerable: true, get: function () { return style_on_function_1.styleOn; } }));
1064
- const style_on_focus_function_1 = __webpack_require__(40);
817
+ const style_on_focus_function_1 = __webpack_require__(41);
1065
818
  Object.defineProperty(exports, "styleOnFocus", ({ enumerable: true, get: function () { return style_on_focus_function_1.styleOnFocus; } }));
1066
- const style_on_pointer_enter_function_1 = __webpack_require__(41);
819
+ const style_on_pointer_enter_function_1 = __webpack_require__(42);
1067
820
  Object.defineProperty(exports, "styleOnPointerEnter", ({ enumerable: true, get: function () { return style_on_pointer_enter_function_1.styleOnPointerEnter; } }));
1068
- const styled_function_1 = __webpack_require__(42);
821
+ const styled_function_1 = __webpack_require__(43);
1069
822
  Object.defineProperty(exports, "styled", ({ enumerable: true, get: function () { return styled_function_1.styled; } }));
1070
823
  // Element factories
1071
824
  exports.$a = (0, as_element_factory_function_1.asElementFactory)(element_function_1.element.bind(null, 'a'));
@@ -1183,7 +936,7 @@ exports.$wbr = (0, as_element_factory_function_1.asElementFactory)((_, attrs) =>
1183
936
 
1184
937
 
1185
938
  /***/ }),
1186
- /* 31 */
939
+ /* 32 */
1187
940
  /***/ ((__unused_webpack_module, exports) => {
1188
941
 
1189
942
 
@@ -1191,7 +944,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
1191
944
 
1192
945
 
1193
946
  /***/ }),
1194
- /* 32 */
947
+ /* 33 */
1195
948
  /***/ ((__unused_webpack_module, exports) => {
1196
949
 
1197
950
 
@@ -1224,7 +977,7 @@ exports.styleManager = StyleManager;
1224
977
 
1225
978
 
1226
979
  /***/ }),
1227
- /* 33 */
980
+ /* 34 */
1228
981
  /***/ ((__unused_webpack_module, exports) => {
1229
982
 
1230
983
 
@@ -1238,7 +991,7 @@ function asId(prefix = 'id') {
1238
991
 
1239
992
 
1240
993
  /***/ }),
1241
- /* 34 */
994
+ /* 35 */
1242
995
  /***/ ((__unused_webpack_module, exports) => {
1243
996
 
1244
997
 
@@ -1267,7 +1020,7 @@ function asElementFactory(renderer) {
1267
1020
 
1268
1021
 
1269
1022
  /***/ }),
1270
- /* 35 */
1023
+ /* 36 */
1271
1024
  /***/ ((__unused_webpack_module, exports) => {
1272
1025
 
1273
1026
 
@@ -1279,7 +1032,7 @@ function extractStyle(element, style) {
1279
1032
 
1280
1033
 
1281
1034
  /***/ }),
1282
- /* 36 */
1035
+ /* 37 */
1283
1036
  /***/ ((__unused_webpack_module, exports) => {
1284
1037
 
1285
1038
 
@@ -1290,7 +1043,7 @@ function setAttrs(target, attrs) {
1290
1043
 
1291
1044
 
1292
1045
  /***/ }),
1293
- /* 37 */
1046
+ /* 38 */
1294
1047
  /***/ ((__unused_webpack_module, exports) => {
1295
1048
 
1296
1049
 
@@ -1301,7 +1054,7 @@ function setElementStyle(target, key, value) {
1301
1054
 
1302
1055
 
1303
1056
  /***/ }),
1304
- /* 38 */
1057
+ /* 39 */
1305
1058
  /***/ ((__unused_webpack_module, exports) => {
1306
1059
 
1307
1060
 
@@ -1312,7 +1065,7 @@ function setElementStyles(target, styles) {
1312
1065
 
1313
1066
 
1314
1067
  /***/ }),
1315
- /* 39 */
1068
+ /* 40 */
1316
1069
  /***/ ((__unused_webpack_module, exports) => {
1317
1070
 
1318
1071
 
@@ -1324,39 +1077,39 @@ function styleOn(element, event, style, elementToStyle, onlyIf) {
1324
1077
 
1325
1078
 
1326
1079
  /***/ }),
1327
- /* 40 */
1080
+ /* 41 */
1328
1081
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1329
1082
 
1330
1083
 
1331
1084
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1332
1085
  exports.styleOnFocus = styleOnFocus;
1333
- const style_on_function_1 = __webpack_require__(39);
1086
+ const style_on_function_1 = __webpack_require__(40);
1334
1087
  function styleOnFocus(element, style, elementToStyle, onlyIf) {
1335
1088
  (0, style_on_function_1.styleOn)(element, 'focus', style, elementToStyle, onlyIf);
1336
1089
  }
1337
1090
 
1338
1091
 
1339
1092
  /***/ }),
1340
- /* 41 */
1093
+ /* 42 */
1341
1094
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1342
1095
 
1343
1096
 
1344
1097
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1345
1098
  exports.styleOnPointerEnter = styleOnPointerEnter;
1346
- const style_on_function_1 = __webpack_require__(39);
1099
+ const style_on_function_1 = __webpack_require__(40);
1347
1100
  function styleOnPointerEnter(element, style, elementToStyle, onlyIf) {
1348
1101
  (0, style_on_function_1.styleOn)(element, 'mouseenter', style, elementToStyle, onlyIf);
1349
1102
  }
1350
1103
 
1351
1104
 
1352
1105
  /***/ }),
1353
- /* 42 */
1106
+ /* 43 */
1354
1107
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1355
1108
 
1356
1109
 
1357
1110
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1358
1111
  exports.styled = styled;
1359
- const style_manager_constant_1 = __webpack_require__(32);
1112
+ const style_manager_constant_1 = __webpack_require__(33);
1360
1113
  function styled(creator) {
1361
1114
  return (css, ...values) => (props = {}) => {
1362
1115
  const raw = css.reduce((acc, part, i) => acc + part + (values[i] || ''), '').trim();
@@ -1371,7 +1124,7 @@ function styled(creator) {
1371
1124
 
1372
1125
 
1373
1126
  /***/ }),
1374
- /* 43 */
1127
+ /* 44 */
1375
1128
  /***/ ((__unused_webpack_module, exports) => {
1376
1129
 
1377
1130
 
@@ -1387,7 +1140,7 @@ exports.AppServerBucketvoreConfig = AppServerBucketvoreConfig;
1387
1140
 
1388
1141
 
1389
1142
  /***/ }),
1390
- /* 44 */
1143
+ /* 45 */
1391
1144
  /***/ ((__unused_webpack_module, exports) => {
1392
1145
 
1393
1146
 
@@ -2008,17 +1761,17 @@ exports.DESIGN_SYSTEM_STYLES = `
2008
1761
 
2009
1762
 
2010
1763
  /***/ }),
2011
- /* 45 */
1764
+ /* 46 */
2012
1765
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2013
1766
 
2014
1767
 
2015
1768
  var _a, _b;
2016
1769
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2017
1770
  exports.BucketsController = void 0;
2018
- const tslib_1 = __webpack_require__(4);
2019
- const common_1 = __webpack_require__(5);
2020
- const s3_service_1 = __webpack_require__(46);
2021
- const html_generator_service_1 = __webpack_require__(50);
1771
+ const tslib_1 = __webpack_require__(5);
1772
+ const common_1 = __webpack_require__(6);
1773
+ const s3_service_1 = __webpack_require__(47);
1774
+ const html_generator_service_1 = __webpack_require__(51);
2022
1775
  let BucketsController = class BucketsController {
2023
1776
  constructor(s3Service, htmlGenerator) {
2024
1777
  this.s3Service = s3Service;
@@ -2069,19 +1822,19 @@ exports.BucketsController = BucketsController = tslib_1.__decorate([
2069
1822
 
2070
1823
 
2071
1824
  /***/ }),
2072
- /* 46 */
1825
+ /* 47 */
2073
1826
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2074
1827
 
2075
1828
 
2076
1829
  var _a, _b;
2077
1830
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2078
1831
  exports.S3Service = void 0;
2079
- const tslib_1 = __webpack_require__(4);
2080
- const common_1 = __webpack_require__(5);
2081
- const client_s3_1 = __webpack_require__(47);
2082
- const s3_request_presigner_1 = __webpack_require__(48);
2083
- const app_server_bucketvore_config_class_1 = __webpack_require__(43);
2084
- const credential_providers_1 = __webpack_require__(49);
1832
+ const tslib_1 = __webpack_require__(5);
1833
+ const common_1 = __webpack_require__(6);
1834
+ const client_s3_1 = __webpack_require__(48);
1835
+ const s3_request_presigner_1 = __webpack_require__(49);
1836
+ const app_server_bucketvore_config_class_1 = __webpack_require__(44);
1837
+ const credential_providers_1 = __webpack_require__(50);
2085
1838
  let S3Service = class S3Service {
2086
1839
  constructor(s3Client, config) {
2087
1840
  this.s3Client = s3Client;
@@ -2281,35 +2034,35 @@ exports.S3Service = S3Service = tslib_1.__decorate([
2281
2034
 
2282
2035
 
2283
2036
  /***/ }),
2284
- /* 47 */
2037
+ /* 48 */
2285
2038
  /***/ ((module) => {
2286
2039
 
2287
2040
  module.exports = require("@aws-sdk/client-s3");
2288
2041
 
2289
2042
  /***/ }),
2290
- /* 48 */
2043
+ /* 49 */
2291
2044
  /***/ ((module) => {
2292
2045
 
2293
2046
  module.exports = require("@aws-sdk/s3-request-presigner");
2294
2047
 
2295
2048
  /***/ }),
2296
- /* 49 */
2049
+ /* 50 */
2297
2050
  /***/ ((module) => {
2298
2051
 
2299
2052
  module.exports = require("@aws-sdk/credential-providers");
2300
2053
 
2301
2054
  /***/ }),
2302
- /* 50 */
2055
+ /* 51 */
2303
2056
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2304
2057
 
2305
2058
 
2306
2059
  var _a;
2307
2060
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2308
2061
  exports.HtmlGeneratorService = void 0;
2309
- const tslib_1 = __webpack_require__(4);
2310
- const common_1 = __webpack_require__(5);
2311
- const server_html_1 = __webpack_require__(7);
2312
- const file_preview_service_1 = __webpack_require__(51);
2062
+ const tslib_1 = __webpack_require__(5);
2063
+ const common_1 = __webpack_require__(6);
2064
+ const server_html_1 = __webpack_require__(8);
2065
+ const file_preview_service_1 = __webpack_require__(52);
2313
2066
  let HtmlGeneratorService = class HtmlGeneratorService {
2314
2067
  constructor(filePreviewService) {
2315
2068
  this.filePreviewService = filePreviewService;
@@ -2629,14 +2382,14 @@ exports.HtmlGeneratorService = HtmlGeneratorService = tslib_1.__decorate([
2629
2382
 
2630
2383
 
2631
2384
  /***/ }),
2632
- /* 51 */
2385
+ /* 52 */
2633
2386
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2634
2387
 
2635
2388
 
2636
2389
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2637
2390
  exports.FilePreviewService = void 0;
2638
- const tslib_1 = __webpack_require__(4);
2639
- const common_1 = __webpack_require__(5);
2391
+ const tslib_1 = __webpack_require__(5);
2392
+ const common_1 = __webpack_require__(6);
2640
2393
  let FilePreviewService = class FilePreviewService {
2641
2394
  constructor() {
2642
2395
  this.imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];
@@ -2729,18 +2482,18 @@ exports.FilePreviewService = FilePreviewService = tslib_1.__decorate([
2729
2482
 
2730
2483
 
2731
2484
  /***/ }),
2732
- /* 52 */
2485
+ /* 53 */
2733
2486
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2734
2487
 
2735
2488
 
2736
2489
  var _a, _b, _c;
2737
2490
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2738
2491
  exports.FilesController = void 0;
2739
- const tslib_1 = __webpack_require__(4);
2740
- const common_1 = __webpack_require__(5);
2741
- const s3_service_1 = __webpack_require__(46);
2742
- const html_generator_service_1 = __webpack_require__(50);
2743
- const file_preview_service_1 = __webpack_require__(51);
2492
+ const tslib_1 = __webpack_require__(5);
2493
+ const common_1 = __webpack_require__(6);
2494
+ const s3_service_1 = __webpack_require__(47);
2495
+ const html_generator_service_1 = __webpack_require__(51);
2496
+ const file_preview_service_1 = __webpack_require__(52);
2744
2497
  let FilesController = class FilesController {
2745
2498
  constructor(s3Service, htmlGenerator, filePreviewService) {
2746
2499
  this.s3Service = s3Service;
@@ -2867,17 +2620,17 @@ exports.FilesController = FilesController = tslib_1.__decorate([
2867
2620
 
2868
2621
 
2869
2622
  /***/ }),
2870
- /* 53 */
2623
+ /* 54 */
2871
2624
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2872
2625
 
2873
2626
 
2874
2627
  var _a;
2875
2628
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2876
2629
  exports.UploadController = void 0;
2877
- const tslib_1 = __webpack_require__(4);
2878
- const common_1 = __webpack_require__(5);
2879
- const platform_express_1 = __webpack_require__(54);
2880
- const s3_service_1 = __webpack_require__(46);
2630
+ const tslib_1 = __webpack_require__(5);
2631
+ const common_1 = __webpack_require__(6);
2632
+ const platform_express_1 = __webpack_require__(55);
2633
+ const s3_service_1 = __webpack_require__(47);
2881
2634
  let UploadController = class UploadController {
2882
2635
  constructor(s3Service) {
2883
2636
  this.s3Service = s3Service;
@@ -2916,7 +2669,7 @@ exports.UploadController = UploadController = tslib_1.__decorate([
2916
2669
 
2917
2670
 
2918
2671
  /***/ }),
2919
- /* 54 */
2672
+ /* 55 */
2920
2673
  /***/ ((module) => {
2921
2674
 
2922
2675
  module.exports = require("@nestjs/platform-express");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onivoro/app-server-bucketvore",
3
- "version": "24.31.2",
3
+ "version": "24.31.3",
4
4
  "description": "BucketVore NestJS application for S3 bucket management",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",