@noxion/core 0.0.1

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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/dist/client.d.ts +6 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +7 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +4 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +27 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/fetcher.d.ts +9 -0
  12. package/dist/fetcher.d.ts.map +1 -0
  13. package/dist/fetcher.js +189 -0
  14. package/dist/fetcher.js.map +1 -0
  15. package/dist/frontmatter.d.ts +6 -0
  16. package/dist/frontmatter.d.ts.map +1 -0
  17. package/dist/frontmatter.js +75 -0
  18. package/dist/frontmatter.js.map +1 -0
  19. package/dist/image-downloader.d.ts +9 -0
  20. package/dist/image-downloader.d.ts.map +1 -0
  21. package/dist/image-downloader.js +95 -0
  22. package/dist/image-downloader.js.map +1 -0
  23. package/dist/image-mapper.d.ts +5 -0
  24. package/dist/image-mapper.d.ts.map +1 -0
  25. package/dist/image-mapper.js +38 -0
  26. package/dist/image-mapper.js.map +1 -0
  27. package/dist/index.d.ts +16 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +11 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/plugin-executor.d.ts +4 -0
  32. package/dist/plugin-executor.d.ts.map +1 -0
  33. package/dist/plugin-executor.js +43 -0
  34. package/dist/plugin-executor.js.map +1 -0
  35. package/dist/plugin-loader.d.ts +4 -0
  36. package/dist/plugin-loader.d.ts.map +1 -0
  37. package/dist/plugin-loader.js +46 -0
  38. package/dist/plugin-loader.js.map +1 -0
  39. package/dist/plugin.d.ts +80 -0
  40. package/dist/plugin.d.ts.map +1 -0
  41. package/dist/plugin.js +2 -0
  42. package/dist/plugin.js.map +1 -0
  43. package/dist/plugins/analytics.d.ts +8 -0
  44. package/dist/plugins/analytics.d.ts.map +1 -0
  45. package/dist/plugins/analytics.js +57 -0
  46. package/dist/plugins/analytics.js.map +1 -0
  47. package/dist/plugins/comments.d.ts +23 -0
  48. package/dist/plugins/comments.d.ts.map +1 -0
  49. package/dist/plugins/comments.js +55 -0
  50. package/dist/plugins/comments.js.map +1 -0
  51. package/dist/plugins/index.d.ts +7 -0
  52. package/dist/plugins/index.d.ts.map +1 -0
  53. package/dist/plugins/index.js +4 -0
  54. package/dist/plugins/index.js.map +1 -0
  55. package/dist/plugins/rss.d.ts +10 -0
  56. package/dist/plugins/rss.d.ts.map +1 -0
  57. package/dist/plugins/rss.js +55 -0
  58. package/dist/plugins/rss.js.map +1 -0
  59. package/dist/slug.d.ts +6 -0
  60. package/dist/slug.d.ts.map +1 -0
  61. package/dist/slug.js +34 -0
  62. package/dist/slug.js.map +1 -0
  63. package/dist/types.d.ts +59 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +58 -0
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export { defineConfig, loadConfig } from "./config";
2
+ export { createNotionClient } from "./client";
3
+ export { fetchBlogPosts, fetchPage, fetchAllSlugs, fetchPostBySlug } from "./fetcher";
4
+ export { generateSlug, parseNotionPageId, buildPageUrl, resolveSlug } from "./slug";
5
+ export { parseFrontmatter, parseKeyValuePairs, applyFrontmatter } from "./frontmatter";
6
+ export { extractImageUrls, generateImageFilename, downloadImages } from "./image-downloader";
7
+ export { mapImages } from "./image-mapper";
8
+ export { definePlugin, loadPlugins } from "./plugin-loader";
9
+ export { executeHook, executeTransformHook } from "./plugin-executor";
10
+ export { createAnalyticsPlugin, createRSSPlugin, generateRSSXml, createCommentsPlugin, } from "./plugins/index";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AA0BtE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NoxionPlugin } from "./plugin";
2
+ export declare function executeHook(plugins: NoxionPlugin[], hookName: keyof NoxionPlugin, args: Record<string, unknown>): Promise<void>;
3
+ export declare function executeTransformHook<T>(plugins: NoxionPlugin[], hookName: keyof NoxionPlugin, initialValue: T, extraArgs: Record<string, unknown>): T;
4
+ //# sourceMappingURL=plugin-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-executor.d.ts","sourceRoot":"","sources":["../src/plugin-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,YAAY,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAcf;AAUD,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,YAAY,EAC5B,YAAY,EAAE,CAAC,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,CAAC,CAyBH"}
@@ -0,0 +1,43 @@
1
+ export async function executeHook(plugins, hookName, args) {
2
+ for (const plugin of plugins) {
3
+ const hookFn = plugin[hookName];
4
+ if (typeof hookFn !== "function")
5
+ continue;
6
+ try {
7
+ await hookFn(args);
8
+ }
9
+ catch (err) {
10
+ console.warn(`[noxion] Plugin "${plugin.name}" threw in ${String(hookName)}:`, err instanceof Error ? err.message : err);
11
+ }
12
+ }
13
+ }
14
+ const TRANSFORM_INPUT_KEYS = {
15
+ transformContent: "recordMap",
16
+ transformPosts: "posts",
17
+ extendMetadata: "metadata",
18
+ extendSitemap: "entries",
19
+ extendRoutes: "routes",
20
+ };
21
+ export function executeTransformHook(plugins, hookName, initialValue, extraArgs) {
22
+ let current = initialValue;
23
+ const hookKey = TRANSFORM_INPUT_KEYS[hookName] ?? "value";
24
+ for (const plugin of plugins) {
25
+ const hookFn = plugin[hookName];
26
+ if (typeof hookFn !== "function")
27
+ continue;
28
+ try {
29
+ const result = hookFn({
30
+ ...extraArgs,
31
+ [hookKey]: current,
32
+ });
33
+ if (result !== undefined) {
34
+ current = result;
35
+ }
36
+ }
37
+ catch (err) {
38
+ console.warn(`[noxion] Plugin "${plugin.name}" threw in ${String(hookName)}:`, err instanceof Error ? err.message : err);
39
+ }
40
+ }
41
+ return current;
42
+ }
43
+ //# sourceMappingURL=plugin-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-executor.js","sourceRoot":"","sources":["../src/plugin-executor.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB,EACvB,QAA4B,EAC5B,IAA6B;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,SAAS;QAE3C,IAAI,CAAC;YACH,MAAO,MAAkE,CAAC,IAAI,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,oBAAoB,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,QAAQ,CAAC,GAAG,EAChE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,oBAAoB,GAA2B;IACnD,gBAAgB,EAAE,WAAW;IAC7B,cAAc,EAAE,OAAO;IACvB,cAAc,EAAE,UAAU;IAC1B,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,QAAQ;CACvB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,OAAuB,EACvB,QAA4B,EAC5B,YAAe,EACf,SAAkC;IAElC,IAAI,OAAO,GAAG,YAAY,CAAC;IAC3B,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAkB,CAAC,IAAI,OAAO,CAAC;IAEpE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,SAAS;QAE3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAI,MAAqD,CAAC;gBACpE,GAAG,SAAS;gBACZ,CAAC,OAAO,CAAC,EAAE,OAAO;aACnB,CAAC,CAAC;YACH,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,GAAG,MAAW,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,oBAAoB,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,QAAQ,CAAC,GAAG,EAChE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NoxionPlugin, PluginFactory, PluginConfigEntry } from "./plugin";
2
+ export declare function definePlugin<Options = unknown, Content = unknown>(factory: PluginFactory<Options, Content>): PluginFactory<Options, Content>;
3
+ export declare function loadPlugins(entries: PluginConfigEntry[]): NoxionPlugin[];
4
+ //# sourceMappingURL=plugin-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,wBAAgB,YAAY,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC/D,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GACvC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAEjC;AAUD,wBAAgB,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE,CAkCxE"}
@@ -0,0 +1,46 @@
1
+ export function definePlugin(factory) {
2
+ return factory;
3
+ }
4
+ function isPluginFactory(entry) {
5
+ return typeof entry === "function";
6
+ }
7
+ function isPluginInstance(entry) {
8
+ return typeof entry === "object" && entry !== null && "name" in entry;
9
+ }
10
+ export function loadPlugins(entries) {
11
+ const plugins = [];
12
+ const seenNames = new Set();
13
+ for (const entry of entries) {
14
+ if (entry === false)
15
+ continue;
16
+ let plugin;
17
+ if (Array.isArray(entry)) {
18
+ const [moduleOrFactory, options] = entry;
19
+ if (isPluginFactory(moduleOrFactory)) {
20
+ plugin = moduleOrFactory(options);
21
+ }
22
+ else if (isPluginInstance(moduleOrFactory)) {
23
+ plugin = moduleOrFactory;
24
+ }
25
+ else {
26
+ continue;
27
+ }
28
+ }
29
+ else if (isPluginFactory(entry)) {
30
+ plugin = entry({});
31
+ }
32
+ else if (isPluginInstance(entry)) {
33
+ plugin = entry;
34
+ }
35
+ else {
36
+ continue;
37
+ }
38
+ if (seenNames.has(plugin.name)) {
39
+ console.warn(`[noxion] Duplicate plugin name: "${plugin.name}"`);
40
+ }
41
+ seenNames.add(plugin.name);
42
+ plugins.push(plugin);
43
+ }
44
+ return plugins;
45
+ }
46
+ //# sourceMappingURL=plugin-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,YAAY,CAC1B,OAAwC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA4B;IACtD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,KAAK;YAAE,SAAS;QAE9B,IAAI,MAAoB,CAAC;QAEzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACzC,IAAI,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrC,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,gBAAgB,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC7C,MAAM,GAAG,eAAe,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,SAAS;YACX,CAAC;QACH,CAAC;aAAM,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,SAAS;QACX,CAAC;QAED,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,oCAAoC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,80 @@
1
+ import type { ExtendedRecordMap } from "notion-types";
2
+ import type { BlogPost, NoxionConfig } from "./types";
3
+ export interface HeadTag {
4
+ tagName: string;
5
+ attributes?: Record<string, string>;
6
+ innerHTML?: string;
7
+ }
8
+ export interface SitemapEntry {
9
+ url: string;
10
+ lastmod?: string;
11
+ changefreq?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never";
12
+ priority?: number;
13
+ }
14
+ export interface RouteInfo {
15
+ path: string;
16
+ component?: string;
17
+ exact?: boolean;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ export interface NoxionMetadata {
21
+ title: string;
22
+ description: string;
23
+ canonical?: string;
24
+ openGraph?: Record<string, string>;
25
+ twitter?: Record<string, string>;
26
+ [key: string]: unknown;
27
+ }
28
+ export interface PluginActions {
29
+ addRoute: (route: RouteInfo) => void;
30
+ setGlobalData: (key: string, data: unknown) => void;
31
+ getGlobalData: (pluginName: string, key: string) => unknown;
32
+ }
33
+ export type AllContent = Record<string, unknown>;
34
+ export interface NoxionPlugin<Content = unknown> {
35
+ name: string;
36
+ loadContent?: () => Promise<Content> | Content;
37
+ contentLoaded?: (args: {
38
+ content: Content;
39
+ actions: PluginActions;
40
+ }) => Promise<void> | void;
41
+ allContentLoaded?: (args: {
42
+ allContent: AllContent;
43
+ actions: PluginActions;
44
+ }) => Promise<void> | void;
45
+ onBuildStart?: (args: {
46
+ config: NoxionConfig;
47
+ }) => Promise<void> | void;
48
+ postBuild?: (args: {
49
+ config: NoxionConfig;
50
+ routes: RouteInfo[];
51
+ }) => Promise<void> | void;
52
+ transformContent?: (args: {
53
+ recordMap: ExtendedRecordMap;
54
+ post: BlogPost;
55
+ }) => ExtendedRecordMap;
56
+ transformPosts?: (args: {
57
+ posts: BlogPost[];
58
+ }) => BlogPost[];
59
+ extendMetadata?: (args: {
60
+ metadata: NoxionMetadata;
61
+ post?: BlogPost;
62
+ config: NoxionConfig;
63
+ }) => NoxionMetadata;
64
+ injectHead?: (args: {
65
+ post?: BlogPost;
66
+ config: NoxionConfig;
67
+ }) => HeadTag[];
68
+ extendSitemap?: (args: {
69
+ entries: SitemapEntry[];
70
+ config: NoxionConfig;
71
+ }) => SitemapEntry[];
72
+ extendRoutes?: (args: {
73
+ routes: RouteInfo[];
74
+ config: NoxionConfig;
75
+ }) => RouteInfo[];
76
+ }
77
+ export type PluginFactory<Options = unknown, Content = unknown> = (options: Options) => NoxionPlugin<Content>;
78
+ export type PluginModule<Options = unknown, Content = unknown> = NoxionPlugin<Content> | PluginFactory<Options, Content>;
79
+ export type PluginConfigEntry = PluginModule | [PluginModule, unknown] | false;
80
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/plugin.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { NoxionPlugin } from "../plugin";
2
+ export interface AnalyticsPluginOptions {
3
+ provider: "google" | "plausible" | "umami" | "custom";
4
+ trackingId: string;
5
+ customScript?: string;
6
+ }
7
+ export declare function createAnalyticsPlugin(options: AnalyticsPluginOptions): NoxionPlugin;
8
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/plugins/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,WAAW,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,YAAY,CAKnF"}
@@ -0,0 +1,57 @@
1
+ export function createAnalyticsPlugin(options) {
2
+ return {
3
+ name: "noxion-plugin-analytics",
4
+ injectHead: () => generateAnalyticsTags(options),
5
+ };
6
+ }
7
+ function generateAnalyticsTags(options) {
8
+ switch (options.provider) {
9
+ case "google":
10
+ return [
11
+ {
12
+ tagName: "script",
13
+ attributes: {
14
+ async: "true",
15
+ src: `https://www.googletagmanager.com/gtag/js?id=${options.trackingId}`,
16
+ },
17
+ },
18
+ {
19
+ tagName: "script",
20
+ innerHTML: `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','${options.trackingId}');`,
21
+ },
22
+ ];
23
+ case "plausible":
24
+ return [
25
+ {
26
+ tagName: "script",
27
+ attributes: {
28
+ defer: "true",
29
+ "data-domain": options.trackingId,
30
+ src: "https://plausible.io/js/plausible.js",
31
+ },
32
+ },
33
+ ];
34
+ case "umami":
35
+ return [
36
+ {
37
+ tagName: "script",
38
+ attributes: {
39
+ async: "true",
40
+ "data-website-id": options.trackingId,
41
+ src: "https://analytics.umami.is/script.js",
42
+ },
43
+ },
44
+ ];
45
+ case "custom":
46
+ return [
47
+ {
48
+ tagName: "script",
49
+ attributes: {
50
+ async: "true",
51
+ src: options.customScript ?? "",
52
+ },
53
+ },
54
+ ];
55
+ }
56
+ }
57
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/plugins/analytics.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA+B;IAC5D,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE;wBACV,KAAK,EAAE,MAAM;wBACb,GAAG,EAAE,+CAA+C,OAAO,CAAC,UAAU,EAAE;qBACzE;iBACF;gBACD;oBACE,OAAO,EAAE,QAAQ;oBACjB,SAAS,EAAE,yHAAyH,OAAO,CAAC,UAAU,KAAK;iBAC5J;aACF,CAAC;QAEJ,KAAK,WAAW;YACd,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE;wBACV,KAAK,EAAE,MAAM;wBACb,aAAa,EAAE,OAAO,CAAC,UAAU;wBACjC,GAAG,EAAE,sCAAsC;qBAC5C;iBACF;aACF,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE;wBACV,KAAK,EAAE,MAAM;wBACb,iBAAiB,EAAE,OAAO,CAAC,UAAU;wBACrC,GAAG,EAAE,sCAAsC;qBAC5C;iBACF;aACF,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE;wBACV,KAAK,EAAE,MAAM;wBACb,GAAG,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;qBAChC;iBACF;aACF,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { NoxionPlugin } from "../plugin";
2
+ export interface GiscusConfig {
3
+ repo: string;
4
+ repoId: string;
5
+ category: string;
6
+ categoryId: string;
7
+ mapping?: string;
8
+ theme?: string;
9
+ }
10
+ export interface UtterancesConfig {
11
+ repo: string;
12
+ issueTerm?: string;
13
+ theme?: string;
14
+ }
15
+ export interface DisqusConfig {
16
+ shortname: string;
17
+ }
18
+ export interface CommentsPluginOptions {
19
+ provider: "giscus" | "utterances" | "disqus";
20
+ config: GiscusConfig | UtterancesConfig | DisqusConfig;
21
+ }
22
+ export declare function createCommentsPlugin(options: CommentsPluginOptions): NoxionPlugin;
23
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/plugins/comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,WAAW,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC7C,MAAM,EAAE,YAAY,GAAG,gBAAgB,GAAG,YAAY,CAAC;CACxD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,YAAY,CAKjF"}
@@ -0,0 +1,55 @@
1
+ export function createCommentsPlugin(options) {
2
+ return {
3
+ name: "noxion-plugin-comments",
4
+ injectHead: () => generateCommentsTags(options),
5
+ };
6
+ }
7
+ function generateCommentsTags(options) {
8
+ switch (options.provider) {
9
+ case "giscus": {
10
+ const cfg = options.config;
11
+ return [
12
+ {
13
+ tagName: "script",
14
+ attributes: {
15
+ src: "https://giscus.app/client.js",
16
+ "data-repo": cfg.repo,
17
+ "data-repo-id": cfg.repoId,
18
+ "data-category": cfg.category,
19
+ "data-category-id": cfg.categoryId,
20
+ "data-mapping": cfg.mapping ?? "pathname",
21
+ "data-theme": cfg.theme ?? "preferred_color_scheme",
22
+ crossorigin: "anonymous",
23
+ async: "true",
24
+ },
25
+ },
26
+ ];
27
+ }
28
+ case "utterances": {
29
+ const cfg = options.config;
30
+ return [
31
+ {
32
+ tagName: "script",
33
+ attributes: {
34
+ src: "https://utteranc.es/client.js",
35
+ repo: cfg.repo,
36
+ "issue-term": cfg.issueTerm ?? "pathname",
37
+ theme: cfg.theme ?? "github-light",
38
+ crossorigin: "anonymous",
39
+ async: "true",
40
+ },
41
+ },
42
+ ];
43
+ }
44
+ case "disqus": {
45
+ const cfg = options.config;
46
+ return [
47
+ {
48
+ tagName: "script",
49
+ innerHTML: `var disqus_config=function(){this.page.url=window.location.href;this.page.identifier=window.location.pathname;};(function(){var d=document,s=d.createElement('script');s.src='https://${cfg.shortname}.disqus.com/embed.js';s.setAttribute('data-timestamp',+new Date());(d.head||d.body).appendChild(s);})();`,
50
+ },
51
+ ];
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/plugins/comments.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA8B;IAC1D,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,OAAO,CAAC,MAAsB,CAAC;YAC3C,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE;wBACV,GAAG,EAAE,8BAA8B;wBACnC,WAAW,EAAE,GAAG,CAAC,IAAI;wBACrB,cAAc,EAAE,GAAG,CAAC,MAAM;wBAC1B,eAAe,EAAE,GAAG,CAAC,QAAQ;wBAC7B,kBAAkB,EAAE,GAAG,CAAC,UAAU;wBAClC,cAAc,EAAE,GAAG,CAAC,OAAO,IAAI,UAAU;wBACzC,YAAY,EAAE,GAAG,CAAC,KAAK,IAAI,wBAAwB;wBACnD,WAAW,EAAE,WAAW;wBACxB,KAAK,EAAE,MAAM;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,OAAO,CAAC,MAA0B,CAAC;YAC/C,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE;wBACV,GAAG,EAAE,+BAA+B;wBACpC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,YAAY,EAAE,GAAG,CAAC,SAAS,IAAI,UAAU;wBACzC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,cAAc;wBAClC,WAAW,EAAE,WAAW;wBACxB,KAAK,EAAE,MAAM;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,OAAO,CAAC,MAAsB,CAAC;YAC3C,OAAO;gBACL;oBACE,OAAO,EAAE,QAAQ;oBACjB,SAAS,EAAE,yLAAyL,GAAG,CAAC,SAAS,0GAA0G;iBAC5T;aACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createAnalyticsPlugin } from "./analytics";
2
+ export type { AnalyticsPluginOptions } from "./analytics";
3
+ export { createRSSPlugin, generateRSSXml } from "./rss";
4
+ export type { RSSPluginOptions } from "./rss";
5
+ export { createCommentsPlugin } from "./comments";
6
+ export type { CommentsPluginOptions, GiscusConfig, UtterancesConfig, DisqusConfig } from "./comments";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createAnalyticsPlugin } from "./analytics";
2
+ export { createRSSPlugin, generateRSSXml } from "./rss";
3
+ export { createCommentsPlugin } from "./comments";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { NoxionPlugin } from "../plugin";
2
+ import type { BlogPost, NoxionConfig } from "../types";
3
+ export interface RSSPluginOptions {
4
+ feedPath?: string;
5
+ limit?: number;
6
+ fullContent?: boolean;
7
+ }
8
+ export declare function createRSSPlugin(options: RSSPluginOptions): NoxionPlugin;
9
+ export declare function generateRSSXml(posts: BlogPost[], config: NoxionConfig, options?: Pick<RSSPluginOptions, "limit">): string;
10
+ //# sourceMappingURL=rss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rss.d.ts","sourceRoot":"","sources":["../../src/plugins/rss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAOvE;AAgBD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,GACxC,MAAM,CA6BR"}
@@ -0,0 +1,55 @@
1
+ export function createRSSPlugin(options) {
2
+ const feedPath = options.feedPath ?? "/feed.xml";
3
+ return {
4
+ name: "noxion-plugin-rss",
5
+ injectHead: () => generateRSSHeadTags(feedPath),
6
+ };
7
+ }
8
+ function generateRSSHeadTags(feedPath) {
9
+ return [
10
+ {
11
+ tagName: "link",
12
+ attributes: {
13
+ rel: "alternate",
14
+ type: "application/rss+xml",
15
+ title: "RSS Feed",
16
+ href: feedPath,
17
+ },
18
+ },
19
+ ];
20
+ }
21
+ export function generateRSSXml(posts, config, options) {
22
+ const baseUrl = `https://${config.domain}`;
23
+ const limit = options?.limit ?? 20;
24
+ const limited = posts.slice(0, limit);
25
+ const items = limited
26
+ .map((post) => ` <item>
27
+ <title>${escapeXml(post.title)}</title>
28
+ <link>${baseUrl}/${post.slug}</link>
29
+ <guid isPermaLink="true">${baseUrl}/${post.slug}</guid>
30
+ <pubDate>${new Date(post.date).toUTCString()}</pubDate>
31
+ <dc:creator>${escapeXml(config.author)}</dc:creator>
32
+ ${post.tags.map((t) => ` <category>${escapeXml(t)}</category>`).join("\n")}
33
+ </item>`)
34
+ .join("\n");
35
+ return `<?xml version="1.0" encoding="UTF-8"?>
36
+ <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
37
+ <channel>
38
+ <title>${escapeXml(config.name)}</title>
39
+ <link>${baseUrl}</link>
40
+ <description>${escapeXml(config.description)}</description>
41
+ <language>${config.language}</language>
42
+ <atom:link href="${baseUrl}/feed.xml" rel="self" type="application/rss+xml"/>
43
+ ${items}
44
+ </channel>
45
+ </rss>`;
46
+ }
47
+ function escapeXml(str) {
48
+ return str
49
+ .replace(/&/g, "&amp;")
50
+ .replace(/</g, "&lt;")
51
+ .replace(/>/g, "&gt;")
52
+ .replace(/"/g, "&quot;")
53
+ .replace(/'/g, "&apos;");
54
+ }
55
+ //# sourceMappingURL=rss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rss.js","sourceRoot":"","sources":["../../src/plugins/rss.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;IAEjD,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,UAAU,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO;QACL;YACE,OAAO,EAAE,MAAM;YACf,UAAU,EAAE;gBACV,GAAG,EAAE,WAAW;gBAChB,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,QAAQ;aACf;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,MAAoB,EACpB,OAAyC;IAEzC,MAAM,OAAO,GAAG,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CAAC;eACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;cACtB,OAAO,IAAI,IAAI,CAAC,IAAI;iCACD,OAAO,IAAI,IAAI,CAAC,IAAI;iBACpC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;oBAC9B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;EAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnE,CACP;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;aAGI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;YACvB,OAAO;mBACA,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;gBAChC,MAAM,CAAC,QAAQ;uBACR,OAAO;EAC5B,KAAK;;OAEA,CAAC;AACR,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
package/dist/slug.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { BlogPost } from "./types";
2
+ export declare function generateSlug(title: string): string;
3
+ export declare function parseNotionPageId(input: string): string;
4
+ export declare function buildPageUrl(slug: string): string;
5
+ export declare function resolveSlug(post: BlogPost): string;
6
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAavD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAGlD"}
package/dist/slug.js ADDED
@@ -0,0 +1,34 @@
1
+ export function generateSlug(title) {
2
+ if (!title)
3
+ return "";
4
+ return (title
5
+ .toLowerCase()
6
+ // keep alphanumerics, CJK characters, hyphens, spaces
7
+ .replace(/[^\p{L}\p{N}\s-]/gu, "")
8
+ .replace(/\s+/g, "-")
9
+ .replace(/-{2,}/g, "-")
10
+ .replace(/^-+|-+$/g, ""));
11
+ }
12
+ export function parseNotionPageId(input) {
13
+ let raw = input;
14
+ const urlMatch = raw.match(/([a-f0-9]{32})$/i);
15
+ if (urlMatch) {
16
+ raw = urlMatch[1];
17
+ }
18
+ const hex = raw.replace(/-/g, "");
19
+ if (hex.length !== 32)
20
+ return input;
21
+ // Format as UUID: 8-4-4-4-12
22
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
23
+ }
24
+ export function buildPageUrl(slug) {
25
+ if (slug.startsWith("/"))
26
+ return slug;
27
+ return `/${slug}`;
28
+ }
29
+ export function resolveSlug(post) {
30
+ if (post.slug)
31
+ return post.slug;
32
+ return generateSlug(post.title);
33
+ }
34
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,OAAO,CACL,KAAK;SACF,WAAW,EAAE;QACd,sDAAsD;SACrD,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAElC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAEpC,6BAA6B;IAC7B,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAChC,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { ExtendedRecordMap } from "notion-types";
2
+ import type { PluginConfigEntry } from "./plugin";
3
+ export type { ExtendedRecordMap } from "notion-types";
4
+ export type ThemeMode = "system" | "light" | "dark";
5
+ export type NoxionLayout = "single-column" | "sidebar-left" | "sidebar-right";
6
+ export interface NoxionConfig {
7
+ rootNotionPageId: string;
8
+ rootNotionSpaceId?: string;
9
+ name: string;
10
+ domain: string;
11
+ author: string;
12
+ description: string;
13
+ language: string;
14
+ defaultTheme: ThemeMode;
15
+ revalidate: number;
16
+ revalidateSecret?: string;
17
+ plugins?: PluginConfig[];
18
+ theme?: NoxionThemeConfig;
19
+ layout?: NoxionLayout;
20
+ components?: ComponentOverrides;
21
+ }
22
+ export interface NoxionConfigInput {
23
+ rootNotionPageId: string;
24
+ rootNotionSpaceId?: string;
25
+ name: string;
26
+ domain: string;
27
+ author: string;
28
+ description: string;
29
+ language?: string;
30
+ defaultTheme?: ThemeMode;
31
+ revalidate?: number;
32
+ revalidateSecret?: string;
33
+ plugins?: PluginConfig[];
34
+ theme?: NoxionThemeConfig;
35
+ layout?: NoxionLayout;
36
+ components?: ComponentOverrides;
37
+ }
38
+ export interface BlogPost {
39
+ id: string;
40
+ title: string;
41
+ slug: string;
42
+ date: string;
43
+ tags: string[];
44
+ category?: string;
45
+ coverImage?: string;
46
+ description?: string;
47
+ author?: string;
48
+ published: boolean;
49
+ lastEditedTime: string;
50
+ frontmatter?: Record<string, string>;
51
+ }
52
+ export interface NoxionPageData {
53
+ recordMap: ExtendedRecordMap;
54
+ post: BlogPost;
55
+ }
56
+ export type PluginConfig = PluginConfigEntry;
57
+ export type NoxionThemeConfig = unknown;
58
+ export type ComponentOverrides = unknown;
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,SAAS,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}