@yongdall/file 0.4.2 → 0.6.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/assets/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{User as e,effect as t,pathRoots as n,request as r,selectFile as i,toFileLink as a,toFileURL as o}from"@yongdall/web";var s=Object.defineProperty,c=(e,t)=>{let n={};for(var r in e)s(n,r,{get:e[r],enumerable:!0});return t||s(n,Symbol.toStringTag,{value:`Module`}),n};function l(e,t,n){return e.replace(/\{([a-zA-Z]+)\}/g,(e,r)=>{switch(r){case`YYYY`:case`YYY`:case`YY`:return`${t.getFullYear()}`.slice(-r.length);case`MM`:case`M`:return`${t.getMonth()+1}`.padStart(r.length,`0`);case`DD`:case`D`:return`${t.getDate()}`.padStart(r.length,`0`);case`hh`:case`h`:return`${t.getHours()}`.padStart(r.length,`0`);case`mm`:case`m`:return`${t.getMinutes()}`.padStart(r.length,`0`);case`ss`:case`s`:return`${t.getSeconds()}`.padStart(r.length,`0`);default:if(Object.hasOwn(n,r))return n[r]}return e})}const u=r.clone().path(`fileCabinets`);async function d(e,t,n,{signal:r}={}){let i=u.clone().append`${t}/files/${n}`.put();r&&(i=i.signal(r));let a=await i.json(),{link:o,id:s}=a,c=fetch(o,{method:`put`,body:e,signal:r instanceof AbortSignal?r:null}),l=s?c.then(()=>u.clone().append`${t}/id/${s}`.put().json(),e=>u.clone().append`${t}/id/${s}`.delete().json().then(()=>Promise.reject(e))):c.then(()=>a);if(!(r instanceof AbortSignal))return l;let d=new Promise((e,t)=>{if(r.aborted){t(r.reason);return}r.addEventListener(`abort`,()=>t(r.reason),{once:!0})});return Promise.race([d,l])}function f(t,r){let i=r?.replace(/[\\\/#?{}~@:&^$()]/g,``)||``,a=i.lastIndexOf(`.`),o=a>=0?i.slice(a):``;if(!t||typeof t!=`string`)return null;let s=l(t,new Date,{user:e.current?.id||`_`,filename:i||`_`,extname:o});if(/^\+file:\/\//.test(s)){let{hostname:e,pathname:t,hash:r}=new URL(s.slice(1)),i=e||`_`,a=t.split(`/`).filter(Boolean).join(`/`);return a?{cabinetId:i,path:a,name:decodeURIComponent(r.slice(1)||a.split(`/`).pop()||`文件`),href:`${n.file}/${i}/files/${a}`}:{cabinetId:i,path:a,name:``,href:``}}return null}async function p(e,t){let n=t?.signal,r=await i(t);if(n?.aborted||!r)return null;let a=f(e,r.name),s=`_`,c;a&&({cabinetId:s,path:c}=a);let l=await d(r,s||`_`,c||r.name,{signal:n});if(!n?.aborted)return o(l,r.name)}document.head.appendChild(document.createElement(`style`)).textContent=`
1
+ import{User as e,effect as t,pathRoots as n,request as r,selectFile as i,toFileLink as a,toFileURL as o}from"@yongdall/web";var s=Object.defineProperty,c=(e,t)=>{let n={};for(var r in e)s(n,r,{get:e[r],enumerable:!0});return t||s(n,Symbol.toStringTag,{value:`Module`}),n};function l(e,t,n){return e.replace(/\{([a-zA-Z]+)\}/g,(e,r)=>{switch(r){case`YYYY`:case`YYY`:case`YY`:return`${t.getFullYear()}`.slice(-r.length);case`MM`:case`M`:return`${t.getMonth()+1}`.padStart(r.length,`0`);case`DD`:case`D`:return`${t.getDate()}`.padStart(r.length,`0`);case`hh`:case`h`:return`${t.getHours()}`.padStart(r.length,`0`);case`mm`:case`m`:return`${t.getMinutes()}`.padStart(r.length,`0`);case`ss`:case`s`:return`${t.getSeconds()}`.padStart(r.length,`0`);default:if(Object.hasOwn(n,r))return n[r]}return e})}const u=r.clone().path(`fileCabinets`);async function d(e,t,n,{signal:r}={}){let i=u.clone().append`${t}/files/${n}`.put();r&&(i=i.signal(r));let a=await i.json(),{link:o,id:s}=a,c=fetch(o,{method:`put`,body:e,signal:r instanceof AbortSignal?r:null}),l=s?c.then(()=>u.clone().append`${t}/id/${s}`.put().json(),e=>u.clone().append`${t}/id/${s}`.delete().json().then(()=>Promise.reject(e))):c.then(()=>a);if(!(r instanceof AbortSignal))return l;let d=new Promise((e,t)=>{if(r.aborted){t(r.reason);return}r.addEventListener(`abort`,()=>t(r.reason),{once:!0})});return Promise.race([d,l])}function f(t,r){let i=r?.replace(/[\\\/#?{}~@:&^$()]/g,``)||``,a=i.lastIndexOf(`.`),o=a>=0?i.slice(a):``;if(!t||typeof t!=`string`)return null;let s=l(t,new Date,{user:e.current?.id||`_`,visitor:e.visitor?.id||`_`,operator:e.operator?.id||`_`,filename:i||`_`,extname:o});if(/^\+file:\/\//.test(s)){let{hostname:e,pathname:t,hash:r}=new URL(s.slice(1)),i=e||`_`,a=t.split(`/`).filter(Boolean).join(`/`);return a?{cabinetId:i,path:a,name:decodeURIComponent(r.slice(1)||a.split(`/`).pop()||`文件`),href:`${n.api}/${n.file}/${i}/files/${a}`}:{cabinetId:i,path:a,name:``,href:``}}return null}async function p(e,t){let n=t?.signal,r=await i(t);if(n?.aborted||!r)return null;let a=f(e,r.name),s=`_`,c;a&&({cabinetId:s,path:c}=a);let l=await d(r,s||`_`,c||r.name,{signal:n});if(!n?.aborted)return o(l,r.name)}document.head.appendChild(document.createElement(`style`)).textContent=`
2
2
  .yongdall-file-form-field {
3
3
  display: flex;
4
4
  inline-size: 100%;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../plugins/file/common/replacePath.mjs","../../../plugins/file/assets/services.mjs","../../../plugins/file/assets/web.mjs","../../../plugins/file/assets/input.mjs","../../../plugins/file/assets/hooks.mjs"],"sourcesContent":["\n/**\n * \n * @param {string} path \n * @param {Date} date \n * @param {Record<string, any>} data \n */\nexport default function replacePath(path, date, data) {\n\treturn path.replace(/\\{([a-zA-Z]+)\\}/g, (_, v) => {\n\t\tswitch (v) {\n\t\t\tcase 'YYYY':\n\t\t\tcase 'YYY':\n\t\t\tcase 'YY':\n\t\t\t\tconst year = date.getFullYear();\n\t\t\t\treturn `${year}`.slice(-v.length);\n\t\t\tcase 'MM':\n\t\t\tcase 'M':\n\t\t\t\tconst month = date.getMonth() + 1;\n\t\t\t\treturn `${month}`.padStart(v.length, '0');\n\t\t\tcase 'DD':\n\t\t\tcase 'D':\n\t\t\t\tconst day = date.getDate();\n\t\t\t\treturn `${day}`.padStart(v.length, '0');\n\t\t\tcase 'hh':\n\t\t\tcase 'h':\n\t\t\t\tconst hour = date.getHours();\n\t\t\t\treturn `${hour}`.padStart(v.length, '0');\n\t\t\tcase 'mm':\n\t\t\tcase 'm':\n\t\t\t\tconst minute = date.getMinutes();\n\t\t\t\treturn `${minute}`.padStart(v.length, '0');\n\t\t\tcase 'ss':\n\t\t\tcase 's':\n\t\t\t\tconst second = date.getSeconds();\n\t\t\t\treturn `${second}`.padStart(v.length, '0');\n\t\t\tdefault: {\n\t\t\t\tif (Object.hasOwn(data, v)) {\n\t\t\t\t\treturn data[v];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _;\n\t});\n}\n","/** @import { DotRequest } from '@yongdall/web' */\nimport { request } from '@yongdall/web';\nexport const fileCabinetApi = request.clone().path('fileCabinets');\n\n/**\n * \n * @param {File} file \n * @param {string} cabinetId\n * @param {string} path\n * @param {object} [options] \n * @param {DotRequest.Signal} [options.signal] \n * @returns {Promise<{domain: string; path: string; id: string}>} \n */\nexport async function uploadFile(file, cabinetId, path, { signal } = {}) {\n\tlet r = fileCabinetApi.clone().append`${cabinetId}/files/${path}`.put();\n\tif (signal) { r = r.signal(signal); }\n\tconst target = await r.json();\n\tconst { link, id } = target;\n\tconst promise1 = fetch(link, {\n\t\tmethod: 'put',\n\t\tbody: file,\n\t\tsignal: signal instanceof AbortSignal ? signal : null,\n\t});\n\n\tconst promise = id\n\t\t? promise1.then(\n\t\t\t() => fileCabinetApi.clone().append`${cabinetId}/id/${id}`.put().json(),\n\t\t\te => fileCabinetApi.clone().append`${cabinetId}/id/${id}`.delete().json().then(() => Promise.reject(e)))\n\t\t: promise1.then(() => target);\n\tif (!(signal instanceof AbortSignal)) { return promise; }\n\t/** @type {Promise<never>} */\n\tconst signalPromise = new Promise((_, reject) => {\n\t\tif (signal.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tsignal.addEventListener('abort', () => reject(signal.reason), {once: true});\n\t});\n\treturn Promise.race([signalPromise, promise]);\n}\n","import { pathRoots, selectFile, toFileURL, User } from '@yongdall/web';\nimport replacePath from './common/replacePath.mjs';\nimport { uploadFile } from './services.mjs';\n\n/**\n * \n * @param {string} [path] \n * @param {string} [name] \n * @returns \n */\nexport function parseFileURL(path, name) {\n\tconst filename = name?.replace(/[\\\\\\/#?{}~@:&^$()]/g, '') || '';\n\tconst index = filename.lastIndexOf('.');\n\tconst extname = index >= 0 ? filename.slice(index) : '';\n\tif (!path || typeof path !== 'string') { return null; }\n\tconst date = new Date();\n\tconst url = replacePath(path, date, {\n\t\tuser: User.current?.id || '_', filename: filename || '_', extname,\n\t});\n\tif (/^\\+file:\\/\\//.test(url)) {\n\t\tconst { hostname, pathname, hash } = new URL(url.slice(1));\n\t\tconst cabinetId = hostname || '_';\n\t\tconst path = pathname.split('/').filter(Boolean).join('/');\n\t\tif (!path) { return { cabinetId, path, name: '', href: '' }; }\n\t\tconst name = decodeURIComponent(hash.slice(1) || path.split('/').pop() || '文件');\n\t\tconst href = `${pathRoots.file}/${cabinetId}/files/${path}`;\n\t\treturn { cabinetId, path, name, href };\n\t}\n\treturn null;\n}\n/**\n * \n * @param {string} fileCabinetUrl \n * @param {object} [options]\n * @param {FileSystemHandleQueryOptions['types']} [options.types]\n * @param {boolean} [options.excludeAcceptAllOption]\n * @param {AbortSignal} [options.signal] \n * @returns \n */\nexport async function upload(fileCabinetUrl, options) {\n\tconst signal = options?.signal;\n\tconst file = await selectFile(options);\n\tif (signal?.aborted || !file) { return null; }\n\tconst u = parseFileURL(fileCabinetUrl, file.name);\n\tlet cabinetId = '_', path;\n\tif (u) { ({ cabinetId, path } = u); }\n\tconst s = await uploadFile(file, cabinetId || '_', path || file.name, { signal });\n\tif (signal?.aborted) { return; }\n\treturn toFileURL(s, file.name);\n\n}\n","import { effect, toFileLink } from '@yongdall/web';\nimport { upload } from './web.mjs';\n/** @import { FieldComponent } from '@yongdall/web' */\n\n\nconst style = `\n.yongdall-file-form-field {\n\tdisplay: flex;\n\tinline-size: 100%;\n\t&.disabled {\n\t\tbutton, .yongdall-file-form-field-uploading, .yongdall-file-form-field-null {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n.yongdall-file-form-field-filename {\n\tflex: 1;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: pre;\n}\n.yongdall-file-form-field-uploading, .yongdall-file-form-field-null {\n\t\tflex: 1;\n}\n.yongdall-file-form-field-uploading::after {\n\tcontent: '上传中...';\n}\n`;\ndocument.head.appendChild(document.createElement('style')).textContent = style;\n\n/** @type {FieldComponent} */\nconst Component = (ctx, options) => {\n\tconst fileCabinetUrl = options?.fileCabinet;\n\t/** @type {AbortController?} */\n\tlet ac = null;\n\n\tconst root = document.createElement('div');\n\troot.className = 'yongdall-file-form-field';\n\tctx.listen('focus', () => root.focus());\n\tctx.listen('scrollIntoView', () => root.scrollIntoView());\n\tlet value = '';\n\n\tconst enableLink = ctx.style.enableLink;\n\tconst inputA = enableLink ? root.appendChild(document.createElement('a')) : null;\n\tconst input = inputA || root.appendChild(document.createElement('span'));\n\tinput.classList.add('yongdall-file-form-field-filename')\n\tif (inputA) { inputA.target = '_blank'; }\n\tconst removeButton = root.appendChild(document.createElement('button'));\n\tremoveButton.appendChild(document.createTextNode('移除'));\n\tconst uploadTip = root.appendChild(document.createElement('span'));\n\tuploadTip.classList.add('yongdall-file-form-field-uploading')\n\tconst cancelButton = root.appendChild(document.createElement('button'));\n\tcancelButton.appendChild(document.createTextNode('取消'));\n\tconst uploadStart = root.appendChild(document.createElement('span'));\n\tuploadStart.classList.add('yongdall-file-form-field-null')\n\tconst uploadButton = root.appendChild(document.createElement('button'));\n\tuploadButton.appendChild(document.createTextNode('上传'));\n\n\tremoveButton.addEventListener('click', () => { ctx.value = ctx.nullable ? null : ''; });\n\tcancelButton.addEventListener('click', () => { ac?.abort(); });\n\n\n\n\tuploadButton.addEventListener('click', async () => {\n\t\tac?.abort();\n\t\tconst tac = ac = new AbortController();\n\t\tconst { signal } = ac;\n\t\tcancelButton.hidden = false;\n\t\tuploadTip.hidden = false;\n\t\tuploadStart.hidden = true;\n\t\tuploadButton.hidden = true;\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tcancelButton.hidden = true;\n\t\t\tuploadTip.hidden = true;\n\t\t\tuploadStart.hidden = false;\n\t\t\tuploadButton.hidden = false;\n\t\t}, { once: true });\n\t\ttry {\n\t\t\tconst url = await upload(fileCabinetUrl, { signal });\n\t\t\tif (typeof url !== 'string') { return; }\n\t\t\tctx.value = url || (ctx.nullable ? null : '');\n\t\t} finally {\n\t\t\tif (!signal.aborted) { tac.abort(); }\n\t\t}\n\t});\n\n\tinputA?.addEventListener('click', (event) => {\n\t\tif (!ctx.disabled) { return; }\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t});\n\n\tif (!ctx.editable) {\n\t\troot.classList.add('disabled');\n\t} else {\n\t\teffect(() => {\n\t\t\tif (ctx.disabled || ctx.readonly) {\n\t\t\t\troot.classList.add('disabled');\n\t\t\t} else {\n\t\t\t\troot.classList.remove('disabled');\n\t\t\t}\n\t\t}, ctx.signal);\n\t}\n\n\n\tremoveButton.hidden = true;\n\tinput.hidden = true;\n\tuploadTip.hidden = true;\n\tcancelButton.hidden = true;\n\n\t/**\n\t * \n\t * @param {*} v \n\t * @returns \n\t */\n\tfunction update(v) {\n\t\tconst val = v || '';\n\t\tif (val === value) { return; }\n\t\tvalue = val;\n\t\tac?.abort();\n\t\tac = null;\n\t\tconst url = toFileLink(val);\n\t\tif (!url?.href) {\n\t\t\tif (inputA) { inputA.href = ''; }\n\t\t\tinput.innerText = '';\n\t\t\tremoveButton.hidden = true;\n\t\t\tinput.hidden = true;\n\t\t\tuploadStart.hidden = false;\n\t\t\tuploadButton.hidden = false;\n\t\t\treturn;\n\t\t}\n\t\tif (inputA) { inputA.href = url.href; }\n\t\tinput.innerText = url.name || url.href;\n\t\tif (inputA) { inputA.download = url.name || '文件'; }\n\t\tremoveButton.hidden = false;\n\t\tinput.hidden = false;\n\t\tuploadStart.hidden = true;\n\t\tuploadButton.hidden = true;\n\t}\n\teffect(() => update(ctx.value), ctx.signal);\n\treturn root;\n};\n\nexport default Component;\n","/** @import { Hooks } from '@yongdall/web' */\n\nimport input from './input.mjs';\n\n\n\n/** @type {Hooks.Define['formFields']} */\nexport const formFields = [\n\t{type: 'file', input },\n]\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../plugins/file/common/replacePath.mjs","../../../plugins/file/assets/services.mjs","../../../plugins/file/assets/web.mjs","../../../plugins/file/assets/input.mjs","../../../plugins/file/assets/hooks.mjs"],"sourcesContent":["\n/**\n * \n * @param {string} path \n * @param {Date} date \n * @param {Record<string, any>} data \n */\nexport default function replacePath(path, date, data) {\n\treturn path.replace(/\\{([a-zA-Z]+)\\}/g, (_, v) => {\n\t\tswitch (v) {\n\t\t\tcase 'YYYY':\n\t\t\tcase 'YYY':\n\t\t\tcase 'YY':\n\t\t\t\tconst year = date.getFullYear();\n\t\t\t\treturn `${year}`.slice(-v.length);\n\t\t\tcase 'MM':\n\t\t\tcase 'M':\n\t\t\t\tconst month = date.getMonth() + 1;\n\t\t\t\treturn `${month}`.padStart(v.length, '0');\n\t\t\tcase 'DD':\n\t\t\tcase 'D':\n\t\t\t\tconst day = date.getDate();\n\t\t\t\treturn `${day}`.padStart(v.length, '0');\n\t\t\tcase 'hh':\n\t\t\tcase 'h':\n\t\t\t\tconst hour = date.getHours();\n\t\t\t\treturn `${hour}`.padStart(v.length, '0');\n\t\t\tcase 'mm':\n\t\t\tcase 'm':\n\t\t\t\tconst minute = date.getMinutes();\n\t\t\t\treturn `${minute}`.padStart(v.length, '0');\n\t\t\tcase 'ss':\n\t\t\tcase 's':\n\t\t\t\tconst second = date.getSeconds();\n\t\t\t\treturn `${second}`.padStart(v.length, '0');\n\t\t\tdefault: {\n\t\t\t\tif (Object.hasOwn(data, v)) {\n\t\t\t\t\treturn data[v];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _;\n\t});\n}\n","/** @import { DotRequest } from '@yongdall/web' */\nimport { request } from '@yongdall/web';\nexport const fileCabinetApi = request.clone().path('fileCabinets');\n\n/**\n * \n * @param {File} file \n * @param {string} cabinetId\n * @param {string} path\n * @param {object} [options] \n * @param {DotRequest.Signal} [options.signal] \n * @returns {Promise<{domain: string; path: string; id: string}>} \n */\nexport async function uploadFile(file, cabinetId, path, { signal } = {}) {\n\tlet r = fileCabinetApi.clone().append`${cabinetId}/files/${path}`.put();\n\tif (signal) { r = r.signal(signal); }\n\tconst target = await r.json();\n\tconst { link, id } = target;\n\tconst promise1 = fetch(link, {\n\t\tmethod: 'put',\n\t\tbody: file,\n\t\tsignal: signal instanceof AbortSignal ? signal : null,\n\t});\n\n\tconst promise = id\n\t\t? promise1.then(\n\t\t\t() => fileCabinetApi.clone().append`${cabinetId}/id/${id}`.put().json(),\n\t\t\te => fileCabinetApi.clone().append`${cabinetId}/id/${id}`.delete().json().then(() => Promise.reject(e)))\n\t\t: promise1.then(() => target);\n\tif (!(signal instanceof AbortSignal)) { return promise; }\n\t/** @type {Promise<never>} */\n\tconst signalPromise = new Promise((_, reject) => {\n\t\tif (signal.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tsignal.addEventListener('abort', () => reject(signal.reason), {once: true});\n\t});\n\treturn Promise.race([signalPromise, promise]);\n}\n","import { pathRoots, selectFile, toFileURL, User } from '@yongdall/web';\nimport replacePath from './common/replacePath.mjs';\nimport { uploadFile } from './services.mjs';\n\n/**\n * \n * @param {string} [path] \n * @param {string} [name] \n * @returns \n */\nexport function parseFileURL(path, name) {\n\tconst filename = name?.replace(/[\\\\\\/#?{}~@:&^$()]/g, '') || '';\n\tconst index = filename.lastIndexOf('.');\n\tconst extname = index >= 0 ? filename.slice(index) : '';\n\tif (!path || typeof path !== 'string') { return null; }\n\tconst date = new Date();\n\tconst url = replacePath(path, date, {\n\t\tuser: User.current?.id || '_',\n\t\tvisitor: User.visitor?.id || '_',\n\t\toperator: User.operator?.id || '_',\n\t\tfilename: filename || '_', extname,\n\t});\n\tif (/^\\+file:\\/\\//.test(url)) {\n\t\tconst { hostname, pathname, hash } = new URL(url.slice(1));\n\t\tconst cabinetId = hostname || '_';\n\t\tconst path = pathname.split('/').filter(Boolean).join('/');\n\t\tif (!path) { return { cabinetId, path, name: '', href: '' }; }\n\t\tconst name = decodeURIComponent(hash.slice(1) || path.split('/').pop() || '文件');\n\t\tconst href = `${pathRoots.api}/${pathRoots.file}/${cabinetId}/files/${path}`;\n\t\treturn { cabinetId, path, name, href };\n\t}\n\treturn null;\n}\n/**\n * \n * @param {string} fileCabinetUrl \n * @param {object} [options]\n * @param {FileSystemHandleQueryOptions['types']} [options.types]\n * @param {boolean} [options.excludeAcceptAllOption]\n * @param {AbortSignal} [options.signal] \n * @returns \n */\nexport async function upload(fileCabinetUrl, options) {\n\tconst signal = options?.signal;\n\tconst file = await selectFile(options);\n\tif (signal?.aborted || !file) { return null; }\n\tconst u = parseFileURL(fileCabinetUrl, file.name);\n\tlet cabinetId = '_', path;\n\tif (u) { ({ cabinetId, path } = u); }\n\tconst s = await uploadFile(file, cabinetId || '_', path || file.name, { signal });\n\tif (signal?.aborted) { return; }\n\treturn toFileURL(s, file.name);\n\n}\n","import { effect, toFileLink } from '@yongdall/web';\nimport { upload } from './web.mjs';\n/** @import { FieldComponent } from '@yongdall/web' */\n\n\nconst style = `\n.yongdall-file-form-field {\n\tdisplay: flex;\n\tinline-size: 100%;\n\t&.disabled {\n\t\tbutton, .yongdall-file-form-field-uploading, .yongdall-file-form-field-null {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n.yongdall-file-form-field-filename {\n\tflex: 1;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: pre;\n}\n.yongdall-file-form-field-uploading, .yongdall-file-form-field-null {\n\t\tflex: 1;\n}\n.yongdall-file-form-field-uploading::after {\n\tcontent: '上传中...';\n}\n`;\ndocument.head.appendChild(document.createElement('style')).textContent = style;\n\n/** @type {FieldComponent} */\nconst Component = (ctx, options) => {\n\tconst fileCabinetUrl = options?.fileCabinet;\n\t/** @type {AbortController?} */\n\tlet ac = null;\n\n\tconst root = document.createElement('div');\n\troot.className = 'yongdall-file-form-field';\n\tctx.listen('focus', () => root.focus());\n\tctx.listen('scrollIntoView', () => root.scrollIntoView());\n\tlet value = '';\n\n\tconst enableLink = ctx.style.enableLink;\n\tconst inputA = enableLink ? root.appendChild(document.createElement('a')) : null;\n\tconst input = inputA || root.appendChild(document.createElement('span'));\n\tinput.classList.add('yongdall-file-form-field-filename')\n\tif (inputA) { inputA.target = '_blank'; }\n\tconst removeButton = root.appendChild(document.createElement('button'));\n\tremoveButton.appendChild(document.createTextNode('移除'));\n\tconst uploadTip = root.appendChild(document.createElement('span'));\n\tuploadTip.classList.add('yongdall-file-form-field-uploading')\n\tconst cancelButton = root.appendChild(document.createElement('button'));\n\tcancelButton.appendChild(document.createTextNode('取消'));\n\tconst uploadStart = root.appendChild(document.createElement('span'));\n\tuploadStart.classList.add('yongdall-file-form-field-null')\n\tconst uploadButton = root.appendChild(document.createElement('button'));\n\tuploadButton.appendChild(document.createTextNode('上传'));\n\n\tremoveButton.addEventListener('click', () => { ctx.value = ctx.nullable ? null : ''; });\n\tcancelButton.addEventListener('click', () => { ac?.abort(); });\n\n\n\n\tuploadButton.addEventListener('click', async () => {\n\t\tac?.abort();\n\t\tconst tac = ac = new AbortController();\n\t\tconst { signal } = ac;\n\t\tcancelButton.hidden = false;\n\t\tuploadTip.hidden = false;\n\t\tuploadStart.hidden = true;\n\t\tuploadButton.hidden = true;\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tcancelButton.hidden = true;\n\t\t\tuploadTip.hidden = true;\n\t\t\tuploadStart.hidden = false;\n\t\t\tuploadButton.hidden = false;\n\t\t}, { once: true });\n\t\ttry {\n\t\t\tconst url = await upload(fileCabinetUrl, { signal });\n\t\t\tif (typeof url !== 'string') { return; }\n\t\t\tctx.value = url || (ctx.nullable ? null : '');\n\t\t} finally {\n\t\t\tif (!signal.aborted) { tac.abort(); }\n\t\t}\n\t});\n\n\tinputA?.addEventListener('click', (event) => {\n\t\tif (!ctx.disabled) { return; }\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t});\n\n\tif (!ctx.editable) {\n\t\troot.classList.add('disabled');\n\t} else {\n\t\teffect(() => {\n\t\t\tif (ctx.disabled || ctx.readonly) {\n\t\t\t\troot.classList.add('disabled');\n\t\t\t} else {\n\t\t\t\troot.classList.remove('disabled');\n\t\t\t}\n\t\t}, ctx.signal);\n\t}\n\n\n\tremoveButton.hidden = true;\n\tinput.hidden = true;\n\tuploadTip.hidden = true;\n\tcancelButton.hidden = true;\n\n\t/**\n\t * \n\t * @param {*} v \n\t * @returns \n\t */\n\tfunction update(v) {\n\t\tconst val = v || '';\n\t\tif (val === value) { return; }\n\t\tvalue = val;\n\t\tac?.abort();\n\t\tac = null;\n\t\tconst url = toFileLink(val);\n\t\tif (!url?.href) {\n\t\t\tif (inputA) { inputA.href = ''; }\n\t\t\tinput.innerText = '';\n\t\t\tremoveButton.hidden = true;\n\t\t\tinput.hidden = true;\n\t\t\tuploadStart.hidden = false;\n\t\t\tuploadButton.hidden = false;\n\t\t\treturn;\n\t\t}\n\t\tif (inputA) { inputA.href = url.href; }\n\t\tinput.innerText = url.name || url.href;\n\t\tif (inputA) { inputA.download = url.name || '文件'; }\n\t\tremoveButton.hidden = false;\n\t\tinput.hidden = false;\n\t\tuploadStart.hidden = true;\n\t\tuploadButton.hidden = true;\n\t}\n\teffect(() => update(ctx.value), ctx.signal);\n\treturn root;\n};\n\nexport default Component;\n","/** @import { Hooks } from '@yongdall/web' */\n\nimport input from './input.mjs';\n\n\n\n/** @type {Hooks.Define['formFields']} */\nexport const formFields = [\n\t{type: 'file', input },\n]\n"],"mappings":"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"}
package/index.d.mts CHANGED
@@ -13,6 +13,6 @@ declare const _default: _yongdall_model0.ModelTable<{
13
13
  updatedAt: imodel0.FieldDefine<"timestamp", false, false>;
14
14
  public: imodel0.FieldDefine<"bool", false, false>;
15
15
  description: imodel0.FieldDefine<"text", false, false>;
16
- }, "fileCabinet">;
16
+ }, string>;
17
17
  //#endregion
18
18
  export { _default as FileCabinet };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yongdall/file",
3
- "version": "0.4.2",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "main": "./index.mjs",
6
6
  "exports": {
@@ -12,15 +12,16 @@
12
12
  "author": "",
13
13
  "license": "ISC",
14
14
  "dependencies": {
15
- "@yongdall/core": "^0.4.0",
16
- "@yongdall/connection": "^0.4.0",
17
- "@yongdall/model": "^0.4.0",
18
- "@yongdall/http": "^0.4.0"
15
+ "@yongdall/core": "^0.5.0",
16
+ "@yongdall/connection": "^0.5.0",
17
+ "@yongdall/model": "^0.5.0",
18
+ "@yongdall/http": "^0.5.0"
19
19
  },
20
20
  "devDependencies": {
21
- "@yongdall/web": "^0.4.0"
21
+ "@yongdall/migrate": "^0.5.0",
22
+ "@yongdall/web": "^0.5.0"
22
23
  },
23
24
  "peerDependencies": {
24
- "@yongdall/web": "^0.4.0"
25
+ "@yongdall/web": "^0.5.0"
25
26
  }
26
27
  }
@@ -1,7 +1,7 @@
1
- import { Query } from "@yongdall/model";
2
1
  import { ApiRouter, Param, e404 } from "@yongdall/http";
3
2
  import { getModel, getUser } from "@yongdall/core";
4
3
  import { useConnection, useDatabase } from "@yongdall/connection";
4
+ import { Query, actions } from "@yongdall/model";
5
5
 
6
6
  //#region plugins/file/getCabinet.mjs
7
7
  /**
@@ -13,7 +13,7 @@ async function getCabinet(cabinetId) {
13
13
  const pageModel = await getModel("fileCabinet");
14
14
  if (!pageModel) return null;
15
15
  const sql = new Query(pageModel, true).where("id", cabinetId);
16
- return await useDatabase(pageModel.databaseId).first(sql) || null;
16
+ return await useDatabase(pageModel.databaseId).call(actions.first(sql)) || null;
17
17
  }
18
18
 
19
19
  //#endregion
@@ -54,17 +54,17 @@ const apiRouter = new ApiRouter();
54
54
  apiRouter.put`${fileCabinetId$1}/files/${filePathParam$1}+`(async (ctx) => {
55
55
  const cabinetId = fileCabinetId$1.param(ctx) || "_";
56
56
  const filePath = filePathParam$1.params(ctx);
57
- if (!filePath?.length) return e404(ctx);
57
+ if (!filePath?.length) return e404();
58
58
  const paths = filePath;
59
59
  const path = filePath.join("/");
60
60
  const fileName = paths.pop()?.replace(/[\\\/#?{}~@:&^$()]/g, "") || "";
61
- if (!fileName) return e404(ctx);
61
+ if (!fileName) return e404();
62
62
  const dirname = paths.join("/");
63
63
  const index = fileName.lastIndexOf(".");
64
64
  const filename = fileName.slice(0, index) || "_";
65
65
  const extname = index >= 0 ? fileName.slice(index) : "";
66
66
  const cabinet = await getCabinet(cabinetId);
67
- if (!cabinet) return e404(ctx);
67
+ if (!cabinet) return e404();
68
68
  const uploadPath = cabinet.uploadPath;
69
69
  const subPath = uploadPath ? replacePath(uploadPath, /* @__PURE__ */ new Date(), {
70
70
  user: await getUser() || "_",
@@ -86,7 +86,7 @@ apiRouter.put`${fileCabinetId$1}/files/${filePathParam$1}+`(async (ctx) => {
86
86
  break;
87
87
  }
88
88
  }
89
- if (!link) return e404(ctx);
89
+ if (!link) return e404();
90
90
  ctx.responseHeaders.set("Location", link.link);
91
91
  return link;
92
92
  });
@@ -100,9 +100,9 @@ const downloadRouter = new ApiRouter();
100
100
  downloadRouter.get`${fileCabinetId}/files/${filePathParam}+`(async (ctx) => {
101
101
  const cabinetId = fileCabinetId.param(ctx) || "_";
102
102
  const filePath = filePathParam.params(ctx);
103
- if (!filePath?.length) return e404(ctx);
103
+ if (!filePath?.length) return e404();
104
104
  const cabinet = await getCabinet(cabinetId);
105
- if (!cabinet) return e404(ctx);
105
+ if (!cabinet) return e404();
106
106
  let link = "";
107
107
  switch (cabinet.mode) {
108
108
  case "map": {
@@ -112,7 +112,7 @@ downloadRouter.get`${fileCabinetId}/files/${filePathParam}+`(async (ctx) => {
112
112
  break;
113
113
  }
114
114
  }
115
- if (!link) return e404(ctx);
115
+ if (!link) return e404();
116
116
  ctx.responseHeaders.set("Location", link);
117
117
  ctx.status = 302;
118
118
  });
@@ -120,9 +120,9 @@ var download_default = downloadRouter;
120
120
 
121
121
  //#endregion
122
122
  //#region plugins/file/routers/index.mjs
123
- const api = { fileCabinets: api_default };
124
- const root = { fileCabinets: download_default };
123
+ const clientApi = { fileCabinets: api_default };
124
+ const api = { fileCabinets: download_default };
125
125
 
126
126
  //#endregion
127
- export { api, root };
127
+ export { api, clientApi };
128
128
  //# sourceMappingURL=routers.yongdall.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"routers.yongdall.mjs","names":["fileCabinetId","filePathParam","apiRouter","download"],"sources":["../../plugins/file/getCabinet.mjs","../../plugins/file/common/replacePath.mjs","../../plugins/file/routers/api.mjs","../../plugins/file/routers/download.mjs","../../plugins/file/routers/index.mjs"],"sourcesContent":["import { getModel } from '@yongdall/core';\nimport { Query } from '@yongdall/model';\nimport { useDatabase } from '@yongdall/connection';\n\n\n\n/**\n * \n * @param {string} cabinetId \n * @returns {Promise<{mode: string; storeId: string; storePath: string; uploadPath: string; public: boolean}?>}\n */\nexport default async function getCabinet(cabinetId) {\n\n\tconst pageModel = await getModel('fileCabinet');\n\tif (!pageModel) { return null; }\n\n\tconst sql = new Query(pageModel, true).where('id', cabinetId);\n\tconst database = useDatabase(pageModel.databaseId);\n\treturn await database.first(sql) || null;\n}\n","\n/**\n * \n * @param {string} path \n * @param {Date} date \n * @param {Record<string, any>} data \n */\nexport default function replacePath(path, date, data) {\n\treturn path.replace(/\\{([a-zA-Z]+)\\}/g, (_, v) => {\n\t\tswitch (v) {\n\t\t\tcase 'YYYY':\n\t\t\tcase 'YYY':\n\t\t\tcase 'YY':\n\t\t\t\tconst year = date.getFullYear();\n\t\t\t\treturn `${year}`.slice(-v.length);\n\t\t\tcase 'MM':\n\t\t\tcase 'M':\n\t\t\t\tconst month = date.getMonth() + 1;\n\t\t\t\treturn `${month}`.padStart(v.length, '0');\n\t\t\tcase 'DD':\n\t\t\tcase 'D':\n\t\t\t\tconst day = date.getDate();\n\t\t\t\treturn `${day}`.padStart(v.length, '0');\n\t\t\tcase 'hh':\n\t\t\tcase 'h':\n\t\t\t\tconst hour = date.getHours();\n\t\t\t\treturn `${hour}`.padStart(v.length, '0');\n\t\t\tcase 'mm':\n\t\t\tcase 'm':\n\t\t\t\tconst minute = date.getMinutes();\n\t\t\t\treturn `${minute}`.padStart(v.length, '0');\n\t\t\tcase 'ss':\n\t\t\tcase 's':\n\t\t\t\tconst second = date.getSeconds();\n\t\t\t\treturn `${second}`.padStart(v.length, '0');\n\t\t\tdefault: {\n\t\t\t\tif (Object.hasOwn(data, v)) {\n\t\t\t\t\treturn data[v];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _;\n\t});\n}\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { e404 } from '@yongdall/http';\nimport { getUser } from '@yongdall/core';\nimport { useConnection } from '@yongdall/connection';\nimport getCabinet from '../getCabinet.mjs';\nimport replacePath from '../common/replacePath.mjs';\n\n\n\n\nconst fileCabinetId = new Param();\nconst filePathParam = new Param();\n\n\n\nconst apiRouter = new ApiRouter();\n\napiRouter.put`${fileCabinetId}/files/${filePathParam}+`(async ctx => {\n\tconst cabinetId = fileCabinetId.param(ctx) || '_';\n\tconst filePath = filePathParam.params(ctx);\n\tif (!filePath?.length) { return e404(ctx); }\n\tconst paths = filePath;\n\tconst path = filePath.join('/');\n\tconst fileName = paths.pop()?.replace(/[\\\\\\/#?{}~@:&^$()]/g, '') || '';\n\tif (!fileName) { return e404(ctx); }\n\tconst dirname = paths.join('/');\n\n\tconst index = fileName.lastIndexOf('.');\n\tconst filename = fileName.slice(0, index) || '_';\n\tconst extname = index >= 0 ? fileName.slice(index) : '';\n\n\tconst cabinet = await getCabinet(cabinetId);\n\tif (!cabinet) { return e404(ctx); }\n\tconst uploadPath = cabinet.uploadPath;\n\tconst subPath = uploadPath ? replacePath(uploadPath, new Date, {\n\t\tuser: await getUser() || '_', filename, extname, dirname,\n\t}) : path;\n\t/** @type {{id?: number, link: string; domain: string; path: string}?} */\n\tlet link = null;\n\tswitch (cabinet.mode) {\n\t\tcase 'map': {\n\t\t\tconst store = useConnection('fs', cabinet.storeId);\n\t\t\tconst path = [\n\t\t\t\t...cabinet.storePath?.split('/')?.filter(Boolean) || [],\n\t\t\t\tsubPath,\n\t\t\t].join('/');\n\t\t\tlink = {\n\t\t\t\tlink: await store.urlWrite(path),\n\t\t\t\tpath: subPath, domain: cabinetId,\n\t\t\t};\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!link) { return e404(ctx); }\n\n\tctx.responseHeaders.set('Location', link.link);\n\treturn link;\n});\nexport default apiRouter;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { e404 } from '@yongdall/http';\nimport { useConnection } from '@yongdall/connection';\nimport getCabinet from '../getCabinet.mjs';\n\n\nconst fileCabinetId = new Param();\nconst filePathParam = new Param();\nconst downloadRouter = new ApiRouter();\n\ndownloadRouter.get`${fileCabinetId}/files/${filePathParam}+`(async ctx => {\n\tconst cabinetId = fileCabinetId.param(ctx) || '_';\n\tconst filePath = filePathParam.params(ctx);\n\tif (!filePath?.length) { return e404(ctx); }\n\tconst cabinet = await getCabinet(cabinetId);\n\tif (!cabinet) { return e404(ctx); }\n\n\tlet link = '';\n\tswitch (cabinet.mode) {\n\t\tcase 'map': {\n\t\t\tconst store = useConnection('fs', cabinet.storeId);\n\t\t\tconst path = [\n\t\t\t\t...cabinet.storePath?.split('/')?.filter(Boolean) || [],\n\t\t\t\t...filePath,\n\t\t\t].join('/');\n\t\t\tlink = await store.urlRead(path);\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!link) { return e404(ctx); }\n\tctx.responseHeaders.set('Location', link);\n\tctx.status = 302;\n});\nexport default downloadRouter;\n","import apiRouter from './api.mjs';\nimport download from './download.mjs';\n\nexport const api = {\n\tfileCabinets: apiRouter,\n}\nexport const root = {\n\tfileCabinets: download,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"routers.yongdall.mjs","names":["fileCabinetId","filePathParam","apiRouter","download"],"sources":["../../plugins/file/getCabinet.mjs","../../plugins/file/common/replacePath.mjs","../../plugins/file/routers/api.mjs","../../plugins/file/routers/download.mjs","../../plugins/file/routers/index.mjs"],"sourcesContent":["import { getModel } from '@yongdall/core';\nimport { actions, Query } from '@yongdall/model';\nimport { useDatabase } from '@yongdall/connection';\n\n\n\n/**\n * \n * @param {string} cabinetId \n * @returns {Promise<{mode: string; storeId: string; storePath: string; uploadPath: string; public: boolean}?>}\n */\nexport default async function getCabinet(cabinetId) {\n\n\tconst pageModel = await getModel('fileCabinet');\n\tif (!pageModel) { return null; }\n\n\tconst sql = new Query(pageModel, true).where('id', cabinetId);\n\tconst database = useDatabase(pageModel.databaseId);\n\treturn await database.call(actions.first(sql)) || null;\n}\n","\n/**\n * \n * @param {string} path \n * @param {Date} date \n * @param {Record<string, any>} data \n */\nexport default function replacePath(path, date, data) {\n\treturn path.replace(/\\{([a-zA-Z]+)\\}/g, (_, v) => {\n\t\tswitch (v) {\n\t\t\tcase 'YYYY':\n\t\t\tcase 'YYY':\n\t\t\tcase 'YY':\n\t\t\t\tconst year = date.getFullYear();\n\t\t\t\treturn `${year}`.slice(-v.length);\n\t\t\tcase 'MM':\n\t\t\tcase 'M':\n\t\t\t\tconst month = date.getMonth() + 1;\n\t\t\t\treturn `${month}`.padStart(v.length, '0');\n\t\t\tcase 'DD':\n\t\t\tcase 'D':\n\t\t\t\tconst day = date.getDate();\n\t\t\t\treturn `${day}`.padStart(v.length, '0');\n\t\t\tcase 'hh':\n\t\t\tcase 'h':\n\t\t\t\tconst hour = date.getHours();\n\t\t\t\treturn `${hour}`.padStart(v.length, '0');\n\t\t\tcase 'mm':\n\t\t\tcase 'm':\n\t\t\t\tconst minute = date.getMinutes();\n\t\t\t\treturn `${minute}`.padStart(v.length, '0');\n\t\t\tcase 'ss':\n\t\t\tcase 's':\n\t\t\t\tconst second = date.getSeconds();\n\t\t\t\treturn `${second}`.padStart(v.length, '0');\n\t\t\tdefault: {\n\t\t\t\tif (Object.hasOwn(data, v)) {\n\t\t\t\t\treturn data[v];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _;\n\t});\n}\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { e404 } from '@yongdall/http';\nimport { getUser } from '@yongdall/core';\nimport { useConnection } from '@yongdall/connection';\nimport getCabinet from '../getCabinet.mjs';\nimport replacePath from '../common/replacePath.mjs';\n\n\n\n\nconst fileCabinetId = new Param();\nconst filePathParam = new Param();\n\n\n\nconst apiRouter = new ApiRouter();\n\napiRouter.put`${fileCabinetId}/files/${filePathParam}+`(async ctx => {\n\tconst cabinetId = fileCabinetId.param(ctx) || '_';\n\tconst filePath = filePathParam.params(ctx);\n\tif (!filePath?.length) { return e404(); }\n\tconst paths = filePath;\n\tconst path = filePath.join('/');\n\tconst fileName = paths.pop()?.replace(/[\\\\\\/#?{}~@:&^$()]/g, '') || '';\n\tif (!fileName) { return e404(); }\n\tconst dirname = paths.join('/');\n\n\tconst index = fileName.lastIndexOf('.');\n\tconst filename = fileName.slice(0, index) || '_';\n\tconst extname = index >= 0 ? fileName.slice(index) : '';\n\n\tconst cabinet = await getCabinet(cabinetId);\n\tif (!cabinet) { return e404(); }\n\tconst uploadPath = cabinet.uploadPath;\n\tconst subPath = uploadPath ? replacePath(uploadPath, new Date, {\n\t\tuser: await getUser() || '_', filename, extname, dirname,\n\t}) : path;\n\t/** @type {{id?: number, link: string; domain: string; path: string}?} */\n\tlet link = null;\n\tswitch (cabinet.mode) {\n\t\tcase 'map': {\n\t\t\tconst store = useConnection('fs', cabinet.storeId);\n\t\t\tconst path = [\n\t\t\t\t...cabinet.storePath?.split('/')?.filter(Boolean) || [],\n\t\t\t\tsubPath,\n\t\t\t].join('/');\n\t\t\tlink = {\n\t\t\t\tlink: await store.urlWrite(path),\n\t\t\t\tpath: subPath, domain: cabinetId,\n\t\t\t};\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!link) { return e404(); }\n\n\tctx.responseHeaders.set('Location', link.link);\n\treturn link;\n});\nexport default apiRouter;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { e404 } from '@yongdall/http';\nimport { useConnection } from '@yongdall/connection';\nimport getCabinet from '../getCabinet.mjs';\n\n\nconst fileCabinetId = new Param();\nconst filePathParam = new Param();\nconst downloadRouter = new ApiRouter();\n\ndownloadRouter.get`${fileCabinetId}/files/${filePathParam}+`(async ctx => {\n\tconst cabinetId = fileCabinetId.param(ctx) || '_';\n\tconst filePath = filePathParam.params(ctx);\n\tif (!filePath?.length) { return e404(); }\n\tconst cabinet = await getCabinet(cabinetId);\n\tif (!cabinet) { return e404(); }\n\n\tlet link = '';\n\tswitch (cabinet.mode) {\n\t\tcase 'map': {\n\t\t\tconst store = useConnection('fs', cabinet.storeId);\n\t\t\tconst path = [\n\t\t\t\t...cabinet.storePath?.split('/')?.filter(Boolean) || [],\n\t\t\t\t...filePath,\n\t\t\t].join('/');\n\t\t\tlink = await store.urlRead(path);\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!link) { return e404(); }\n\tctx.responseHeaders.set('Location', link);\n\tctx.status = 302;\n});\nexport default downloadRouter;\n","import apiRouter from './api.mjs';\nimport download from './download.mjs';\n\nexport const clientApi = {\n\tfileCabinets: apiRouter,\n}\nexport const api = {\n\tfileCabinets: download,\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { t as FileCabinet_default } from "../file-DqyOTm3m.mjs";
2
+
3
+ //#region plugins/file/yongdall/migration.mjs
4
+ /** @import { Profile } from '@yongdall/migrate' */
5
+ /** @type {Profile['models']} */
6
+ const models = [FileCabinet_default];
7
+
8
+ //#endregion
9
+ export { models };
10
+ //# sourceMappingURL=migration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.mjs","names":["FileCabinet"],"sources":["../../../plugins/file/yongdall/migration.mjs"],"sourcesContent":["/** @import { Profile } from '@yongdall/migrate' */\nimport { FileCabinet } from '../index.mjs';\n\n\n/** @type {Profile['models']} */\nexport const models = [\n\tFileCabinet,\n]\n"],"mappings":";;;;;AAKA,MAAa,SAAS,CACrBA,oBACA"}
@@ -0,0 +1,10 @@
1
+ import { t as FileCabinet_default } from "../file-DqyOTm3m.mjs";
2
+
3
+ //#region plugins/file/yongdall/model.mjs
4
+ /** @import { ModelProfile } from '@yongdall/core' */
5
+ /** @type {ModelProfile['models']} */
6
+ const models = { fileCabinet: FileCabinet_default };
7
+
8
+ //#endregion
9
+ export { models };
10
+ //# sourceMappingURL=model.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.mjs","names":["FileCabinet"],"sources":["../../../plugins/file/yongdall/model.mjs"],"sourcesContent":["/** @import { ModelProfile } from '@yongdall/core' */\nimport { FileCabinet } from '../index.mjs';\n\n/** @type {ModelProfile['models']} */\nexport const models = {\n\tfileCabinet: FileCabinet,\n};\n"],"mappings":";;;;;AAIA,MAAa,SAAS,EACrB,aAAaA,qBACb"}
@@ -0,0 +1,10 @@
1
+ {
2
+ "alias": {
3
+ ".": "index"
4
+ },
5
+ "esm": {
6
+ "index": "index.mjs"
7
+ },
8
+ "hooks": "#hooks",
9
+ "dir": "assets"
10
+ }
@@ -0,0 +1 @@
1
+ label: 文件管理
@@ -1,4 +0,0 @@
1
- export const alias = {".":"index"};
2
- export const esm = {"index":"index.mjs"};
3
- export const hooks = "#hooks";
4
- export const dir = "assets";
@@ -1,12 +0,0 @@
1
- import { t as FileCabinet_default } from "./file-DqyOTm3m.mjs";
2
-
3
- //#region plugins/file/hooks.yongdall.mjs
4
- /** @import { Hooks } from '@yongdall/core' */
5
- /** @type {Hooks.Define['models']} */
6
- const models = { fileCabinet: FileCabinet_default };
7
- /** @type {Hooks.Define['migrationModels']} */
8
- const migrationModels = [FileCabinet_default];
9
-
10
- //#endregion
11
- export { migrationModels, models };
12
- //# sourceMappingURL=hooks.yongdall.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.yongdall.mjs","names":["FileCabinet"],"sources":["../../plugins/file/hooks.yongdall.mjs"],"sourcesContent":["import { FileCabinet } from './index.mjs';\n/** @import { Hooks } from '@yongdall/core' */\n\n/** @type {Hooks.Define['models']} */\nexport const models = {\n\tfileCabinet: FileCabinet,\n};\n\n\n/** @type {Hooks.Define['migrationModels']} */\nexport const migrationModels = [\n\tFileCabinet,\n]\n"],"mappings":";;;;;AAIA,MAAa,SAAS,EACrB,aAAaA,qBACb;;AAID,MAAa,kBAAkB,CAC9BA,oBACA"}