mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-22 01:44:24 +01:00
faa28b5a44
Move `public/*` to `public/assets/*` Some old PRs (like #15219) introduced inconsistent directory system. For example: why the local directory "public" is accessed by `http://site/assets`? How to serve the ".well-known" files properly in the public directory? For convention rules, the "public" directory is widely used for the website's root directory. It shouldn't be an exception for Gitea. So, this PR makes the things consistent: * `http://site/assets/foo` means `{CustomPath}/public/assets/foo`. * `{CustomPath}/public/.well-known` and `{CustomPath}/public/robots.txt` can be used in the future. This PR is also a prerequisite for a clear solution for: * #21942 * #25892 * discourse.gitea.io: [.well-known path serving custom files behind proxy?](https://discourse.gitea.io/t/well-known-path-serving-custom-files-behind-proxy/5445/1) This PR is breaking for users who have custom "public" files (CSS/JS). After getting approvals, I will update the documents. ---- ## ⚠️ BREAKING ⚠️ If you have files in your "custom/public/" folder, please move them to "custom/public/assets/". --------- Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Giteabot <teabot@gitea.io>
67 lines
2 KiB
JavaScript
Executable file
67 lines
2 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
import fastGlob from 'fast-glob';
|
|
import {optimize} from 'svgo';
|
|
import {parse} from 'node:path';
|
|
import {readFile, writeFile, mkdir} from 'node:fs/promises';
|
|
import {fileURLToPath} from 'node:url';
|
|
|
|
const glob = (pattern) => fastGlob.sync(pattern, {
|
|
cwd: fileURLToPath(new URL('..', import.meta.url)),
|
|
absolute: true,
|
|
});
|
|
|
|
function exit(err) {
|
|
if (err) console.error(err);
|
|
process.exit(err ? 1 : 0);
|
|
}
|
|
|
|
async function processFile(file, {prefix, fullName} = {}) {
|
|
let name;
|
|
if (fullName) {
|
|
name = fullName;
|
|
} else {
|
|
name = parse(file).name;
|
|
if (prefix) name = `${prefix}-${name}`;
|
|
if (prefix === 'octicon') name = name.replace(/-[0-9]+$/, ''); // chop of '-16' on octicons
|
|
}
|
|
|
|
// Set the `xmlns` attribute so that the files are displayable in standalone documents
|
|
// The svg backend module will strip the attribute during startup for inline display
|
|
const {data} = optimize(await readFile(file, 'utf8'), {
|
|
plugins: [
|
|
{name: 'preset-default'},
|
|
{name: 'removeDimensions'},
|
|
{name: 'prefixIds', params: {prefix: () => name}},
|
|
{name: 'addClassesToSVGElement', params: {classNames: ['svg', name]}},
|
|
{
|
|
name: 'addAttributesToSVGElement', params: {
|
|
attributes: [
|
|
{'xmlns': 'http://www.w3.org/2000/svg'},
|
|
{'width': '16'}, {'height': '16'}, {'aria-hidden': 'true'},
|
|
]
|
|
}
|
|
},
|
|
],
|
|
});
|
|
|
|
await writeFile(fileURLToPath(new URL(`../public/assets/img/svg/${name}.svg`, import.meta.url)), data);
|
|
}
|
|
|
|
function processFiles(pattern, opts) {
|
|
return glob(pattern).map((file) => processFile(file, opts));
|
|
}
|
|
|
|
async function main() {
|
|
try {
|
|
await mkdir(fileURLToPath(new URL('../public/assets/img/svg', import.meta.url)), {recursive: true});
|
|
} catch {}
|
|
|
|
await Promise.all([
|
|
...processFiles('node_modules/@primer/octicons/build/svg/*-16.svg', {prefix: 'octicon'}),
|
|
...processFiles('web_src/svg/*.svg'),
|
|
...processFiles('public/assets/img/gitea.svg', {fullName: 'gitea-gitea'}),
|
|
]);
|
|
}
|
|
|
|
main().then(exit).catch(exit);
|