118 lines
4.0 KiB
TypeScript
118 lines
4.0 KiB
TypeScript
import { getPayload } from 'payload'
|
|
import configPromise from '../src/payload.config'
|
|
import fs from 'fs'
|
|
|
|
const ALLOWED_DUPLICATES = [
|
|
"b.b.h. Lohnsteuerhilfeverein e.V.",
|
|
"§4 Nr. 11 StBerG",
|
|
"Finanz- & Lohnbuchhaltung",
|
|
"Dipl.-Ing. Janusz Kędzierski",
|
|
"JK"
|
|
]
|
|
|
|
function isAllowedDuplicate(val: string): boolean {
|
|
if (!val || typeof val !== 'string') return true;
|
|
const trimmed = val.trim();
|
|
if (ALLOWED_DUPLICATES.includes(trimmed)) return true;
|
|
if (trimmed.startsWith('http') || trimmed.startsWith('/') || trimmed.startsWith('tel:') || trimmed.startsWith('mailto:')) return true;
|
|
// phone numbers, pure digits
|
|
if (/^[\d\s\+\-\(\)]+$/.test(trimmed)) return true;
|
|
// emails
|
|
if (trimmed.includes('@') && !trimmed.includes(' ')) return true;
|
|
return false;
|
|
}
|
|
|
|
function extractText(val: any): string {
|
|
if (typeof val === 'string') return val;
|
|
if (val && typeof val === 'object' && val.root && val.root.children) {
|
|
// Basic rich text extractor
|
|
let text = '';
|
|
const traverse = (node: any) => {
|
|
if (node.text) text += node.text;
|
|
if (node.children) node.children.forEach(traverse);
|
|
};
|
|
traverse(val.root);
|
|
return text.trim();
|
|
}
|
|
return JSON.stringify(val);
|
|
}
|
|
|
|
function compareObjects(objPL: any, objDE: any, path: string, results: string[]) {
|
|
if (!objPL || !objDE) return;
|
|
if (typeof objPL !== 'object' || typeof objDE !== 'object') return;
|
|
|
|
// If array
|
|
if (Array.isArray(objPL)) {
|
|
for (let i = 0; i < objPL.length; i++) {
|
|
compareObjects(objPL[i], objDE[i], `${path}[${i}]`, results);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Iterate keys
|
|
for (const key of Object.keys(objPL)) {
|
|
if ([
|
|
'id', 'createdAt', 'updatedAt', 'blockType', 'blockName',
|
|
'slug', 'value', 'name', 'icon', 'globalType', 'confirmationType',
|
|
'type', 'url', 'siteName', 'titleOrder', 'titleSeparator',
|
|
'defaultTheme', 'relationTo', 'status'
|
|
].includes(key)) continue;
|
|
|
|
const valPL = objPL[key];
|
|
const valDE = objDE[key];
|
|
|
|
if (typeof valPL === 'string' || (valPL && valPL.root)) {
|
|
const textPL = extractText(valPL);
|
|
const textDE = extractText(valDE);
|
|
|
|
if (textPL && textPL === textDE) {
|
|
if (!isAllowedDuplicate(textPL)) {
|
|
results.push(`[PODEJRZANY DUPLIKAT] ${path}.${key} | PL: "${textPL.substring(0, 50).replace(/\n/g, ' ')}" | DE: "${textDE.substring(0, 50).replace(/\n/g, ' ')}"`);
|
|
}
|
|
}
|
|
} else if (typeof valPL === 'object') {
|
|
compareObjects(valPL, valDE, `${path}.${key}`, results);
|
|
}
|
|
}
|
|
}
|
|
|
|
async function run() {
|
|
const payload = await getPayload({ config: configPromise })
|
|
const results: string[] = [];
|
|
|
|
console.log('Fetching pages...');
|
|
const pagesPL = await payload.find({ collection: 'pages', depth: 2, locale: 'pl', limit: 100 })
|
|
const pagesDE = await payload.find({ collection: 'pages', depth: 2, locale: 'de', limit: 100 })
|
|
|
|
for (const pagePL of pagesPL.docs) {
|
|
const pageDE = pagesDE.docs.find(p => p.id === pagePL.id)
|
|
if (pageDE) {
|
|
compareObjects(pagePL, pageDE, `Page(${pagePL.slug})`, results);
|
|
}
|
|
}
|
|
|
|
const globals = ['header', 'footer', 'company', 'site-settings']
|
|
for (const slug of globals) {
|
|
console.log(`Fetching global ${slug}...`);
|
|
const globalPL = await payload.findGlobal({ slug: slug as any, depth: 2, locale: 'pl' })
|
|
const globalDE = await payload.findGlobal({ slug: slug as any, depth: 2, locale: 'de' })
|
|
compareObjects(globalPL, globalDE, `Global(${slug})`, results);
|
|
}
|
|
|
|
console.log('Fetching forms...');
|
|
const formsPL = await payload.find({ collection: 'forms', depth: 2, locale: 'pl', limit: 100 })
|
|
const formsDE = await payload.find({ collection: 'forms', depth: 2, locale: 'de', limit: 100 })
|
|
|
|
for (const formPL of formsPL.docs) {
|
|
const formDE = formsDE.docs.find(f => f.id === formPL.id)
|
|
if (formDE) {
|
|
compareObjects(formPL, formDE, `Form(${formPL.title})`, results);
|
|
}
|
|
}
|
|
|
|
fs.writeFileSync('audit_results.txt', results.join('\n'));
|
|
console.log(`Audit complete. Found ${results.length} suspicious fields.`);
|
|
process.exit(0)
|
|
}
|
|
run()
|