@dualmark/astro 0.7.0 → 0.8.0

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/README.md CHANGED
@@ -75,7 +75,7 @@ export default defineConfig({
75
75
 
76
76
  ## Built-in converter names
77
77
 
78
- `blog`, `case-study`, `changelog`, `compare`, `docs`, `feature`, `glossary`, `legal`, `pricing`, `pseo`, `tool`, `video`
78
+ `blog`, `case-study`, `changelog`, `compare`, `docs`, `feature`, `glossary`, `legal`, `pricing`, `pseo`, `status-page`, `tool`, `video`
79
79
 
80
80
  Pass any string from this list as `converter`, or pass a function (currently not serializable into generated routes — planned for a future release).
81
81
 
package/dist/index.cjs CHANGED
@@ -297,13 +297,15 @@ function resolveBuiltInConverter(args) {
297
297
  return converters.pricingConverter(cfg);
298
298
  case "pseo":
299
299
  return converters.pseoConverter(cfg);
300
+ case "status-page":
301
+ return converters.statusPageConverter(cfg);
300
302
  case "tool":
301
303
  return converters.toolConverter(cfg);
302
304
  case "video":
303
305
  return converters.videoConverter(cfg);
304
306
  default:
305
307
  throw new Error(
306
- `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, tool, video. Or pass a function.`
308
+ `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, status-page, tool, video. Or pass a function.`
307
309
  );
308
310
  }
309
311
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config-validation.ts","../src/integration.ts","../src/converter-registry.ts"],"names":["relative","sep","fileURLToPath","join","existsSync","writeFileSync","blogConverter","caseStudyConverter","changelogConverter","compareConverter","docsConverter","featureConverter","glossaryConverter","integrationConverter","legalConverter","pricingConverter","pseoConverter","toolConverter","videoConverter"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\nexport class DualmarkConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DualmarkConfigError\";\n }\n}\n\nexport function resolveConfig(input: DualmarkAstroConfig): ResolvedDualmarkConfig {\n if (!input || typeof input !== \"object\") {\n throw new DualmarkConfigError(\"Dualmark config must be an object\");\n }\n if (typeof input.siteUrl !== \"string\" || !input.siteUrl) {\n throw new DualmarkConfigError(\"Dualmark config: siteUrl is required (e.g. 'https://example.com')\");\n }\n try {\n new URL(input.siteUrl);\n } catch {\n throw new DualmarkConfigError(`Dualmark config: siteUrl is not a valid URL: ${input.siteUrl}`);\n }\n if (input.siteUrl.endsWith(\"/\")) {\n throw new DualmarkConfigError(`Dualmark config: siteUrl must not end with '/': ${input.siteUrl}`);\n }\n\n const collections = input.collections ?? {};\n for (const [name, c] of Object.entries(collections)) {\n if (!c.converter) {\n throw new DualmarkConfigError(`Dualmark config: collection '${name}' is missing 'converter'`);\n }\n if (c.route && c.route.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: collection '${name}' route should not start with '/' (got '${c.route}')`,\n );\n }\n }\n\n const staticPages = input.staticPages ?? [];\n for (const sp of staticPages) {\n if (!sp.pattern.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.pattern must start with '/' (got '${sp.pattern}')`,\n );\n }\n if (typeof sp.render !== \"function\") {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.render for '${sp.pattern}' must be a function`,\n );\n }\n }\n\n const parameterizedRoutes = input.parameterizedRoutes ?? [];\n for (const pr of parameterizedRoutes) {\n if (!pr.pattern.includes(\"[\")) {\n throw new DualmarkConfigError(\n `Dualmark config: parameterizedRoutes.pattern must contain at least one [param] (got '${pr.pattern}')`,\n );\n }\n }\n\n return {\n siteUrl: input.siteUrl,\n collections,\n staticPages,\n parameterizedRoutes,\n llmsTxt: input.llmsTxt,\n middleware: {\n injectLinkHeader: input.middleware?.injectLinkHeader !== false,\n },\n headers: {\n cacheControl: input.headers?.cacheControl ?? \"public, max-age=3600\",\n noindex: input.headers?.noindex !== false,\n },\n };\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport { resolveConfig, DualmarkConfigError } from \"./config-validation.js\";\nimport type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\ninterface AstroIntegrationLogger {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n}\n\ninterface InjectedRoute {\n pattern: string;\n entrypoint: string | URL;\n prerender?: boolean;\n}\n\ninterface AstroIntegrationMiddleware {\n order: \"pre\" | \"post\";\n entrypoint: string | URL;\n}\n\ninterface ConfigSetupHookOptions {\n config: { root: URL; srcDir?: URL };\n command: string;\n isRestart?: boolean;\n injectRoute: (route: InjectedRoute) => void;\n addMiddleware?: (mw: AstroIntegrationMiddleware) => void;\n logger: AstroIntegrationLogger;\n updateConfig?: (cfg: unknown) => unknown;\n}\n\nexport interface AstroIntegrationLike {\n name: string;\n hooks: {\n \"astro:config:setup\": (opts: ConfigSetupHookOptions) => void | Promise<void>;\n };\n}\n\nconst GENERATED_DIR_NAME = \".dualmark-generated\";\n\ninterface RouteSpec {\n pattern: string;\n fileName: string;\n source: string;\n}\n\nfunction rel(from: string, to: string): string {\n const r = relative(from, to);\n return r.split(sep).join(\"/\");\n}\n\nexport function createDualmarkIntegration(input: DualmarkAstroConfig): AstroIntegrationLike {\n let resolved: ResolvedDualmarkConfig;\n try {\n resolved = resolveConfig(input);\n } catch (e) {\n if (e instanceof DualmarkConfigError) throw e;\n throw e;\n }\n\n return {\n name: \"@dualmark/astro\",\n hooks: {\n \"astro:config:setup\"(opts) {\n const root = fileURLToPath(opts.config.root);\n const generatedDir = join(root, \"node_modules\", GENERATED_DIR_NAME);\n if (!existsSync(generatedDir)) mkdirSync(generatedDir, { recursive: true });\n\n writeFileSync(\n join(generatedDir, \"config.mjs\"),\n `export default ${JSON.stringify(\n {\n siteUrl: resolved.siteUrl,\n cacheControl: resolved.headers.cacheControl,\n noindex: resolved.headers.noindex,\n },\n null,\n 2,\n )};\\n`,\n \"utf8\",\n );\n\n const routes: RouteSpec[] = [];\n\n for (const [collectionName, c] of Object.entries(resolved.collections)) {\n const route = c.route ?? collectionName;\n const slugSeg = c.slugStrategy === \"single\" ? \"[slug]\" : \"[...slug]\";\n const detailPattern = `/${route}/${slugSeg}.md`;\n const listingPattern = `/${route}.md`;\n if (typeof c.converter !== \"string\") {\n opts.logger.warn(\n `[@dualmark/astro] Collection '${collectionName}' uses an inline converter function — this isn't yet serializable into a generated route. Use a built-in converter name (e.g. 'blog') for now.`,\n );\n continue;\n }\n const converterImport = `import { resolveBuiltInConverter } from \"@dualmark/astro\";`;\n const detailSource = `${converterImport}\nimport { makeCollectionDetailEndpoint } from \"@dualmark/astro/endpoints/collection\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst converter = resolveBuiltInConverter({\n name: ${JSON.stringify(c.converter)},\n collectionName: ${JSON.stringify(collectionName)},\n baseConfig: { siteUrl: dualmarkConfig.siteUrl },\n});\n\nconst endpoint = makeCollectionDetailEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n converter,\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n\n const listingSource = `import { makeListingEndpoint } from \"@dualmark/astro/endpoints/listing\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst endpoint = makeListingEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n siteUrl: dualmarkConfig.siteUrl,\n basePath: ${JSON.stringify(\"/\" + route)},\n title: ${JSON.stringify(c.listingMetadata?.title ?? collectionName)},\n description: ${JSON.stringify(c.listingMetadata?.description ?? `All ${collectionName} entries.`)},\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n\n routes.push(\n { pattern: detailPattern, fileName: `collection-${collectionName}-detail.mjs`, source: detailSource },\n );\n if (c.emitListing !== false) {\n routes.push({\n pattern: listingPattern,\n fileName: `collection-${collectionName}-listing.mjs`,\n source: listingSource,\n });\n }\n }\n\n for (let i = 0; i < resolved.staticPages.length; i++) {\n const sp = resolved.staticPages[i];\n if (!sp) continue;\n const safe = sp.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const fileName = `static-${i}-${safe}.mjs`;\n const renderModulePath = join(generatedDir, `static-${i}-${safe}-render.mjs`);\n writeFileSync(\n renderModulePath,\n `export default ${sp.render.toString()};\\n`,\n \"utf8\",\n );\n const source = `import { makeStaticEndpoint } from \"@dualmark/astro/endpoints/static\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\n\nconst endpoint = makeStaticEndpoint({\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n const mdPattern = sp.pattern === \"/\" ? \"/index.md\" : sp.pattern.replace(/\\/$/, \"\") + \".md\";\n routes.push({ pattern: mdPattern, fileName, source });\n }\n\n for (let i = 0; i < resolved.parameterizedRoutes.length; i++) {\n const pr = resolved.parameterizedRoutes[i];\n if (!pr) continue;\n const safe = pr.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const renderModulePath = join(generatedDir, `param-${i}-${safe}-render.mjs`);\n const pathsModulePath = join(generatedDir, `param-${i}-${safe}-paths.mjs`);\n writeFileSync(renderModulePath, `export default ${pr.render.toString()};\\n`, \"utf8\");\n writeFileSync(pathsModulePath, `export default ${pr.getStaticPaths.toString()};\\n`, \"utf8\");\n const source = `import { makeParameterizedEndpoint } from \"@dualmark/astro/endpoints/parameterized\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\nimport getStaticPaths from \"./${rel(generatedDir, pathsModulePath)}\";\n\nconst endpoint = makeParameterizedEndpoint({\n getStaticPaths: () => getStaticPaths(),\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n const pattern = pr.pattern.startsWith(\"/\") ? pr.pattern + \".md\" : `/${pr.pattern}.md`;\n routes.push({\n pattern,\n fileName: `param-${i}-${safe}.mjs`,\n source,\n });\n }\n\n if (resolved.llmsTxt?.enabled) {\n const sections = resolved.llmsTxt.sections ?? [];\n const source = `import { makeLlmsTxtEndpoint } from \"@dualmark/astro/endpoints/llms-txt\";\n\nconst endpoint = makeLlmsTxtEndpoint({\n brandName: ${JSON.stringify(resolved.llmsTxt.brandName ?? \"Site\")},\n description: ${JSON.stringify(resolved.llmsTxt.description ?? \"\")},\n sections: ${JSON.stringify(sections)},\n});\n\nexport const GET = endpoint.GET;\n`;\n routes.push({ pattern: \"/llms.txt\", fileName: `llms-txt.mjs`, source });\n }\n\n for (const r of routes) {\n const filePath = join(generatedDir, r.fileName);\n writeFileSync(filePath, r.source, \"utf8\");\n opts.injectRoute({\n pattern: r.pattern,\n entrypoint: filePath,\n prerender: true,\n });\n }\n\n if (resolved.middleware.injectLinkHeader && opts.addMiddleware) {\n opts.addMiddleware({\n order: \"post\",\n entrypoint: \"@dualmark/astro/middleware\",\n });\n }\n\n opts.logger.info(\n `[@dualmark/astro] Injected ${routes.length} route(s) and ${\n resolved.middleware.injectLinkHeader ? \"1\" : \"0\"\n } middleware`,\n );\n\n void resolve;\n },\n },\n };\n}\n\nexport default function dualmarkAstro(config: DualmarkAstroConfig): AstroIntegrationLike {\n return createDualmarkIntegration(config);\n}\n","import {\n blogConverter,\n caseStudyConverter,\n changelogConverter,\n compareConverter,\n docsConverter,\n featureConverter,\n glossaryConverter,\n integrationConverter,\n legalConverter,\n pricingConverter,\n pseoConverter,\n toolConverter,\n videoConverter,\n type BaseConverterConfig,\n type CollectionEntry,\n type Converter,\n} from \"@dualmark/converters\";\n\nexport type BuiltInConverterName =\n | \"blog\"\n | \"case-study\"\n | \"changelog\"\n | \"compare\"\n | \"docs\"\n | \"feature\"\n | \"glossary\"\n | \"integration\"\n | \"legal\"\n | \"pricing\"\n | \"pseo\"\n | \"tool\"\n | \"video\";\n\nexport interface ResolveConverterArgs {\n name: string;\n collectionName: string;\n baseConfig: BaseConverterConfig;\n}\n\nexport function resolveBuiltInConverter(\n args: ResolveConverterArgs,\n): Converter<CollectionEntry<unknown>> {\n const basePath = `/${args.collectionName}`;\n const cfg = { ...args.baseConfig, basePath };\n switch (args.name as BuiltInConverterName) {\n case \"blog\":\n return blogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"case-study\":\n return caseStudyConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"changelog\":\n return changelogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"compare\":\n return compareConverter({ ...cfg, ourBrandColumn: \"Us\" }) as Converter<CollectionEntry<unknown>>;\n case \"docs\":\n return docsConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"feature\":\n return featureConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"glossary\":\n return glossaryConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"integration\":\n return integrationConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"legal\":\n return legalConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pricing\":\n return pricingConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pseo\":\n return pseoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"tool\":\n return toolConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"video\":\n return videoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n default:\n throw new Error(\n `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, tool, video. Or pass a function.`,\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/config-validation.ts","../src/integration.ts","../src/converter-registry.ts"],"names":["relative","sep","fileURLToPath","join","existsSync","writeFileSync","blogConverter","caseStudyConverter","changelogConverter","compareConverter","docsConverter","featureConverter","glossaryConverter","integrationConverter","legalConverter","pricingConverter","pseoConverter","statusPageConverter","toolConverter","videoConverter"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\nexport class DualmarkConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DualmarkConfigError\";\n }\n}\n\nexport function resolveConfig(input: DualmarkAstroConfig): ResolvedDualmarkConfig {\n if (!input || typeof input !== \"object\") {\n throw new DualmarkConfigError(\"Dualmark config must be an object\");\n }\n if (typeof input.siteUrl !== \"string\" || !input.siteUrl) {\n throw new DualmarkConfigError(\"Dualmark config: siteUrl is required (e.g. 'https://example.com')\");\n }\n try {\n new URL(input.siteUrl);\n } catch {\n throw new DualmarkConfigError(`Dualmark config: siteUrl is not a valid URL: ${input.siteUrl}`);\n }\n if (input.siteUrl.endsWith(\"/\")) {\n throw new DualmarkConfigError(`Dualmark config: siteUrl must not end with '/': ${input.siteUrl}`);\n }\n\n const collections = input.collections ?? {};\n for (const [name, c] of Object.entries(collections)) {\n if (!c.converter) {\n throw new DualmarkConfigError(`Dualmark config: collection '${name}' is missing 'converter'`);\n }\n if (c.route && c.route.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: collection '${name}' route should not start with '/' (got '${c.route}')`,\n );\n }\n }\n\n const staticPages = input.staticPages ?? [];\n for (const sp of staticPages) {\n if (!sp.pattern.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.pattern must start with '/' (got '${sp.pattern}')`,\n );\n }\n if (typeof sp.render !== \"function\") {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.render for '${sp.pattern}' must be a function`,\n );\n }\n }\n\n const parameterizedRoutes = input.parameterizedRoutes ?? [];\n for (const pr of parameterizedRoutes) {\n if (!pr.pattern.includes(\"[\")) {\n throw new DualmarkConfigError(\n `Dualmark config: parameterizedRoutes.pattern must contain at least one [param] (got '${pr.pattern}')`,\n );\n }\n }\n\n return {\n siteUrl: input.siteUrl,\n collections,\n staticPages,\n parameterizedRoutes,\n llmsTxt: input.llmsTxt,\n middleware: {\n injectLinkHeader: input.middleware?.injectLinkHeader !== false,\n },\n headers: {\n cacheControl: input.headers?.cacheControl ?? \"public, max-age=3600\",\n noindex: input.headers?.noindex !== false,\n },\n };\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport { resolveConfig, DualmarkConfigError } from \"./config-validation.js\";\nimport type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\ninterface AstroIntegrationLogger {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n}\n\ninterface InjectedRoute {\n pattern: string;\n entrypoint: string | URL;\n prerender?: boolean;\n}\n\ninterface AstroIntegrationMiddleware {\n order: \"pre\" | \"post\";\n entrypoint: string | URL;\n}\n\ninterface ConfigSetupHookOptions {\n config: { root: URL; srcDir?: URL };\n command: string;\n isRestart?: boolean;\n injectRoute: (route: InjectedRoute) => void;\n addMiddleware?: (mw: AstroIntegrationMiddleware) => void;\n logger: AstroIntegrationLogger;\n updateConfig?: (cfg: unknown) => unknown;\n}\n\nexport interface AstroIntegrationLike {\n name: string;\n hooks: {\n \"astro:config:setup\": (opts: ConfigSetupHookOptions) => void | Promise<void>;\n };\n}\n\nconst GENERATED_DIR_NAME = \".dualmark-generated\";\n\ninterface RouteSpec {\n pattern: string;\n fileName: string;\n source: string;\n}\n\nfunction rel(from: string, to: string): string {\n const r = relative(from, to);\n return r.split(sep).join(\"/\");\n}\n\nexport function createDualmarkIntegration(input: DualmarkAstroConfig): AstroIntegrationLike {\n let resolved: ResolvedDualmarkConfig;\n try {\n resolved = resolveConfig(input);\n } catch (e) {\n if (e instanceof DualmarkConfigError) throw e;\n throw e;\n }\n\n return {\n name: \"@dualmark/astro\",\n hooks: {\n \"astro:config:setup\"(opts) {\n const root = fileURLToPath(opts.config.root);\n const generatedDir = join(root, \"node_modules\", GENERATED_DIR_NAME);\n if (!existsSync(generatedDir)) mkdirSync(generatedDir, { recursive: true });\n\n writeFileSync(\n join(generatedDir, \"config.mjs\"),\n `export default ${JSON.stringify(\n {\n siteUrl: resolved.siteUrl,\n cacheControl: resolved.headers.cacheControl,\n noindex: resolved.headers.noindex,\n },\n null,\n 2,\n )};\\n`,\n \"utf8\",\n );\n\n const routes: RouteSpec[] = [];\n\n for (const [collectionName, c] of Object.entries(resolved.collections)) {\n const route = c.route ?? collectionName;\n const slugSeg = c.slugStrategy === \"single\" ? \"[slug]\" : \"[...slug]\";\n const detailPattern = `/${route}/${slugSeg}.md`;\n const listingPattern = `/${route}.md`;\n if (typeof c.converter !== \"string\") {\n opts.logger.warn(\n `[@dualmark/astro] Collection '${collectionName}' uses an inline converter function — this isn't yet serializable into a generated route. Use a built-in converter name (e.g. 'blog') for now.`,\n );\n continue;\n }\n const converterImport = `import { resolveBuiltInConverter } from \"@dualmark/astro\";`;\n const detailSource = `${converterImport}\nimport { makeCollectionDetailEndpoint } from \"@dualmark/astro/endpoints/collection\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst converter = resolveBuiltInConverter({\n name: ${JSON.stringify(c.converter)},\n collectionName: ${JSON.stringify(collectionName)},\n baseConfig: { siteUrl: dualmarkConfig.siteUrl },\n});\n\nconst endpoint = makeCollectionDetailEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n converter,\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n\n const listingSource = `import { makeListingEndpoint } from \"@dualmark/astro/endpoints/listing\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst endpoint = makeListingEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n siteUrl: dualmarkConfig.siteUrl,\n basePath: ${JSON.stringify(\"/\" + route)},\n title: ${JSON.stringify(c.listingMetadata?.title ?? collectionName)},\n description: ${JSON.stringify(c.listingMetadata?.description ?? `All ${collectionName} entries.`)},\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n\n routes.push(\n { pattern: detailPattern, fileName: `collection-${collectionName}-detail.mjs`, source: detailSource },\n );\n if (c.emitListing !== false) {\n routes.push({\n pattern: listingPattern,\n fileName: `collection-${collectionName}-listing.mjs`,\n source: listingSource,\n });\n }\n }\n\n for (let i = 0; i < resolved.staticPages.length; i++) {\n const sp = resolved.staticPages[i];\n if (!sp) continue;\n const safe = sp.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const fileName = `static-${i}-${safe}.mjs`;\n const renderModulePath = join(generatedDir, `static-${i}-${safe}-render.mjs`);\n writeFileSync(\n renderModulePath,\n `export default ${sp.render.toString()};\\n`,\n \"utf8\",\n );\n const source = `import { makeStaticEndpoint } from \"@dualmark/astro/endpoints/static\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\n\nconst endpoint = makeStaticEndpoint({\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n const mdPattern = sp.pattern === \"/\" ? \"/index.md\" : sp.pattern.replace(/\\/$/, \"\") + \".md\";\n routes.push({ pattern: mdPattern, fileName, source });\n }\n\n for (let i = 0; i < resolved.parameterizedRoutes.length; i++) {\n const pr = resolved.parameterizedRoutes[i];\n if (!pr) continue;\n const safe = pr.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const renderModulePath = join(generatedDir, `param-${i}-${safe}-render.mjs`);\n const pathsModulePath = join(generatedDir, `param-${i}-${safe}-paths.mjs`);\n writeFileSync(renderModulePath, `export default ${pr.render.toString()};\\n`, \"utf8\");\n writeFileSync(pathsModulePath, `export default ${pr.getStaticPaths.toString()};\\n`, \"utf8\");\n const source = `import { makeParameterizedEndpoint } from \"@dualmark/astro/endpoints/parameterized\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\nimport getStaticPaths from \"./${rel(generatedDir, pathsModulePath)}\";\n\nconst endpoint = makeParameterizedEndpoint({\n getStaticPaths: () => getStaticPaths(),\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n const pattern = pr.pattern.startsWith(\"/\") ? pr.pattern + \".md\" : `/${pr.pattern}.md`;\n routes.push({\n pattern,\n fileName: `param-${i}-${safe}.mjs`,\n source,\n });\n }\n\n if (resolved.llmsTxt?.enabled) {\n const sections = resolved.llmsTxt.sections ?? [];\n const source = `import { makeLlmsTxtEndpoint } from \"@dualmark/astro/endpoints/llms-txt\";\n\nconst endpoint = makeLlmsTxtEndpoint({\n brandName: ${JSON.stringify(resolved.llmsTxt.brandName ?? \"Site\")},\n description: ${JSON.stringify(resolved.llmsTxt.description ?? \"\")},\n sections: ${JSON.stringify(sections)},\n});\n\nexport const GET = endpoint.GET;\n`;\n routes.push({ pattern: \"/llms.txt\", fileName: `llms-txt.mjs`, source });\n }\n\n for (const r of routes) {\n const filePath = join(generatedDir, r.fileName);\n writeFileSync(filePath, r.source, \"utf8\");\n opts.injectRoute({\n pattern: r.pattern,\n entrypoint: filePath,\n prerender: true,\n });\n }\n\n if (resolved.middleware.injectLinkHeader && opts.addMiddleware) {\n opts.addMiddleware({\n order: \"post\",\n entrypoint: \"@dualmark/astro/middleware\",\n });\n }\n\n opts.logger.info(\n `[@dualmark/astro] Injected ${routes.length} route(s) and ${\n resolved.middleware.injectLinkHeader ? \"1\" : \"0\"\n } middleware`,\n );\n\n void resolve;\n },\n },\n };\n}\n\nexport default function dualmarkAstro(config: DualmarkAstroConfig): AstroIntegrationLike {\n return createDualmarkIntegration(config);\n}\n","import {\n blogConverter,\n caseStudyConverter,\n changelogConverter,\n compareConverter,\n docsConverter,\n featureConverter,\n glossaryConverter,\n integrationConverter,\n legalConverter,\n pricingConverter,\n pseoConverter,\n statusPageConverter,\n toolConverter,\n videoConverter,\n type BaseConverterConfig,\n type CollectionEntry,\n type Converter,\n} from \"@dualmark/converters\";\n\nexport type BuiltInConverterName =\n | \"blog\"\n | \"case-study\"\n | \"changelog\"\n | \"compare\"\n | \"docs\"\n | \"feature\"\n | \"glossary\"\n | \"integration\"\n | \"legal\"\n | \"pricing\"\n | \"pseo\"\n | \"status-page\"\n | \"tool\"\n | \"video\";\n\nexport interface ResolveConverterArgs {\n name: string;\n collectionName: string;\n baseConfig: BaseConverterConfig;\n}\n\nexport function resolveBuiltInConverter(\n args: ResolveConverterArgs,\n): Converter<CollectionEntry<unknown>> {\n const basePath = `/${args.collectionName}`;\n const cfg = { ...args.baseConfig, basePath };\n switch (args.name as BuiltInConverterName) {\n case \"blog\":\n return blogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"case-study\":\n return caseStudyConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"changelog\":\n return changelogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"compare\":\n return compareConverter({ ...cfg, ourBrandColumn: \"Us\" }) as Converter<\n CollectionEntry<unknown>\n >;\n case \"docs\":\n return docsConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"feature\":\n return featureConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"glossary\":\n return glossaryConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"integration\":\n return integrationConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"legal\":\n return legalConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pricing\":\n return pricingConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pseo\":\n return pseoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"status-page\":\n return statusPageConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"tool\":\n return toolConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"video\":\n return videoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n default:\n throw new Error(\n `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, status-page, tool, video. Or pass a function.`,\n );\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -43,7 +43,7 @@ declare class DualmarkConfigError extends Error {
43
43
  }
44
44
  declare function resolveConfig(input: DualmarkAstroConfig): ResolvedDualmarkConfig;
45
45
 
46
- type BuiltInConverterName = "blog" | "case-study" | "changelog" | "compare" | "docs" | "feature" | "glossary" | "integration" | "legal" | "pricing" | "pseo" | "tool" | "video";
46
+ type BuiltInConverterName = "blog" | "case-study" | "changelog" | "compare" | "docs" | "feature" | "glossary" | "integration" | "legal" | "pricing" | "pseo" | "status-page" | "tool" | "video";
47
47
  interface ResolveConverterArgs {
48
48
  name: string;
49
49
  collectionName: string;
package/dist/index.d.ts CHANGED
@@ -43,7 +43,7 @@ declare class DualmarkConfigError extends Error {
43
43
  }
44
44
  declare function resolveConfig(input: DualmarkAstroConfig): ResolvedDualmarkConfig;
45
45
 
46
- type BuiltInConverterName = "blog" | "case-study" | "changelog" | "compare" | "docs" | "feature" | "glossary" | "integration" | "legal" | "pricing" | "pseo" | "tool" | "video";
46
+ type BuiltInConverterName = "blog" | "case-study" | "changelog" | "compare" | "docs" | "feature" | "glossary" | "integration" | "legal" | "pricing" | "pseo" | "status-page" | "tool" | "video";
47
47
  interface ResolveConverterArgs {
48
48
  name: string;
49
49
  collectionName: string;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from 'fs';
2
2
  import { fileURLToPath } from 'url';
3
3
  import { join, relative, sep } from 'path';
4
- import { videoConverter, toolConverter, pseoConverter, pricingConverter, legalConverter, integrationConverter, glossaryConverter, featureConverter, docsConverter, compareConverter, changelogConverter, caseStudyConverter, blogConverter } from '@dualmark/converters';
4
+ import { videoConverter, toolConverter, statusPageConverter, pseoConverter, pricingConverter, legalConverter, integrationConverter, glossaryConverter, featureConverter, docsConverter, compareConverter, changelogConverter, caseStudyConverter, blogConverter } from '@dualmark/converters';
5
5
 
6
6
  // src/integration.ts
7
7
 
@@ -293,13 +293,15 @@ function resolveBuiltInConverter(args) {
293
293
  return pricingConverter(cfg);
294
294
  case "pseo":
295
295
  return pseoConverter(cfg);
296
+ case "status-page":
297
+ return statusPageConverter(cfg);
296
298
  case "tool":
297
299
  return toolConverter(cfg);
298
300
  case "video":
299
301
  return videoConverter(cfg);
300
302
  default:
301
303
  throw new Error(
302
- `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, tool, video. Or pass a function.`
304
+ `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, status-page, tool, video. Or pass a function.`
303
305
  );
304
306
  }
305
307
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config-validation.ts","../src/integration.ts","../src/converter-registry.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\nexport class DualmarkConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DualmarkConfigError\";\n }\n}\n\nexport function resolveConfig(input: DualmarkAstroConfig): ResolvedDualmarkConfig {\n if (!input || typeof input !== \"object\") {\n throw new DualmarkConfigError(\"Dualmark config must be an object\");\n }\n if (typeof input.siteUrl !== \"string\" || !input.siteUrl) {\n throw new DualmarkConfigError(\"Dualmark config: siteUrl is required (e.g. 'https://example.com')\");\n }\n try {\n new URL(input.siteUrl);\n } catch {\n throw new DualmarkConfigError(`Dualmark config: siteUrl is not a valid URL: ${input.siteUrl}`);\n }\n if (input.siteUrl.endsWith(\"/\")) {\n throw new DualmarkConfigError(`Dualmark config: siteUrl must not end with '/': ${input.siteUrl}`);\n }\n\n const collections = input.collections ?? {};\n for (const [name, c] of Object.entries(collections)) {\n if (!c.converter) {\n throw new DualmarkConfigError(`Dualmark config: collection '${name}' is missing 'converter'`);\n }\n if (c.route && c.route.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: collection '${name}' route should not start with '/' (got '${c.route}')`,\n );\n }\n }\n\n const staticPages = input.staticPages ?? [];\n for (const sp of staticPages) {\n if (!sp.pattern.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.pattern must start with '/' (got '${sp.pattern}')`,\n );\n }\n if (typeof sp.render !== \"function\") {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.render for '${sp.pattern}' must be a function`,\n );\n }\n }\n\n const parameterizedRoutes = input.parameterizedRoutes ?? [];\n for (const pr of parameterizedRoutes) {\n if (!pr.pattern.includes(\"[\")) {\n throw new DualmarkConfigError(\n `Dualmark config: parameterizedRoutes.pattern must contain at least one [param] (got '${pr.pattern}')`,\n );\n }\n }\n\n return {\n siteUrl: input.siteUrl,\n collections,\n staticPages,\n parameterizedRoutes,\n llmsTxt: input.llmsTxt,\n middleware: {\n injectLinkHeader: input.middleware?.injectLinkHeader !== false,\n },\n headers: {\n cacheControl: input.headers?.cacheControl ?? \"public, max-age=3600\",\n noindex: input.headers?.noindex !== false,\n },\n };\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport { resolveConfig, DualmarkConfigError } from \"./config-validation.js\";\nimport type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\ninterface AstroIntegrationLogger {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n}\n\ninterface InjectedRoute {\n pattern: string;\n entrypoint: string | URL;\n prerender?: boolean;\n}\n\ninterface AstroIntegrationMiddleware {\n order: \"pre\" | \"post\";\n entrypoint: string | URL;\n}\n\ninterface ConfigSetupHookOptions {\n config: { root: URL; srcDir?: URL };\n command: string;\n isRestart?: boolean;\n injectRoute: (route: InjectedRoute) => void;\n addMiddleware?: (mw: AstroIntegrationMiddleware) => void;\n logger: AstroIntegrationLogger;\n updateConfig?: (cfg: unknown) => unknown;\n}\n\nexport interface AstroIntegrationLike {\n name: string;\n hooks: {\n \"astro:config:setup\": (opts: ConfigSetupHookOptions) => void | Promise<void>;\n };\n}\n\nconst GENERATED_DIR_NAME = \".dualmark-generated\";\n\ninterface RouteSpec {\n pattern: string;\n fileName: string;\n source: string;\n}\n\nfunction rel(from: string, to: string): string {\n const r = relative(from, to);\n return r.split(sep).join(\"/\");\n}\n\nexport function createDualmarkIntegration(input: DualmarkAstroConfig): AstroIntegrationLike {\n let resolved: ResolvedDualmarkConfig;\n try {\n resolved = resolveConfig(input);\n } catch (e) {\n if (e instanceof DualmarkConfigError) throw e;\n throw e;\n }\n\n return {\n name: \"@dualmark/astro\",\n hooks: {\n \"astro:config:setup\"(opts) {\n const root = fileURLToPath(opts.config.root);\n const generatedDir = join(root, \"node_modules\", GENERATED_DIR_NAME);\n if (!existsSync(generatedDir)) mkdirSync(generatedDir, { recursive: true });\n\n writeFileSync(\n join(generatedDir, \"config.mjs\"),\n `export default ${JSON.stringify(\n {\n siteUrl: resolved.siteUrl,\n cacheControl: resolved.headers.cacheControl,\n noindex: resolved.headers.noindex,\n },\n null,\n 2,\n )};\\n`,\n \"utf8\",\n );\n\n const routes: RouteSpec[] = [];\n\n for (const [collectionName, c] of Object.entries(resolved.collections)) {\n const route = c.route ?? collectionName;\n const slugSeg = c.slugStrategy === \"single\" ? \"[slug]\" : \"[...slug]\";\n const detailPattern = `/${route}/${slugSeg}.md`;\n const listingPattern = `/${route}.md`;\n if (typeof c.converter !== \"string\") {\n opts.logger.warn(\n `[@dualmark/astro] Collection '${collectionName}' uses an inline converter function — this isn't yet serializable into a generated route. Use a built-in converter name (e.g. 'blog') for now.`,\n );\n continue;\n }\n const converterImport = `import { resolveBuiltInConverter } from \"@dualmark/astro\";`;\n const detailSource = `${converterImport}\nimport { makeCollectionDetailEndpoint } from \"@dualmark/astro/endpoints/collection\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst converter = resolveBuiltInConverter({\n name: ${JSON.stringify(c.converter)},\n collectionName: ${JSON.stringify(collectionName)},\n baseConfig: { siteUrl: dualmarkConfig.siteUrl },\n});\n\nconst endpoint = makeCollectionDetailEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n converter,\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n\n const listingSource = `import { makeListingEndpoint } from \"@dualmark/astro/endpoints/listing\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst endpoint = makeListingEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n siteUrl: dualmarkConfig.siteUrl,\n basePath: ${JSON.stringify(\"/\" + route)},\n title: ${JSON.stringify(c.listingMetadata?.title ?? collectionName)},\n description: ${JSON.stringify(c.listingMetadata?.description ?? `All ${collectionName} entries.`)},\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n\n routes.push(\n { pattern: detailPattern, fileName: `collection-${collectionName}-detail.mjs`, source: detailSource },\n );\n if (c.emitListing !== false) {\n routes.push({\n pattern: listingPattern,\n fileName: `collection-${collectionName}-listing.mjs`,\n source: listingSource,\n });\n }\n }\n\n for (let i = 0; i < resolved.staticPages.length; i++) {\n const sp = resolved.staticPages[i];\n if (!sp) continue;\n const safe = sp.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const fileName = `static-${i}-${safe}.mjs`;\n const renderModulePath = join(generatedDir, `static-${i}-${safe}-render.mjs`);\n writeFileSync(\n renderModulePath,\n `export default ${sp.render.toString()};\\n`,\n \"utf8\",\n );\n const source = `import { makeStaticEndpoint } from \"@dualmark/astro/endpoints/static\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\n\nconst endpoint = makeStaticEndpoint({\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n const mdPattern = sp.pattern === \"/\" ? \"/index.md\" : sp.pattern.replace(/\\/$/, \"\") + \".md\";\n routes.push({ pattern: mdPattern, fileName, source });\n }\n\n for (let i = 0; i < resolved.parameterizedRoutes.length; i++) {\n const pr = resolved.parameterizedRoutes[i];\n if (!pr) continue;\n const safe = pr.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const renderModulePath = join(generatedDir, `param-${i}-${safe}-render.mjs`);\n const pathsModulePath = join(generatedDir, `param-${i}-${safe}-paths.mjs`);\n writeFileSync(renderModulePath, `export default ${pr.render.toString()};\\n`, \"utf8\");\n writeFileSync(pathsModulePath, `export default ${pr.getStaticPaths.toString()};\\n`, \"utf8\");\n const source = `import { makeParameterizedEndpoint } from \"@dualmark/astro/endpoints/parameterized\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\nimport getStaticPaths from \"./${rel(generatedDir, pathsModulePath)}\";\n\nconst endpoint = makeParameterizedEndpoint({\n getStaticPaths: () => getStaticPaths(),\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n const pattern = pr.pattern.startsWith(\"/\") ? pr.pattern + \".md\" : `/${pr.pattern}.md`;\n routes.push({\n pattern,\n fileName: `param-${i}-${safe}.mjs`,\n source,\n });\n }\n\n if (resolved.llmsTxt?.enabled) {\n const sections = resolved.llmsTxt.sections ?? [];\n const source = `import { makeLlmsTxtEndpoint } from \"@dualmark/astro/endpoints/llms-txt\";\n\nconst endpoint = makeLlmsTxtEndpoint({\n brandName: ${JSON.stringify(resolved.llmsTxt.brandName ?? \"Site\")},\n description: ${JSON.stringify(resolved.llmsTxt.description ?? \"\")},\n sections: ${JSON.stringify(sections)},\n});\n\nexport const GET = endpoint.GET;\n`;\n routes.push({ pattern: \"/llms.txt\", fileName: `llms-txt.mjs`, source });\n }\n\n for (const r of routes) {\n const filePath = join(generatedDir, r.fileName);\n writeFileSync(filePath, r.source, \"utf8\");\n opts.injectRoute({\n pattern: r.pattern,\n entrypoint: filePath,\n prerender: true,\n });\n }\n\n if (resolved.middleware.injectLinkHeader && opts.addMiddleware) {\n opts.addMiddleware({\n order: \"post\",\n entrypoint: \"@dualmark/astro/middleware\",\n });\n }\n\n opts.logger.info(\n `[@dualmark/astro] Injected ${routes.length} route(s) and ${\n resolved.middleware.injectLinkHeader ? \"1\" : \"0\"\n } middleware`,\n );\n\n void resolve;\n },\n },\n };\n}\n\nexport default function dualmarkAstro(config: DualmarkAstroConfig): AstroIntegrationLike {\n return createDualmarkIntegration(config);\n}\n","import {\n blogConverter,\n caseStudyConverter,\n changelogConverter,\n compareConverter,\n docsConverter,\n featureConverter,\n glossaryConverter,\n integrationConverter,\n legalConverter,\n pricingConverter,\n pseoConverter,\n toolConverter,\n videoConverter,\n type BaseConverterConfig,\n type CollectionEntry,\n type Converter,\n} from \"@dualmark/converters\";\n\nexport type BuiltInConverterName =\n | \"blog\"\n | \"case-study\"\n | \"changelog\"\n | \"compare\"\n | \"docs\"\n | \"feature\"\n | \"glossary\"\n | \"integration\"\n | \"legal\"\n | \"pricing\"\n | \"pseo\"\n | \"tool\"\n | \"video\";\n\nexport interface ResolveConverterArgs {\n name: string;\n collectionName: string;\n baseConfig: BaseConverterConfig;\n}\n\nexport function resolveBuiltInConverter(\n args: ResolveConverterArgs,\n): Converter<CollectionEntry<unknown>> {\n const basePath = `/${args.collectionName}`;\n const cfg = { ...args.baseConfig, basePath };\n switch (args.name as BuiltInConverterName) {\n case \"blog\":\n return blogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"case-study\":\n return caseStudyConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"changelog\":\n return changelogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"compare\":\n return compareConverter({ ...cfg, ourBrandColumn: \"Us\" }) as Converter<CollectionEntry<unknown>>;\n case \"docs\":\n return docsConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"feature\":\n return featureConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"glossary\":\n return glossaryConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"integration\":\n return integrationConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"legal\":\n return legalConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pricing\":\n return pricingConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pseo\":\n return pseoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"tool\":\n return toolConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"video\":\n return videoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n default:\n throw new Error(\n `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, tool, video. Or pass a function.`,\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/config-validation.ts","../src/integration.ts","../src/converter-registry.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\nexport class DualmarkConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DualmarkConfigError\";\n }\n}\n\nexport function resolveConfig(input: DualmarkAstroConfig): ResolvedDualmarkConfig {\n if (!input || typeof input !== \"object\") {\n throw new DualmarkConfigError(\"Dualmark config must be an object\");\n }\n if (typeof input.siteUrl !== \"string\" || !input.siteUrl) {\n throw new DualmarkConfigError(\"Dualmark config: siteUrl is required (e.g. 'https://example.com')\");\n }\n try {\n new URL(input.siteUrl);\n } catch {\n throw new DualmarkConfigError(`Dualmark config: siteUrl is not a valid URL: ${input.siteUrl}`);\n }\n if (input.siteUrl.endsWith(\"/\")) {\n throw new DualmarkConfigError(`Dualmark config: siteUrl must not end with '/': ${input.siteUrl}`);\n }\n\n const collections = input.collections ?? {};\n for (const [name, c] of Object.entries(collections)) {\n if (!c.converter) {\n throw new DualmarkConfigError(`Dualmark config: collection '${name}' is missing 'converter'`);\n }\n if (c.route && c.route.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: collection '${name}' route should not start with '/' (got '${c.route}')`,\n );\n }\n }\n\n const staticPages = input.staticPages ?? [];\n for (const sp of staticPages) {\n if (!sp.pattern.startsWith(\"/\")) {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.pattern must start with '/' (got '${sp.pattern}')`,\n );\n }\n if (typeof sp.render !== \"function\") {\n throw new DualmarkConfigError(\n `Dualmark config: staticPages.render for '${sp.pattern}' must be a function`,\n );\n }\n }\n\n const parameterizedRoutes = input.parameterizedRoutes ?? [];\n for (const pr of parameterizedRoutes) {\n if (!pr.pattern.includes(\"[\")) {\n throw new DualmarkConfigError(\n `Dualmark config: parameterizedRoutes.pattern must contain at least one [param] (got '${pr.pattern}')`,\n );\n }\n }\n\n return {\n siteUrl: input.siteUrl,\n collections,\n staticPages,\n parameterizedRoutes,\n llmsTxt: input.llmsTxt,\n middleware: {\n injectLinkHeader: input.middleware?.injectLinkHeader !== false,\n },\n headers: {\n cacheControl: input.headers?.cacheControl ?? \"public, max-age=3600\",\n noindex: input.headers?.noindex !== false,\n },\n };\n}\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport { resolveConfig, DualmarkConfigError } from \"./config-validation.js\";\nimport type { DualmarkAstroConfig, ResolvedDualmarkConfig } from \"./types.js\";\n\ninterface AstroIntegrationLogger {\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n}\n\ninterface InjectedRoute {\n pattern: string;\n entrypoint: string | URL;\n prerender?: boolean;\n}\n\ninterface AstroIntegrationMiddleware {\n order: \"pre\" | \"post\";\n entrypoint: string | URL;\n}\n\ninterface ConfigSetupHookOptions {\n config: { root: URL; srcDir?: URL };\n command: string;\n isRestart?: boolean;\n injectRoute: (route: InjectedRoute) => void;\n addMiddleware?: (mw: AstroIntegrationMiddleware) => void;\n logger: AstroIntegrationLogger;\n updateConfig?: (cfg: unknown) => unknown;\n}\n\nexport interface AstroIntegrationLike {\n name: string;\n hooks: {\n \"astro:config:setup\": (opts: ConfigSetupHookOptions) => void | Promise<void>;\n };\n}\n\nconst GENERATED_DIR_NAME = \".dualmark-generated\";\n\ninterface RouteSpec {\n pattern: string;\n fileName: string;\n source: string;\n}\n\nfunction rel(from: string, to: string): string {\n const r = relative(from, to);\n return r.split(sep).join(\"/\");\n}\n\nexport function createDualmarkIntegration(input: DualmarkAstroConfig): AstroIntegrationLike {\n let resolved: ResolvedDualmarkConfig;\n try {\n resolved = resolveConfig(input);\n } catch (e) {\n if (e instanceof DualmarkConfigError) throw e;\n throw e;\n }\n\n return {\n name: \"@dualmark/astro\",\n hooks: {\n \"astro:config:setup\"(opts) {\n const root = fileURLToPath(opts.config.root);\n const generatedDir = join(root, \"node_modules\", GENERATED_DIR_NAME);\n if (!existsSync(generatedDir)) mkdirSync(generatedDir, { recursive: true });\n\n writeFileSync(\n join(generatedDir, \"config.mjs\"),\n `export default ${JSON.stringify(\n {\n siteUrl: resolved.siteUrl,\n cacheControl: resolved.headers.cacheControl,\n noindex: resolved.headers.noindex,\n },\n null,\n 2,\n )};\\n`,\n \"utf8\",\n );\n\n const routes: RouteSpec[] = [];\n\n for (const [collectionName, c] of Object.entries(resolved.collections)) {\n const route = c.route ?? collectionName;\n const slugSeg = c.slugStrategy === \"single\" ? \"[slug]\" : \"[...slug]\";\n const detailPattern = `/${route}/${slugSeg}.md`;\n const listingPattern = `/${route}.md`;\n if (typeof c.converter !== \"string\") {\n opts.logger.warn(\n `[@dualmark/astro] Collection '${collectionName}' uses an inline converter function — this isn't yet serializable into a generated route. Use a built-in converter name (e.g. 'blog') for now.`,\n );\n continue;\n }\n const converterImport = `import { resolveBuiltInConverter } from \"@dualmark/astro\";`;\n const detailSource = `${converterImport}\nimport { makeCollectionDetailEndpoint } from \"@dualmark/astro/endpoints/collection\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst converter = resolveBuiltInConverter({\n name: ${JSON.stringify(c.converter)},\n collectionName: ${JSON.stringify(collectionName)},\n baseConfig: { siteUrl: dualmarkConfig.siteUrl },\n});\n\nconst endpoint = makeCollectionDetailEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n converter,\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n\n const listingSource = `import { makeListingEndpoint } from \"@dualmark/astro/endpoints/listing\";\nimport { getCollection } from \"astro:content\";\nimport dualmarkConfig from \"./config.mjs\";\n\nconst endpoint = makeListingEndpoint({\n collectionName: ${JSON.stringify(collectionName)},\n siteUrl: dualmarkConfig.siteUrl,\n basePath: ${JSON.stringify(\"/\" + route)},\n title: ${JSON.stringify(c.listingMetadata?.title ?? collectionName)},\n description: ${JSON.stringify(c.listingMetadata?.description ?? `All ${collectionName} entries.`)},\n getCollection: (name, filter) => getCollection(name, filter),\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n\n routes.push(\n { pattern: detailPattern, fileName: `collection-${collectionName}-detail.mjs`, source: detailSource },\n );\n if (c.emitListing !== false) {\n routes.push({\n pattern: listingPattern,\n fileName: `collection-${collectionName}-listing.mjs`,\n source: listingSource,\n });\n }\n }\n\n for (let i = 0; i < resolved.staticPages.length; i++) {\n const sp = resolved.staticPages[i];\n if (!sp) continue;\n const safe = sp.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const fileName = `static-${i}-${safe}.mjs`;\n const renderModulePath = join(generatedDir, `static-${i}-${safe}-render.mjs`);\n writeFileSync(\n renderModulePath,\n `export default ${sp.render.toString()};\\n`,\n \"utf8\",\n );\n const source = `import { makeStaticEndpoint } from \"@dualmark/astro/endpoints/static\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\n\nconst endpoint = makeStaticEndpoint({\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const GET = endpoint.GET;\n`;\n const mdPattern = sp.pattern === \"/\" ? \"/index.md\" : sp.pattern.replace(/\\/$/, \"\") + \".md\";\n routes.push({ pattern: mdPattern, fileName, source });\n }\n\n for (let i = 0; i < resolved.parameterizedRoutes.length; i++) {\n const pr = resolved.parameterizedRoutes[i];\n if (!pr) continue;\n const safe = pr.pattern.replace(/[^a-z0-9]/gi, \"_\");\n const renderModulePath = join(generatedDir, `param-${i}-${safe}-render.mjs`);\n const pathsModulePath = join(generatedDir, `param-${i}-${safe}-paths.mjs`);\n writeFileSync(renderModulePath, `export default ${pr.render.toString()};\\n`, \"utf8\");\n writeFileSync(pathsModulePath, `export default ${pr.getStaticPaths.toString()};\\n`, \"utf8\");\n const source = `import { makeParameterizedEndpoint } from \"@dualmark/astro/endpoints/parameterized\";\nimport dualmarkConfig from \"./config.mjs\";\nimport render from \"./${rel(generatedDir, renderModulePath)}\";\nimport getStaticPaths from \"./${rel(generatedDir, pathsModulePath)}\";\n\nconst endpoint = makeParameterizedEndpoint({\n getStaticPaths: () => getStaticPaths(),\n render,\n responseOptions: { cacheControl: dualmarkConfig.cacheControl, noindex: dualmarkConfig.noindex },\n});\n\nexport const getStaticPaths = endpoint.getStaticPaths;\nexport const GET = endpoint.GET;\n`;\n const pattern = pr.pattern.startsWith(\"/\") ? pr.pattern + \".md\" : `/${pr.pattern}.md`;\n routes.push({\n pattern,\n fileName: `param-${i}-${safe}.mjs`,\n source,\n });\n }\n\n if (resolved.llmsTxt?.enabled) {\n const sections = resolved.llmsTxt.sections ?? [];\n const source = `import { makeLlmsTxtEndpoint } from \"@dualmark/astro/endpoints/llms-txt\";\n\nconst endpoint = makeLlmsTxtEndpoint({\n brandName: ${JSON.stringify(resolved.llmsTxt.brandName ?? \"Site\")},\n description: ${JSON.stringify(resolved.llmsTxt.description ?? \"\")},\n sections: ${JSON.stringify(sections)},\n});\n\nexport const GET = endpoint.GET;\n`;\n routes.push({ pattern: \"/llms.txt\", fileName: `llms-txt.mjs`, source });\n }\n\n for (const r of routes) {\n const filePath = join(generatedDir, r.fileName);\n writeFileSync(filePath, r.source, \"utf8\");\n opts.injectRoute({\n pattern: r.pattern,\n entrypoint: filePath,\n prerender: true,\n });\n }\n\n if (resolved.middleware.injectLinkHeader && opts.addMiddleware) {\n opts.addMiddleware({\n order: \"post\",\n entrypoint: \"@dualmark/astro/middleware\",\n });\n }\n\n opts.logger.info(\n `[@dualmark/astro] Injected ${routes.length} route(s) and ${\n resolved.middleware.injectLinkHeader ? \"1\" : \"0\"\n } middleware`,\n );\n\n void resolve;\n },\n },\n };\n}\n\nexport default function dualmarkAstro(config: DualmarkAstroConfig): AstroIntegrationLike {\n return createDualmarkIntegration(config);\n}\n","import {\n blogConverter,\n caseStudyConverter,\n changelogConverter,\n compareConverter,\n docsConverter,\n featureConverter,\n glossaryConverter,\n integrationConverter,\n legalConverter,\n pricingConverter,\n pseoConverter,\n statusPageConverter,\n toolConverter,\n videoConverter,\n type BaseConverterConfig,\n type CollectionEntry,\n type Converter,\n} from \"@dualmark/converters\";\n\nexport type BuiltInConverterName =\n | \"blog\"\n | \"case-study\"\n | \"changelog\"\n | \"compare\"\n | \"docs\"\n | \"feature\"\n | \"glossary\"\n | \"integration\"\n | \"legal\"\n | \"pricing\"\n | \"pseo\"\n | \"status-page\"\n | \"tool\"\n | \"video\";\n\nexport interface ResolveConverterArgs {\n name: string;\n collectionName: string;\n baseConfig: BaseConverterConfig;\n}\n\nexport function resolveBuiltInConverter(\n args: ResolveConverterArgs,\n): Converter<CollectionEntry<unknown>> {\n const basePath = `/${args.collectionName}`;\n const cfg = { ...args.baseConfig, basePath };\n switch (args.name as BuiltInConverterName) {\n case \"blog\":\n return blogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"case-study\":\n return caseStudyConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"changelog\":\n return changelogConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"compare\":\n return compareConverter({ ...cfg, ourBrandColumn: \"Us\" }) as Converter<\n CollectionEntry<unknown>\n >;\n case \"docs\":\n return docsConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"feature\":\n return featureConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"glossary\":\n return glossaryConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"integration\":\n return integrationConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"legal\":\n return legalConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pricing\":\n return pricingConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"pseo\":\n return pseoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"status-page\":\n return statusPageConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"tool\":\n return toolConverter(cfg) as Converter<CollectionEntry<unknown>>;\n case \"video\":\n return videoConverter(cfg) as Converter<CollectionEntry<unknown>>;\n default:\n throw new Error(\n `Dualmark: unknown built-in converter '${args.name}'. Valid names: blog, case-study, changelog, compare, docs, feature, glossary, integration, legal, pricing, pseo, status-page, tool, video. Or pass a function.`,\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dualmark/astro",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Astro integration for the Dualmark AEO framework. Auto-generates .md endpoints from collection config + injects Link rel=alternate middleware + generates llms.txt.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Dodo Payments <opensource@dodopayments.com> (https://dodopayments.com)",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "@dualmark/core": "0.7.0",
74
- "@dualmark/converters": "0.7.0"
74
+ "@dualmark/converters": "0.8.0"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@types/node": "^22.10.0",