chalknotes 0.0.33 → 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 -334
  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,556 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateNotionRenderer = generateNotionRenderer;
4
+ exports.generateCSSModules = generateCSSModules;
5
+ function generateNotionRenderer(vars) {
6
+ return generateAppRouterRenderer(vars);
7
+ }
8
+ function generateAppRouterRenderer(vars) {
9
+ const imageImport = 'import Image from "next/image";';
10
+ if (vars.hasTailwind) {
11
+ return `${vars.hasTypeScript ? 'import React from "react";' : ''}
12
+ ${imageImport}
13
+
14
+ interface NotionBlock {
15
+ type: string;
16
+ text?: string;
17
+ richText?: any[];
18
+ imageUrl?: string;
19
+ caption?: string;
20
+ alt?: string;
21
+ code?: string;
22
+ language?: string;
23
+ unsupported?: boolean;
24
+ }
25
+
26
+ interface NotionRendererProps {
27
+ blocks: NotionBlock[];
28
+ }
29
+
30
+ export default function NotionRenderer({ blocks }: NotionRendererProps) {
31
+ if (!blocks || blocks.length === 0) return null;
32
+
33
+ return (
34
+ <div className="max-w-none">
35
+ {blocks.map((block, i) => {
36
+ switch (block.type) {
37
+ case "heading_1":
38
+ return (
39
+ <h1 key={i} className="text-3xl font-bold mb-6 mt-8 border-b border-gray-200 dark:border-gray-700 pb-2">
40
+ {block.text}
41
+ </h1>
42
+ );
43
+
44
+ case "heading_2":
45
+ return (
46
+ <h2 key={i} className="text-2xl font-semibold mb-4 mt-6">
47
+ {block.text}
48
+ </h2>
49
+ );
50
+
51
+ case "heading_3":
52
+ return (
53
+ <h3 key={i} className="text-xl font-medium mb-3 mt-5">
54
+ {block.text}
55
+ </h3>
56
+ );
57
+
58
+ case "paragraph":
59
+ return (
60
+ <p key={i} className="leading-relaxed mb-4 text-gray-700 dark:text-gray-300">
61
+ {block.text}
62
+ </p>
63
+ );
64
+
65
+ case "bulleted_list_item":
66
+ return (
67
+ <div key={i} className="flex items-start mb-2">
68
+ <span className="inline-block w-2 h-2 bg-gray-400 rounded-full mr-3 mt-2 flex-shrink-0"></span>
69
+ <span className="leading-relaxed text-gray-700 dark:text-gray-300">{block.text}</span>
70
+ </div>
71
+ );
72
+
73
+ case "numbered_list_item":
74
+ return (
75
+ <div key={i} className="flex items-start mb-2">
76
+ <span className="inline-block w-6 h-6 bg-blue-500 text-white text-sm rounded-full mr-3 text-center leading-6 flex-shrink-0">
77
+ {i + 1}
78
+ </span>
79
+ <span className="leading-relaxed text-gray-700 dark:text-gray-300">{block.text}</span>
80
+ </div>
81
+ );
82
+
83
+ case "quote":
84
+ return (
85
+ <blockquote key={i} className="border-l-4 border-blue-500 pl-6 py-4 my-6 bg-blue-50 dark:bg-blue-900/20 rounded-r-lg">
86
+ <p className="italic text-gray-700 dark:text-gray-300 text-lg leading-relaxed">
87
+ {block.text}
88
+ </p>
89
+ </blockquote>
90
+ );
91
+
92
+ case "code":
93
+ return (
94
+ <pre key={i} className="bg-gray-100 dark:bg-gray-800 p-4 rounded-lg overflow-x-auto my-4 border">
95
+ <code className="text-sm font-mono text-gray-800 dark:text-gray-200">
96
+ {block.code}
97
+ </code>
98
+ </pre>
99
+ );
100
+
101
+ case "image":
102
+ return (
103
+ <figure key={i} className="my-8">
104
+ <div className="relative overflow-hidden rounded-lg bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700">
105
+ <Image
106
+ src={block.imageUrl || '/placeholder.jpg'}
107
+ alt={block.alt || 'Image'}
108
+ width={800}
109
+ height={400}
110
+ className="w-full h-auto object-cover"
111
+ />
112
+ {block.caption && (
113
+ <figcaption className="text-sm text-center text-gray-500 dark:text-gray-400 mt-3 italic">
114
+ {block.caption}
115
+ </figcaption>
116
+ )}
117
+ </div>
118
+ </figure>
119
+ );
120
+
121
+ default:
122
+ return (
123
+ <div key={i} className="my-4 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg">
124
+ <p className="text-sm text-yellow-700 dark:text-yellow-300 italic">
125
+ ⚠️ Unsupported block type: {block.type}
126
+ </p>
127
+ </div>
128
+ );
129
+ }
130
+ })}
131
+ </div>
132
+ );
133
+ }`;
134
+ }
135
+ // CSS Modules version
136
+ if (vars.cssFramework === 'css-modules') {
137
+ return `${vars.hasTypeScript ? 'import React from "react";' : ''}
138
+ ${imageImport}
139
+ import styles from './NotionRenderer.module.css';
140
+
141
+ interface NotionBlock {
142
+ type: string;
143
+ text?: string;
144
+ richText?: any[];
145
+ imageUrl?: string;
146
+ caption?: string;
147
+ alt?: string;
148
+ code?: string;
149
+ language?: string;
150
+ unsupported?: boolean;
151
+ }
152
+
153
+ interface NotionRendererProps {
154
+ blocks: NotionBlock[];
155
+ }
156
+
157
+ export default function NotionRenderer({ blocks }: NotionRendererProps) {
158
+ if (!blocks || blocks.length === 0) return null;
159
+
160
+ return (
161
+ <div className={styles.container}>
162
+ {blocks.map((block, i) => {
163
+ switch (block.type) {
164
+ case "heading_1":
165
+ return (
166
+ <h1 key={i} className={styles.heading1}>
167
+ {block.text}
168
+ </h1>
169
+ );
170
+
171
+ case "heading_2":
172
+ return (
173
+ <h2 key={i} className={styles.heading2}>
174
+ {block.text}
175
+ </h2>
176
+ );
177
+
178
+ case "heading_3":
179
+ return (
180
+ <h3 key={i} className={styles.heading3}>
181
+ {block.text}
182
+ </h3>
183
+ );
184
+
185
+ case "paragraph":
186
+ return (
187
+ <p key={i} className={styles.paragraph}>
188
+ {block.text}
189
+ </p>
190
+ );
191
+
192
+ case "quote":
193
+ return (
194
+ <blockquote key={i} className={styles.quote}>
195
+ <p className={styles.quoteText}>
196
+ {block.text}
197
+ </p>
198
+ </blockquote>
199
+ );
200
+
201
+ case "code":
202
+ return (
203
+ <pre key={i} className={styles.codeBlock}>
204
+ <code className={styles.code}>
205
+ {block.code}
206
+ </code>
207
+ </pre>
208
+ );
209
+
210
+ case "image":
211
+ return (
212
+ <figure key={i}>
213
+ <div className={styles.imageContainer}>
214
+ <Image
215
+ src={block.imageUrl || '/placeholder.jpg'}
216
+ alt={block.alt || 'Image'}
217
+ width={800}
218
+ height={400}
219
+ className={styles.image}
220
+ />
221
+ {block.caption && (
222
+ <figcaption className={styles.caption}>
223
+ {block.caption}
224
+ </figcaption>
225
+ )}
226
+ </div>
227
+ </figure>
228
+ );
229
+
230
+ default:
231
+ return (
232
+ <div key={i} className={styles.unsupported}>
233
+ <p className={styles.unsupportedText}>
234
+ ⚠️ Unsupported block type: {block.type}
235
+ </p>
236
+ </div>
237
+ );
238
+ }
239
+ })}
240
+ </div>
241
+ );
242
+ }`;
243
+ }
244
+ // Plain CSS/Styled Components version
245
+ return `${vars.hasTypeScript ? 'import React from "react";' : ''}
246
+ ${imageImport}
247
+
248
+ interface NotionBlock {
249
+ type: string;
250
+ text?: string;
251
+ richText?: any[];
252
+ imageUrl?: string;
253
+ caption?: string;
254
+ alt?: string;
255
+ code?: string;
256
+ language?: string;
257
+ unsupported?: boolean;
258
+ }
259
+
260
+ interface NotionRendererProps {
261
+ blocks: NotionBlock[];
262
+ }
263
+
264
+ export default function NotionRenderer({ blocks }: NotionRendererProps) {
265
+ if (!blocks || blocks.length === 0) return null;
266
+
267
+ return (
268
+ <div style={{ maxWidth: 'none' }}>
269
+ {blocks.map((block, i) => {
270
+ switch (block.type) {
271
+ case "heading_1":
272
+ return (
273
+ <h1 key={i} style={{
274
+ fontSize: '1.875rem',
275
+ fontWeight: 'bold',
276
+ marginBottom: '1.5rem',
277
+ marginTop: '2rem',
278
+ borderBottom: '1px solid #e5e7eb',
279
+ paddingBottom: '0.5rem'
280
+ }}>
281
+ {block.text}
282
+ </h1>
283
+ );
284
+
285
+ case "heading_2":
286
+ return (
287
+ <h2 key={i} style={{
288
+ fontSize: '1.5rem',
289
+ fontWeight: '600',
290
+ marginBottom: '1rem',
291
+ marginTop: '1.5rem'
292
+ }}>
293
+ {block.text}
294
+ </h2>
295
+ );
296
+
297
+ case "heading_3":
298
+ return (
299
+ <h3 key={i} style={{
300
+ fontSize: '1.25rem',
301
+ fontWeight: '500',
302
+ marginBottom: '0.75rem',
303
+ marginTop: '1.25rem'
304
+ }}>
305
+ {block.text}
306
+ </h3>
307
+ );
308
+
309
+ case "paragraph":
310
+ return (
311
+ <p key={i} style={{
312
+ lineHeight: '1.625',
313
+ marginBottom: '1rem',
314
+ color: '#374151'
315
+ }}>
316
+ {block.text}
317
+ </p>
318
+ );
319
+
320
+ case "quote":
321
+ return (
322
+ <blockquote key={i} style={{
323
+ borderLeft: '4px solid #3b82f6',
324
+ paddingLeft: '1.5rem',
325
+ paddingTop: '1rem',
326
+ paddingBottom: '1rem',
327
+ marginTop: '1.5rem',
328
+ marginBottom: '1.5rem',
329
+ backgroundColor: '#eff6ff',
330
+ borderRadius: '0 0.5rem 0.5rem 0'
331
+ }}>
332
+ <p style={{
333
+ fontStyle: 'italic',
334
+ color: '#374151',
335
+ fontSize: '1.125rem',
336
+ lineHeight: '1.625'
337
+ }}>
338
+ {block.text}
339
+ </p>
340
+ </blockquote>
341
+ );
342
+
343
+ case "code":
344
+ return (
345
+ <pre key={i} style={{
346
+ backgroundColor: '#f3f4f6',
347
+ padding: '1rem',
348
+ borderRadius: '0.5rem',
349
+ overflowX: 'auto',
350
+ marginTop: '1rem',
351
+ marginBottom: '1rem',
352
+ border: '1px solid #e5e7eb'
353
+ }}>
354
+ <code style={{
355
+ fontSize: '0.875rem',
356
+ fontFamily: 'monospace',
357
+ color: '#1f2937'
358
+ }}>
359
+ {block.code}
360
+ </code>
361
+ </pre>
362
+ );
363
+
364
+ case "image":
365
+ return (
366
+ <figure key={i} style={{ marginTop: '2rem', marginBottom: '2rem' }}>
367
+ <div style={{
368
+ position: 'relative',
369
+ overflow: 'hidden',
370
+ borderRadius: '0.5rem',
371
+ backgroundColor: '#f3f4f6',
372
+ border: '1px solid #e5e7eb'
373
+ }}>
374
+ <Image
375
+ src={block.imageUrl || '/placeholder.jpg'}
376
+ alt={block.alt || 'Image'}
377
+ width={800}
378
+ height={400}
379
+ style={{ width: '100%', height: 'auto', objectFit: 'cover' }}
380
+ />
381
+ {block.caption && (
382
+ <figcaption style={{
383
+ fontSize: '0.875rem',
384
+ textAlign: 'center',
385
+ color: '#6b7280',
386
+ marginTop: '0.75rem',
387
+ fontStyle: 'italic'
388
+ }}>
389
+ {block.caption}
390
+ </figcaption>
391
+ )}
392
+ </div>
393
+ </figure>
394
+ );
395
+
396
+ default:
397
+ return (
398
+ <div key={i} style={{
399
+ marginTop: '1rem',
400
+ marginBottom: '1rem',
401
+ padding: '0.75rem',
402
+ backgroundColor: '#fefce8',
403
+ border: '1px solid #fde047',
404
+ borderRadius: '0.5rem'
405
+ }}>
406
+ <p style={{
407
+ fontSize: '0.875rem',
408
+ color: '#a16207',
409
+ fontStyle: 'italic'
410
+ }}>
411
+ ⚠️ Unsupported block type: {block.type}
412
+ </p>
413
+ </div>
414
+ );
415
+ }
416
+ })}
417
+ </div>
418
+ );
419
+ }`;
420
+ }
421
+ function generateCSSModules() {
422
+ return `.container {
423
+ max-width: none;
424
+ }
425
+
426
+ .heading1 {
427
+ font-size: 1.875rem;
428
+ font-weight: bold;
429
+ margin-bottom: 1.5rem;
430
+ margin-top: 2rem;
431
+ border-bottom: 1px solid #e5e7eb;
432
+ padding-bottom: 0.5rem;
433
+ }
434
+
435
+ .heading2 {
436
+ font-size: 1.5rem;
437
+ font-weight: 600;
438
+ margin-bottom: 1rem;
439
+ margin-top: 1.5rem;
440
+ }
441
+
442
+ .heading3 {
443
+ font-size: 1.25rem;
444
+ font-weight: 500;
445
+ margin-bottom: 0.75rem;
446
+ margin-top: 1.25rem;
447
+ }
448
+
449
+ .paragraph {
450
+ line-height: 1.625;
451
+ margin-bottom: 1rem;
452
+ color: #374151;
453
+ }
454
+
455
+ .quote {
456
+ border-left: 4px solid #3b82f6;
457
+ padding-left: 1.5rem;
458
+ padding-top: 1rem;
459
+ padding-bottom: 1rem;
460
+ margin-top: 1.5rem;
461
+ margin-bottom: 1.5rem;
462
+ background-color: #eff6ff;
463
+ border-radius: 0 0.5rem 0.5rem 0;
464
+ }
465
+
466
+ .quoteText {
467
+ font-style: italic;
468
+ color: #374151;
469
+ font-size: 1.125rem;
470
+ line-height: 1.625;
471
+ }
472
+
473
+ .codeBlock {
474
+ background-color: #f3f4f6;
475
+ padding: 1rem;
476
+ border-radius: 0.5rem;
477
+ overflow-x: auto;
478
+ margin-top: 1rem;
479
+ margin-bottom: 1rem;
480
+ border: 1px solid #e5e7eb;
481
+ }
482
+
483
+ .code {
484
+ font-size: 0.875rem;
485
+ font-family: monospace;
486
+ color: #1f2937;
487
+ }
488
+
489
+ .imageContainer {
490
+ position: relative;
491
+ overflow: hidden;
492
+ border-radius: 0.5rem;
493
+ background-color: #f3f4f6;
494
+ border: 1px solid #e5e7eb;
495
+ }
496
+
497
+ .image {
498
+ width: 100%;
499
+ height: auto;
500
+ object-fit: cover;
501
+ }
502
+
503
+ .caption {
504
+ font-size: 0.875rem;
505
+ text-align: center;
506
+ color: #6b7280;
507
+ margin-top: 0.75rem;
508
+ font-style: italic;
509
+ }
510
+
511
+ .unsupported {
512
+ margin-top: 1rem;
513
+ margin-bottom: 1rem;
514
+ padding: 0.75rem;
515
+ background-color: #fefce8;
516
+ border: 1px solid #fde047;
517
+ border-radius: 0.5rem;
518
+ }
519
+
520
+ .unsupportedText {
521
+ font-size: 0.875rem;
522
+ color: #a16207;
523
+ font-style: italic;
524
+ }
525
+
526
+ /* Dark mode support */
527
+ @media (prefers-color-scheme: dark) {
528
+ .paragraph, .quoteText {
529
+ color: #d1d5db;
530
+ }
531
+
532
+ .heading1, .heading2, .heading3 {
533
+ color: #f9fafb;
534
+ }
535
+
536
+ .quote {
537
+ background-color: #1e3a8a20;
538
+ border-left-color: #60a5fa;
539
+ }
540
+
541
+ .imageContainer {
542
+ background-color: #1f2937;
543
+ border-color: #374151;
544
+ }
545
+
546
+ .unsupported {
547
+ background-color: #451a0380;
548
+ border-color: #d97706;
549
+ }
550
+
551
+ .unsupportedText {
552
+ color: #fbbf24;
553
+ }
554
+ }`;
555
+ }
556
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/templates/components.ts"],"names":[],"mappings":";;AAEA,wDAEC;AAmaD,gDAsIC;AA3iBD,SAAgB,sBAAsB,CAAC,IAAuB;IAC5D,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAuB;IACxD,MAAM,WAAW,GAAG,iCAAiC,CAAC;IAEtD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;EAClE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyHX,CAAC;IACD,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;QACxC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;EAClE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGX,CAAC;IACD,CAAC;IAED,sCAAsC;IACtC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;EAChE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6KX,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoIP,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { TemplateVariables } from '../types';
2
+ export declare function generateBlogPage(vars: TemplateVariables): string;
3
+ export declare function generateIndexPage(vars: TemplateVariables): string;
4
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/templates/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAQhE;AA2KD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAiJjE"}