Files
memind/scripts/verify-mindspace-page-sync-guards.mjs

69 lines
1.8 KiB
JavaScript
Raw Permalink Normal View History

import fs from 'node:fs';
import path from 'node:path';
const root = path.resolve(new URL('..', import.meta.url).pathname);
function read(relativePath) {
return fs.readFileSync(path.join(root, relativePath), 'utf8');
}
function assertIncludes(label, source, snippet) {
if (!source.includes(snippet)) {
throw new Error(`${label} is missing required guard snippet:\n${snippet}`);
}
}
const serverSource = read('server.mjs');
const pagesSource = read('mindspace-pages.mjs');
const contractSource = read('mindspace-server-adapter-contract.mjs');
assertIncludes(
'server.mjs syncUserGeneratedPages',
serverSource,
'await mindSpacePageSync.syncUserGeneratedPages(userId);',
);
if (serverSource.includes("mindSpaceServerRuntime.adapterKind === 'remote'")) {
throw new Error(
'server.mjs must not skip page sync in remote mode; use pageSyncService RPC instead',
);
}
assertIncludes(
'mindspace-server-adapter-contract.mjs',
contractSource,
"pageSyncService: Object.freeze(['syncUserGeneratedPages'])",
);
assertIncludes(
'mindspace-pages.mjs',
pagesSource,
'readPageContentWithWorkspaceFallback',
);
assertIncludes(
'mindspace-pages.mjs workspace fallback',
pagesSource,
"snapshot.relative_path ?? null",
);
const publicSiteBasesSource = read('src/utils/public-site-bases.mjs');
const publicUrlSource = read('src/utils/publicUrl.ts');
const buildRuntimeSource = read('scripts/build-portal-runtime.mjs');
assertIncludes(
'public-site-bases.mjs loopback guard',
publicSiteBasesSource,
'isLoopbackPublicBase',
);
assertIncludes(
'publicUrl.ts uses public-site-bases',
publicUrlSource,
"from './public-site-bases.mjs'",
);
assertIncludes(
'build-portal-runtime.mjs production plaza default',
buildRuntimeSource,
'https://plaza.tkmind.cn',
);
console.log('mindspace page sync + thumbnail regression guards ok');