// npm package
@f5xc-salesdemos/docs-theme
F5 Distributed Cloud branded Starlight documentation theme
weekly
788
monthly
2,362
versions
76
maintainers
1
license
MIT
first publish
2026-02-19
publisher
robinmordasiewicz
tarball
376,358 B
AUTO-PUBLISHED·2 versions indexed·latest published 2026-06-06
// exfil path
what is read → where it shipssteals
- ● AI API keys
sends to
- ⤳ github.com(github.com (via hostname var))
// offending code· @3.0.1· 3 files flagged
llm: malicious · 0.95→ Credential read (reads-ai-api-keys) paired with dest-via-hostname-var destination — classic exfiltration signature.
- @3.0.1··AUTO-PUBLISHED·publisher: robinmordasiewiczheuristic 72/100static flags 4llm malicious (0.95) via fast-tracknew-publisher:18dpublisher-handle-randomlookingmature-packagehas-source-repopublisher-multi-name-burst:12publisher-version-pump:23reads-env-varsreads-ai-api-keyschild-process-spawndest-via-hostname-var
→ Credential read (reads-ai-api-keys) paired with dest-via-hostname-var destination — classic exfiltration signature.
// offending code· 3 files flaggedpatterns: 4
--- package/config.ts (excerpt) --- import fs from 'node:fs'; import path from 'node:path'; import react from '@astrojs/react'; import starlight from '@astrojs/starlight'; import type { StarlightPlugin } from '@astrojs/starlight/types'; import starlightLlmsTxt from '@f5xc-salesdemos/starlight-llms-txt'; import type { AstroIntegration } from 'astro'; import { defineConfig } from 'astro/config'; import codeImport from 'remark-code-import'; import starlightHeadingBadges from 'starlight-heading-badges'; import starlightImageZoom from 'starlight-image-zoom'; import starlightMegaMenu from 'starlight-mega-menu'; import starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi'; import starlightPageActions from 'starlight-page-actions'; import { starlightIconsPlugin } from 'starlight-plugin-icons'; import starlightScrollToTop from 'starlight-scroll-to-top'; import starlightVideosPlugin from 'starlight-videos'; import f5xcDocsTheme from './index.ts'; import { defaultLocale as f5xcDefaultLocale, f5xcDefaultLocales } from './src/i18n/locales.ts'; import remarkMermaid from './src/plugins/remark-mermaid.mjs'; import { resolveIcon } from './src/utils/resolve-icon.ts'; import { buildSubcategorySidebar } from './src/utils/subcategory-sidebar.ts'; export type { LocaleConfig } from './src/i18n/locales.ts'; export { f5xcDefaultLocales } from './src/i18n/locales.ts'; interface MegaMenuItem { label: string; href?: string; content?: { layout?: string; columns?: number; categories?: Array<{ title: s --- package/index.ts (excerpt) --- import type { StarlightPlugin } from '@astrojs/starlight/types'; export default function f5xcDocsTheme(): StarlightPlugin { return { name: '@f5xc-salesdemos/docs-theme', hooks: { 'config:setup'({ config, updateConfig, addRouteMiddleware, logger }) { addRouteMiddleware({ entrypoint: '@f5xc-salesdemos/docs-theme/route-middleware', order: 'pre', }); updateConfig({ customCss: [ ...(config.customCss ?? []), '@f5xc-salesdemos/docs-theme/fonts/font-face.css', '@f5xc-salesdemos/docs-theme/styles/custom.css', ], components: { ...config.components, Banner: '@f5xc-salesdemos/docs-theme/components/Banner.astro', EditLink: '@f5xc-salesdemos/docs-theme/components/EditLink.astro', Footer: '@f5xc-salesdemos/docs-theme/components/Footer.astro', SiteTitle: '@f5xc-salesdemos/docs-theme/components/SiteTitle.astro', MarkdownContent: process.env.DOCS_MARKDOWN_CONTENT || '@f5xc-salesdemos/docs-theme/components/MarkdownContent.astro', }, }); logger.info('F5 XC docs theme loaded'); }, }, }; } --- package/bin/translate.mjs (excerpt) --- #!/usr/bin/env node import { execFileSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; async function main() { const args = process.argv.slice(2); const staged = args.includes('--staged'); const localeFlag = args.indexOf('--locale'); const singleLocale = localeFlag !== -1 ? args[localeFlag + 1] : null; const apiKey = process.env.ANTHROPIC_API_KEY; if (!apiKey) { console.warn('[docs-translate] ANTHROPIC_API_KEY not set — skipping translation.'); process.exit(0); } const { f5xcDefaultLocales } = await import('@f5xc-salesdemos/docs-theme/src/i18n/locales.ts'); const { translateFile } = await import('@f5xc-salesdemos/docs-theme/src/i18n/translator.ts'); const contentDir = process.env.CONTENT_DIR || 'src/content/docs'; const resolvedContentDir = path.resolve(process.cwd(), contentDir); let activeLocales = { ...f5xcDefaultLocales }; delete activeLocales.en; if (singleLocale) { if (!activeLocales[singleLocale]) { console.error(`[docs-translate] Unknown locale: ${singleLocale}`); process.exit(1); } activeLocales = { [singleLocale]: activeLocales[singleLocale] }; } let englishFiles; if (staged) { const stagedOutput = execFileSync('git', ['diff', '--cached', '--name-only', '--diff-filter=ACM'], { encoding: 'utf-8', }); englishFiles = stagedOutput .split('\n') .filter((f) => f.trim()) .filter((f) => /\.mdx?$/.test(f)) .filter((f) => --- dynamic destinations --- → github.com (via hostname-var)
