{
  "version": 3,
  "sources": ["../src/index.ts", "../src/helpers/get-ocular-config.ts", "../src/helpers/aliases.ts", "../src/utils/utils.ts"],
  "sourcesContent": ["export {getOcularConfig} from './helpers/get-ocular-config.js';\n\nexport type {OcularConfig} from './helpers/get-ocular-config.js';\n", "/* @typedef {import('./get-ocular-config')} default */\n\nimport fs from 'fs';\nimport {resolve} from 'path';\nimport getAliases, {getModuleInfo} from './aliases.js';\nimport {shallowMerge, getValidPath, ocularRoot} from '../utils/utils.js';\nimport type {BrowserTestDriver} from '@probe.gl/test-utils';\n\n// TODO - export from probe.gl\ntype BrowserTestOptions = Parameters<BrowserTestDriver['run']>[0];\n\n/** User configuration from .ocularrc.js */\nexport type OcularConfig = {\n  root?: string;\n\n  aliases?: {[module: string]: string};\n\n  nodeAliases?: {[module: string]: string};\n\n  bundle?: {\n    target?: string[];\n    globalName?: string;\n    format?: 'cjs' | 'esm' | 'umd' | 'iife';\n    externals?: string[];\n    globals?: {[pattern: string]: string};\n  };\n\n  typescript?: {\n    project: string;\n  };\n\n  lint?: {\n    paths?: string[];\n    extensions?: string[];\n  };\n\n  vite?: {\n    version?: number;\n    configPath?: string;\n  };\n\n  coverage?: {\n    test?: 'node' | 'browser';\n  };\n\n  browserTest?: {\n    server?: BrowserTestOptions['server'];\n    browser?: BrowserTestOptions['browser'];\n  };\n\n  entry?: {\n    test?: string;\n    'test-browser'?: `${string}.html`;\n    bench?: string;\n    'bench-browser'?: `${string}.html`;\n    size?: string[] | string;\n  };\n};\n\n/** Internal type to typecheck resolved ocular config inside ocular-dev-tools */\nexport type MaterializedOcularConfig = {\n  root: string;\n  ocularPath: string;\n  esm: boolean;\n\n  aliases: {[module: string]: string};\n\n  bundle: {\n    target?: string[];\n    globalName?: string;\n    format?: 'cjs' | 'esm' | 'umd' | 'iife';\n    externals?: string[];\n    globals: {[pattern: string]: string};\n  };\n\n  typescript: {\n    project: string;\n  };\n\n  lint: {\n    paths: string[];\n    extensions: string[];\n  };\n\n  vite: {\n    version: number;\n    configPath: string;\n  };\n\n  coverage: {\n    test: 'node' | 'browser';\n  };\n\n  browserTest?: {\n    server?: BrowserTestOptions['server'];\n    browser?: BrowserTestOptions['browser'];\n  };\n\n  entry: {\n    test: string;\n    'test-browser': `${string}.html`;\n    bench: string;\n    'bench-browser': `${string}.html`;\n    size: string[];\n  };\n};\n\nexport async function getOcularConfig(\n  options: {\n    root?: string;\n    aliasMode?: 'src' | 'dist';\n  } = {}\n): Promise<MaterializedOcularConfig> {\n  const packageRoot = options.root || process.env.PWD!;\n\n  const IS_MONOREPO = fs.existsSync(resolve(packageRoot, './modules'));\n\n  const userConfig = await getUserConfig(packageRoot);\n\n  const config: MaterializedOcularConfig = {\n    root: packageRoot,\n    ocularPath: ocularRoot,\n\n    esm: getModuleInfo(packageRoot)?.packageInfo.type === 'module',\n\n    bundle: {\n      globals: {}\n    },\n\n    typescript: {\n      project: 'tsconfig.json'\n    },\n\n    lint: {\n      paths: IS_MONOREPO ? ['modules'] : ['src'],\n      extensions: ['js', 'mjs', 'jsx', 'ts', 'tsx', 'd.ts']\n    },\n\n    coverage: {\n      test: 'node'\n    },\n\n    aliases: {},\n\n    entry: {\n      test: 'test/index.ts',\n      'test-browser': 'test/index.html',\n      bench: 'test/bench/index.ts',\n      'bench-browser': 'test/bench/index.html',\n      size: ['test/size.ts']\n    },\n\n    vite: {\n      version: 4,\n      configPath: getValidPath(\n        resolve(packageRoot, './vite.config.js'),\n        resolve(packageRoot, './vite.config.cjs'),\n        resolve(ocularRoot, 'dist/configuration/vite.config.js')\n      )!\n    }\n  };\n\n  shallowMerge(config, userConfig);\n\n  // Backward compatibility\n  if (typeof userConfig.entry?.size === 'string') {\n    userConfig.entry.size = [userConfig.entry.size];\n  }\n\n  const aliasMode = options.aliasMode || 'src';\n\n  // User's aliases need to come first, due to module-alias resolve order\n  Object.assign(config.aliases, getAliases(aliasMode, packageRoot));\n\n  if (aliasMode && !aliasMode.includes('browser')) {\n    Object.assign(config.aliases, userConfig.nodeAliases);\n  }\n\n  return config;\n}\n\n// HELPERS\n\n/**\n * TODO better error messages\n */\nasync function getUserConfig(packageRoot: string): Promise<OcularConfig> {\n  const userConfigPath = getValidPath(\n    resolve(packageRoot, './.ocularrc.js'),\n    resolve(packageRoot, './.ocularrc.cjs'),\n    resolve(packageRoot, './.ocular.config.js'),\n    resolve(packageRoot, './.ocular.config.cjs'),\n    // deprecated\n    resolve(packageRoot, './ocular-dev-tools.config.js')\n  );\n\n  if (userConfigPath) {\n    const userConfigModule = (await import(userConfigPath)) as\n      | OcularConfig\n      | {default: OcularConfig};\n    if ('default' in userConfigModule) {\n      return userConfigModule.default;\n    }\n    return userConfigModule;\n  }\n\n  throw new Error('No valid user config found');\n}\n", "// Registers an alias for this module\nimport {resolve} from 'path';\nimport fs from 'fs';\nimport {getValidPath} from '../utils/utils.js';\nimport type {PackageJson} from '../utils/types.js';\n\ntype ModuleInfo = {\n  name: string;\n  path: string;\n  packageInfo: PackageJson;\n};\n\nexport function getModuleInfo(path: string): ModuleInfo | null {\n  if (fs.lstatSync(path).isDirectory()) {\n    try {\n      const packageInfoText = fs.readFileSync(resolve(path, 'package.json'), 'utf-8');\n      const packageInfo = JSON.parse(packageInfoText) as PackageJson;\n      return {\n        name: packageInfo.name,\n        path,\n        packageInfo\n      };\n    } catch (err) {\n      // ignore if sub directory does not contain package.json\n    }\n  }\n  return null;\n}\n\n// Get information of all submodules\nfunction getSubmodules(packageRoot: string): {[name: string]: ModuleInfo} {\n  const submodules: Record<string, ModuleInfo> = {};\n  const parentPath = resolve(packageRoot, './modules');\n\n  if (fs.existsSync(parentPath)) {\n    // monorepo\n    fs.readdirSync(parentPath).forEach((item) => {\n      const itemPath = resolve(parentPath, item);\n      const moduleInfo = getModuleInfo(itemPath);\n      if (moduleInfo) {\n        submodules[moduleInfo.name] = moduleInfo;\n      }\n    });\n  } else {\n    const moduleInfo = getModuleInfo(packageRoot);\n    if (moduleInfo) {\n      submodules[moduleInfo.name] = moduleInfo;\n    }\n  }\n\n  return submodules;\n}\n\nexport default function getAliases(\n  mode: 'src' | 'dist',\n  packageRoot: string = process.env.PWD!\n): Record<string, string> {\n  const aliases: Record<string, string> = {};\n  const submodules = getSubmodules(packageRoot);\n\n  for (const moduleName in submodules) {\n    const {path} = submodules[moduleName];\n\n    const testPath = resolve(path, 'test');\n    if (fs.existsSync(testPath)) {\n      aliases[`${moduleName}/test`] = testPath;\n    }\n\n    if (mode === 'dist') {\n      aliases[moduleName] = getValidPath(\n        resolve(path, 'dist/es5'),\n        resolve(path, 'dist/esm'),\n        resolve(path, 'dist')\n      )!;\n    } else {\n      aliases[moduleName] = resolve(path, 'src');\n    }\n  }\n\n  return aliases;\n}\n", "import fs from 'fs';\nimport {resolve, dirname} from 'path';\nimport {fileURLToPath} from 'node:url';\nimport {execSync} from 'child_process';\n\nexport function execShellCommand(command: string, args: string[] = []) {\n  try {\n    execSync(`${command} ${args.join(' ')}`, {\n      stdio: 'inherit'\n    });\n  } catch (err: unknown) {\n    process.exit((err as any).status);\n  }\n}\n\n/** Returns the path to the root directory of ocular-dev-tools */\nexport const ocularRoot: string = (function () {\n  let dir;\n  try {\n    dir = __dirname;\n  } catch {\n    dir = dirname(fileURLToPath(import.meta.url));\n  }\n  return resolve(dir, '../..');\n})();\n\nexport function shallowMerge<T>(base: T, override: any): T {\n  for (const key in override) {\n    if (base[key] && typeof base[key] === 'object') {\n      Object.assign(base[key], override[key]);\n    } else {\n      base[key] = override[key];\n    }\n  }\n  return base;\n}\n\n/** Given a list of paths, return the first one that exists */\nexport function getValidPath(...resolveOrder: string[]): string | null {\n  for (const path of resolveOrder) {\n    if (fs.existsSync(path)) {\n      return path;\n    }\n  }\n  return null;\n}\n"],
  "mappings": "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",
  "names": ["import_fs", "import_path", "import_path", "import_fs", "fs", "fs", "fs"]
}
