Compare commits
1 Commits
fix/update
...
bump_pve91
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf63774bef |
@@ -43,10 +43,6 @@ const config = {
|
|||||||
'http://192.168.*',
|
'http://192.168.*',
|
||||||
],
|
],
|
||||||
|
|
||||||
turbopack: {
|
|
||||||
// Disable Turbopack and use Webpack instead for compatibility
|
|
||||||
// This is necessary for server-side code that uses child_process
|
|
||||||
},
|
|
||||||
webpack: (config, { dev, isServer }) => {
|
webpack: (config, { dev, isServer }) => {
|
||||||
if (dev && !isServer) {
|
if (dev && !isServer) {
|
||||||
config.watchOptions = {
|
config.watchOptions = {
|
||||||
@@ -54,15 +50,12 @@ const config = {
|
|||||||
aggregateTimeout: 300,
|
aggregateTimeout: 300,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// Handle server-side modules
|
|
||||||
if (isServer) {
|
|
||||||
config.externals = config.externals || [];
|
|
||||||
if (!config.externals.includes('child_process')) {
|
|
||||||
config.externals.push('child_process');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
|
// Ignore ESLint errors during build (they can be fixed separately)
|
||||||
|
eslint: {
|
||||||
|
ignoreDuringBuilds: true,
|
||||||
|
},
|
||||||
// Ignore TypeScript errors during build (they can be fixed separately)
|
// Ignore TypeScript errors during build (they can be fixed separately)
|
||||||
typescript: {
|
typescript: {
|
||||||
ignoreBuildErrors: true,
|
ignoreBuildErrors: true,
|
||||||
|
|||||||
2696
package-lock.json
generated
2696
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
27
package.json
27
package.json
@@ -4,11 +4,11 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "next build --webpack",
|
"build": "next build",
|
||||||
"check": "next lint && tsc --noEmit",
|
"check": "next lint && tsc --noEmit",
|
||||||
"dev": "next dev --webpack",
|
"dev": "next dev",
|
||||||
"dev:server": "node server.js",
|
"dev:server": "node server.js",
|
||||||
"dev:next": "next dev --webpack",
|
"dev:next": "next dev",
|
||||||
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,mdx}\" --cache",
|
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,mdx}\" --cache",
|
||||||
"format:write": "prettier --write \"**/*.{ts,tsx,js,jsx,mdx}\" --cache",
|
"format:write": "prettier --write \"**/*.{ts,tsx,js,jsx,mdx}\" --cache",
|
||||||
"lint": "next lint",
|
"lint": "next lint",
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^6.19.0",
|
"@prisma/client": "^6.18.0",
|
||||||
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||||
"@radix-ui/react-slot": "^1.2.3",
|
"@radix-ui/react-slot": "^1.2.3",
|
||||||
"@t3-oss/env-nextjs": "^0.13.8",
|
"@t3-oss/env-nextjs": "^0.13.8",
|
||||||
@@ -43,14 +43,14 @@
|
|||||||
"cron-validator": "^1.2.0",
|
"cron-validator": "^1.2.0",
|
||||||
"dotenv": "^17.2.3",
|
"dotenv": "^17.2.3",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"lucide-react": "^0.554.0",
|
"lucide-react": "^0.553.0",
|
||||||
"next": "^16.0.4",
|
"next": "^15.1.6",
|
||||||
"node-cron": "^4.2.1",
|
"node-cron": "^3.0.3",
|
||||||
"node-pty": "^1.0.0",
|
"node-pty": "^1.0.0",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-markdown": "^10.1.0",
|
"react-markdown": "^10.1.0",
|
||||||
"react-syntax-highlighter": "^16.1.0",
|
"react-syntax-highlighter": "^15.6.6",
|
||||||
"refractor": "^5.0.0",
|
"refractor": "^5.0.0",
|
||||||
"remark-gfm": "^4.0.1",
|
"remark-gfm": "^4.0.1",
|
||||||
"server-only": "^0.0.1",
|
"server-only": "^0.0.1",
|
||||||
@@ -74,10 +74,10 @@
|
|||||||
"@types/react": "^19.2.4",
|
"@types/react": "^19.2.4",
|
||||||
"@types/react-dom": "^19.2.2",
|
"@types/react-dom": "^19.2.2",
|
||||||
"@vitejs/plugin-react": "^5.1.0",
|
"@vitejs/plugin-react": "^5.1.0",
|
||||||
"@vitest/coverage-v8": "^4.0.13",
|
"@vitest/coverage-v8": "^3.2.4",
|
||||||
"@vitest/ui": "^4.0.13",
|
"@vitest/ui": "^3.2.4",
|
||||||
"eslint": "^9.39.1",
|
"eslint": "^9.39.1",
|
||||||
"eslint-config-next": "^16.0.4",
|
"eslint-config-next": "^15.1.6",
|
||||||
"jsdom": "^27.2.0",
|
"jsdom": "^27.2.0",
|
||||||
"postcss": "^8.5.3",
|
"postcss": "^8.5.3",
|
||||||
"prettier": "^3.5.3",
|
"prettier": "^3.5.3",
|
||||||
@@ -86,15 +86,12 @@
|
|||||||
"tailwindcss": "^4.1.17",
|
"tailwindcss": "^4.1.17",
|
||||||
"typescript": "^5.8.2",
|
"typescript": "^5.8.2",
|
||||||
"typescript-eslint": "^8.46.2",
|
"typescript-eslint": "^8.46.2",
|
||||||
"vitest": "^4.0.13"
|
"vitest": "^3.2.4"
|
||||||
},
|
},
|
||||||
"ct3aMetadata": {
|
"ct3aMetadata": {
|
||||||
"initVersion": "7.39.3"
|
"initVersion": "7.39.3"
|
||||||
},
|
},
|
||||||
"packageManager": "npm@10.9.3",
|
"packageManager": "npm@10.9.3",
|
||||||
"engines": {
|
|
||||||
"node": ">=24.0.0"
|
|
||||||
},
|
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"prismjs": "^1.30.0"
|
"prismjs": "^1.30.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ cleanup_lxc() {
|
|||||||
|
|
||||||
# Python pip
|
# Python pip
|
||||||
if command -v pip &>/dev/null; then $STD pip cache purge || true; fi
|
if command -v pip &>/dev/null; then $STD pip cache purge || true; fi
|
||||||
|
# Python uv
|
||||||
|
if command -v uv &>/dev/null; then $STD uv cache clear || true; fi
|
||||||
# Node.js npm
|
# Node.js npm
|
||||||
if command -v npm &>/dev/null; then $STD npm cache clean --force || true; fi
|
if command -v npm &>/dev/null; then $STD npm cache clean --force || true; fi
|
||||||
# Node.js yarn
|
# Node.js yarn
|
||||||
@@ -408,6 +410,7 @@ cleanup_lxc() {
|
|||||||
if command -v composer &>/dev/null; then $STD composer clear-cache || true; fi
|
if command -v composer &>/dev/null; then $STD composer clear-cache || true; fi
|
||||||
|
|
||||||
if command -v journalctl &>/dev/null; then
|
if command -v journalctl &>/dev/null; then
|
||||||
|
$STD journalctl --rotate || true
|
||||||
$STD journalctl --vacuum-time=10m || true
|
$STD journalctl --vacuum-time=10m || true
|
||||||
fi
|
fi
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -61,11 +61,7 @@ export function ScriptDetailModal({
|
|||||||
isLoading: comparisonLoading,
|
isLoading: comparisonLoading,
|
||||||
} = api.scripts.compareScriptContent.useQuery(
|
} = api.scripts.compareScriptContent.useQuery(
|
||||||
{ slug: script?.slug ?? "" },
|
{ slug: script?.slug ?? "" },
|
||||||
{
|
{ enabled: !!script && isOpen },
|
||||||
enabled: !!script && isOpen,
|
|
||||||
refetchOnMount: true,
|
|
||||||
staleTime: 0,
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Load script mutation
|
// Load script mutation
|
||||||
@@ -551,60 +547,19 @@ export function ScriptDetailModal({
|
|||||||
</div>
|
</div>
|
||||||
{scriptFilesData?.success &&
|
{scriptFilesData?.success &&
|
||||||
(scriptFilesData.ctExists ||
|
(scriptFilesData.ctExists ||
|
||||||
scriptFilesData.installExists) && (
|
scriptFilesData.installExists) &&
|
||||||
|
comparisonData?.success &&
|
||||||
|
!comparisonLoading && (
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
{comparisonData?.success ? (
|
<div
|
||||||
<>
|
className={`h-2 w-2 rounded-full ${comparisonData.hasDifferences ? "bg-warning" : "bg-success"}`}
|
||||||
<div
|
></div>
|
||||||
className={`h-2 w-2 rounded-full ${comparisonData.hasDifferences ? "bg-warning" : "bg-success"}`}
|
<span>
|
||||||
></div>
|
Status:{" "}
|
||||||
<span>
|
{comparisonData.hasDifferences
|
||||||
Status:{" "}
|
? "Update available"
|
||||||
{comparisonData.hasDifferences
|
: "Up to date"}
|
||||||
? "Update available"
|
</span>
|
||||||
: "Up to date"}
|
|
||||||
</span>
|
|
||||||
</>
|
|
||||||
) : comparisonLoading ? (
|
|
||||||
<>
|
|
||||||
<div className="h-2 w-2 rounded-full bg-muted animate-pulse"></div>
|
|
||||||
<span>Checking for updates...</span>
|
|
||||||
</>
|
|
||||||
) : comparisonData?.error ? (
|
|
||||||
<>
|
|
||||||
<div className="h-2 w-2 rounded-full bg-destructive"></div>
|
|
||||||
<span className="text-destructive">Error: {comparisonData.error}</span>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<div className="h-2 w-2 rounded-full bg-muted"></div>
|
|
||||||
<span>Status: Unknown</span>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
<button
|
|
||||||
onClick={() => void refetchComparison()}
|
|
||||||
disabled={comparisonLoading}
|
|
||||||
className="ml-2 p-1.5 rounded-md hover:bg-accent transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center"
|
|
||||||
title="Refresh comparison"
|
|
||||||
>
|
|
||||||
{comparisonLoading ? (
|
|
||||||
<div className="h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent"></div>
|
|
||||||
) : (
|
|
||||||
<svg
|
|
||||||
className="h-4 w-4 text-muted-foreground hover:text-foreground"
|
|
||||||
fill="none"
|
|
||||||
stroke="currentColor"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
strokeLinecap="round"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
strokeWidth={2}
|
|
||||||
d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -519,16 +519,13 @@ export class ScriptDownloaderService {
|
|||||||
comparisonPromises.push(
|
comparisonPromises.push(
|
||||||
this.compareSingleFile(script, scriptPath, `${finalTargetDir}/${fileName}`)
|
this.compareSingleFile(script, scriptPath, `${finalTargetDir}/${fileName}`)
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.error) {
|
|
||||||
console.error(`[Comparison] Error comparing ${result.filePath}: ${result.error}`);
|
|
||||||
}
|
|
||||||
if (result.hasDifferences) {
|
if (result.hasDifferences) {
|
||||||
hasDifferences = true;
|
hasDifferences = true;
|
||||||
differences.push(result.filePath);
|
differences.push(result.filePath);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch(() => {
|
||||||
console.error(`[Comparison] Promise error for ${scriptPath}:`, error);
|
// Don't add to differences if there's an error reading files
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -544,16 +541,13 @@ export class ScriptDownloaderService {
|
|||||||
comparisonPromises.push(
|
comparisonPromises.push(
|
||||||
this.compareSingleFile(script, installScriptPath, installScriptPath)
|
this.compareSingleFile(script, installScriptPath, installScriptPath)
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.error) {
|
|
||||||
console.error(`[Comparison] Error comparing ${result.filePath}: ${result.error}`);
|
|
||||||
}
|
|
||||||
if (result.hasDifferences) {
|
if (result.hasDifferences) {
|
||||||
hasDifferences = true;
|
hasDifferences = true;
|
||||||
differences.push(result.filePath);
|
differences.push(result.filePath);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch(() => {
|
||||||
console.error(`[Comparison] Promise error for ${installScriptPath}:`, error);
|
// Don't add to differences if there's an error reading files
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -573,16 +567,13 @@ export class ScriptDownloaderService {
|
|||||||
comparisonPromises.push(
|
comparisonPromises.push(
|
||||||
this.compareSingleFile(script, alpineInstallScriptPath, alpineInstallScriptPath)
|
this.compareSingleFile(script, alpineInstallScriptPath, alpineInstallScriptPath)
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.error) {
|
|
||||||
console.error(`[Comparison] Error comparing ${result.filePath}: ${result.error}`);
|
|
||||||
}
|
|
||||||
if (result.hasDifferences) {
|
if (result.hasDifferences) {
|
||||||
hasDifferences = true;
|
hasDifferences = true;
|
||||||
differences.push(result.filePath);
|
differences.push(result.filePath);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch(() => {
|
||||||
console.error(`[Comparison] Promise error for ${alpineInstallScriptPath}:`, error);
|
// Don't add to differences if there's an error reading files
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
} catch {
|
} catch {
|
||||||
@@ -593,11 +584,10 @@ export class ScriptDownloaderService {
|
|||||||
// Wait for all comparisons to complete
|
// Wait for all comparisons to complete
|
||||||
await Promise.all(comparisonPromises);
|
await Promise.all(comparisonPromises);
|
||||||
|
|
||||||
console.log(`[Comparison] Completed comparison for ${script.slug}: hasDifferences=${hasDifferences}, differences=${differences.length}`);
|
|
||||||
return { hasDifferences, differences };
|
return { hasDifferences, differences };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`[Comparison] Error comparing script content for ${script.slug}:`, error);
|
console.error('Error comparing script content:', error);
|
||||||
return { hasDifferences: false, differences: [], error: error.message };
|
return { hasDifferences: false, differences: [] };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -607,21 +597,16 @@ export class ScriptDownloaderService {
|
|||||||
const repoUrl = this.getRepoUrlForScript(script);
|
const repoUrl = this.getRepoUrlForScript(script);
|
||||||
const branch = process.env.REPO_BRANCH || 'main';
|
const branch = process.env.REPO_BRANCH || 'main';
|
||||||
|
|
||||||
console.log(`[Comparison] Comparing ${filePath} from ${repoUrl} (branch: ${branch})`);
|
|
||||||
|
|
||||||
// Read local content
|
// Read local content
|
||||||
const localContent = await readFile(localPath, 'utf-8');
|
const localContent = await readFile(localPath, 'utf-8');
|
||||||
console.log(`[Comparison] Local file size: ${localContent.length} bytes`);
|
|
||||||
|
|
||||||
// Download remote content from the script's repository
|
// Download remote content from the script's repository
|
||||||
const remoteContent = await this.downloadFileFromGitHub(repoUrl, remotePath, branch);
|
const remoteContent = await this.downloadFileFromGitHub(repoUrl, remotePath, branch);
|
||||||
console.log(`[Comparison] Remote file size: ${remoteContent.length} bytes`);
|
|
||||||
|
|
||||||
// Apply modification only for CT scripts, not for other script types
|
// Apply modification only for CT scripts, not for other script types
|
||||||
let modifiedRemoteContent;
|
let modifiedRemoteContent;
|
||||||
if (remotePath.startsWith('ct/')) {
|
if (remotePath.startsWith('ct/')) {
|
||||||
modifiedRemoteContent = this.modifyScriptContent(remoteContent);
|
modifiedRemoteContent = this.modifyScriptContent(remoteContent);
|
||||||
console.log(`[Comparison] Applied CT script modifications`);
|
|
||||||
} else {
|
} else {
|
||||||
modifiedRemoteContent = remoteContent; // Don't modify tools or vm scripts
|
modifiedRemoteContent = remoteContent; // Don't modify tools or vm scripts
|
||||||
}
|
}
|
||||||
@@ -629,17 +614,10 @@ export class ScriptDownloaderService {
|
|||||||
// Compare content
|
// Compare content
|
||||||
const hasDifferences = localContent !== modifiedRemoteContent;
|
const hasDifferences = localContent !== modifiedRemoteContent;
|
||||||
|
|
||||||
if (hasDifferences) {
|
|
||||||
console.log(`[Comparison] Differences found in ${filePath}`);
|
|
||||||
} else {
|
|
||||||
console.log(`[Comparison] No differences in ${filePath}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return { hasDifferences, filePath };
|
return { hasDifferences, filePath };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`[Comparison] Error comparing file ${filePath}:`, error.message);
|
console.error(`Error comparing file ${filePath}:`, error);
|
||||||
// Return error information so it can be handled upstream
|
return { hasDifferences: false, filePath };
|
||||||
return { hasDifferences: false, filePath, error: error.message };
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"module": "ESNext",
|
"module": "ESNext",
|
||||||
"moduleResolution": "Bundler",
|
"moduleResolution": "Bundler",
|
||||||
"jsx": "react-jsx",
|
"jsx": "preserve",
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
"name": "next"
|
"name": "next"
|
||||||
|
|||||||
Reference in New Issue
Block a user