auto-cms-server
Advanced tools
Comparing version 0.4.0 to 0.5.0
@@ -12,2 +12,6 @@ "use strict"; | ||
const fs_1 = require("fs"); | ||
const mime_detect_1 = require("mime-detect"); | ||
const format_1 = require("@beenotung/tslib/format"); | ||
const formidable_1 = require("formidable"); | ||
const bytes_1 = __importDefault(require("bytes")); | ||
console.log('Project Directory:', env_1.env.SITE_DIR); | ||
@@ -28,3 +32,3 @@ let app = (0, express_1.default)(); | ||
req.session.save(); | ||
res.redirect('/'); | ||
res.redirect('/auto-cms'); | ||
}); | ||
@@ -36,6 +40,16 @@ app.post('/auto-cms/logout', express_1.default.urlencoded({ extended: false }), (req, res, next) => { | ||
}); | ||
app.post('/auto-cms/save', session_1.guardCMS, express_1.default.text({ | ||
let parse_html_middleware = express_1.default.text({ | ||
type: 'text/html', | ||
limit: env_1.env.FILE_SIZE_LIMIT, | ||
}), (req, res, next) => { | ||
}); | ||
let maxFileSize = bytes_1.default.parse(env_1.env.FILE_SIZE_LIMIT); | ||
let createUploadForm = (options) => new formidable_1.Formidable({ | ||
uploadDir: options.dir, | ||
filename: () => options.filename, | ||
multiples: false, | ||
allowEmptyFiles: false, | ||
maxFileSize, | ||
filter: part => part.name == 'file', | ||
}); | ||
app.put('/auto-cms/file', session_1.guardCMS, (req, res, next) => { | ||
let pathname = req.header('X-Pathname'); | ||
@@ -47,8 +61,18 @@ if (!pathname) { | ||
} | ||
let file = resolveSiteFile(pathname); | ||
if (!file) { | ||
res.status(400); | ||
res.json({ error: 'target file not found' }); | ||
if (req.headers['content-type'] == 'text/html') { | ||
next(); | ||
return; | ||
} | ||
let dir = (0, path_1.resolve)((0, path_1.join)(site_dir, (0, path_1.dirname)(pathname))); | ||
let filename = (0, path_1.basename)(pathname); | ||
let form = createUploadForm({ dir, filename }); | ||
form.parse(req, (err, fields, files) => { | ||
if (err) { | ||
next(err); | ||
return; | ||
} | ||
res.json({}); | ||
}); | ||
}, parse_html_middleware, (req, res, next) => { | ||
let pathname = req.header('X-Pathname'); | ||
let content = req.body.trim(); | ||
@@ -60,5 +84,36 @@ if (!content) { | ||
} | ||
let file = resolveSiteFile(pathname); | ||
if (!file) { | ||
res.status(400); | ||
res.json({ error: 'target file not found' }); | ||
return; | ||
} | ||
(0, fs_1.writeFileSync)(file, content + '\n'); | ||
res.json({}); | ||
}); | ||
app.delete('/auto-cms/file', session_1.guardCMS, (req, res, next) => { | ||
let pathname = req.header('X-Pathname'); | ||
if (!pathname) { | ||
res.status(400); | ||
res.json({ error: 'missing X-Pathname in header' }); | ||
return; | ||
} | ||
let file = resolveSiteFile(pathname); | ||
if (!file) { | ||
res.status(400); | ||
res.json({ error: 'target file not found' }); | ||
return; | ||
} | ||
(0, fs_1.unlinkSync)(file); | ||
res.json({}); | ||
}); | ||
app.get('/auto-cms/images', session_1.guardCMS, (req, res, next) => { | ||
let dir = scanImageDir(site_dir); | ||
res.json({ dir }); | ||
}); | ||
let cms_transparent_grid_file = (0, path_1.resolve)(__dirname, '..', 'public', 'transparent-grid.svg'); | ||
app.get('/auto-cms/transparent-grid.svg', session_1.guardCMS, (req, res, next) => { | ||
res.setHeader('Content-Type', 'image/svg+xml'); | ||
res.sendFile(cms_transparent_grid_file); | ||
}); | ||
let cms_js_file = (0, path_1.resolve)(__dirname, '..', 'public', 'auto-cms.js'); | ||
@@ -75,2 +130,3 @@ app.get('/auto-cms.js', session_1.guardCMS, (req, res, next) => { | ||
function resolveSiteFile(pathname) { | ||
pathname = decodeURIComponent(pathname); | ||
try { | ||
@@ -96,3 +152,42 @@ let file = (0, path_1.resolve)((0, path_1.join)(site_dir, pathname)); | ||
} | ||
function scanImageDir(dir) { | ||
let result = { | ||
url: dir.replace(site_dir, ''), | ||
name: (0, path_1.basename)(dir), | ||
images: [], | ||
dirs: [], | ||
total_image_count: 0, | ||
}; | ||
let filenames = (0, fs_1.readdirSync)(dir); | ||
for (let filename of filenames) { | ||
let file = (0, path_1.join)(dir, filename); | ||
let stat = (0, fs_1.statSync)(file); | ||
if (stat.isDirectory()) { | ||
let dir = scanImageDir(file); | ||
if (dir.total_image_count > 0) { | ||
result.total_image_count += dir.total_image_count; | ||
result.dirs.push(dir); | ||
} | ||
} | ||
else if (stat.isFile()) { | ||
let mime = (0, mime_detect_1.detectFilenameMime)(filename); | ||
if (!mime.startsWith('image/')) | ||
continue; | ||
let url_dir = dir.replace(site_dir, ''); | ||
result.images.push({ | ||
dir: url_dir, | ||
filename, | ||
size: (0, format_1.format_byte)(stat.size), | ||
url: (0, path_1.join)(url_dir, filename), | ||
}); | ||
result.total_image_count++; | ||
} | ||
} | ||
return result; | ||
} | ||
app.use((req, res, next) => { | ||
if (req.method !== 'GET') { | ||
next(); | ||
return; | ||
} | ||
try { | ||
@@ -99,0 +194,0 @@ let file = resolveSiteFile(req.path); |
{ | ||
"name": "auto-cms-server", | ||
"version": "0.4.0", | ||
"version": "0.5.0", | ||
"description": "Auto turn any webpage into editable CMS without coding.", | ||
@@ -41,11 +41,17 @@ "keywords": [ | ||
"dependencies": { | ||
"@beenotung/tslib": "^23.2.0", | ||
"bytes": "^3.1.2", | ||
"dotenv": "^16.3.1", | ||
"express": "^4.18.2", | ||
"express-session": "^1.17.3", | ||
"formidable": "^3.5.1", | ||
"listening-on": "^2.0.9", | ||
"mime-detect": "^1.2.0", | ||
"populate-env": "^2.0.0" | ||
}, | ||
"devDependencies": { | ||
"@types/bytes": "^3.1.4", | ||
"@types/express": "^4.17.21", | ||
"@types/express-session": "^1.17.10", | ||
"@types/formidable": "^3.4.5", | ||
"@types/node": "^20.11.4", | ||
@@ -52,0 +58,0 @@ "esbuild": "^0.19.11", |
@@ -298,4 +298,4 @@ "use strict"; | ||
button.textContent = "Saving"; | ||
fetch("/auto-cms/save", { | ||
method: "POST", | ||
fetch("/auto-cms/file", { | ||
method: "PUT", | ||
headers: { | ||
@@ -302,0 +302,0 @@ "Content-Type": "text/html", |
@@ -16,4 +16,11 @@ # auto-cms | ||
- video | ||
- [ ] media upload | ||
- [x] media management | ||
- view | ||
- upload | ||
- delete | ||
- [ ] style editing | ||
- text alignment | ||
- text color | ||
- font size | ||
- font family | ||
- [x] SEO settings | ||
@@ -20,0 +27,0 @@ - title |
Sorry, the diff of this file is not supported yet
37239
10
656
56
9
13
+ Added@beenotung/tslib@^23.2.0
+ Addedbytes@^3.1.2
+ Addedformidable@^3.5.1
+ Addedmime-detect@^1.2.0
+ Added@beenotung/tslib@23.12.1(transitive)
+ Addedasap@2.0.6(transitive)
+ Addedcache-dir.ts@1.1.0(transitive)
+ Addeddezalgo@1.0.4(transitive)
+ Addedformidable@3.5.2(transitive)
+ Addedheic2any@0.0.4(transitive)
+ Addedhexoid@2.0.0(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedmime-db@1.53.0(transitive)
+ Addedmime-detect@1.3.0(transitive)
+ Addednode-localstorage@3.0.5(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedsignal-exit@4.1.0(transitive)
+ Addedtimezone-date.ts@2.0.1(transitive)
+ Addedtslib@2.8.1(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedwrite-file-atomic@5.0.1(transitive)