{"version":3,"sources":["../../src/build/compiler.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @jobo/scraper-sdk — Build Compiler\n *\n * Compiles a scraper provider project into deployable JavaScript.\n * Uses esbuild for fast TypeScript → JavaScript compilation.\n *\n * The compiler:\n * 1. Reads the provider's `manifest.json`\n * 2. Discovers all `.ts` source files\n * 3. Bundles everything into a single `provider.js` (IIFE format)\n * 4. Copies `manifest.json` to the output directory\n * 5. Optionally watches for changes and recompiles\n */\n\nimport * as esbuild from \"esbuild\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { glob } from \"glob\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename_local = fileURLToPath(import.meta.url);\nconst __dirname_local = path.dirname(__filename_local);\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Build configuration for a scraper provider package.\n */\nexport interface BuildConfig {\n  /** Root directory of the provider project. */\n  projectDir: string;\n  /** Output directory. Defaults to `dist/` within the project directory. */\n  outDir?: string;\n  /** Whether to minify the output. Default: `false`. */\n  minify?: boolean;\n  /** Whether to generate source maps. Default: `true`. */\n  sourcemap?: boolean;\n}\n\n/**\n * Result of a build operation.\n */\nexport interface BuildResult {\n  /** Whether the build completed without errors. */\n  success: boolean;\n  /** Absolute path to the output directory. */\n  outputDir: string;\n  /** List of output file paths relative to `outputDir`. */\n  files: string[];\n  /** Build errors, if any. */\n  errors: string[];\n  /** Build warnings, if any. */\n  warnings: string[];\n  /** Total build time in milliseconds. */\n  duration: number;\n}\n\n// ---------------------------------------------------------------------------\n// Compiler\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a scraper provider project into a deployable bundle.\n *\n * Expects the following project structure:\n * ```\n * my-scraper/\n * ├── src/\n * │   ├── manifest.json    ← Provider manifest (required)\n * │   ├── provider.ts      ← Entry point (required)\n * │   └── helpers.ts       ← Optional helper modules\n * └── package.json\n * ```\n *\n * Produces:\n * ```\n * my-scraper/dist/\n * ├── manifest.json\n * ├── provider.js\n * └── provider.js.map\n * ```\n *\n * @param config — Build configuration.\n * @returns Build result with output file list and any errors.\n *\n * @example\n * ```ts\n * import { compileProvider } from \"@jobo/scraper-sdk/build\";\n *\n * const result = await compileProvider({ projectDir: \"./my-scraper\" });\n * if (result.success) {\n *   console.log(`Built ${result.files.length} files in ${result.duration}ms`);\n * } else {\n *   console.error(\"Build failed:\", result.errors);\n * }\n * ```\n */\nexport async function compileProvider(\n  config: BuildConfig,\n): Promise<BuildResult> {\n  const startTime = Date.now();\n  const projectDir = path.resolve(config.projectDir);\n  const outDir = path.resolve(config.outDir ?? path.join(projectDir, \"dist\"));\n  const errors: string[] = [];\n  const warnings: string[] = [];\n  const outputFiles: string[] = [];\n\n  // --- Validate project structure ---\n\n  const manifestPath = path.join(projectDir, \"src\", \"manifest.json\");\n  if (!fs.existsSync(manifestPath)) {\n    return {\n      success: false,\n      outputDir: outDir,\n      files: [],\n      errors: [\n        `manifest.json not found at ${manifestPath}. Expected at src/manifest.json.`,\n      ],\n      warnings: [],\n      duration: Date.now() - startTime,\n    };\n  }\n\n  const entryPoint = path.join(projectDir, \"src\", \"provider.ts\");\n  if (!fs.existsSync(entryPoint)) {\n    return {\n      success: false,\n      outputDir: outDir,\n      files: [],\n      errors: [\n        `provider.ts not found at ${entryPoint}. Expected at src/provider.ts.`,\n      ],\n      warnings: [],\n      duration: Date.now() - startTime,\n    };\n  }\n\n  // --- Read and validate manifest ---\n\n  let manifest: Record<string, unknown>;\n  try {\n    manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n  } catch (err) {\n    return {\n      success: false,\n      outputDir: outDir,\n      files: [],\n      errors: [`Failed to parse manifest.json: ${(err as Error).message}`],\n      warnings: [],\n      duration: Date.now() - startTime,\n    };\n  }\n\n  const requiredFields = [\n    \"providerId\",\n    \"displayName\",\n    \"category\",\n    \"transport\",\n    \"urlPatterns\",\n  ];\n  for (const field of requiredFields) {\n    if (!manifest[field]) {\n      errors.push(`manifest.json is missing required field: \"${field}\"`);\n    }\n  }\n\n  if (manifest[\"category\"] !== \"full\" && manifest[\"category\"] !== \"split\") {\n    errors.push(\n      `manifest.json \"category\" must be \"full\" or \"split\", got \"${manifest[\"category\"]}\"`,\n    );\n  }\n\n  if (![\"api\", \"html\", \"browser\"].includes(manifest[\"transport\"] as string)) {\n    errors.push(\n      `manifest.json \"transport\" must be \"api\", \"html\", or \"browser\", got \"${manifest[\"transport\"]}\"`,\n    );\n  }\n\n  if (manifest[\"isDraft\"] === true) {\n    warnings.push(\n      `manifest.json has \"isDraft\": true — this provider will be blocked from publishing.`,\n    );\n  }\n\n  if (errors.length > 0) {\n    return {\n      success: false,\n      outputDir: outDir,\n      files: outputFiles,\n      errors,\n      warnings,\n      duration: Date.now() - startTime,\n    };\n  }\n\n  // --- Clean and prepare output directory ---\n\n  if (fs.existsSync(outDir)) {\n    fs.rmSync(outDir, { recursive: true });\n  }\n  fs.mkdirSync(outDir, { recursive: true });\n\n  // --- Copy manifest ---\n\n  fs.writeFileSync(\n    path.join(outDir, \"manifest.json\"),\n    JSON.stringify(manifest, null, 2),\n  );\n  outputFiles.push(\"manifest.json\");\n\n  // --- Verify source files exist ---\n\n  const srcDir = path.join(projectDir, \"src\");\n  const tsFiles = await glob(\"**/*.ts\", {\n    cwd: srcDir,\n    ignore: [\"**/*.test.ts\", \"**/*.spec.ts\", \"**/*.d.ts\"],\n  });\n\n  if (tsFiles.length === 0) {\n    errors.push(\"No TypeScript source files found in src/\");\n    return {\n      success: false,\n      outputDir: outDir,\n      files: outputFiles,\n      errors,\n      warnings,\n      duration: Date.now() - startTime,\n    };\n  }\n\n  // --- Bundle with esbuild ---\n\n  const globalName =\n    (manifest[\"jsProviderName\"] as string) ??\n    `${manifest[\"providerId\"]}Scraper`;\n\n  const resolveAliasPath = (relativeDir: string, baseName: string): string => {\n    const tsPath = path.resolve(\n      __dirname_local,\n      \"..\",\n      relativeDir,\n      `${baseName}.ts`,\n    );\n    if (fs.existsSync(tsPath)) return tsPath;\n\n    const jsPath = path.resolve(\n      __dirname_local,\n      \"..\",\n      relativeDir,\n      `${baseName}.js`,\n    );\n    if (fs.existsSync(jsPath)) return jsPath;\n\n    return tsPath;\n  };\n\n  const runtimeAliasPath = resolveAliasPath(\"runtime\", \"index\");\n  const sdkAliasPath = resolveAliasPath(\"\", \"index\");\n\n  try {\n    const result = await esbuild.build({\n      entryPoints: [entryPoint],\n      bundle: true,\n      outfile: path.join(outDir, \"provider.js\"),\n      format: \"iife\",\n      globalName,\n      platform: \"neutral\",\n      target: \"es2022\",\n      minify: config.minify ?? false,\n      sourcemap: config.sourcemap ?? true,\n      external: [],\n      // Inline SDK runtime helpers into the bundle\n      alias: {\n        \"@jobo-ai/scraper-sdk/runtime\": runtimeAliasPath,\n        \"@jobo-ai/scraper-sdk\": sdkAliasPath,\n      },\n    });\n\n    if (result.errors.length > 0) {\n      errors.push(...result.errors.map((e: esbuild.Message) => e.text));\n    }\n    if (result.warnings.length > 0) {\n      warnings.push(...result.warnings.map((w: esbuild.Message) => w.text));\n    }\n\n    outputFiles.push(\"provider.js\");\n    if (config.sourcemap !== false) outputFiles.push(\"provider.js.map\");\n  } catch (err: unknown) {\n    errors.push(`Bundle compilation failed: ${(err as Error).message}`);\n  }\n\n  return {\n    success: errors.length === 0,\n    outputDir: outDir,\n    files: outputFiles,\n    errors,\n    warnings,\n    duration: Date.now() - startTime,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Watch mode\n// ---------------------------------------------------------------------------\n\n/**\n * Watch a provider project for changes and recompile automatically.\n *\n * @param config — Build configuration.\n * @param onChange — Callback invoked after each recompilation.\n * @returns A handle with a `stop()` method to terminate watching.\n *\n * @example\n * ```ts\n * const watcher = await watchProvider(\n *   { projectDir: \"./my-scraper\" },\n *   (result) => console.log(result.success ? \"✓ Built\" : \"✗ Failed\"),\n * );\n *\n * // Later...\n * watcher.stop();\n * ```\n */\nexport async function watchProvider(\n  config: BuildConfig,\n  onChange?: (result: BuildResult) => void,\n): Promise<{ stop: () => void }> {\n  const srcDir = path.join(path.resolve(config.projectDir), \"src\");\n\n  // Initial build\n  const result = await compileProvider(config);\n  onChange?.(result);\n\n  // Watch for changes\n  const watcher = fs.watch(\n    srcDir,\n    { recursive: true },\n    async (_event: string, filename: string | null) => {\n      if (!filename) return;\n      if (!filename.endsWith(\".ts\") && !filename.endsWith(\".json\")) return;\n\n      const reResult = await compileProvider(config);\n      onChange?.(reResult);\n    },\n  );\n\n  return {\n    stop: () => watcher.close(),\n  };\n}\n"]}