build: package persistent deployment and maintenance commands
This commit is contained in:
@@ -1,10 +1,27 @@
|
||||
import { cp } from 'node:fs/promises';
|
||||
import { cp, readdir, rm } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
|
||||
const projectRoot = path.resolve('.');
|
||||
const standaloneRoot = path.join(projectRoot, '.next', 'standalone');
|
||||
|
||||
// Instrumentation traces can bypass Next's route-level exclusions. Runtime
|
||||
// state belongs to the mounted volume, never to a distributable build.
|
||||
async function removeRuntimeState(directory) {
|
||||
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
||||
const target = path.resolve(directory, entry.name);
|
||||
if (!target.startsWith(`${standaloneRoot}${path.sep}`)) throw new Error('Invalid package path');
|
||||
if (entry.name === 'node_modules') continue;
|
||||
if (entry.name === 'data' || entry.name === 'backups' || entry.name === 'auth-secret' || /\.sqlite(?:-|$)/.test(entry.name) || /^\.env(?:\.|$)/.test(entry.name)) {
|
||||
await rm(target, { recursive: entry.isDirectory(), force: true });
|
||||
} else if (entry.isDirectory()) {
|
||||
await removeRuntimeState(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
await removeRuntimeState(standaloneRoot);
|
||||
|
||||
await cp(path.join(projectRoot, 'public'), path.join(standaloneRoot, 'public'), { recursive: true });
|
||||
await cp(path.join(projectRoot, 'migrations'), path.join(standaloneRoot, 'migrations'), { recursive: true });
|
||||
await cp(
|
||||
path.join(projectRoot, '.next', 'static'),
|
||||
path.join(standaloneRoot, '.next', 'static'),
|
||||
|
||||
Reference in New Issue
Block a user