@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 +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;AAEO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,SAAS,cAAc,KAAA,EAAoD;AAChF,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,MAAM,IAAI,oBAAoB,mCAAmC,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,CAAC,MAAM,OAAA,EAAS;AACvD,IAAA,MAAM,IAAI,oBAAoB,mEAAmE,CAAA;AAAA,EACnG;AACA,EAAA,IAAI;AACF,IAAA,IAAI,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,6CAAA,EAAgD,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,gDAAA,EAAmD,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EAClG;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,IAAA,IAAI,CAAC,EAAE,SAAA,EAAW;AAChB,MAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,6BAAA,EAAgC,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,6BAAA,EAAgC,IAAI,CAAA,wCAAA,EAA2C,CAAA,CAAE,KAAK,CAAA,EAAA;AAAA,OACxF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,EAAC;AAC1C,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,+DAAA,EAAkE,GAAG,OAAO,CAAA,EAAA;AAAA,OAC9E;AAAA,IACF;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,MAAA,KAAW,UAAA,EAAY;AACnC,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,yCAAA,EAA4C,GAAG,OAAO,CAAA,oBAAA;AAAA,OACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,mBAAA,IAAuB,EAAC;AAC1D,EAAA,KAAA,MAAW,MAAM,mBAAA,EAAqB;AACpC,IAAA,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,qFAAA,EAAwF,GAAG,OAAO,CAAA,EAAA;AAAA,OACpG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,WAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,UAAA,EAAY;AAAA,MACV,gBAAA,EAAkB,KAAA,CAAM,UAAA,EAAY,gBAAA,KAAqB;AAAA,KAC3D;AAAA,IACA,OAAA,EAAS;AAAA,MACP,YAAA,EAAc,KAAA,CAAM,OAAA,EAAS,YAAA,IAAgB,sBAAA;AAAA,MAC7C,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,OAAA,KAAY;AAAA;AACtC,GACF;AACF;;;AClCA,IAAM,kBAAA,GAAqB,qBAAA;AAQ3B,SAAS,GAAA,CAAI,MAAc,EAAA,EAAoB;AAC7C,EAAA,MAAM,CAAA,GAAIA,aAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC3B,EAAA,OAAO,CAAA,CAAE,KAAA,CAAMC,QAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9B;AAEO,SAAS,0BAA0B,KAAA,EAAkD;AAC1F,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,cAAc,KAAK,CAAA;AAAA,EAChC,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,CAAA,YAAa,qBAAqB,MAAM,CAAA;AAC5C,IAAA,MAAM,CAAA;AAAA,EACR;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,qBAAqB,IAAA,EAAM;AACzB,QAAA,MAAM,IAAA,GAAOC,iBAAA,CAAc,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC3C,QAAA,MAAM,YAAA,GAAeC,SAAA,CAAK,IAAA,EAAM,cAAA,EAAgB,kBAAkB,CAAA;AAClE,QAAA,IAAI,CAACC,cAAW,YAAY,CAAA,eAAa,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAE1E,QAAAC,gBAAA;AAAA,UACEF,SAAA,CAAK,cAAc,YAAY,CAAA;AAAA,UAC/B,kBAAkB,IAAA,CAAK,SAAA;AAAA,YACrB;AAAA,cACE,SAAS,QAAA,CAAS,OAAA;AAAA,cAClB,YAAA,EAAc,SAAS,OAAA,CAAQ,YAAA;AAAA,cAC/B,OAAA,EAAS,SAAS,OAAA,CAAQ;AAAA,aAC5B;AAAA,YACA,IAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,CAAA;AAAA,UACD;AAAA,SACF;AAEA,QAAA,MAAM,SAAsB,EAAC;AAE7B,QAAA,KAAA,MAAW,CAAC,gBAAgB,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACtE,UAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,cAAA;AACzB,UAAA,MAAM,OAAA,GAAU,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAW,QAAA,GAAW,WAAA;AACzD,UAAA,MAAM,aAAA,GAAgB,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,CAAA;AAC1C,UAAA,MAAM,cAAA,GAAiB,IAAI,KAAK,CAAA,GAAA,CAAA;AAChC,UAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU;AACnC,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,cACV,iCAAiC,cAAc,CAAA,mJAAA;AAAA,aACjD;AACA,YAAA;AAAA,UACF;AACA,UAAA,MAAM,eAAA,GAAkB,CAAA,0DAAA,CAAA;AACxB,UAAA,MAAM,YAAA,GAAe,GAAG,eAAe;AAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAMvC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,kBAAA,EACjB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA,kBAAA,EAK9B,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAUxC,UAAA,MAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;;AAAA;AAAA,kBAAA,EAKZ,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA,YAAA,EAEpC,IAAA,CAAK,SAAA,CAAU,GAAA,GAAM,KAAK,CAAC,CAAA;AAAA,SAAA,EAC9B,KAAK,SAAA,CAAU,CAAA,CAAE,eAAA,EAAiB,KAAA,IAAS,cAAc,CAAC,CAAA;AAAA,eAAA,EACpD,IAAA,CAAK,UAAU,CAAA,CAAE,eAAA,EAAiB,eAAe,CAAA,IAAA,EAAO,cAAc,WAAW,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAQzF,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,EAAE,SAAS,aAAA,EAAe,QAAA,EAAU,cAAc,cAAc,CAAA,WAAA,CAAA,EAAe,QAAQ,YAAA;AAAa,WACtG;AACA,UAAA,IAAI,CAAA,CAAE,gBAAgB,KAAA,EAAO;AAC3B,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,OAAA,EAAS,cAAA;AAAA,cACT,QAAA,EAAU,cAAc,cAAc,CAAA,YAAA,CAAA;AAAA,cACtC,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AACpD,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA;AACjC,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,eAAe,GAAG,CAAA;AAClD,UAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAA;AACpC,UAAA,MAAM,mBAAmBA,SAAA,CAAK,YAAA,EAAc,UAAU,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,CAAa,CAAA;AAC5E,UAAAE,gBAAA;AAAA,YACE,gBAAA;AAAA,YACA,CAAA,eAAA,EAAkB,EAAA,CAAG,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,CAAA;AAAA,YACtC;AAAA,WACF;AACA,UAAA,MAAM,MAAA,GAAS,CAAA;AAAA;AAAA,sBAAA,EAED,GAAA,CAAI,YAAA,EAAc,gBAAgB,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AASjD,UAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,KAAY,GAAA,GAAM,WAAA,GAAc,GAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,KAAA;AACrF,UAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,QACtD;AAEA,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,mBAAA,CAAoB,QAAQ,CAAA,EAAA,EAAK;AAC5D,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,mBAAA,CAAoB,CAAC,CAAA;AACzC,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,eAAe,GAAG,CAAA;AAClD,UAAA,MAAM,mBAAmBF,SAAA,CAAK,YAAA,EAAc,SAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,CAAa,CAAA;AAC3E,UAAA,MAAM,kBAAkBA,SAAA,CAAK,YAAA,EAAc,SAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,CAAY,CAAA;AACzE,UAAAE,gBAAA,CAAc,gBAAA,EAAkB,CAAA,eAAA,EAAkB,EAAA,CAAG,MAAA,CAAO,UAAU,CAAA;AAAA,CAAA,EAAO,MAAM,CAAA;AACnF,UAAAA,gBAAA,CAAc,eAAA,EAAiB,CAAA,eAAA,EAAkB,EAAA,CAAG,cAAA,CAAe,UAAU,CAAA;AAAA,CAAA,EAAO,MAAM,CAAA;AAC1F,UAAA,MAAM,MAAA,GAAS,CAAA;AAAA;AAAA,sBAAA,EAED,GAAA,CAAI,YAAA,EAAc,gBAAgB,CAAC,CAAA;AAAA,8BAAA,EAC3B,GAAA,CAAI,YAAA,EAAc,eAAe,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAWxD,UAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,EAAA,CAAG,OAAA,GAAU,KAAA,GAAQ,CAAA,CAAA,EAAI,EAAA,CAAG,OAAO,CAAA,GAAA,CAAA;AAChF,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,OAAA;AAAA,YACA,QAAA,EAAU,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAA;AAAA,YAC5B;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,QAAA,IAAY,EAAC;AAC/C,UAAA,MAAM,MAAA,GAAS,CAAA;;AAAA;AAAA,aAAA,EAGV,KAAK,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,SAAA,IAAa,MAAM,CAAC,CAAA;AAAA,eAAA,EAClD,KAAK,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAC,CAAA;AAAA,YAAA,EACrD,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA;;AAAA;AAAA,CAAA;AAK5B,UAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,aAAa,QAAA,EAAU,CAAA,YAAA,CAAA,EAAgB,QAAQ,CAAA;AAAA,QACxE;AAEA,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,UAAA,MAAM,QAAA,GAAWF,SAAA,CAAK,YAAA,EAAc,CAAA,CAAE,QAAQ,CAAA;AAC9C,UAAAE,gBAAA,CAAc,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,MAAM,CAAA;AACxC,UAAA,IAAA,CAAK,WAAA,CAAY;AAAA,YACf,SAAS,CAAA,CAAE,OAAA;AAAA,YACX,UAAA,EAAY,QAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,QAAA,CAAS,UAAA,CAAW,gBAAA,IAAoB,IAAA,CAAK,aAAA,EAAe;AAC9D,UAAA,IAAA,CAAK,aAAA,CAAc;AAAA,YACjB,KAAA,EAAO,MAAA;AAAA,YACP,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,2BAAA,EAA8B,OAAO,MAAM,CAAA,cAAA,EACzC,SAAS,UAAA,CAAW,gBAAA,GAAmB,MAAM,GAC/C,CAAA,WAAA;AAAA,SACF;AAEK,MACP;AAAA;AACF,GACF;AACF;AAEe,SAAR,cAA+B,MAAA,EAAmD;AACvF,EAAA,OAAO,0BAA0B,MAAM,CAAA;AACzC;ACnNO,SAAS,wBACd,IAAA,EACqC;AACrC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAA,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,IAAA,CAAK,YAAY,QAAA,EAAS;AAC3C,EAAA,QAAQ,KAAK,IAAA;AAA8B,IACzC,KAAK,MAAA;AACH,MAAA,OAAOC,yBAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,YAAA;AACH,MAAA,OAAOC,8BAAmB,GAAG,CAAA;AAAA,IAC/B,KAAK,WAAA;AACH,MAAA,OAAOC,8BAAmB,GAAG,CAAA;AAAA,IAC/B,KAAK,SAAA;AACH,MAAA,OAAOC,4BAAiB,EAAE,GAAG,GAAA,EAAK,cAAA,EAAgB,MAAM,CAAA;AAAA,IAC1D,KAAK,MAAA;AACH,MAAA,OAAOC,yBAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,SAAA;AACH,MAAA,OAAOC,4BAAiB,GAAG,CAAA;AAAA,IAC7B,KAAK,UAAA;AACH,MAAA,OAAOC,6BAAkB,GAAG,CAAA;AAAA,IAC9B,KAAK,aAAA;AACH,MAAA,OAAOC,gCAAqB,GAAG,CAAA;AAAA,IACjC,KAAK,OAAA;AACH,MAAA,OAAOC,0BAAe,GAAG,CAAA;AAAA,IAC3B,KAAK,SAAA;AACH,MAAA,OAAOC,4BAAiB,GAAG,CAAA;AAAA,IAC7B,KAAK,MAAA;AACH,MAAA,OAAOC,yBAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,MAAA;AACH,MAAA,OAAOC,yBAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,OAAA;AACH,MAAA,OAAOC,0BAAe,GAAG,CAAA;AAAA,IAC3B;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,sCAAA,EAAyC,KAAK,IAAI,CAAA,kJAAA;AAAA,OACpD;AAAA;AAEN","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":";;;;;;;;AAEO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,SAAS,cAAc,KAAA,EAAoD;AAChF,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,MAAM,IAAI,oBAAoB,mCAAmC,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,CAAC,MAAM,OAAA,EAAS;AACvD,IAAA,MAAM,IAAI,oBAAoB,mEAAmE,CAAA;AAAA,EACnG;AACA,EAAA,IAAI;AACF,IAAA,IAAI,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,6CAAA,EAAgD,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,gDAAA,EAAmD,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EAClG;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,IAAA,IAAI,CAAC,EAAE,SAAA,EAAW;AAChB,MAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,6BAAA,EAAgC,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,6BAAA,EAAgC,IAAI,CAAA,wCAAA,EAA2C,CAAA,CAAE,KAAK,CAAA,EAAA;AAAA,OACxF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,EAAC;AAC1C,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,+DAAA,EAAkE,GAAG,OAAO,CAAA,EAAA;AAAA,OAC9E;AAAA,IACF;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,MAAA,KAAW,UAAA,EAAY;AACnC,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,yCAAA,EAA4C,GAAG,OAAO,CAAA,oBAAA;AAAA,OACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,mBAAA,IAAuB,EAAC;AAC1D,EAAA,KAAA,MAAW,MAAM,mBAAA,EAAqB;AACpC,IAAA,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,qFAAA,EAAwF,GAAG,OAAO,CAAA,EAAA;AAAA,OACpG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,WAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,UAAA,EAAY;AAAA,MACV,gBAAA,EAAkB,KAAA,CAAM,UAAA,EAAY,gBAAA,KAAqB;AAAA,KAC3D;AAAA,IACA,OAAA,EAAS;AAAA,MACP,YAAA,EAAc,KAAA,CAAM,OAAA,EAAS,YAAA,IAAgB,sBAAA;AAAA,MAC7C,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,OAAA,KAAY;AAAA;AACtC,GACF;AACF;;;AClCA,IAAM,kBAAA,GAAqB,qBAAA;AAQ3B,SAAS,GAAA,CAAI,MAAc,EAAA,EAAoB;AAC7C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC3B,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9B;AAEO,SAAS,0BAA0B,KAAA,EAAkD;AAC1F,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,cAAc,KAAK,CAAA;AAAA,EAChC,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,CAAA,YAAa,qBAAqB,MAAM,CAAA;AAC5C,IAAA,MAAM,CAAA;AAAA,EACR;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,qBAAqB,IAAA,EAAM;AACzB,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC3C,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,EAAM,cAAA,EAAgB,kBAAkB,CAAA;AAClE,QAAA,IAAI,CAAC,WAAW,YAAY,CAAA,YAAa,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAE1E,QAAA,aAAA;AAAA,UACE,IAAA,CAAK,cAAc,YAAY,CAAA;AAAA,UAC/B,kBAAkB,IAAA,CAAK,SAAA;AAAA,YACrB;AAAA,cACE,SAAS,QAAA,CAAS,OAAA;AAAA,cAClB,YAAA,EAAc,SAAS,OAAA,CAAQ,YAAA;AAAA,cAC/B,OAAA,EAAS,SAAS,OAAA,CAAQ;AAAA,aAC5B;AAAA,YACA,IAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,CAAA;AAAA,UACD;AAAA,SACF;AAEA,QAAA,MAAM,SAAsB,EAAC;AAE7B,QAAA,KAAA,MAAW,CAAC,gBAAgB,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACtE,UAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,cAAA;AACzB,UAAA,MAAM,OAAA,GAAU,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAW,QAAA,GAAW,WAAA;AACzD,UAAA,MAAM,aAAA,GAAgB,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,CAAA;AAC1C,UAAA,MAAM,cAAA,GAAiB,IAAI,KAAK,CAAA,GAAA,CAAA;AAChC,UAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU;AACnC,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,cACV,iCAAiC,cAAc,CAAA,mJAAA;AAAA,aACjD;AACA,YAAA;AAAA,UACF;AACA,UAAA,MAAM,eAAA,GAAkB,CAAA,0DAAA,CAAA;AACxB,UAAA,MAAM,YAAA,GAAe,GAAG,eAAe;AAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAMvC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,kBAAA,EACjB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA,kBAAA,EAK9B,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAUxC,UAAA,MAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;;AAAA;AAAA,kBAAA,EAKZ,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA;AAAA,YAAA,EAEpC,IAAA,CAAK,SAAA,CAAU,GAAA,GAAM,KAAK,CAAC,CAAA;AAAA,SAAA,EAC9B,KAAK,SAAA,CAAU,CAAA,CAAE,eAAA,EAAiB,KAAA,IAAS,cAAc,CAAC,CAAA;AAAA,eAAA,EACpD,IAAA,CAAK,UAAU,CAAA,CAAE,eAAA,EAAiB,eAAe,CAAA,IAAA,EAAO,cAAc,WAAW,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAQzF,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,EAAE,SAAS,aAAA,EAAe,QAAA,EAAU,cAAc,cAAc,CAAA,WAAA,CAAA,EAAe,QAAQ,YAAA;AAAa,WACtG;AACA,UAAA,IAAI,CAAA,CAAE,gBAAgB,KAAA,EAAO;AAC3B,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,OAAA,EAAS,cAAA;AAAA,cACT,QAAA,EAAU,cAAc,cAAc,CAAA,YAAA,CAAA;AAAA,cACtC,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AACpD,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,WAAA,CAAY,CAAC,CAAA;AACjC,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,eAAe,GAAG,CAAA;AAClD,UAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAA;AACpC,UAAA,MAAM,mBAAmB,IAAA,CAAK,YAAA,EAAc,UAAU,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,CAAa,CAAA;AAC5E,UAAA,aAAA;AAAA,YACE,gBAAA;AAAA,YACA,CAAA,eAAA,EAAkB,EAAA,CAAG,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,CAAA;AAAA,YACtC;AAAA,WACF;AACA,UAAA,MAAM,MAAA,GAAS,CAAA;AAAA;AAAA,sBAAA,EAED,GAAA,CAAI,YAAA,EAAc,gBAAgB,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AASjD,UAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,KAAY,GAAA,GAAM,WAAA,GAAc,GAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,KAAA;AACrF,UAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,QACtD;AAEA,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,mBAAA,CAAoB,QAAQ,CAAA,EAAA,EAAK;AAC5D,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,mBAAA,CAAoB,CAAC,CAAA;AACzC,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,eAAe,GAAG,CAAA;AAClD,UAAA,MAAM,mBAAmB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,CAAa,CAAA;AAC3E,UAAA,MAAM,kBAAkB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,CAAY,CAAA;AACzE,UAAA,aAAA,CAAc,gBAAA,EAAkB,CAAA,eAAA,EAAkB,EAAA,CAAG,MAAA,CAAO,UAAU,CAAA;AAAA,CAAA,EAAO,MAAM,CAAA;AACnF,UAAA,aAAA,CAAc,eAAA,EAAiB,CAAA,eAAA,EAAkB,EAAA,CAAG,cAAA,CAAe,UAAU,CAAA;AAAA,CAAA,EAAO,MAAM,CAAA;AAC1F,UAAA,MAAM,MAAA,GAAS,CAAA;AAAA;AAAA,sBAAA,EAED,GAAA,CAAI,YAAA,EAAc,gBAAgB,CAAC,CAAA;AAAA,8BAAA,EAC3B,GAAA,CAAI,YAAA,EAAc,eAAe,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAWxD,UAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,EAAA,CAAG,OAAA,GAAU,KAAA,GAAQ,CAAA,CAAA,EAAI,EAAA,CAAG,OAAO,CAAA,GAAA,CAAA;AAChF,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,OAAA;AAAA,YACA,QAAA,EAAU,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,CAAA;AAAA,YAC5B;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,QAAA,IAAY,EAAC;AAC/C,UAAA,MAAM,MAAA,GAAS,CAAA;;AAAA;AAAA,aAAA,EAGV,KAAK,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,SAAA,IAAa,MAAM,CAAC,CAAA;AAAA,eAAA,EAClD,KAAK,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAC,CAAA;AAAA,YAAA,EACrD,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA;;AAAA;AAAA,CAAA;AAK5B,UAAA,MAAA,CAAO,KAAK,EAAE,OAAA,EAAS,aAAa,QAAA,EAAU,CAAA,YAAA,CAAA,EAAgB,QAAQ,CAAA;AAAA,QACxE;AAEA,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,EAAc,CAAA,CAAE,QAAQ,CAAA;AAC9C,UAAA,aAAA,CAAc,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,MAAM,CAAA;AACxC,UAAA,IAAA,CAAK,WAAA,CAAY;AAAA,YACf,SAAS,CAAA,CAAE,OAAA;AAAA,YACX,UAAA,EAAY,QAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,QAAA,CAAS,UAAA,CAAW,gBAAA,IAAoB,IAAA,CAAK,aAAA,EAAe;AAC9D,UAAA,IAAA,CAAK,aAAA,CAAc;AAAA,YACjB,KAAA,EAAO,MAAA;AAAA,YACP,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,2BAAA,EAA8B,OAAO,MAAM,CAAA,cAAA,EACzC,SAAS,UAAA,CAAW,gBAAA,GAAmB,MAAM,GAC/C,CAAA,WAAA;AAAA,SACF;AAEK,MACP;AAAA;AACF,GACF;AACF;AAEe,SAAR,cAA+B,MAAA,EAAmD;AACvF,EAAA,OAAO,0BAA0B,MAAM,CAAA;AACzC;ACnNO,SAAS,wBACd,IAAA,EACqC;AACrC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAA,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,IAAA,CAAK,YAAY,QAAA,EAAS;AAC3C,EAAA,QAAQ,KAAK,IAAA;AAA8B,IACzC,KAAK,MAAA;AACH,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,YAAA;AACH,MAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,IAC/B,KAAK,WAAA;AACH,MAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,IAC/B,KAAK,SAAA;AACH,MAAA,OAAO,iBAAiB,EAAE,GAAG,GAAA,EAAK,cAAA,EAAgB,MAAM,CAAA;AAAA,IAC1D,KAAK,MAAA;AACH,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,SAAA;AACH,MAAA,OAAO,iBAAiB,GAAG,CAAA;AAAA,IAC7B,KAAK,UAAA;AACH,MAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA,IAC9B,KAAK,aAAA;AACH,MAAA,OAAO,qBAAqB,GAAG,CAAA;AAAA,IACjC,KAAK,OAAA;AACH,MAAA,OAAO,eAAe,GAAG,CAAA;AAAA,IAC3B,KAAK,SAAA;AACH,MAAA,OAAO,iBAAiB,GAAG,CAAA;AAAA,IAC7B,KAAK,MAAA;AACH,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,MAAA;AACH,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,OAAA;AACH,MAAA,OAAO,eAAe,GAAG,CAAA;AAAA,IAC3B;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,sCAAA,EAAyC,KAAK,IAAI,CAAA,kJAAA;AAAA,OACpD;AAAA;AAEN","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.
|
|
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.
|
|
74
|
+
"@dualmark/converters": "0.8.0"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@types/node": "^22.10.0",
|