chalknotes 0.0.34 → 1.0.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.
Files changed (56) hide show
  1. package/README.md +143 -188
  2. package/bin/chalknotes.js +31 -0
  3. package/bin/cli.js +27 -288
  4. package/dist/commands/init.d.ts +6 -0
  5. package/dist/commands/init.d.ts.map +1 -0
  6. package/dist/commands/init.js +196 -0
  7. package/dist/commands/init.js.map +1 -0
  8. package/dist/commands/scaffold.d.ts +6 -0
  9. package/dist/commands/scaffold.d.ts.map +1 -0
  10. package/dist/commands/scaffold.js +196 -0
  11. package/dist/commands/scaffold.js.map +1 -0
  12. package/dist/index.d.ts +53 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +163 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/notion/client.d.ts +14 -0
  17. package/dist/notion/client.d.ts.map +1 -0
  18. package/dist/notion/client.js +191 -0
  19. package/dist/notion/client.js.map +1 -0
  20. package/dist/plugins/parser.d.ts +10 -0
  21. package/dist/plugins/parser.d.ts.map +1 -0
  22. package/dist/plugins/parser.js +307 -0
  23. package/dist/plugins/parser.js.map +1 -0
  24. package/dist/templates/components.d.ts +4 -0
  25. package/dist/templates/components.d.ts.map +1 -0
  26. package/dist/templates/components.js +556 -0
  27. package/dist/templates/components.js.map +1 -0
  28. package/dist/templates/pages.d.ts +4 -0
  29. package/dist/templates/pages.d.ts.map +1 -0
  30. package/dist/templates/pages.js +321 -0
  31. package/dist/templates/pages.js.map +1 -0
  32. package/dist/types/index.d.ts +64 -0
  33. package/dist/types/index.d.ts.map +1 -0
  34. package/dist/types/index.js +3 -0
  35. package/dist/types/index.js.map +1 -0
  36. package/dist/utils/config.d.ts +12 -0
  37. package/dist/utils/config.d.ts.map +1 -0
  38. package/dist/utils/config.js +99 -0
  39. package/dist/utils/config.js.map +1 -0
  40. package/dist/utils/detection.d.ts +19 -0
  41. package/dist/utils/detection.d.ts.map +1 -0
  42. package/dist/utils/detection.js +246 -0
  43. package/dist/utils/detection.js.map +1 -0
  44. package/dist/utils/logger.d.ts +10 -0
  45. package/dist/utils/logger.d.ts.map +1 -0
  46. package/dist/utils/logger.js +62 -0
  47. package/dist/utils/logger.js.map +1 -0
  48. package/package.json +47 -10
  49. package/templates/example-config.js +34 -0
  50. package/templates/example-env +3 -0
  51. package/src/index.js +0 -10
  52. package/src/lib/getAllPosts.js +0 -35
  53. package/src/lib/getPostBySlug.js +0 -380
  54. package/src/lib/nextHelpers.js +0 -36
  55. package/src/lib/notion.js +0 -11
  56. package/src/utils.js +0 -6
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateBlogPage = generateBlogPage;
4
+ exports.generateIndexPage = generateIndexPage;
5
+ function generateBlogPage(vars) {
6
+ const ext = vars.hasTypeScript ? 'tsx' : 'jsx';
7
+ if (vars.isAppRouter) {
8
+ return generateAppRouterPage(vars);
9
+ }
10
+ else {
11
+ return generatePagesRouterPage(vars);
12
+ }
13
+ }
14
+ function generateAppRouterPage(vars) {
15
+ const routePath = vars.routeBasePath.replace(/^\//, '');
16
+ return `import { getPostBySlug } from 'chalknotes';
17
+ import NotionRenderer from './NotionRenderer';
18
+ import { notFound } from 'next/navigation';
19
+
20
+ interface PageProps {
21
+ params: { slug: string };
22
+ }
23
+
24
+ export default async function BlogPost({ params }: PageProps) {
25
+ const post = await getPostBySlug(params.slug);
26
+
27
+ if (!post) {
28
+ notFound();
29
+ }
30
+
31
+ return (
32
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).container}">
33
+ <main className="${getThemeClasses(vars.theme, vars.hasTailwind).main}">
34
+ <article className="${getThemeClasses(vars.theme, vars.hasTailwind).article}">
35
+ <header className="${getThemeClasses(vars.theme, vars.hasTailwind).header}">
36
+ <h1 className="${getThemeClasses(vars.theme, vars.hasTailwind).title}">
37
+ {post.title}
38
+ </h1>
39
+ {post.publishedAt && (
40
+ <time className="${getThemeClasses(vars.theme, vars.hasTailwind).date}">
41
+ {new Date(post.publishedAt).toLocaleDateString('en-US', {
42
+ year: 'numeric',
43
+ month: 'long',
44
+ day: 'numeric'
45
+ })}
46
+ </time>
47
+ )}
48
+ {post.tags && post.tags.length > 0 && (
49
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).tags}">
50
+ {post.tags.map((tag) => (
51
+ <span key={tag} className="${getThemeClasses(vars.theme, vars.hasTailwind).tag}">
52
+ {tag}
53
+ </span>
54
+ ))}
55
+ </div>
56
+ )}
57
+ </header>
58
+
59
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).content}">
60
+ <NotionRenderer blocks={post.blocks} />
61
+ </div>
62
+ </article>
63
+ </main>
64
+ </div>
65
+ );
66
+ }
67
+
68
+ export async function generateStaticParams() {
69
+ // This will be populated at build time with your posts
70
+ return [];
71
+ }`;
72
+ }
73
+ function generatePagesRouterPage(vars) {
74
+ return `import { getStaticPropsForPost, getStaticPathsForPosts } from 'chalknotes';
75
+ import NotionRenderer from './NotionRenderer';
76
+
77
+ export const getStaticProps = getStaticPropsForPost;
78
+ export const getStaticPaths = getStaticPathsForPosts;
79
+
80
+ export default function BlogPost({ post }) {
81
+ if (!post) {
82
+ return <div>Post not found</div>;
83
+ }
84
+
85
+ return (
86
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).container}">
87
+ <main className="${getThemeClasses(vars.theme, vars.hasTailwind).main}">
88
+ <article className="${getThemeClasses(vars.theme, vars.hasTailwind).article}">
89
+ <header className="${getThemeClasses(vars.theme, vars.hasTailwind).header}">
90
+ <h1 className="${getThemeClasses(vars.theme, vars.hasTailwind).title}">
91
+ {post.title}
92
+ </h1>
93
+ {post.publishedAt && (
94
+ <time className="${getThemeClasses(vars.theme, vars.hasTailwind).date}">
95
+ {new Date(post.publishedAt).toLocaleDateString('en-US', {
96
+ year: 'numeric',
97
+ month: 'long',
98
+ day: 'numeric'
99
+ })}
100
+ </time>
101
+ )}
102
+ {post.tags && post.tags.length > 0 && (
103
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).tags}">
104
+ {post.tags.map((tag) => (
105
+ <span key={tag} className="${getThemeClasses(vars.theme, vars.hasTailwind).tag}">
106
+ {tag}
107
+ </span>
108
+ ))}
109
+ </div>
110
+ )}
111
+ </header>
112
+
113
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).content}">
114
+ <NotionRenderer blocks={post.blocks} />
115
+ </div>
116
+ </article>
117
+ </main>
118
+ </div>
119
+ );
120
+ }`;
121
+ }
122
+ function getThemeClasses(theme, hasTailwind) {
123
+ if (!hasTailwind) {
124
+ return {
125
+ container: '',
126
+ main: '',
127
+ article: '',
128
+ header: '',
129
+ title: '',
130
+ date: '',
131
+ tags: '',
132
+ tag: '',
133
+ content: ''
134
+ };
135
+ }
136
+ const baseClasses = {
137
+ container: 'min-h-screen bg-background text-foreground',
138
+ main: 'max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12',
139
+ article: 'bg-card text-card-foreground rounded-lg border shadow-sm p-8',
140
+ header: 'mb-8 border-b border-border pb-6',
141
+ title: 'text-4xl font-bold mb-4 leading-tight',
142
+ date: 'text-sm text-muted-foreground mb-4 block',
143
+ tags: 'flex flex-wrap gap-2',
144
+ tag: 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-primary/10 text-primary',
145
+ content: 'prose prose-lg dark:prose-invert max-w-none'
146
+ };
147
+ switch (theme) {
148
+ case 'minimal':
149
+ return {
150
+ ...baseClasses,
151
+ container: 'min-h-screen bg-white dark:bg-gray-950 text-gray-900 dark:text-gray-100',
152
+ main: 'max-w-3xl mx-auto px-6 py-16',
153
+ article: 'bg-white dark:bg-gray-950',
154
+ header: 'mb-12 border-b border-gray-200 dark:border-gray-800 pb-8',
155
+ title: 'text-3xl font-light mb-6 leading-tight tracking-tight',
156
+ date: 'text-sm text-gray-500 dark:text-gray-400 mb-6 block font-mono',
157
+ tag: 'inline-flex items-center px-3 py-1 rounded-md text-xs font-mono bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300'
158
+ };
159
+ case 'dev':
160
+ return {
161
+ ...baseClasses,
162
+ container: 'min-h-screen bg-gray-900 text-green-400 font-mono',
163
+ main: 'max-w-5xl mx-auto px-6 py-8',
164
+ article: 'bg-gray-800 border border-green-500/20 rounded-none p-6',
165
+ header: 'mb-8 border-b border-green-500/30 pb-6',
166
+ title: 'text-2xl font-bold mb-4 text-green-300 tracking-wide',
167
+ date: 'text-xs text-green-600 mb-4 block',
168
+ tag: 'inline-flex items-center px-2 py-1 text-xs bg-green-900/50 text-green-300 border border-green-500/30',
169
+ content: 'prose prose-green dark:prose-invert max-w-none prose-code:text-green-300 prose-pre:bg-black prose-pre:border prose-pre:border-green-500/30'
170
+ };
171
+ default: // modern
172
+ return baseClasses;
173
+ }
174
+ }
175
+ function generateIndexPage(vars) {
176
+ const routePath = vars.routeBasePath.replace(/^\//, '');
177
+ if (vars.isAppRouter) {
178
+ return `import { getAllPosts } from 'chalknotes';
179
+ import Link from 'next/link';
180
+
181
+ export default async function BlogIndex() {
182
+ const posts = await getAllPosts();
183
+
184
+ return (
185
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).container}">
186
+ <main className="${getThemeClasses(vars.theme, vars.hasTailwind).main}">
187
+ <header className="mb-12">
188
+ <h1 className="${getThemeClasses(vars.theme, vars.hasTailwind).title}">
189
+ Blog
190
+ </h1>
191
+ <p className="text-lg text-muted-foreground mt-4">
192
+ Thoughts, ideas, and tutorials from our team.
193
+ </p>
194
+ </header>
195
+
196
+ <div className="space-y-8">
197
+ {posts.map((post) => (
198
+ <article key={post.slug} className="${getThemeClasses(vars.theme, vars.hasTailwind).article}">
199
+ <Link href={\`${vars.routeBasePath}/\${post.slug}\`} className="block">
200
+ <h2 className="text-2xl font-semibold mb-3 hover:text-primary transition-colors">
201
+ {post.title}
202
+ </h2>
203
+ {post.excerpt && (
204
+ <p className="text-muted-foreground mb-4 line-clamp-2">
205
+ {post.excerpt}
206
+ </p>
207
+ )}
208
+ <div className="flex items-center justify-between text-sm text-muted-foreground">
209
+ {post.publishedAt && (
210
+ <time>
211
+ {new Date(post.publishedAt).toLocaleDateString('en-US', {
212
+ year: 'numeric',
213
+ month: 'long',
214
+ day: 'numeric'
215
+ })}
216
+ </time>
217
+ )}
218
+ {post.tags && post.tags.length > 0 && (
219
+ <div className="flex gap-2">
220
+ {post.tags.slice(0, 3).map((tag) => (
221
+ <span key={tag} className="${getThemeClasses(vars.theme, vars.hasTailwind).tag}">
222
+ {tag}
223
+ </span>
224
+ ))}
225
+ </div>
226
+ )}
227
+ </div>
228
+ </Link>
229
+ </article>
230
+ ))}
231
+ </div>
232
+
233
+ {posts.length === 0 && (
234
+ <div className="text-center py-12">
235
+ <p className="text-muted-foreground">
236
+ No blog posts found. Make sure your Notion database has published posts.
237
+ </p>
238
+ </div>
239
+ )}
240
+ </main>
241
+ </div>
242
+ );
243
+ }`;
244
+ }
245
+ else {
246
+ return `import { getAllPosts } from 'chalknotes';
247
+ import Link from 'next/link';
248
+
249
+ export async function getStaticProps() {
250
+ const posts = await getAllPosts();
251
+ return {
252
+ props: { posts }
253
+ };
254
+ }
255
+
256
+ export default function BlogIndex({ posts }) {
257
+ return (
258
+ <div className="${getThemeClasses(vars.theme, vars.hasTailwind).container}">
259
+ <main className="${getThemeClasses(vars.theme, vars.hasTailwind).main}">
260
+ <header className="mb-12">
261
+ <h1 className="${getThemeClasses(vars.theme, vars.hasTailwind).title}">
262
+ Blog
263
+ </h1>
264
+ <p className="text-lg text-muted-foreground mt-4">
265
+ Thoughts, ideas, and tutorials from our team.
266
+ </p>
267
+ </header>
268
+
269
+ <div className="space-y-8">
270
+ {posts.map((post) => (
271
+ <article key={post.slug} className="${getThemeClasses(vars.theme, vars.hasTailwind).article}">
272
+ <Link href={\`${vars.routeBasePath}/\${post.slug}\`}>
273
+ <a className="block">
274
+ <h2 className="text-2xl font-semibold mb-3 hover:text-primary transition-colors">
275
+ {post.title}
276
+ </h2>
277
+ {post.excerpt && (
278
+ <p className="text-muted-foreground mb-4 line-clamp-2">
279
+ {post.excerpt}
280
+ </p>
281
+ )}
282
+ <div className="flex items-center justify-between text-sm text-muted-foreground">
283
+ {post.publishedAt && (
284
+ <time>
285
+ {new Date(post.publishedAt).toLocaleDateString('en-US', {
286
+ year: 'numeric',
287
+ month: 'long',
288
+ day: 'numeric'
289
+ })}
290
+ </time>
291
+ )}
292
+ {post.tags && post.tags.length > 0 && (
293
+ <div className="flex gap-2">
294
+ {post.tags.slice(0, 3).map((tag) => (
295
+ <span key={tag} className="${getThemeClasses(vars.theme, vars.hasTailwind).tag}">
296
+ {tag}
297
+ </span>
298
+ ))}
299
+ </div>
300
+ )}
301
+ </div>
302
+ </a>
303
+ </Link>
304
+ </article>
305
+ ))}
306
+ </div>
307
+
308
+ {posts.length === 0 && (
309
+ <div className="text-center py-12">
310
+ <p className="text-muted-foreground">
311
+ No blog posts found. Make sure your Notion database has published posts.
312
+ </p>
313
+ </div>
314
+ )}
315
+ </main>
316
+ </div>
317
+ );
318
+ }`;
319
+ }
320
+ }
321
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/templates/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ export interface ChalkNotesConfig {
2
+ notionToken: string;
3
+ notionDatabaseId: string;
4
+ routeBasePath: string;
5
+ theme: 'modern' | 'minimal' | 'dev';
6
+ plugins: string[];
7
+ caching?: {
8
+ enabled: boolean;
9
+ ttl: number;
10
+ };
11
+ errorBoundaries?: boolean;
12
+ customization?: {
13
+ colors?: Record<string, string>;
14
+ fonts?: Record<string, string>;
15
+ };
16
+ }
17
+ export interface ProjectDetection {
18
+ isNextJs: boolean;
19
+ isAppRouter: boolean;
20
+ hasTailwind: boolean;
21
+ hasStyledComponents: boolean;
22
+ hasCSSModules: boolean;
23
+ hasTypeScript: boolean;
24
+ packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';
25
+ }
26
+ export interface NotionBlock {
27
+ type: string;
28
+ text?: string;
29
+ richText?: any[];
30
+ imageUrl?: string;
31
+ caption?: string;
32
+ alt?: string;
33
+ code?: string;
34
+ language?: string;
35
+ unsupported?: boolean;
36
+ }
37
+ export interface BlogPost {
38
+ title: string;
39
+ slug: string;
40
+ notionPageId: string;
41
+ blocks: NotionBlock[];
42
+ publishedAt?: string;
43
+ tags?: string[];
44
+ excerpt?: string;
45
+ }
46
+ export interface PluginContext {
47
+ content: string;
48
+ config: ChalkNotesConfig;
49
+ post: BlogPost;
50
+ }
51
+ export interface Plugin {
52
+ name: string;
53
+ syntax: RegExp;
54
+ render: (match: RegExpMatchArray, context: PluginContext) => string;
55
+ }
56
+ export interface TemplateVariables {
57
+ routeBasePath: string;
58
+ theme: string;
59
+ hasTypeScript: boolean;
60
+ hasTailwind: boolean;
61
+ isAppRouter: boolean;
62
+ cssFramework: 'tailwind' | 'styled-components' | 'css-modules' | 'none';
63
+ }
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,KAAK,MAAM,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,UAAU,GAAG,mBAAmB,GAAG,aAAa,GAAG,MAAM,CAAC;CACzE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { ChalkNotesConfig } from '../types';
2
+ export declare class ConfigManager {
3
+ private configPath;
4
+ constructor(cwd?: string);
5
+ getConfigPath(): string;
6
+ exists(): boolean;
7
+ load(): Promise<ChalkNotesConfig | null>;
8
+ save(config: ChalkNotesConfig): Promise<void>;
9
+ private generateConfigContent;
10
+ getDefaultConfig(): ChalkNotesConfig;
11
+ }
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,GAAG,GAAE,MAAsB;IAIvC,aAAa,IAAI,MAAM;IAIvB,MAAM,IAAI,OAAO;IAIX,IAAI,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAcxC,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,OAAO,CAAC,qBAAqB;IAkB7B,gBAAgB,IAAI,gBAAgB;CAcrC"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ConfigManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class ConfigManager {
40
+ constructor(cwd = process.cwd()) {
41
+ this.configPath = path.join(cwd, 'blog.config.js');
42
+ }
43
+ getConfigPath() {
44
+ return this.configPath;
45
+ }
46
+ exists() {
47
+ return fs.existsSync(this.configPath);
48
+ }
49
+ async load() {
50
+ if (!this.exists()) {
51
+ return null;
52
+ }
53
+ try {
54
+ // Clear require cache to get fresh config
55
+ delete require.cache[require.resolve(this.configPath)];
56
+ return require(this.configPath);
57
+ }
58
+ catch (error) {
59
+ throw new Error(`Failed to load config: ${error instanceof Error ? error.message : 'Unknown error'}`);
60
+ }
61
+ }
62
+ async save(config) {
63
+ const configContent = this.generateConfigContent(config);
64
+ await fs.promises.writeFile(this.configPath, configContent, 'utf-8');
65
+ }
66
+ generateConfigContent(config) {
67
+ return `module.exports = {
68
+ notionToken: process.env.NOTION_TOKEN,
69
+ notionDatabaseId: process.env.NOTION_DATABASE_ID,
70
+ routeBasePath: '${config.routeBasePath}',
71
+ theme: '${config.theme}',
72
+ plugins: [
73
+ ${config.plugins.map(plugin => `'${plugin}'`).join(',\n ')}
74
+ ],
75
+ caching: {
76
+ enabled: ${config.caching?.enabled ?? true},
77
+ ttl: ${config.caching?.ttl ?? 3600}
78
+ },
79
+ errorBoundaries: ${config.errorBoundaries ?? true},
80
+ customization: ${JSON.stringify(config.customization || {}, null, 4)}
81
+ };`;
82
+ }
83
+ getDefaultConfig() {
84
+ return {
85
+ notionToken: process.env.NOTION_TOKEN || '',
86
+ notionDatabaseId: process.env.NOTION_DATABASE_ID || '',
87
+ routeBasePath: '/blog',
88
+ theme: 'modern',
89
+ plugins: [],
90
+ caching: {
91
+ enabled: true,
92
+ ttl: 3600
93
+ },
94
+ errorBoundaries: true
95
+ };
96
+ }
97
+ }
98
+ exports.ConfigManager = ConfigManager;
99
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAG7B,MAAa,aAAa;IAGxB,YAAY,MAAc,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACrD,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,0CAA0C;YAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACvD,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAwB;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAEO,qBAAqB,CAAC,MAAwB;QACpD,OAAO;;;oBAGS,MAAM,CAAC,aAAa;YAC5B,MAAM,CAAC,KAAK;;MAElB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;;;eAGlD,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI;WACnC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI;;qBAEjB,MAAM,CAAC,eAAe,IAAI,IAAI;mBAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;GACnE,CAAC;IACF,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE;YAC3C,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE;YACtD,aAAa,EAAE,OAAO;YACtB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,EAAE;YACX,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,IAAI;aACV;YACD,eAAe,EAAE,IAAI;SACtB,CAAC;IACJ,CAAC;CACF;AAlED,sCAkEC"}
@@ -0,0 +1,19 @@
1
+ import { ProjectDetection } from '../types';
2
+ export declare class ProjectDetector {
3
+ private cwd;
4
+ constructor(cwd?: string);
5
+ detect(): Promise<ProjectDetection>;
6
+ private detectNextJs;
7
+ private detectAppRouter;
8
+ private detectTailwind;
9
+ private detectStyledComponents;
10
+ private detectCSSModules;
11
+ private detectTypeScript;
12
+ private detectPackageManager;
13
+ private readPackageJson;
14
+ private readNextConfig;
15
+ private hasTailwindConfig;
16
+ private hasGlobalTailwindCss;
17
+ private findFiles;
18
+ }
19
+ //# sourceMappingURL=detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/utils/detection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,GAAE,MAAsB;IAIjC,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;YA8B3B,YAAY;YAYZ,eAAe;YAuBf,cAAc;YAmBd,sBAAsB;YAYtB,gBAAgB;YAehB,gBAAgB;YAkBhB,oBAAoB;YA0BpB,eAAe;YAMf,cAAc;YA0Bd,iBAAiB;YAgBjB,oBAAoB;YA0BpB,SAAS;CAQxB"}