@addfox/rsbuild-plugin-extension-manifest 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { Compiler } from \"@rspack/core\";\nimport type { RsbuildPluginAPI } from \"@rsbuild/core\";\nimport { resolve } from \"path\";\nimport { writeFileSync, existsSync, mkdirSync, readFileSync } from \"fs\";\nimport { writeFile as writeFileAsync } from \"fs/promises\";\nimport type {\n AddfoxResolvedConfig,\n EntryInfo,\n BrowserTarget,\n ManifestRecord,\n ContentScriptOutput,\n} from \"@addfox/core\";\nimport { resolveManifestForTarget, getAddfoxVersion } from \"@addfox/core\";\n\nconst CONTENT_CSS_GLOBAL_KEY = \"__ADDFOX_CONTENT_CSS_FILES__\";\nconst CONTENT_CSS_TEXTS_GLOBAL_KEY = \"__ADDFOX_CONTENT_CSS_TEXTS__\";\n\nconst REQUIRED_HTML_ENTRIES = new Set([\"popup\", \"options\", \"sidepanel\", \"offscreen\"]);\n\nconst CONTENT_CSS_PATTERN = /defineShadowContentUI|defineIframeContentUI/;\nconst CONTENT_WRAPPER_PATTERN = /wrapper\\s*:\\s*[\"'](?:shadow|iframe)[\"']/;\n\nconst CONTENT_JS_PATTERNS = [\n (k: string) => k.startsWith(\"content/\") && k.endsWith(\".js\"),\n (k: string) => k === \"content.js\",\n];\n\nconst CONTENT_CSS_PATTERNS = [\n (k: string) => (k.startsWith(\"content/\") && k.endsWith(\".css\")) || k === \"content.css\",\n (k: string) => k.startsWith(\"static/css/content\"),\n];\n\ntype ContentScriptOutputWithPolicy = ContentScriptOutput & {\n autoFillCssInManifest?: boolean;\n};\n\ntype EntrypointLike = { getFiles?: () => ReadonlyArray<string> };\ntype EntrypointsMap = Map<string, EntrypointLike>;\ntype EntrypointsRecord = Record<string, EntrypointLike>;\ntype CompilationLike = {\n entrypoints?: unknown;\n assets?: Record<string, unknown>;\n getAssets?: () => ReadonlyArray<{ filename?: string; name?: string }>;\n};\ntype AssetLike = { filename?: string; name?: string };\n\n/**\n * Writes manifest.json after build. Entry and HTML (html: false for background/content) are handled by plugin-extension-entry.\n * Browser comes from CLI -l/--launch (config/constants), not from env.\n * \n * @param resolvedConfig - Resolved Addfox configuration\n * @param entries - Discovered entries\n * @param browser - Target browser (chromium or firefox)\n * @param distPath - Output directory path (browser-specific, e.g., .addfox/extension/extension-chromium)\n */\nexport function extensionPlugin(\n resolvedConfig: AddfoxResolvedConfig,\n entries: EntryInfo[],\n browser: BrowserTarget,\n distPath: string,\n devConnectPorts?: number[]\n) {\n const { root, outputRoot, manifest } = resolvedConfig;\n const metaDir = resolve(root, outputRoot);\n\n return {\n name: \"rsbuild-plugin-extension-manifest\",\n setup(api: RsbuildPluginAPI) {\n api.onBeforeCreateCompiler(async ({ bundlerConfigs }) => {\n const config = bundlerConfigs[0];\n if (!config) return;\n\n config.plugins = config.plugins ?? [];\n config.plugins.push(createManifestPlugin(distPath, metaDir, manifest, entries, browser, devConnectPorts));\n });\n },\n };\n}\n\nfunction createManifestPlugin(\n distPath: string,\n metaDir: string,\n manifest: AddfoxResolvedConfig[\"manifest\"],\n entries: EntryInfo[],\n browser: BrowserTarget,\n devConnectPorts?: number[]\n) {\n return {\n name: \"rsbuild-plugin-extension-manifest:post-build\",\n apply(compiler: Compiler) {\n compiler.hooks.afterEmit.tap(\"rsbuild-plugin-extension-manifest:post-build\", (compilation) => {\n emitManifest(distPath, metaDir, manifest, entries, browser, compilation, devConnectPorts);\n });\n },\n };\n}\n\nfunction emitManifest(\n distPath: string,\n metaDir: string,\n manifest: AddfoxResolvedConfig[\"manifest\"],\n entries: EntryInfo[],\n browser: BrowserTarget,\n compilation?: CompilationLike,\n devConnectPorts?: number[]\n): void {\n ensureDir(distPath);\n\n const safeCompilation: CompilationLike = compilation ?? {};\n const contentScriptOutput = collectContentScriptOutput(safeCompilation, entries);\n injectContentCssRuntimeMeta(distPath, contentScriptOutput);\n\n const manifestObj = resolveManifestForTarget(\n manifest,\n entries,\n browser,\n console.warn,\n contentScriptOutput\n );\n\n const finalManifest = applyContentCssManifestPolicy(\n manifestObj,\n manifest,\n browser,\n contentScriptOutput\n );\n\n if (devConnectPorts != null && devConnectPorts.length > 0) {\n injectDevCsp(finalManifest, devConnectPorts);\n }\n\n validateEntryHtmlRules(entries, finalManifest);\n writeManifestJson(distPath, finalManifest);\n\n // Extract entrypoints mapping for AI context\n const entrypointsMap = extractEntrypointsMap(safeCompilation, entries);\n\n // Fire-and-forget meta.md and llms.txt generation for AI consumption\n void Promise.all([\n writeMetaMarkdown(metaDir, finalManifest, entries, entrypointsMap),\n writeLlmsTxt(metaDir, finalManifest, entries),\n ]).catch(() => {\n // Intentionally ignore write errors to keep build/dev unaffected.\n });\n}\n\nfunction ensureDir(dirPath: string): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true });\n }\n}\n\nfunction writeManifestJson(distPath: string, manifest: ManifestRecord): void {\n const manifestPath = resolve(distPath, \"manifest.json\");\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n}\n\n/**\n * Collect content entry js and css for [addfox.content] placeholder expansion.\n * Prefer compilation.entrypoints[\"content\"].getFiles() so we get exactly the assets built from the content entry (including any CSS it imports). Fallback to naming-based collection if entrypoints are unavailable or return no CSS.\n */\nfunction collectContentScriptOutput(\n compilation: CompilationLike,\n entries: EntryInfo[]\n): ContentScriptOutputWithPolicy | undefined {\n const hasContent = entries.some((e) => e.name === \"content\");\n if (!hasContent) return undefined;\n\n const autoFillCssInManifest = !shouldDisableManifestCssAutoFill(entries);\n const fromEntrypoint = tryGetContentEntryFiles(compilation);\n const byNames = collectContentScriptOutputByNames(compilation);\n\n if (fromEntrypoint?.js.length) {\n const css = fromEntrypoint.css.length ? fromEntrypoint.css : (byNames?.css ?? []);\n return { js: fromEntrypoint.js, css, autoFillCssInManifest };\n }\n\n if (!byNames) return undefined;\n return { ...byNames, autoFillCssInManifest };\n}\n\nfunction tryGetContentEntryFiles(compilation: CompilationLike): ContentScriptOutput | undefined {\n const entrypoints = compilation.entrypoints;\n if (!entrypoints) return undefined;\n\n const contentEntry = getContentEntryFromEntrypoints(entrypoints);\n if (!contentEntry || typeof contentEntry.getFiles !== \"function\") return undefined;\n\n const files = safeGetFiles(contentEntry);\n if (!files?.length) return undefined;\n\n return categorizeFiles(files);\n}\n\nfunction getContentEntryFromEntrypoints(entrypoints: unknown): EntrypointLike | undefined {\n if (isMap(entrypoints)) {\n return entrypoints.get(\"content\");\n }\n if (isRecord(entrypoints)) {\n return entrypoints[\"content\"];\n }\n return undefined;\n}\n\nfunction isMap(value: unknown): value is EntrypointsMap {\n return typeof (value as EntrypointsMap).get === \"function\";\n}\n\nfunction isRecord(value: unknown): value is EntrypointsRecord {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction safeGetFiles(entry: EntrypointLike): ReadonlyArray<string> | undefined {\n try {\n const files = entry.getFiles?.();\n return Array.isArray(files) && files.length ? files : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction categorizeFiles(files: ReadonlyArray<string>): ContentScriptOutput {\n const js: string[] = [];\n const css: string[] = [];\n\n for (const name of files) {\n if (typeof name !== \"string\") continue;\n const normalized = normalizePath(name);\n\n if (normalized.endsWith(\".js\")) js.push(normalized);\n else if (normalized.endsWith(\".css\")) css.push(normalized);\n }\n\n return { js: js.sort(), css: css.sort() };\n}\n\nfunction collectContentScriptOutputByNames(compilation: CompilationLike): ContentScriptOutput | undefined {\n const keys = getAssetKeys(compilation);\n if (!keys.length) return undefined;\n\n return {\n js: filterAndSortKeys(keys, CONTENT_JS_PATTERNS),\n css: filterAndSortKeys(keys, CONTENT_CSS_PATTERNS),\n };\n}\n\nfunction getAssetKeys(compilation: CompilationLike): string[] {\n if (compilation.assets) {\n return Object.keys(compilation.assets);\n }\n return safeGetAssetKeys(compilation.getAssets);\n}\n\nfunction safeGetAssetKeys(getAssets?: () => ReadonlyArray<AssetLike>): string[] {\n if (typeof getAssets !== \"function\") return [];\n\n try {\n const assets = getAssets();\n if (!Array.isArray(assets)) return [];\n\n return assets\n .map((a) => a?.filename ?? a?.name)\n .filter((s): s is string => typeof s === \"string\");\n } catch {\n return [];\n }\n}\n\nfunction filterAndSortKeys(keys: string[], patterns: ((k: string) => boolean)[]): string[] {\n return keys\n .filter((k) => {\n const normalized = normalizePath(k);\n if (!normalized.endsWith(\".css\") && !normalized.endsWith(\".js\")) return false;\n return patterns.some((pattern) => pattern(normalized));\n })\n .map(normalizePath)\n .sort();\n}\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction shouldDisableManifestCssAutoFill(entries: EntryInfo[]): boolean {\n const contentEntry = entries.find((e) => e.name === \"content\");\n if (!contentEntry) return false;\n return hasShadowOrIframeContentUIUsage(contentEntry.scriptPath);\n}\n\nfunction hasShadowOrIframeContentUIUsage(scriptPath: string): boolean {\n const source = safeReadFile(scriptPath);\n if (!source) return false;\n\n return CONTENT_CSS_PATTERN.test(source) || CONTENT_WRAPPER_PATTERN.test(source);\n}\n\nfunction safeReadFile(filePath: string): string | undefined {\n if (!existsSync(filePath)) return undefined;\n try {\n return readFileSync(filePath, \"utf-8\");\n } catch {\n return undefined;\n }\n}\n\nfunction applyContentCssManifestPolicy(\n outputManifest: ManifestRecord,\n inputManifest: AddfoxResolvedConfig[\"manifest\"],\n browser: BrowserTarget,\n contentScriptOutput?: ContentScriptOutputWithPolicy\n): ManifestRecord {\n const shouldRemoveCss =\n contentScriptOutput?.autoFillCssInManifest === false &&\n !hasUserDefinedContentCss(inputManifest, browser);\n\n return shouldRemoveCss ? removeContentScriptCss(outputManifest) : outputManifest;\n}\n\nfunction hasUserDefinedContentCss(\n manifest: AddfoxResolvedConfig[\"manifest\"],\n browser: BrowserTarget\n): boolean {\n const branch = pickManifestBranch(manifest, browser);\n if (!branch) return false;\n\n const scripts = branch.content_scripts;\n if (!Array.isArray(scripts)) return false;\n\n return scripts.some(hasCssField);\n}\n\nfunction hasCssField(item: unknown): boolean {\n if (!isPlainObject(item)) return false;\n const css = item.css;\n return Array.isArray(css) && css.length > 0;\n}\n\nfunction pickManifestBranch(\n manifest: AddfoxResolvedConfig[\"manifest\"],\n browser: BrowserTarget\n): ManifestRecord | null {\n if (!isPlainObject(manifest)) return null;\n if (!(\"chromium\" in manifest) && !(\"firefox\" in manifest)) {\n return manifest as ManifestRecord;\n }\n\n const byBrowser = manifest as { chromium?: unknown; firefox?: unknown };\n const primary = browser === \"firefox\" ? byBrowser.firefox : byBrowser.chromium;\n const fallback = browser === \"firefox\" ? byBrowser.chromium : byBrowser.firefox;\n\n return asManifestRecord(primary) ?? asManifestRecord(fallback);\n}\n\nfunction asManifestRecord(value: unknown): ManifestRecord | null {\n return isPlainObject(value) ? (value as ManifestRecord) : null;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction removeContentScriptCss(manifest: ManifestRecord): ManifestRecord {\n const scripts = manifest.content_scripts;\n if (!Array.isArray(scripts)) return manifest;\n\n const next = scripts.map((item) => {\n if (!isPlainObject(item)) return item;\n const { css: _, ...rest } = item;\n return rest;\n });\n\n return { ...manifest, content_scripts: next };\n}\n\nfunction injectContentCssRuntimeMeta(\n distPath: string,\n contentScriptOutput?: ContentScriptOutputWithPolicy\n): void {\n if (!contentScriptOutput?.css.length || !contentScriptOutput.js.length) return;\n\n const normalizedCss = contentScriptOutput.css.map(normalizePath);\n const cssTexts = normalizedCss.map((file) => readCssAssetText(distPath, file));\n const banner = buildCssBanner(normalizedCss, cssTexts);\n\n for (const jsRel of contentScriptOutput.js) {\n prependBannerToJsFile(distPath, jsRel, banner);\n }\n}\n\nfunction buildCssBanner(cssFiles: string[], cssTexts: string[]): string {\n return (\n `;globalThis.${CONTENT_CSS_GLOBAL_KEY}=${JSON.stringify(cssFiles)};` +\n `globalThis.${CONTENT_CSS_TEXTS_GLOBAL_KEY}=${JSON.stringify(cssTexts)};\\n`\n );\n}\n\nfunction prependBannerToJsFile(distPath: string, jsRel: string, banner: string): void {\n const absPath = resolve(distPath, jsRel);\n if (!existsSync(absPath)) return;\n\n const src = readFileSync(absPath, \"utf-8\");\n if (hasCssMetaInjected(src)) return;\n\n writeFileSync(absPath, banner + src, \"utf-8\");\n}\n\nfunction hasCssMetaInjected(source: string): boolean {\n return (\n source.includes(`globalThis.${CONTENT_CSS_GLOBAL_KEY}`) &&\n source.includes(`globalThis.${CONTENT_CSS_TEXTS_GLOBAL_KEY}`)\n );\n}\n\nfunction readCssAssetText(distPath: string, file: string): string {\n const absPath = resolve(distPath, file);\n return safeReadFile(absPath) ?? \"\";\n}\n\nfunction validateEntryHtmlRules(entries: EntryInfo[], manifest: ManifestRecord): void {\n const mv = getManifestVersion(manifest);\n const errors = entries.flatMap((entry) => validateEntryHtml(entry, mv));\n\n if (errors.length) {\n throw new Error(errors.join(\"; \"));\n }\n}\n\nfunction validateEntryHtml(entry: EntryInfo, mv: 2 | 3 | null): string[] {\n const errors: string[] = [];\n const htmlFlag = getEntryHtmlFlag(entry);\n\n if (REQUIRED_HTML_ENTRIES.has(entry.name) && htmlFlag === false) {\n errors.push(`entry \"${entry.name}\" must generate HTML; html:false is not allowed`);\n }\n if (mv === 3 && entry.name === \"background\" && htmlFlag === true) {\n errors.push(`entry \"background\" cannot generate HTML in MV3`);\n }\n\n return errors;\n}\n\nfunction getManifestVersion(manifest: ManifestRecord): 2 | 3 | null {\n const mv = manifest.manifest_version;\n return mv === 2 || mv === 3 ? mv : null;\n}\n\nfunction getEntryHtmlFlag(entry: EntryInfo): boolean | undefined {\n return (entry as EntryInfo & { html?: boolean }).html;\n}\n\nasync function writeMetaMarkdown(\n metaDir: string,\n manifest: ManifestRecord,\n entries: EntryInfo[],\n entrypointsMap?: EntrypointsMapData\n): Promise<void> {\n if (!ensureMetaDir(metaDir)) return;\n\n const content = buildMetaMarkdown(manifest, entries, entrypointsMap);\n const metaPath = resolve(metaDir, \"meta.md\");\n await writeFileAsync(metaPath, content, \"utf-8\");\n}\n\nfunction ensureMetaDir(metaDir: string): boolean {\n try {\n if (!existsSync(metaDir)) mkdirSync(metaDir, { recursive: true });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction buildMetaMarkdown(\n manifest: ManifestRecord,\n entries: EntryInfo[],\n entrypointsMap?: EntrypointsMapData\n): string {\n const sections = [\n formatAiPromptHeader(),\n formatBasicSection(manifest),\n formatPermissionsSection(manifest),\n formatEntriesSection(entries, entrypointsMap),\n ];\n\n return sections.join(\"\\n\\n\") + \"\\n\";\n}\n\nfunction formatAiPromptHeader(): string {\n return [\n \"---\",\n \"ai_context: addfox_extension_metadata\",\n \"description: Structured metadata about the Addfox browser extension project\",\n \"when_to_use:\",\n \" - Initial project exploration - understand extension structure, entries, permissions\",\n \" - Build debugging - check entry configuration, output paths, dependencies\",\n \" - Architecture review - analyze entry relationships and code organization\",\n \" - Before modifying entries - see current configuration and generated outputs\",\n \"structure:\",\n \" - Section 1: Basic project info (name, version, manifest version)\",\n \" - Section 2: Permissions (required, host, optional)\",\n \" - Section 3: Entries (source files, build outputs, configuration flags)\",\n \"related_files:\",\n \" - error.md: Runtime errors (use when debugging extension errors)\",\n \" - llms.txt: This project's AI guide (always read first)\",\n \"---\",\n ].join(\"\\n\");\n}\n\nasync function writeLlmsTxt(\n metaDir: string,\n manifest: ManifestRecord,\n entries: EntryInfo[]\n): Promise<void> {\n if (!ensureMetaDir(metaDir)) return;\n\n const content = buildLlmsTxt(manifest, entries);\n const llmsPath = resolve(metaDir, \"llms.txt\");\n await writeFileAsync(llmsPath, content, \"utf-8\");\n}\n\nfunction buildLlmsTxt(manifest: ManifestRecord, entries: EntryInfo[]): string {\n const name = getString(manifest.name) ?? \"Unknown\";\n const description = getString(manifest.description) ?? \"Browser extension\";\n const version = getString(manifest.version) ?? \"Unknown\";\n const mv = getManifestVersion(manifest);\n\n const entryList = entries.map((e) => `- **${e.name}**: ${e.scriptPath}`).join(\"\\n\");\n\n return [\n \"# AI Guide for Addfox Extension Project\",\n \"\",\n \"> This file guides AI assistants working on this browser extension project.\",\n \"> Generated by Addfox framework. Do not edit manually.\",\n \"\",\n \"## Project Overview\",\n \"\",\n `- **Name**: ${name}`,\n `- **Description**: ${description}`,\n `- **Version**: ${version}`,\n `- **Manifest Version**: ${mv ?? \"Unknown\"}`,\n `- **Framework**: Addfox (browser extension framework)`,\n \"\",\n \"## Entry Points\",\n \"\",\n entryList || \"- No entries configured\",\n \"\",\n \"## AI Context Files in .addfox/\",\n \"\",\n \"This project generates three AI-friendly files in the \\`.addfox/\\` directory:\",\n \"\",\n \"### 1. llms.txt (this file)\",\n \"**Purpose**: High-level project guide for AI assistants.\",\n \"\",\n \"**When to read**:\",\n \"- First interaction with the project\",\n \"- Understanding project structure and conventions\",\n \"- Looking for guidance on which file to use next\",\n \"\",\n \"**Contains**: Project overview, entry list, and file usage guide.\",\n \"\",\n \"### 2. meta.md\",\n \"**Purpose**: Detailed project metadata and build information.\",\n \"\",\n \"**When to use**:\",\n \"- ⭐ **AL**: Understanding extension structure, entries, and configuration\",\n \"- ⭐ **Analyzing entry points**: Source files, build outputs, dependencies\",\n \"- ⭐ **Build debugging**: Entry configuration, output paths, build issues\",\n \"- ⭐ **Architecture review**: Entry relationships and code organization\",\n \"- ⭐ **Before modifying entries**: Current configuration and generated outputs\",\n \"\",\n \"**Contains**:\",\n \"- Basic info: name, version, manifest version\",\n \"- Permissions: required, host, and optional permissions\",\n \"- Entries: file tree showing source → build output mapping\",\n \"\",\n \"### 3. error.md\",\n \"**Purpose**: Runtime error information from the extension.\",\n \"\",\n \"**When to use**:\",\n \"- ⭐ **ALWAYS**: When user reports extension runtime errors\",\n \"- ⭐ **Debugging**: Extension crashes, console errors, unexpected behavior\",\n \"- ⭐ **Entry-specific issues**: Errors occurring in specific entry contexts\",\n \"- ⭐ **Build vs runtime**: Errors that appear after successful build\",\n \"\",\n \"**Contains**:\",\n \"- Error type and message\",\n \"- Entry context where error occurred\",\n \"- Stack trace\",\n \"- Location (file, line, column)\",\n \"- Timestamp\",\n \"\",\n \"**Note**: This file is cleared on each dev server start. It only contains the most recent error.\",\n \"\",\n \"## Quick Decision Guide\",\n \"\",\n \"| Scenario | File to Use | Why |\",\n \"|----------|-------------|-----|\",\n \"| First time seeing project | llms.txt | Get oriented |\",\n \"| Understanding structure | meta.md | Detailed metadata |\",\n \"| Build issues | meta.md | Entry configurations |\",\n \"| Runtime errors | error.md | Stack traces and context |\",\n \"| Permission issues | meta.md | Permission lists |\",\n \"| Entry relationships | meta.md | File trees |\",\n \"\",\n \"## Addfox Framework Conventions\",\n \"\",\n \"### Entry Names\",\n \"Standard browser extension entries:\",\n \"- \\`popup\\`: Popup UI (usually has HTML)\",\n \"- \\`options\\`: Options/settings page (usually has HTML)\",\n \"- \\`background\\`: Service worker / background script (no HTML in MV3)\",\n \"- \\`content\\`: Content script injected into web pages\",\n \"- \\`sidepanel\\`: Side panel UI (Chrome)\",\n \"- \\`devtools\\`: DevTools panel\",\n \"- \\`offscreen\\`: Offscreen document (for DOM APIs in MV3)\",\n \"\",\n \"### Entry Configuration\",\n \"Entries can have these flags:\",\n \"- \\`html: true\\`: Generates HTML page (for popup/options)\",\n \"- \\`html: false\\`: No HTML generation (for background/content)\",\n \"- \\`outputFollowsScriptPath\\`: Output follows source script location\",\n \"- \\`scriptInject: 'head' | 'body'\\`: Where to inject script in HTML\",\n \"\",\n \"---\",\n \"\",\n \"*Generated by Addfox. Last updated: \" + new Date().toISOString() + \"*\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatBasicSection(manifest: ManifestRecord): string {\n const name = getString(manifest.name);\n const description = getString(manifest.description);\n const version = getString(manifest.version);\n const frameworkVersion = getString(getAddfoxVersion());\n const manifestVersion = getManifestVersion(manifest);\n\n return [\n \"# Extension Meta\",\n \"\",\n \"## 1. Basic information\",\n \"\",\n \"- Framework: addfox\",\n `- Name: ${name ?? \"Unknown\"}`,\n `- Description: ${description ?? \"None\"}`,\n `- Version: ${version ?? \"Unknown\"}`,\n `- Framework version: ${frameworkVersion ?? \"Unknown\"}`,\n `- Manifest version: ${manifestVersion ?? \"Unknown\"}`,\n ].join(\"\\n\");\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction formatPermissionsSection(manifest: ManifestRecord): string {\n const permissions = pickArray(manifest.permissions);\n const hostPermissions = pickArray(manifest.host_permissions);\n const optionalPermissions = pickArray(manifest.optional_permissions);\n\n return [\n \"## 2. Permissions\",\n \"\",\n \"### 2.1 Permissions\",\n formatList(permissions),\n \"\",\n \"### 2.2 Host permissions\",\n formatList(hostPermissions),\n \"\",\n \"### 2.3 Optional permissions\",\n formatList(optionalPermissions),\n ].join(\"\\n\");\n}\n\nfunction formatList(items: string[]): string {\n return items.length ? items.map((p) => `- ${p}`).join(\"\\n\") : \"- None\";\n}\n\nfunction formatEntriesSection(entries: EntryInfo[], entrypointsMap?: EntrypointsMapData): string {\n const lines = [\"## 3. Entries\", \"\"];\n\n if (!entries.length) {\n lines.push(\"- None\");\n return lines.join(\"\\n\");\n }\n\n // Build tree content for all entries\n const treeLines: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const mapping = entrypointsMap?.get(entry.name);\n const entryTree = formatEntryTree(entry, mapping);\n treeLines.push(entryTree);\n // Add blank line between entries (except after last)\n if (i < entries.length - 1) {\n treeLines.push(\"\");\n }\n }\n\n // Wrap in text code block for tree visualization\n lines.push(\"```text\");\n lines.push(...treeLines);\n lines.push(\"```\");\n\n return lines.join(\"\\n\");\n}\n\nfunction formatEntryTree(entry: EntryInfo, mapping?: EntryFilesMapping): string {\n const lines: string[] = [];\n const name = entry.name;\n\n // Entry header\n lines.push(`${name}/`);\n\n // Source file\n const sourcePath = mapping?.source ?? entry.scriptPath ?? \"unknown\";\n lines.push(`├── 📄 Source: ${normalizePath(sourcePath)}`);\n\n // HTML file if exists\n if (entry.htmlPath) {\n lines.push(`├── 📄 HTML: ${normalizePath(entry.htmlPath)}`);\n }\n\n // Output files from compilation\n const outputs = mapping?.outputs ?? [];\n if (outputs.length > 0) {\n // Group outputs by type\n const jsFiles = outputs.filter((f) => f.endsWith(\".js\"));\n const cssFiles = outputs.filter((f) => f.endsWith(\".css\"));\n const htmlFiles = outputs.filter((f) => f.endsWith(\".html\"));\n const otherFiles = outputs.filter((f) => !f.endsWith(\".js\") && !f.endsWith(\".css\") && !f.endsWith(\".html\"));\n\n const allGroups = [\n { label: \"JS\", files: jsFiles },\n { label: \"CSS\", files: cssFiles },\n { label: \"HTML\", files: htmlFiles },\n { label: \"Other\", files: otherFiles },\n ].filter((g) => g.files.length > 0);\n\n for (let i = 0; i < allGroups.length; i++) {\n const group = allGroups[i];\n const isLastGroup = i === allGroups.length - 1;\n const groupPrefix = isLastGroup ? \"└──\" : \"├──\";\n\n lines.push(`${groupPrefix} 📁 ${group.label}/`);\n\n for (let j = 0; j < group.files.length; j++) {\n const file = group.files[j];\n const isLastFile = j === group.files.length - 1;\n const filePrefix = isLastGroup ? (isLastFile ? \" └──\" : \" ├──\") : (isLastFile ? \"│ └──\" : \"│ ├──\");\n lines.push(`${filePrefix} ${file}`);\n }\n }\n } else {\n lines.push(\"└── 📁 Output: (not yet built)\");\n }\n\n // Configuration flags\n const configs: string[] = [];\n if (entry.html === true) configs.push(\"html: true\");\n if (entry.html === false) configs.push(\"html: false\");\n if (entry.outputFollowsScriptPath) configs.push(\"outputFollowsScriptPath: true\");\n if (entry.scriptInject) configs.push(`scriptInject: ${entry.scriptInject}`);\n\n if (configs.length > 0) {\n lines.push(` ⚙️ ${configs.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction pickArray(field: unknown): string[] {\n if (!Array.isArray(field)) return [];\n return field.filter((item): item is string => typeof item === \"string\");\n}\n\n/** Entry files mapping from compilation entrypoints */\ninterface EntryFilesMapping {\n /** Source entry file path */\n source: string;\n /** Output files generated for this entry (JS, CSS, HTML) */\n outputs: string[];\n}\n\ntype EntrypointsMapData = Map<string, EntryFilesMapping>;\n\n/**\n * Extract entrypoints mapping from compilation for AI context.\n * Maps each entry name to its source file and generated output files.\n */\nfunction extractEntrypointsMap(compilation: CompilationLike, entries: EntryInfo[]): EntrypointsMapData {\n const map = new Map<string, EntryFilesMapping>();\n const entrypoints = compilation.entrypoints;\n\n for (const entry of entries) {\n const entryOutput: EntryFilesMapping = {\n source: entry.scriptPath,\n outputs: [],\n };\n\n // Try to get files from compilation entrypoints\n if (entrypoints) {\n const ep = getEntrypointFromMap(entrypoints, entry.name);\n if (ep && typeof ep.getFiles === \"function\") {\n try {\n const files = ep.getFiles();\n if (Array.isArray(files)) {\n entryOutput.outputs = files.map(normalizePath).sort();\n }\n } catch {\n // Fallback to empty outputs if getFiles fails\n }\n }\n }\n\n // If no outputs from entrypoints, try to infer from assets\n if (entryOutput.outputs.length === 0 && compilation.assets) {\n const inferredOutputs = inferEntryOutputsFromAssets(entry, compilation.assets);\n entryOutput.outputs = inferredOutputs;\n }\n\n map.set(entry.name, entryOutput);\n }\n\n return map;\n}\n\nfunction getEntrypointFromMap(entrypoints: unknown, name: string): EntrypointLike | undefined {\n if (isMap(entrypoints)) {\n return entrypoints.get(name);\n }\n if (isRecord(entrypoints)) {\n return entrypoints[name];\n }\n return undefined;\n}\n\nfunction inferEntryOutputsFromAssets(entry: EntryInfo, assets: Record<string, unknown>): string[] {\n const outputs: string[] = [];\n const assetNames = Object.keys(assets);\n\n // Match JS files\n const jsPatterns = [\n `${entry.name}.js`,\n `${entry.name}/index.js`,\n `static/js/${entry.name}.*.js`,\n `${entry.name}.*.js`,\n ];\n\n // Match CSS files\n const cssPatterns = [\n `${entry.name}.css`,\n `${entry.name}/index.css`,\n `static/css/${entry.name}.*.css`,\n `${entry.name}.*.css`,\n ];\n\n // Match HTML files\n const htmlPatterns = [\n `${entry.name}.html`,\n `${entry.name}/index.html`,\n `${entry.name}/*.html`,\n ];\n\n const patterns = [...jsPatterns, ...cssPatterns, ...htmlPatterns];\n\n for (const asset of assetNames) {\n const normalizedAsset = normalizePath(asset);\n for (const pattern of patterns) {\n if (matchPattern(normalizedAsset, pattern)) {\n outputs.push(normalizedAsset);\n break;\n }\n }\n }\n\n return outputs.sort();\n}\n\nfunction matchPattern(filename: string, pattern: string): boolean {\n // Convert simple glob pattern to regex\n const regexPattern = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/{{GLOBSTAR}}/g, \".*\");\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(filename);\n}\n\n/** Inject dev-mode CSP connect-src so extension pages can reach Addfox HMR WS and Rsbuild dev server. */\nfunction injectDevCsp(manifest: ManifestRecord, ports: number[]): void {\n const devHosts = buildDevConnectHosts(ports);\n const csp = manifest.content_security_policy;\n\n if (typeof csp === \"string\") {\n manifest.content_security_policy = mergeCspString(csp, devHosts);\n return;\n }\n\n const cspObj = (typeof csp === \"object\" && csp !== null ? csp : {}) as Record<string, unknown>;\n const extensionPages = typeof cspObj.extension_pages === \"string\" ? cspObj.extension_pages : \"\";\n manifest.content_security_policy = {\n ...cspObj,\n extension_pages: extensionPages ? mergeCspString(extensionPages, devHosts) : buildDefaultCsp(devHosts),\n };\n}\n\nfunction buildDevConnectHosts(ports: number[]): string[] {\n const hosts: string[] = [];\n const seen = new Set<string>();\n const hostnames = [\"127.0.0.1\", \"localhost\"] as const;\n for (const hostname of hostnames) {\n for (const scheme of [\"http\", \"ws\"] as const) {\n addDevHost(hosts, seen, `${scheme}://${hostname}:*`);\n }\n }\n for (const port of ports) {\n for (const hostname of hostnames) {\n for (const scheme of [\"http\", \"ws\"] as const) {\n addDevHost(hosts, seen, `${scheme}://${hostname}:${port}`);\n }\n }\n }\n return hosts;\n}\n\nfunction addDevHost(hosts: string[], seen: Set<string>, host: string): void {\n if (seen.has(host)) return;\n seen.add(host);\n hosts.push(host);\n}\n\nfunction buildDefaultCsp(devHosts: string[]): string {\n return `script-src 'self'; object-src 'self'; connect-src 'self' ${devHosts.join(\" \")};`;\n}\n\nfunction mergeCspString(csp: string, devHosts: string[]): string {\n const connectMatch = csp.match(/connect-src\\s+([^;]*)/);\n if (!connectMatch) {\n return `${csp.trim().replace(/;?\\s*$/, \"\")}; connect-src 'self' ${devHosts.join(\" \")};`;\n }\n const existing = connectMatch[1].trim();\n const parts = existing.split(/\\s+/);\n for (const host of devHosts) {\n if (!parts.includes(host)) parts.push(host);\n }\n return csp.replace(/connect-src\\s+[^;]*/, `connect-src ${parts.join(\" \")}`);\n}\n"],"names":["CONTENT_CSS_GLOBAL_KEY","CONTENT_CSS_TEXTS_GLOBAL_KEY","REQUIRED_HTML_ENTRIES","Set","CONTENT_CSS_PATTERN","CONTENT_WRAPPER_PATTERN","CONTENT_JS_PATTERNS","k","CONTENT_CSS_PATTERNS","extensionPlugin","resolvedConfig","entries","browser","distPath","devConnectPorts","root","outputRoot","manifest","metaDir","resolve","api","bundlerConfigs","config","createManifestPlugin","compiler","compilation","emitManifest","ensureDir","safeCompilation","contentScriptOutput","collectContentScriptOutput","injectContentCssRuntimeMeta","manifestObj","resolveManifestForTarget","console","finalManifest","applyContentCssManifestPolicy","injectDevCsp","validateEntryHtmlRules","writeManifestJson","entrypointsMap","extractEntrypointsMap","Promise","writeMetaMarkdown","writeLlmsTxt","dirPath","existsSync","mkdirSync","manifestPath","writeFileSync","JSON","hasContent","e","autoFillCssInManifest","shouldDisableManifestCssAutoFill","fromEntrypoint","tryGetContentEntryFiles","byNames","collectContentScriptOutputByNames","css","entrypoints","contentEntry","getContentEntryFromEntrypoints","files","safeGetFiles","categorizeFiles","isMap","isRecord","value","entry","Array","undefined","js","name","normalized","normalizePath","keys","getAssetKeys","filterAndSortKeys","Object","safeGetAssetKeys","getAssets","assets","a","s","patterns","pattern","path","hasShadowOrIframeContentUIUsage","scriptPath","source","safeReadFile","filePath","readFileSync","outputManifest","inputManifest","shouldRemoveCss","hasUserDefinedContentCss","removeContentScriptCss","branch","pickManifestBranch","scripts","hasCssField","item","isPlainObject","byBrowser","primary","fallback","asManifestRecord","next","_","rest","normalizedCss","cssTexts","file","readCssAssetText","banner","buildCssBanner","jsRel","prependBannerToJsFile","cssFiles","absPath","src","hasCssMetaInjected","mv","getManifestVersion","errors","validateEntryHtml","Error","htmlFlag","getEntryHtmlFlag","ensureMetaDir","content","buildMetaMarkdown","metaPath","writeFileAsync","sections","formatAiPromptHeader","formatBasicSection","formatPermissionsSection","formatEntriesSection","buildLlmsTxt","llmsPath","getString","description","version","entryList","Date","frameworkVersion","getAddfoxVersion","manifestVersion","permissions","pickArray","hostPermissions","optionalPermissions","formatList","items","p","lines","treeLines","i","mapping","entryTree","formatEntryTree","sourcePath","outputs","jsFiles","f","htmlFiles","otherFiles","allGroups","g","group","isLastGroup","groupPrefix","j","isLastFile","filePrefix","configs","field","map","Map","entryOutput","ep","getEntrypointFromMap","inferredOutputs","inferEntryOutputsFromAssets","assetNames","jsPatterns","cssPatterns","htmlPatterns","asset","normalizedAsset","matchPattern","filename","regexPattern","regex","RegExp","ports","devHosts","buildDevConnectHosts","csp","mergeCspString","cspObj","extensionPages","buildDefaultCsp","hosts","seen","hostnames","hostname","scheme","addDevHost","port","host","connectMatch","existing","parts"],"mappings":"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,KAAKC,mBAAmB5G;IAE9B,MAAMiI,YAAYvI,QAAQ,GAAG,CAAC,CAACyC,IAAM,CAAC,IAAI,EAAEA,EAAE,IAAI,CAAC,IAAI,EAAEA,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC;IAE9E,OAAO;QACL;QACA;QACA;QACA;QACA;QACA;QACA;QACA,CAAC,YAAY,EAAEqB,MAAM;QACrB,CAAC,mBAAmB,EAAEuE,aAAa;QACnC,CAAC,eAAe,EAAEC,SAAS;QAC3B,CAAC,wBAAwB,EAAErB,MAAM,WAAW;QAC5C;QACA;QACA;QACA;QACAsB,aAAa;QACb;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,IAAIC,OAAO,WAAW,KAAK;QACpE;KACD,CAAC,IAAI,CAAC;AACT;AAEA,SAAST,mBAAmBzH,QAAwB;IAClD,MAAMwD,OAAOsE,UAAU9H,SAAS,IAAI;IACpC,MAAM+H,cAAcD,UAAU9H,SAAS,WAAW;IAClD,MAAMgI,UAAUF,UAAU9H,SAAS,OAAO;IAC1C,MAAMmI,mBAAmBL,UAAUM;IACnC,MAAMC,kBAAkBzB,mBAAmB5G;IAE3C,OAAO;QACL;QACA;QACA;QACA;QACA;QACA,CAAC,QAAQ,EAAEwD,QAAQ,WAAW;QAC9B,CAAC,eAAe,EAAEuE,eAAe,QAAQ;QACzC,CAAC,WAAW,EAAEC,WAAW,WAAW;QACpC,CAAC,qBAAqB,EAAEG,oBAAoB,WAAW;QACvD,CAAC,oBAAoB,EAAEE,mBAAmB,WAAW;KACtD,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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { Compiler } from \"@rspack/core\";\r\nimport type { RsbuildPluginAPI } from \"@rsbuild/core\";\r\nimport { resolve } from \"path\";\r\nimport { writeFileSync, existsSync, mkdirSync, readFileSync } from \"fs\";\r\nimport { writeFile as writeFileAsync } from \"fs/promises\";\r\nimport type {\r\n AddfoxResolvedConfig,\r\n EntryInfo,\r\n BrowserTarget,\r\n ManifestRecord,\r\n ContentScriptOutput,\r\n} from \"@addfox/core\";\r\nimport { resolveManifestForTarget, getAddfoxVersion } from \"@addfox/core\";\r\n\r\nconst CONTENT_CSS_GLOBAL_KEY = \"__ADDFOX_CONTENT_CSS_FILES__\";\r\nconst CONTENT_CSS_TEXTS_GLOBAL_KEY = \"__ADDFOX_CONTENT_CSS_TEXTS__\";\r\n\r\nconst REQUIRED_HTML_ENTRIES = new Set([\"popup\", \"options\", \"sidepanel\", \"offscreen\"]);\r\n\r\nconst CONTENT_CSS_PATTERN = /defineShadowContentUI|defineIframeContentUI/;\r\nconst CONTENT_WRAPPER_PATTERN = /wrapper\\s*:\\s*[\"'](?:shadow|iframe)[\"']/;\r\n\r\nconst CONTENT_JS_PATTERNS = [\r\n (k: string) => k.startsWith(\"content/\") && k.endsWith(\".js\"),\r\n (k: string) => k === \"content.js\",\r\n];\r\n\r\nconst CONTENT_CSS_PATTERNS = [\r\n (k: string) => (k.startsWith(\"content/\") && k.endsWith(\".css\")) || k === \"content.css\",\r\n (k: string) => k.startsWith(\"static/css/content\"),\r\n];\r\n\r\ntype ContentScriptOutputWithPolicy = ContentScriptOutput & {\r\n autoFillCssInManifest?: boolean;\r\n};\r\n\r\ntype EntrypointLike = { getFiles?: () => ReadonlyArray<string> };\r\ntype EntrypointsMap = Map<string, EntrypointLike>;\r\ntype EntrypointsRecord = Record<string, EntrypointLike>;\r\ntype CompilationLike = {\r\n entrypoints?: unknown;\r\n assets?: Record<string, unknown>;\r\n getAssets?: () => ReadonlyArray<{ filename?: string; name?: string }>;\r\n};\r\ntype AssetLike = { filename?: string; name?: string };\r\n\r\n/**\r\n * Writes manifest.json after build. Entry and HTML (html: false for background/content) are handled by plugin-extension-entry.\r\n * Browser comes from CLI -l/--launch (config/constants), not from env.\r\n * \r\n * @param resolvedConfig - Resolved Addfox configuration\r\n * @param entries - Discovered entries\r\n * @param browser - Target browser (chromium or firefox)\r\n * @param distPath - Output directory path (browser-specific, e.g., .addfox/extension/extension-chromium)\r\n */\r\nexport function extensionPlugin(\r\n resolvedConfig: AddfoxResolvedConfig,\r\n entries: EntryInfo[],\r\n browser: BrowserTarget,\r\n distPath: string,\r\n devConnectPorts?: number[]\r\n) {\r\n const { root, outputRoot, manifest } = resolvedConfig;\r\n const metaDir = resolve(root, outputRoot);\r\n\r\n return {\r\n name: \"rsbuild-plugin-extension-manifest\",\r\n setup(api: RsbuildPluginAPI) {\r\n api.onBeforeCreateCompiler(async ({ bundlerConfigs }) => {\r\n const config = bundlerConfigs[0];\r\n if (!config) return;\r\n\r\n config.plugins = config.plugins ?? [];\r\n config.plugins.push(createManifestPlugin(distPath, metaDir, manifest, entries, browser, devConnectPorts));\r\n });\r\n },\r\n };\r\n}\r\n\r\nfunction createManifestPlugin(\r\n distPath: string,\r\n metaDir: string,\r\n manifest: AddfoxResolvedConfig[\"manifest\"],\r\n entries: EntryInfo[],\r\n browser: BrowserTarget,\r\n devConnectPorts?: number[]\r\n) {\r\n return {\r\n name: \"rsbuild-plugin-extension-manifest:post-build\",\r\n apply(compiler: Compiler) {\r\n compiler.hooks.afterEmit.tap(\"rsbuild-plugin-extension-manifest:post-build\", (compilation) => {\r\n emitManifest(distPath, metaDir, manifest, entries, browser, compilation, devConnectPorts);\r\n });\r\n },\r\n };\r\n}\r\n\r\nfunction emitManifest(\r\n distPath: string,\r\n metaDir: string,\r\n manifest: AddfoxResolvedConfig[\"manifest\"],\r\n entries: EntryInfo[],\r\n browser: BrowserTarget,\r\n compilation?: CompilationLike,\r\n devConnectPorts?: number[]\r\n): void {\r\n ensureDir(distPath);\r\n\r\n const safeCompilation: CompilationLike = compilation ?? {};\r\n const contentScriptOutput = collectContentScriptOutput(safeCompilation, entries);\r\n injectContentCssRuntimeMeta(distPath, contentScriptOutput);\r\n\r\n const manifestObj = resolveManifestForTarget(\r\n manifest,\r\n entries,\r\n browser,\r\n console.warn,\r\n contentScriptOutput\r\n );\r\n\r\n const finalManifest = applyContentCssManifestPolicy(\r\n manifestObj,\r\n manifest,\r\n browser,\r\n contentScriptOutput\r\n );\r\n\r\n if (devConnectPorts != null && devConnectPorts.length > 0) {\r\n injectDevCsp(finalManifest, devConnectPorts);\r\n }\r\n\r\n validateEntryHtmlRules(entries, finalManifest);\r\n writeManifestJson(distPath, finalManifest);\r\n\r\n // Extract entrypoints mapping for AI context\r\n const entrypointsMap = extractEntrypointsMap(safeCompilation, entries);\r\n\r\n // Fire-and-forget meta.md and llms.txt generation for AI consumption\r\n void Promise.all([\r\n writeMetaMarkdown(metaDir, finalManifest, entries, entrypointsMap),\r\n writeLlmsTxt(metaDir, finalManifest, entries),\r\n ]).catch(() => {\r\n // Intentionally ignore write errors to keep build/dev unaffected.\r\n });\r\n}\r\n\r\nfunction ensureDir(dirPath: string): void {\r\n if (!existsSync(dirPath)) {\r\n mkdirSync(dirPath, { recursive: true });\r\n }\r\n}\r\n\r\nfunction writeManifestJson(distPath: string, manifest: ManifestRecord): void {\r\n const manifestPath = resolve(distPath, \"manifest.json\");\r\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Collect content entry js and css for [addfox.content] placeholder expansion.\r\n * Prefer compilation.entrypoints[\"content\"].getFiles() so we get exactly the assets built from the content entry (including any CSS it imports). Fallback to naming-based collection if entrypoints are unavailable or return no CSS.\r\n */\r\nfunction collectContentScriptOutput(\r\n compilation: CompilationLike,\r\n entries: EntryInfo[]\r\n): ContentScriptOutputWithPolicy | undefined {\r\n const hasContent = entries.some((e) => e.name === \"content\");\r\n if (!hasContent) return undefined;\r\n\r\n const autoFillCssInManifest = !shouldDisableManifestCssAutoFill(entries);\r\n const fromEntrypoint = tryGetContentEntryFiles(compilation);\r\n const byNames = collectContentScriptOutputByNames(compilation);\r\n\r\n if (fromEntrypoint?.js.length) {\r\n const css = fromEntrypoint.css.length ? fromEntrypoint.css : (byNames?.css ?? []);\r\n return { js: fromEntrypoint.js, css, autoFillCssInManifest };\r\n }\r\n\r\n if (!byNames) return undefined;\r\n return { ...byNames, autoFillCssInManifest };\r\n}\r\n\r\nfunction tryGetContentEntryFiles(compilation: CompilationLike): ContentScriptOutput | undefined {\r\n const entrypoints = compilation.entrypoints;\r\n if (!entrypoints) return undefined;\r\n\r\n const contentEntry = getContentEntryFromEntrypoints(entrypoints);\r\n if (!contentEntry || typeof contentEntry.getFiles !== \"function\") return undefined;\r\n\r\n const files = safeGetFiles(contentEntry);\r\n if (!files?.length) return undefined;\r\n\r\n return categorizeFiles(files);\r\n}\r\n\r\nfunction getContentEntryFromEntrypoints(entrypoints: unknown): EntrypointLike | undefined {\r\n if (isMap(entrypoints)) {\r\n return entrypoints.get(\"content\");\r\n }\r\n if (isRecord(entrypoints)) {\r\n return entrypoints[\"content\"];\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction isMap(value: unknown): value is EntrypointsMap {\r\n return typeof (value as EntrypointsMap).get === \"function\";\r\n}\r\n\r\nfunction isRecord(value: unknown): value is EntrypointsRecord {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction safeGetFiles(entry: EntrypointLike): ReadonlyArray<string> | undefined {\r\n try {\r\n const files = entry.getFiles?.();\r\n return Array.isArray(files) && files.length ? files : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction categorizeFiles(files: ReadonlyArray<string>): ContentScriptOutput {\r\n const js: string[] = [];\r\n const css: string[] = [];\r\n\r\n for (const name of files) {\r\n if (typeof name !== \"string\") continue;\r\n const normalized = normalizePath(name);\r\n\r\n if (normalized.endsWith(\".js\")) js.push(normalized);\r\n else if (normalized.endsWith(\".css\")) css.push(normalized);\r\n }\r\n\r\n return { js: js.sort(), css: css.sort() };\r\n}\r\n\r\nfunction collectContentScriptOutputByNames(compilation: CompilationLike): ContentScriptOutput | undefined {\r\n const keys = getAssetKeys(compilation);\r\n if (!keys.length) return undefined;\r\n\r\n return {\r\n js: filterAndSortKeys(keys, CONTENT_JS_PATTERNS),\r\n css: filterAndSortKeys(keys, CONTENT_CSS_PATTERNS),\r\n };\r\n}\r\n\r\nfunction getAssetKeys(compilation: CompilationLike): string[] {\r\n if (compilation.assets) {\r\n return Object.keys(compilation.assets);\r\n }\r\n return safeGetAssetKeys(compilation.getAssets);\r\n}\r\n\r\nfunction safeGetAssetKeys(getAssets?: () => ReadonlyArray<AssetLike>): string[] {\r\n if (typeof getAssets !== \"function\") return [];\r\n\r\n try {\r\n const assets = getAssets();\r\n if (!Array.isArray(assets)) return [];\r\n\r\n return assets\r\n .map((a) => a?.filename ?? a?.name)\r\n .filter((s): s is string => typeof s === \"string\");\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction filterAndSortKeys(keys: string[], patterns: ((k: string) => boolean)[]): string[] {\r\n return keys\r\n .filter((k) => {\r\n const normalized = normalizePath(k);\r\n if (!normalized.endsWith(\".css\") && !normalized.endsWith(\".js\")) return false;\r\n return patterns.some((pattern) => pattern(normalized));\r\n })\r\n .map(normalizePath)\r\n .sort();\r\n}\r\n\r\nfunction normalizePath(path: string): string {\r\n return path.replace(/\\\\/g, \"/\");\r\n}\r\n\r\nfunction shouldDisableManifestCssAutoFill(entries: EntryInfo[]): boolean {\r\n const contentEntry = entries.find((e) => e.name === \"content\");\r\n if (!contentEntry) return false;\r\n return hasShadowOrIframeContentUIUsage(contentEntry.scriptPath);\r\n}\r\n\r\nfunction hasShadowOrIframeContentUIUsage(scriptPath: string): boolean {\r\n const source = safeReadFile(scriptPath);\r\n if (!source) return false;\r\n\r\n return CONTENT_CSS_PATTERN.test(source) || CONTENT_WRAPPER_PATTERN.test(source);\r\n}\r\n\r\nfunction safeReadFile(filePath: string): string | undefined {\r\n if (!existsSync(filePath)) return undefined;\r\n try {\r\n return readFileSync(filePath, \"utf-8\");\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction applyContentCssManifestPolicy(\r\n outputManifest: ManifestRecord,\r\n inputManifest: AddfoxResolvedConfig[\"manifest\"],\r\n browser: BrowserTarget,\r\n contentScriptOutput?: ContentScriptOutputWithPolicy\r\n): ManifestRecord {\r\n const shouldRemoveCss =\r\n contentScriptOutput?.autoFillCssInManifest === false &&\r\n !hasUserDefinedContentCss(inputManifest, browser);\r\n\r\n return shouldRemoveCss ? removeContentScriptCss(outputManifest) : outputManifest;\r\n}\r\n\r\nfunction hasUserDefinedContentCss(\r\n manifest: AddfoxResolvedConfig[\"manifest\"],\r\n browser: BrowserTarget\r\n): boolean {\r\n const branch = pickManifestBranch(manifest, browser);\r\n if (!branch) return false;\r\n\r\n const scripts = branch.content_scripts;\r\n if (!Array.isArray(scripts)) return false;\r\n\r\n return scripts.some(hasCssField);\r\n}\r\n\r\nfunction hasCssField(item: unknown): boolean {\r\n if (!isPlainObject(item)) return false;\r\n const css = item.css;\r\n return Array.isArray(css) && css.length > 0;\r\n}\r\n\r\nfunction pickManifestBranch(\r\n manifest: AddfoxResolvedConfig[\"manifest\"],\r\n browser: BrowserTarget\r\n): ManifestRecord | null {\r\n if (!isPlainObject(manifest)) return null;\r\n if (!(\"chromium\" in manifest) && !(\"firefox\" in manifest)) {\r\n return manifest as ManifestRecord;\r\n }\r\n\r\n const byBrowser = manifest as { chromium?: unknown; firefox?: unknown };\r\n const primary = browser === \"firefox\" ? byBrowser.firefox : byBrowser.chromium;\r\n const fallback = browser === \"firefox\" ? byBrowser.chromium : byBrowser.firefox;\r\n\r\n return asManifestRecord(primary) ?? asManifestRecord(fallback);\r\n}\r\n\r\nfunction asManifestRecord(value: unknown): ManifestRecord | null {\r\n return isPlainObject(value) ? (value as ManifestRecord) : null;\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction removeContentScriptCss(manifest: ManifestRecord): ManifestRecord {\r\n const scripts = manifest.content_scripts;\r\n if (!Array.isArray(scripts)) return manifest;\r\n\r\n const next = scripts.map((item) => {\r\n if (!isPlainObject(item)) return item;\r\n const { css: _, ...rest } = item;\r\n return rest;\r\n });\r\n\r\n return { ...manifest, content_scripts: next };\r\n}\r\n\r\nfunction injectContentCssRuntimeMeta(\r\n distPath: string,\r\n contentScriptOutput?: ContentScriptOutputWithPolicy\r\n): void {\r\n if (!contentScriptOutput?.css.length || !contentScriptOutput.js.length) return;\r\n\r\n const normalizedCss = contentScriptOutput.css.map(normalizePath);\r\n const cssTexts = normalizedCss.map((file) => readCssAssetText(distPath, file));\r\n const banner = buildCssBanner(normalizedCss, cssTexts);\r\n\r\n for (const jsRel of contentScriptOutput.js) {\r\n prependBannerToJsFile(distPath, jsRel, banner);\r\n }\r\n}\r\n\r\nfunction buildCssBanner(cssFiles: string[], cssTexts: string[]): string {\r\n return (\r\n `;globalThis.${CONTENT_CSS_GLOBAL_KEY}=${JSON.stringify(cssFiles)};` +\r\n `globalThis.${CONTENT_CSS_TEXTS_GLOBAL_KEY}=${JSON.stringify(cssTexts)};\\n`\r\n );\r\n}\r\n\r\nfunction prependBannerToJsFile(distPath: string, jsRel: string, banner: string): void {\r\n const absPath = resolve(distPath, jsRel);\r\n if (!existsSync(absPath)) return;\r\n\r\n const src = readFileSync(absPath, \"utf-8\");\r\n if (hasCssMetaInjected(src)) return;\r\n\r\n writeFileSync(absPath, banner + src, \"utf-8\");\r\n}\r\n\r\nfunction hasCssMetaInjected(source: string): boolean {\r\n return (\r\n source.includes(`globalThis.${CONTENT_CSS_GLOBAL_KEY}`) &&\r\n source.includes(`globalThis.${CONTENT_CSS_TEXTS_GLOBAL_KEY}`)\r\n );\r\n}\r\n\r\nfunction readCssAssetText(distPath: string, file: string): string {\r\n const absPath = resolve(distPath, file);\r\n return safeReadFile(absPath) ?? \"\";\r\n}\r\n\r\nfunction validateEntryHtmlRules(entries: EntryInfo[], manifest: ManifestRecord): void {\r\n const mv = getManifestVersion(manifest);\r\n const errors = entries.flatMap((entry) => validateEntryHtml(entry, mv));\r\n\r\n if (errors.length) {\r\n throw new Error(errors.join(\"; \"));\r\n }\r\n}\r\n\r\nfunction validateEntryHtml(entry: EntryInfo, mv: 2 | 3 | null): string[] {\r\n const errors: string[] = [];\r\n const htmlFlag = getEntryHtmlFlag(entry);\r\n\r\n if (REQUIRED_HTML_ENTRIES.has(entry.name) && htmlFlag === false) {\r\n errors.push(`entry \"${entry.name}\" must generate HTML; html:false is not allowed`);\r\n }\r\n if (mv === 3 && entry.name === \"background\" && htmlFlag === true) {\r\n errors.push(`entry \"background\" cannot generate HTML in MV3`);\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction getManifestVersion(manifest: ManifestRecord): 2 | 3 | null {\r\n const mv = manifest.manifest_version;\r\n return mv === 2 || mv === 3 ? mv : null;\r\n}\r\n\r\nfunction getEntryHtmlFlag(entry: EntryInfo): boolean | undefined {\r\n return (entry as EntryInfo & { html?: boolean }).html;\r\n}\r\n\r\nasync function writeMetaMarkdown(\r\n metaDir: string,\r\n manifest: ManifestRecord,\r\n entries: EntryInfo[],\r\n entrypointsMap?: EntrypointsMapData\r\n): Promise<void> {\r\n if (!ensureMetaDir(metaDir)) return;\r\n\r\n const content = buildMetaMarkdown(manifest, entries, entrypointsMap);\r\n const metaPath = resolve(metaDir, \"meta.md\");\r\n await writeFileAsync(metaPath, content, \"utf-8\");\r\n}\r\n\r\nfunction ensureMetaDir(metaDir: string): boolean {\r\n try {\r\n if (!existsSync(metaDir)) mkdirSync(metaDir, { recursive: true });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction buildMetaMarkdown(\r\n manifest: ManifestRecord,\r\n entries: EntryInfo[],\r\n entrypointsMap?: EntrypointsMapData\r\n): string {\r\n const sections = [\r\n formatAiPromptHeader(),\r\n formatBasicSection(manifest),\r\n formatPermissionsSection(manifest),\r\n formatEntriesSection(entries, entrypointsMap),\r\n ];\r\n\r\n return sections.join(\"\\n\\n\") + \"\\n\";\r\n}\r\n\r\nfunction formatAiPromptHeader(): string {\r\n return [\r\n \"---\",\r\n \"ai_context: addfox_extension_metadata\",\r\n \"description: Structured metadata about the Addfox browser extension project\",\r\n \"when_to_use:\",\r\n \" - Initial project exploration - understand extension structure, entries, permissions\",\r\n \" - Build debugging - check entry configuration, output paths, dependencies\",\r\n \" - Architecture review - analyze entry relationships and code organization\",\r\n \" - Before modifying entries - see current configuration and generated outputs\",\r\n \"structure:\",\r\n \" - Section 1: Basic project info (name, version, manifest version)\",\r\n \" - Section 2: Permissions (required, host, optional)\",\r\n \" - Section 3: Entries (source files, build outputs, configuration flags)\",\r\n \"related_files:\",\r\n \" - error.md: Runtime errors (use when debugging extension errors)\",\r\n \" - llms.txt: This project's AI guide (always read first)\",\r\n \"---\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nasync function writeLlmsTxt(\r\n metaDir: string,\r\n manifest: ManifestRecord,\r\n entries: EntryInfo[]\r\n): Promise<void> {\r\n if (!ensureMetaDir(metaDir)) return;\r\n\r\n const content = buildLlmsTxt(manifest, entries);\r\n const llmsPath = resolve(metaDir, \"llms.txt\");\r\n await writeFileAsync(llmsPath, content, \"utf-8\");\r\n}\r\n\r\nfunction buildLlmsTxt(manifest: ManifestRecord, entries: EntryInfo[]): string {\r\n const name = getString(manifest.name) ?? \"Unknown\";\r\n const description = getString(manifest.description) ?? \"Browser extension\";\r\n const version = getString(manifest.version) ?? \"Unknown\";\r\n const mv = getManifestVersion(manifest);\r\n\r\n const entryList = entries.map((e) => `- **${e.name}**: ${e.scriptPath}`).join(\"\\n\");\r\n\r\n return [\r\n \"# AI Guide for Addfox Extension Project\",\r\n \"\",\r\n \"> This file guides AI assistants working on this browser extension project.\",\r\n \"> Generated by Addfox framework. Do not edit manually.\",\r\n \"\",\r\n \"## Project Overview\",\r\n \"\",\r\n `- **Name**: ${name}`,\r\n `- **Description**: ${description}`,\r\n `- **Version**: ${version}`,\r\n `- **Manifest Version**: ${mv ?? \"Unknown\"}`,\r\n `- **Framework**: Addfox (browser extension framework)`,\r\n \"\",\r\n \"## Entry Points\",\r\n \"\",\r\n entryList || \"- No entries configured\",\r\n \"\",\r\n \"## AI Context Files in .addfox/\",\r\n \"\",\r\n \"This project generates three AI-friendly files in the \\`.addfox/\\` directory:\",\r\n \"\",\r\n \"### 1. llms.txt (this file)\",\r\n \"**Purpose**: High-level project guide for AI assistants.\",\r\n \"\",\r\n \"**When to read**:\",\r\n \"- First interaction with the project\",\r\n \"- Understanding project structure and conventions\",\r\n \"- Looking for guidance on which file to use next\",\r\n \"\",\r\n \"**Contains**: Project overview, entry list, and file usage guide.\",\r\n \"\",\r\n \"### 2. meta.md\",\r\n \"**Purpose**: Detailed project metadata and build information.\",\r\n \"\",\r\n \"**When to use**:\",\r\n \"- ⭐ **AL**: Understanding extension structure, entries, and configuration\",\r\n \"- ⭐ **Analyzing entry points**: Source files, build outputs, dependencies\",\r\n \"- ⭐ **Build debugging**: Entry configuration, output paths, build issues\",\r\n \"- ⭐ **Architecture review**: Entry relationships and code organization\",\r\n \"- ⭐ **Before modifying entries**: Current configuration and generated outputs\",\r\n \"\",\r\n \"**Contains**:\",\r\n \"- Basic info: name, version, manifest version\",\r\n \"- Permissions: required, host, and optional permissions\",\r\n \"- Entries: file tree showing source → build output mapping\",\r\n \"\",\r\n \"### 3. error.md\",\r\n \"**Purpose**: Runtime error information from the extension.\",\r\n \"\",\r\n \"**When to use**:\",\r\n \"- ⭐ **ALWAYS**: When user reports extension runtime errors\",\r\n \"- ⭐ **Debugging**: Extension crashes, console errors, unexpected behavior\",\r\n \"- ⭐ **Entry-specific issues**: Errors occurring in specific entry contexts\",\r\n \"- ⭐ **Build vs runtime**: Errors that appear after successful build\",\r\n \"\",\r\n \"**Contains**:\",\r\n \"- Error type and message\",\r\n \"- Entry context where error occurred\",\r\n \"- Stack trace\",\r\n \"- Location (file, line, column)\",\r\n \"- Timestamp\",\r\n \"\",\r\n \"**Note**: This file is cleared on each dev server start. It only contains the most recent error.\",\r\n \"\",\r\n \"## Quick Decision Guide\",\r\n \"\",\r\n \"| Scenario | File to Use | Why |\",\r\n \"|----------|-------------|-----|\",\r\n \"| First time seeing project | llms.txt | Get oriented |\",\r\n \"| Understanding structure | meta.md | Detailed metadata |\",\r\n \"| Build issues | meta.md | Entry configurations |\",\r\n \"| Runtime errors | error.md | Stack traces and context |\",\r\n \"| Permission issues | meta.md | Permission lists |\",\r\n \"| Entry relationships | meta.md | File trees |\",\r\n \"\",\r\n \"## Addfox Framework Conventions\",\r\n \"\",\r\n \"### Entry Names\",\r\n \"Standard browser extension entries:\",\r\n \"- \\`popup\\`: Popup UI (usually has HTML)\",\r\n \"- \\`options\\`: Options/settings page (usually has HTML)\",\r\n \"- \\`background\\`: Service worker / background script (no HTML in MV3)\",\r\n \"- \\`content\\`: Content script injected into web pages\",\r\n \"- \\`sidepanel\\`: Side panel UI (Chrome)\",\r\n \"- \\`devtools\\`: DevTools panel\",\r\n \"- \\`offscreen\\`: Offscreen document (for DOM APIs in MV3)\",\r\n \"\",\r\n \"### Entry Configuration\",\r\n \"Entries can have these flags:\",\r\n \"- \\`html: true\\`: Generates HTML page (for popup/options)\",\r\n \"- \\`html: false\\`: No HTML generation (for background/content)\",\r\n \"- \\`outputFollowsScriptPath\\`: Output follows source script location\",\r\n \"- \\`scriptInject: 'head' | 'body'\\`: Where to inject script in HTML\",\r\n \"\",\r\n \"---\",\r\n \"\",\r\n \"*Generated by Addfox. Last updated: \" + new Date().toISOString() + \"*\",\r\n \"\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction formatBasicSection(manifest: ManifestRecord): string {\r\n const name = getString(manifest.name);\r\n const description = getString(manifest.description);\r\n const version = getString(manifest.version);\r\n const frameworkVersion = getString(getAddfoxVersion());\r\n const manifestVersion = getManifestVersion(manifest);\r\n\r\n return [\r\n \"# Extension Meta\",\r\n \"\",\r\n \"## 1. Basic information\",\r\n \"\",\r\n \"- Framework: addfox\",\r\n `- Name: ${name ?? \"Unknown\"}`,\r\n `- Description: ${description ?? \"None\"}`,\r\n `- Version: ${version ?? \"Unknown\"}`,\r\n `- Framework version: ${frameworkVersion ?? \"Unknown\"}`,\r\n `- Manifest version: ${manifestVersion ?? \"Unknown\"}`,\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction getString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction formatPermissionsSection(manifest: ManifestRecord): string {\r\n const permissions = pickArray(manifest.permissions);\r\n const hostPermissions = pickArray(manifest.host_permissions);\r\n const optionalPermissions = pickArray(manifest.optional_permissions);\r\n\r\n return [\r\n \"## 2. Permissions\",\r\n \"\",\r\n \"### 2.1 Permissions\",\r\n formatList(permissions),\r\n \"\",\r\n \"### 2.2 Host permissions\",\r\n formatList(hostPermissions),\r\n \"\",\r\n \"### 2.3 Optional permissions\",\r\n formatList(optionalPermissions),\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction formatList(items: string[]): string {\r\n return items.length ? items.map((p) => `- ${p}`).join(\"\\n\") : \"- None\";\r\n}\r\n\r\nfunction formatEntriesSection(entries: EntryInfo[], entrypointsMap?: EntrypointsMapData): string {\r\n const lines = [\"## 3. Entries\", \"\"];\r\n\r\n if (!entries.length) {\r\n lines.push(\"- None\");\r\n return lines.join(\"\\n\");\r\n }\r\n\r\n // Build tree content for all entries\r\n const treeLines: string[] = [];\r\n for (let i = 0; i < entries.length; i++) {\r\n const entry = entries[i];\r\n const mapping = entrypointsMap?.get(entry.name);\r\n const entryTree = formatEntryTree(entry, mapping);\r\n treeLines.push(entryTree);\r\n // Add blank line between entries (except after last)\r\n if (i < entries.length - 1) {\r\n treeLines.push(\"\");\r\n }\r\n }\r\n\r\n // Wrap in text code block for tree visualization\r\n lines.push(\"```text\");\r\n lines.push(...treeLines);\r\n lines.push(\"```\");\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction formatEntryTree(entry: EntryInfo, mapping?: EntryFilesMapping): string {\r\n const lines: string[] = [];\r\n const name = entry.name;\r\n\r\n // Entry header\r\n lines.push(`${name}/`);\r\n\r\n // Source file\r\n const sourcePath = mapping?.source ?? entry.scriptPath ?? \"unknown\";\r\n lines.push(`├── 📄 Source: ${normalizePath(sourcePath)}`);\r\n\r\n // HTML file if exists\r\n if (entry.htmlPath) {\r\n lines.push(`├── 📄 HTML: ${normalizePath(entry.htmlPath)}`);\r\n }\r\n\r\n // Output files from compilation\r\n const outputs = mapping?.outputs ?? [];\r\n if (outputs.length > 0) {\r\n // Group outputs by type\r\n const jsFiles = outputs.filter((f) => f.endsWith(\".js\"));\r\n const cssFiles = outputs.filter((f) => f.endsWith(\".css\"));\r\n const htmlFiles = outputs.filter((f) => f.endsWith(\".html\"));\r\n const otherFiles = outputs.filter((f) => !f.endsWith(\".js\") && !f.endsWith(\".css\") && !f.endsWith(\".html\"));\r\n\r\n const allGroups = [\r\n { label: \"JS\", files: jsFiles },\r\n { label: \"CSS\", files: cssFiles },\r\n { label: \"HTML\", files: htmlFiles },\r\n { label: \"Other\", files: otherFiles },\r\n ].filter((g) => g.files.length > 0);\r\n\r\n for (let i = 0; i < allGroups.length; i++) {\r\n const group = allGroups[i];\r\n const isLastGroup = i === allGroups.length - 1;\r\n const groupPrefix = isLastGroup ? \"└──\" : \"├──\";\r\n\r\n lines.push(`${groupPrefix} 📁 ${group.label}/`);\r\n\r\n for (let j = 0; j < group.files.length; j++) {\r\n const file = group.files[j];\r\n const isLastFile = j === group.files.length - 1;\r\n const filePrefix = isLastGroup ? (isLastFile ? \" └──\" : \" ├──\") : (isLastFile ? \"│ └──\" : \"│ ├──\");\r\n lines.push(`${filePrefix} ${file}`);\r\n }\r\n }\r\n } else {\r\n lines.push(\"└── 📁 Output: (not yet built)\");\r\n }\r\n\r\n // Configuration flags\r\n const configs: string[] = [];\r\n if (entry.html === true) configs.push(\"html: true\");\r\n if (entry.html === false) configs.push(\"html: false\");\r\n if (entry.outputFollowsScriptPath) configs.push(\"outputFollowsScriptPath: true\");\r\n if (entry.scriptInject) configs.push(`scriptInject: ${entry.scriptInject}`);\r\n\r\n if (configs.length > 0) {\r\n lines.push(` ⚙️ ${configs.join(\", \")}`);\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction pickArray(field: unknown): string[] {\r\n if (!Array.isArray(field)) return [];\r\n return field.filter((item): item is string => typeof item === \"string\");\r\n}\r\n\r\n/** Entry files mapping from compilation entrypoints */\r\ninterface EntryFilesMapping {\r\n /** Source entry file path */\r\n source: string;\r\n /** Output files generated for this entry (JS, CSS, HTML) */\r\n outputs: string[];\r\n}\r\n\r\ntype EntrypointsMapData = Map<string, EntryFilesMapping>;\r\n\r\n/**\r\n * Extract entrypoints mapping from compilation for AI context.\r\n * Maps each entry name to its source file and generated output files.\r\n */\r\nfunction extractEntrypointsMap(compilation: CompilationLike, entries: EntryInfo[]): EntrypointsMapData {\r\n const map = new Map<string, EntryFilesMapping>();\r\n const entrypoints = compilation.entrypoints;\r\n\r\n for (const entry of entries) {\r\n const entryOutput: EntryFilesMapping = {\r\n source: entry.scriptPath,\r\n outputs: [],\r\n };\r\n\r\n // Try to get files from compilation entrypoints\r\n if (entrypoints) {\r\n const ep = getEntrypointFromMap(entrypoints, entry.name);\r\n if (ep && typeof ep.getFiles === \"function\") {\r\n try {\r\n const files = ep.getFiles();\r\n if (Array.isArray(files)) {\r\n entryOutput.outputs = files.map(normalizePath).sort();\r\n }\r\n } catch {\r\n // Fallback to empty outputs if getFiles fails\r\n }\r\n }\r\n }\r\n\r\n // If no outputs from entrypoints, try to infer from assets\r\n if (entryOutput.outputs.length === 0 && compilation.assets) {\r\n const inferredOutputs = inferEntryOutputsFromAssets(entry, compilation.assets);\r\n entryOutput.outputs = inferredOutputs;\r\n }\r\n\r\n map.set(entry.name, entryOutput);\r\n }\r\n\r\n return map;\r\n}\r\n\r\nfunction getEntrypointFromMap(entrypoints: unknown, name: string): EntrypointLike | undefined {\r\n if (isMap(entrypoints)) {\r\n return entrypoints.get(name);\r\n }\r\n if (isRecord(entrypoints)) {\r\n return entrypoints[name];\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction inferEntryOutputsFromAssets(entry: EntryInfo, assets: Record<string, unknown>): string[] {\r\n const outputs: string[] = [];\r\n const assetNames = Object.keys(assets);\r\n\r\n // Match JS files\r\n const jsPatterns = [\r\n `${entry.name}.js`,\r\n `${entry.name}/index.js`,\r\n `static/js/${entry.name}.*.js`,\r\n `${entry.name}.*.js`,\r\n ];\r\n\r\n // Match CSS files\r\n const cssPatterns = [\r\n `${entry.name}.css`,\r\n `${entry.name}/index.css`,\r\n `static/css/${entry.name}.*.css`,\r\n `${entry.name}.*.css`,\r\n ];\r\n\r\n // Match HTML files\r\n const htmlPatterns = [\r\n `${entry.name}.html`,\r\n `${entry.name}/index.html`,\r\n `${entry.name}/*.html`,\r\n ];\r\n\r\n const patterns = [...jsPatterns, ...cssPatterns, ...htmlPatterns];\r\n\r\n for (const asset of assetNames) {\r\n const normalizedAsset = normalizePath(asset);\r\n for (const pattern of patterns) {\r\n if (matchPattern(normalizedAsset, pattern)) {\r\n outputs.push(normalizedAsset);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return outputs.sort();\r\n}\r\n\r\nfunction matchPattern(filename: string, pattern: string): boolean {\r\n // Convert simple glob pattern to regex\r\n const regexPattern = pattern\r\n .replace(/\\./g, \"\\\\.\")\r\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\r\n .replace(/\\*/g, \"[^/]*\")\r\n .replace(/{{GLOBSTAR}}/g, \".*\");\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(filename);\r\n}\r\n\r\n/** Inject dev-mode CSP connect-src so extension pages can reach Addfox HMR WS and Rsbuild dev server. */\r\nfunction injectDevCsp(manifest: ManifestRecord, ports: number[]): void {\r\n const devHosts = buildDevConnectHosts(ports);\r\n const csp = manifest.content_security_policy;\r\n\r\n if (typeof csp === \"string\") {\r\n manifest.content_security_policy = mergeCspString(csp, devHosts);\r\n return;\r\n }\r\n\r\n const cspObj = (typeof csp === \"object\" && csp !== null ? csp : {}) as Record<string, unknown>;\r\n const extensionPages = typeof cspObj.extension_pages === \"string\" ? cspObj.extension_pages : \"\";\r\n manifest.content_security_policy = {\r\n ...cspObj,\r\n extension_pages: extensionPages ? mergeCspString(extensionPages, devHosts) : buildDefaultCsp(devHosts),\r\n };\r\n}\r\n\r\nfunction buildDevConnectHosts(ports: number[]): string[] {\r\n const hosts: string[] = [];\r\n const seen = new Set<string>();\r\n const hostnames = [\"127.0.0.1\", \"localhost\"] as const;\r\n for (const hostname of hostnames) {\r\n for (const scheme of [\"http\", \"ws\"] as const) {\r\n addDevHost(hosts, seen, `${scheme}://${hostname}:*`);\r\n }\r\n }\r\n for (const port of ports) {\r\n for (const hostname of hostnames) {\r\n for (const scheme of [\"http\", \"ws\"] as const) {\r\n addDevHost(hosts, seen, `${scheme}://${hostname}:${port}`);\r\n }\r\n }\r\n }\r\n return hosts;\r\n}\r\n\r\nfunction addDevHost(hosts: string[], seen: Set<string>, host: string): void {\r\n if (seen.has(host)) return;\r\n seen.add(host);\r\n hosts.push(host);\r\n}\r\n\r\nfunction buildDefaultCsp(devHosts: string[]): string {\r\n return `script-src 'self'; object-src 'self'; connect-src 'self' ${devHosts.join(\" \")};`;\r\n}\r\n\r\nfunction mergeCspString(csp: string, devHosts: string[]): string {\r\n const connectMatch = csp.match(/connect-src\\s+([^;]*)/);\r\n if (!connectMatch) {\r\n return `${csp.trim().replace(/;?\\s*$/, \"\")}; connect-src 'self' ${devHosts.join(\" \")};`;\r\n }\r\n const existing = connectMatch[1].trim();\r\n const parts = existing.split(/\\s+/);\r\n for (const host of devHosts) {\r\n if (!parts.includes(host)) parts.push(host);\r\n }\r\n return csp.replace(/connect-src\\s+[^;]*/, `connect-src ${parts.join(\" \")}`);\r\n}\r\n"],"names":["CONTENT_CSS_GLOBAL_KEY","CONTENT_CSS_TEXTS_GLOBAL_KEY","REQUIRED_HTML_ENTRIES","Set","CONTENT_CSS_PATTERN","CONTENT_WRAPPER_PATTERN","CONTENT_JS_PATTERNS","k","CONTENT_CSS_PATTERNS","extensionPlugin","resolvedConfig","entries","browser","distPath","devConnectPorts","root","outputRoot","manifest","metaDir","resolve","api","bundlerConfigs","config","createManifestPlugin","compiler","compilation","emitManifest","ensureDir","safeCompilation","contentScriptOutput","collectContentScriptOutput","injectContentCssRuntimeMeta","manifestObj","resolveManifestForTarget","console","finalManifest","applyContentCssManifestPolicy","injectDevCsp","validateEntryHtmlRules","writeManifestJson","entrypointsMap","extractEntrypointsMap","Promise","writeMetaMarkdown","writeLlmsTxt","dirPath","existsSync","mkdirSync","manifestPath","writeFileSync","JSON","hasContent","e","autoFillCssInManifest","shouldDisableManifestCssAutoFill","fromEntrypoint","tryGetContentEntryFiles","byNames","collectContentScriptOutputByNames","css","entrypoints","contentEntry","getContentEntryFromEntrypoints","files","safeGetFiles","categorizeFiles","isMap","isRecord","value","entry","Array","undefined","js","name","normalized","normalizePath","keys","getAssetKeys","filterAndSortKeys","Object","safeGetAssetKeys","getAssets","assets","a","s","patterns","pattern","path","hasShadowOrIframeContentUIUsage","scriptPath","source","safeReadFile","filePath","readFileSync","outputManifest","inputManifest","shouldRemoveCss","hasUserDefinedContentCss","removeContentScriptCss","branch","pickManifestBranch","scripts","hasCssField","item","isPlainObject","byBrowser","primary","fallback","asManifestRecord","next","_","rest","normalizedCss","cssTexts","file","readCssAssetText","banner","buildCssBanner","jsRel","prependBannerToJsFile","cssFiles","absPath","src","hasCssMetaInjected","mv","getManifestVersion","errors","validateEntryHtml","Error","htmlFlag","getEntryHtmlFlag","ensureMetaDir","content","buildMetaMarkdown","metaPath","writeFileAsync","sections","formatAiPromptHeader","formatBasicSection","formatPermissionsSection","formatEntriesSection","buildLlmsTxt","llmsPath","getString","description","version","entryList","Date","frameworkVersion","getAddfoxVersion","manifestVersion","permissions","pickArray","hostPermissions","optionalPermissions","formatList","items","p","lines","treeLines","i","mapping","entryTree","formatEntryTree","sourcePath","outputs","jsFiles","f","htmlFiles","otherFiles","allGroups","g","group","isLastGroup","groupPrefix","j","isLastFile","filePrefix","configs","field","map","Map","entryOutput","ep","getEntrypointFromMap","inferredOutputs","inferEntryOutputsFromAssets","assetNames","jsPatterns","cssPatterns","htmlPatterns","asset","normalizedAsset","matchPattern","filename","regexPattern","regex","RegExp","ports","devHosts","buildDevConnectHosts","csp","mergeCspString","cspObj","extensionPages","buildDefaultCsp","hosts","seen","hostnames","hostname","scheme","addDevHost","port","host","connectMatch","existing","parts"],"mappings":"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,KAAKC,mBAAmB5G;IAE9B,MAAMiI,YAAYvI,QAAQ,GAAG,CAAC,CAACyC,IAAM,CAAC,IAAI,EAAEA,EAAE,IAAI,CAAC,IAAI,EAAEA,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC;IAE9E,OAAO;QACL;QACA;QACA;QACA;QACA;QACA;QACA;QACA,CAAC,YAAY,EAAEqB,MAAM;QACrB,CAAC,mBAAmB,EAAEuE,aAAa;QACnC,CAAC,eAAe,EAAEC,SAAS;QAC3B,CAAC,wBAAwB,EAAErB,MAAM,WAAW;QAC5C;QACA;QACA;QACA;QACAsB,aAAa;QACb;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,IAAIC,OAAO,WAAW,KAAK;QACpE;KACD,CAAC,IAAI,CAAC;AACT;AAEA,SAAST,mBAAmBzH,QAAwB;IAClD,MAAMwD,OAAOsE,UAAU9H,SAAS,IAAI;IACpC,MAAM+H,cAAcD,UAAU9H,SAAS,WAAW;IAClD,MAAMgI,UAAUF,UAAU9H,SAAS,OAAO;IAC1C,MAAMmI,mBAAmBL,UAAUM;IACnC,MAAMC,kBAAkBzB,mBAAmB5G;IAE3C,OAAO;QACL;QACA;QACA;QACA;QACA;QACA,CAAC,QAAQ,EAAEwD,QAAQ,WAAW;QAC9B,CAAC,eAAe,EAAEuE,eAAe,QAAQ;QACzC,CAAC,WAAW,EAAEC,WAAW,WAAW;QACpC,CAAC,qBAAqB,EAAEG,oBAAoB,WAAW;QACvD,CAAC,oBAAoB,EAAEE,mBAAmB,WAAW;KACtD,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@addfox/rsbuild-plugin-extension-manifest",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "Rsbuild plugin: write manifest.json and remove stray HTML (internal)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@addfox/core": "0.2.
|
|
23
|
+
"@addfox/core": "0.2.6"
|
|
24
24
|
},
|
|
25
25
|
"engines": {
|
|
26
26
|
"node": ">=18.0.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@rspack/core": "2.1.
|
|
30
|
-
"@rsbuild/core": "2.1.
|
|
29
|
+
"@rspack/core": "2.1.10",
|
|
30
|
+
"@rsbuild/core": "2.1.13",
|
|
31
31
|
"@rslib/core": "^0.23.0",
|
|
32
32
|
"@rstest/core": "^0.9.9",
|
|
33
33
|
"@rstest/coverage-istanbul": "^0.3.2",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"typescript": "^5.0.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@rsbuild/core": "2.1.
|
|
39
|
-
"@rspack/core": "2.1.
|
|
38
|
+
"@rsbuild/core": "2.1.13",
|
|
39
|
+
"@rspack/core": "2.1.10"
|
|
40
40
|
},
|
|
41
41
|
"peerDependenciesMeta": {
|
|
42
42
|
"@rsbuild/core": {
|