mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-09-30 01:51:20 +00:00
Some checks are pending
CodeQL / Analyze (python) (push) Waiting to run
Publish / RC guard (marker + release-PR skip) (push) Blocked by required conditions
Trivy Image Scan / Trivy (gitnexus-web) (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
Gitleaks / gitleaks (push) Waiting to run
Publish / Classify release event (push) Waiting to run
Publish / ci (push) Blocked by required conditions
Publish / Publish to npm (push) Blocked by required conditions
Publish / Build & Push RC Docker images (push) Blocked by required conditions
Scorecard / Scorecard analysis (push) Waiting to run
Trivy Image Scan / Trivy (gitnexus-cli) (push) Waiting to run
* fix(web): drop TypeScript 7-incompatible tsconfig paths Remove baseUrl and the dead ../shared include so web project references typecheck under TypeScript 7. Co-authored-by: Cursor <cursoragent@cursor.com> * test(cli): parse TypeScript with a TypeScript 6 API package Keep AST guards working after the named typescript package becomes 7, which no longer ships the Compiler API. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(lint): pin root TypeScript to the 6 API package Give typescript-eslint a TypeScript 6 peer so syntax-only lint still installs after CLI and web move to TypeScript 7. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(deps): compile first-party packages with TypeScript 7.0.2 Unify CLI and web on the same native compiler line as gitnexus-shared so typecheck and emit no longer split 5.x versus 7.x. Co-authored-by: Cursor <cursoragent@cursor.com> * docs(ci): describe parent TypeScript 7 as the shared compiler Stop saying web compiles shared with TypeScript 5 now that the parent lockfile is 7. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ci): compile shared from parent TypeScript on Vercel and skill-evolution Stop isolated npm installs in gitnexus-shared so those paths do not pull a second TypeScript 7 optional-platform tree. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: record TypeScript 7 typecheck and Dependabot major-split policy Keep contributor typecheck commands, and stop Dependabot from bumping shared onto a different TypeScript major than CLI and web. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(lint): pin root TypeScript to 5.9 so npm ci satisfies eslint peers typescript-eslint 8 peers typescript below 6.0.0, so the typescript6 alias made quality lint npm ci fail with ERESOLVE. Co-authored-by: Cursor <cursoragent@cursor.com> * test(cli): drop the TypeScript 6 Compiler API package TypeScript 7.0 has no classic createProgram surface, so parse-only guards now use Babel and Mode 4 uses the TypeScript 7 Checker. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: align contributor setup with parent TypeScript 7 compile Stop telling clones to npm-install gitnexus-shared; CI and Vercel already emit that package from a parent lib/tsc.js shim. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(web): typecheck React JSX on TypeScript 7 with explicit DOM libs TypeScript 7 no longer implies DOM or auto-includes @types, so the web app must declare React/JSX settings while Vite keeps plugin-react. Co-authored-by: Cursor <cursoragent@cursor.com> * test: pin Vercel --include=dev and share parse-only string helpers Production npm ci omits the web TypeScript unless --include=dev is on that install. Move staticStringValue next to the other Babel walk helpers so CLI help and contract tests share one source. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(autofix): apply prettier + eslint fixes via /autofix command --------- Co-authored-by: Gergo Magyar <gergomagyar0@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
132 lines
5.3 KiB
JavaScript
132 lines
5.3 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Build script that compiles gitnexus and inlines gitnexus-shared into the dist.
|
|
*
|
|
* Steps:
|
|
* 1. Build gitnexus-shared (tsc)
|
|
* 2. Build gitnexus (tsc)
|
|
* 3. Copy gitnexus-shared/dist → dist/_shared
|
|
* 4. Rewrite bare 'gitnexus-shared' specifiers → relative paths
|
|
*/
|
|
import { execFileSync } from 'node:child_process';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { runWebBuild } from './build-web.js';
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
const ROOT = path.resolve(__dirname, '..');
|
|
const SHARED_ROOT = path.resolve(ROOT, '..', 'gitnexus-shared');
|
|
const DIST = path.join(ROOT, 'dist');
|
|
const SHARED_DEST = path.join(DIST, '_shared');
|
|
const DEFAULT_BUILD_TIMEOUT_MS = 600_000;
|
|
|
|
function getBuildTimeoutMs() {
|
|
const raw = process.env.GITNEXUS_BUILD_TIMEOUT_MS;
|
|
if (raw === undefined || raw.trim() === '') return DEFAULT_BUILD_TIMEOUT_MS;
|
|
|
|
const parsed = Number.parseInt(raw, 10);
|
|
if (Number.isFinite(parsed) && parsed > 0) return parsed;
|
|
|
|
console.warn(
|
|
`[build] ignoring invalid GITNEXUS_BUILD_TIMEOUT_MS=${JSON.stringify(raw)}; using ${DEFAULT_BUILD_TIMEOUT_MS}ms`,
|
|
);
|
|
return DEFAULT_BUILD_TIMEOUT_MS;
|
|
}
|
|
|
|
const BUILD_TIMEOUT_MS = getBuildTimeoutMs();
|
|
|
|
// Published-package guard: when installed from the npm registry the
|
|
// monorepo sibling `gitnexus-shared` does not exist and `dist/` is
|
|
// already pre-built. Skip the build to avoid a misleading ENOENT
|
|
// crash (#1795).
|
|
if (!fs.existsSync(SHARED_ROOT)) {
|
|
if (fs.existsSync(DIST)) {
|
|
console.log('[build] skipping — dist/ already present (published package).');
|
|
process.exit(0);
|
|
}
|
|
console.error(
|
|
`[build] gitnexus-shared not found at ${SHARED_ROOT} and no dist/ exists.\n` +
|
|
'Are you running from the monorepo checkout? Run `npm install` from the repo root first.',
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
// Launch tsc as `node typescript/lib/tsc.js` on every OS. The `.bin/tsc` /
|
|
// `tsc.cmd` shims are Windows-only wrappers; `execFileSync` cannot spawn a
|
|
// `.cmd` without a shell, and a separate `npm ci` in gitnexus-shared would
|
|
// pull a second TypeScript 7 optional-platform install (7+ minutes in CI).
|
|
const tscJs = path.join(ROOT, 'node_modules', 'typescript', 'lib', 'tsc.js');
|
|
if (!fs.existsSync(tscJs)) {
|
|
console.error(
|
|
`[build] missing ${tscJs}. Install gitnexus dependencies first (npm ci in gitnexus/).`,
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
function runTsc(cwd) {
|
|
execFileSync(process.execPath, [tscJs], { cwd, stdio: 'inherit', timeout: BUILD_TIMEOUT_MS });
|
|
}
|
|
|
|
// ── 1. Build gitnexus-shared ───────────────────────────────────────
|
|
console.log('[build] compiling gitnexus-shared…');
|
|
runTsc(SHARED_ROOT);
|
|
|
|
// ── 2. Build gitnexus ──────────────────────────────────────────────
|
|
console.log('[build] compiling gitnexus…');
|
|
runTsc(ROOT);
|
|
|
|
// ── 3. Copy shared dist ────────────────────────────────────────────
|
|
console.log('[build] copying shared module into dist/_shared…');
|
|
fs.cpSync(path.join(SHARED_ROOT, 'dist'), SHARED_DEST, { recursive: true });
|
|
|
|
// ── 4. Rewrite imports ─────────────────────────────────────────────
|
|
console.log('[build] rewriting gitnexus-shared imports…');
|
|
let rewritten = 0;
|
|
|
|
function rewriteFile(filePath) {
|
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
if (!content.includes('gitnexus-shared')) return;
|
|
|
|
const relDir = path.relative(path.dirname(filePath), SHARED_DEST);
|
|
// Always use posix separators and point to the package index
|
|
const relImport = relDir.split(path.sep).join('/') + '/index.js';
|
|
|
|
const updated = content
|
|
.replace(/from\s+['"]gitnexus-shared['"]/g, `from '${relImport}'`)
|
|
.replace(/import\(\s*['"]gitnexus-shared['"]\s*\)/g, `import('${relImport}')`);
|
|
|
|
if (updated !== content) {
|
|
fs.writeFileSync(filePath, updated);
|
|
rewritten++;
|
|
}
|
|
}
|
|
|
|
function walk(dir, extensions, cb) {
|
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
const full = path.join(dir, entry.name);
|
|
if (entry.isDirectory()) {
|
|
walk(full, extensions, cb);
|
|
} else if (extensions.some((ext) => entry.name.endsWith(ext))) {
|
|
cb(full);
|
|
}
|
|
}
|
|
}
|
|
|
|
walk(DIST, ['.js', '.d.ts'], rewriteFile);
|
|
|
|
// ── 5. Make CLI entry executable ────────────────────────────────────
|
|
const cliEntry = path.join(DIST, 'cli', 'index.js');
|
|
if (process.platform !== 'win32' && fs.existsSync(cliEntry)) {
|
|
fs.chmodSync(cliEntry, 0o755);
|
|
}
|
|
|
|
// ── 6. Build & copy web UI (opt-in) ─────────────────────────────────
|
|
// Web UI is a separate package and is only required in the published
|
|
// tarball, so it is built by `prepack --web`, not by `prepare`. Serve
|
|
// falls back to the landing page when web/ is absent. CLI-only builds
|
|
// delete stale web/ except during npm pack/publish prepare, which must
|
|
// keep the prepack output.
|
|
runWebBuild({ root: ROOT, dist: DIST, timeoutMs: BUILD_TIMEOUT_MS });
|
|
|
|
console.log(`[build] done — rewrote ${rewritten} files.`);
|