- Migrated all pages from Next.js to Astro - Added PDPA-compliant Privacy Policy (Thai) - Added PDPA-compliant Terms & Conditions (Thai) - Added Cookie Policy with disclosure (Thai) - Implemented cookie consent banner (client-side) - Integrated Umami Analytics placeholder - Blog system with 3 posts - Optimized Docker configuration for production - Static site build (184KB, 11 pages) - Ready for Easypanel deployment Backup: /Users/kunthawatgreethong/Gitea/dealplustech-backup-nextjs-20260309.tar.gz
40 lines
1.3 KiB
JavaScript
40 lines
1.3 KiB
JavaScript
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
|
|
|
|
const escape = (str, filename) =>
|
|
(filename ? str : str.replace(/\r?\n|\r/g, '\r\n'))
|
|
.replace(/\n/g, '%0A')
|
|
.replace(/\r/g, '%0D')
|
|
.replace(/"/g, '%22')
|
|
|
|
/**
|
|
* pure function to convert any formData instance to a Blob
|
|
* instances synchronous without reading all of the files
|
|
*
|
|
* @param {FormData|*} formData an instance of a formData Class
|
|
* @param {Blob|*} [BlobClass=Blob] the Blob class to use when constructing it
|
|
*/
|
|
export function formDataToBlob (formData, BlobClass = Blob) {
|
|
const boundary = ('----formdata-polyfill-' + Math.random())
|
|
const chunks = []
|
|
const prefix = `--${boundary}\r\nContent-Disposition: form-data; name="`
|
|
|
|
for (let [name, value] of formData) {
|
|
if (typeof value === 'string') {
|
|
chunks.push(prefix + escape(name) + `"\r\n\r\n${value.replace(/\r(?!\n)|(?<!\r)\n/g, '\r\n')}\r\n`)
|
|
} else {
|
|
chunks.push(
|
|
prefix + escape(name) + `"; filename="${escape(value.name, 1)}"\r\n` +
|
|
`Content-Type: ${value.type || 'application/octet-stream'}\r\n\r\n`,
|
|
value,
|
|
'\r\n'
|
|
)
|
|
}
|
|
}
|
|
|
|
chunks.push(`--${boundary}--`)
|
|
|
|
return new BlobClass(chunks, {
|
|
type: 'multipart/form-data; boundary=' + boundary
|
|
})
|
|
}
|