Ctrl K
ComunidadGuías…

apply-scope.mjs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { realpathSync } from 'node:fs';
import { isAbsolute, dirname, join, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { getCareerOpsRoot } from './path-resolver.mjs';
import { isMainModule } from './lib/is-main-module.mjs';
import { pathIsInsideCanonical } from './tracker-utils.mjs';

export class ApplyScopeError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ApplyScopeError';
  }
}

const LAUNCH_KEYS = new Set(['headless', 'channel', 'args', 'timeout']);
const LAUNCH_CHANNELS = new Set(['chrome', 'chromium', 'msedge']);
const ATTACH_ARG = /remote-debugging|user-data-dir|DevToolsActivePort|devtools/i;

function realOrLexical(p) {
  try {
    return realpathSync(p);
  } catch {
    return resolve(p);
  }
}

export function projectRoot() {
  return dirname(fileURLToPath(import.meta.url));
}

export function allowedRoots() {
  const code = projectRoot();
  const data = getCareerOpsRoot();
  if (realOrLexical(data) === realOrLexical(code)) return [code];
  return [code, data];
}

export function resolveInsideProject(root, candidate) {
  if (typeof candidate !== 'string' || candidate.trim() === '' || candidate.includes('\0')) {
    throw new ApplyScopeError('Apply refused a path outside the project.');
  }
  const abs = isAbsolute(candidate) ? resolve(candidate) : resolve(root, candidate);
  if (!pathIsInsideCanonical(abs, root)) {
    throw new ApplyScopeError('Apply refused a path outside the project.');
  }
  return abs;
}

function insideAnyRoot(candidate) {
  let last = new ApplyScopeError('Apply refused a path outside the project.');
  for (const root of allowedRoots()) {
    try {
      return resolveInsideProject(root, candidate);
    } catch (e) {
      last = e;
    }
  }
  throw last;
}

export function freshLaunchOptions(requested = {}) {
  if (requested == null || typeof requested !== 'object' || Array.isArray(requested)) {
    throw new ApplyScopeError('Apply refused to attach to an existing browser.');
  }
  for (const key of Object.keys(requested)) {
    if (!LAUNCH_KEYS.has(key)) {
      throw new ApplyScopeError('Apply refused to attach to an existing browser.');
    }
  }
  if (requested.channel != null && !LAUNCH_CHANNELS.has(requested.channel)) {
    throw new ApplyScopeError('Apply refused to attach to an existing browser.');
  }
  const args = requested.args ?? [];
  if (!Array.isArray(args) || args.some((arg) => ATTACH_ARG.test(String(arg)))) {
    throw new ApplyScopeError('Apply refused to attach to an existing browser.');
  }
  const options = {};
  if (requested.headless !== undefined) options.headless = Boolean(requested.headless);
  if (requested.channel !== undefined) options.channel = requested.channel;
  if (requested.timeout !== undefined) options.timeout = requested.timeout;
  if (args.length) options.args = args.map(String);
  return options;
}

export const HEADED_APPLY_LAUNCH = freshLaunchOptions({
  channel: 'chrome',
  headless: false,
  args: ['--window-position=-3200,-3200', '--window-size=1280,940'],
});

export const BUNDLED_HEADED_LAUNCH = freshLaunchOptions({
  headless: false,
  args: ['--window-position=-3200,-3200', '--window-size=1280,940'],
});

export function defaultLaunchOptions() {
  return freshLaunchOptions({ headless: false });
}

export function locateApplyReport(dataRoot, ref, io) {
  if (typeof ref !== 'string' || ref.trim() === '') return { ok: false, reason: 'missing' };
  const looksLikePath = /[\\/]/.test(ref) || isAbsolute(ref);
  if (looksLikePath) {
    const file = resolveInsideProject(dataRoot, ref);
    if (!io.exists(file)) return { ok: false, reason: 'missing' };
    return { ok: true, path: file };
  }
  const num = ref.trim().padStart(3, '0');
  const reportsDir = resolveInsideProject(dataRoot, 'reports');
  const names = io.list(reportsDir);
  const match = names.find((name) => name.startsWith(num));
  if (!match) return { ok: false, reason: 'missing' };
  return { ok: true, path: resolveInsideProject(dataRoot, join('reports', match)) };
}

function printUsage() {
  console.log('Usage: node apply-scope.mjs <root|check-path|launch-options>');
}

if (isMainModule(import.meta.url)) {
  const args = process.argv.slice(2);
  if (args.includes('--help') || args.includes('-h')) {
    printUsage();
    process.exit(0);
  }
  const [cmd, arg] = args;
  try {
    if (cmd === 'root') {
      for (const root of allowedRoots()) console.log(root);
    } else if (cmd === 'check-path') {
      console.log(insideAnyRoot(arg));
    } else if (cmd === 'launch-options') {
      console.log(JSON.stringify(defaultLaunchOptions()));
    } else {
      console.error('Usage: node apply-scope.mjs <root|check-path|launch-options>');
      process.exit(2);
    }
  } catch (e) {
    console.error(e instanceof Error ? e.message : String(e));
    process.exit(1);
  }
}