@nuasite/cms-marker 0.0.64 → 0.0.66

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 (38) hide show
  1. package/dist/types/build-processor.d.ts +2 -1
  2. package/dist/types/build-processor.d.ts.map +1 -1
  3. package/dist/types/component-registry.d.ts.map +1 -1
  4. package/dist/types/config.d.ts +19 -0
  5. package/dist/types/config.d.ts.map +1 -0
  6. package/dist/types/dev-middleware.d.ts +10 -2
  7. package/dist/types/dev-middleware.d.ts.map +1 -1
  8. package/dist/types/error-collector.d.ts +56 -0
  9. package/dist/types/error-collector.d.ts.map +1 -0
  10. package/dist/types/html-processor.d.ts.map +1 -1
  11. package/dist/types/index.d.ts +2 -1
  12. package/dist/types/index.d.ts.map +1 -1
  13. package/dist/types/manifest-writer.d.ts +11 -2
  14. package/dist/types/manifest-writer.d.ts.map +1 -1
  15. package/dist/types/source-finder.d.ts +18 -3
  16. package/dist/types/source-finder.d.ts.map +1 -1
  17. package/dist/types/tailwind-colors.d.ts +6 -30
  18. package/dist/types/tailwind-colors.d.ts.map +1 -1
  19. package/dist/types/tsconfig.tsbuildinfo +1 -1
  20. package/dist/types/types.d.ts +25 -9
  21. package/dist/types/types.d.ts.map +1 -1
  22. package/dist/types/vite-plugin.d.ts.map +1 -1
  23. package/package.json +2 -1
  24. package/src/build-processor.ts +73 -19
  25. package/src/component-registry.ts +2 -0
  26. package/src/config.ts +29 -0
  27. package/src/dev-middleware.ts +12 -4
  28. package/src/error-collector.ts +106 -0
  29. package/src/html-processor.ts +55 -37
  30. package/src/index.ts +20 -4
  31. package/src/manifest-writer.ts +38 -7
  32. package/src/source-finder.ts +1003 -295
  33. package/src/tailwind-colors.ts +511 -121
  34. package/src/types.ts +27 -9
  35. package/src/vite-plugin.ts +4 -12
  36. package/dist/types/astro-transform.d.ts +0 -21
  37. package/dist/types/astro-transform.d.ts.map +0 -1
  38. package/src/astro-transform.ts +0 -205
@@ -66,12 +66,12 @@ export interface ContentConstraints {
66
66
  /** Allowed HTML tags for rich text content */
67
67
  allowedTags?: string[];
68
68
  }
69
- /** Represents a single Tailwind color with its shades */
69
+ /** Represents a single Tailwind color with its shades and values */
70
70
  export interface TailwindColor {
71
71
  /** Color name (e.g., 'red', 'blue', 'primary') */
72
72
  name: string;
73
- /** Available shades (e.g., ['50', '100', '200', ..., '900', '950']) */
74
- shades: string[];
73
+ /** Map of shade to CSS color value (e.g., { '500': '#ef4444', '600': '#dc2626' }) */
74
+ values: Record<string, string>;
75
75
  /** Whether this is a custom/theme color vs default Tailwind */
76
76
  isCustom?: boolean;
77
77
  }
@@ -98,8 +98,26 @@ export interface AvailableColors {
98
98
  defaultColors: string[];
99
99
  /** Custom/theme color names */
100
100
  customColors: string[];
101
- /** Hidden HTML containing all color classes for Tailwind safelist */
102
- colorSafelistHtml?: string;
101
+ }
102
+ /** Text style value with class name and CSS properties */
103
+ export interface TextStyleValue {
104
+ /** Tailwind class name (e.g., 'font-bold', 'text-xl') */
105
+ class: string;
106
+ /** Display label for UI */
107
+ label: string;
108
+ /** CSS properties to apply (e.g., { fontWeight: '700' }) */
109
+ css: Record<string, string>;
110
+ }
111
+ /** Available text styles from Tailwind config */
112
+ export interface AvailableTextStyles {
113
+ /** Font weight options (font-normal, font-bold, etc.) */
114
+ fontWeight: TextStyleValue[];
115
+ /** Font size options (text-xs, text-sm, text-base, etc.) */
116
+ fontSize: TextStyleValue[];
117
+ /** Text decoration options (underline, line-through, etc.) */
118
+ textDecoration: TextStyleValue[];
119
+ /** Font style options (italic, not-italic) */
120
+ fontStyle: TextStyleValue[];
103
121
  }
104
122
  export interface ManifestEntry {
105
123
  id: string;
@@ -121,10 +139,6 @@ export interface ManifestEntry {
121
139
  collectionSlug?: string;
122
140
  /** Path to the markdown content file (e.g., 'src/content/blog/my-post.md') */
123
141
  contentPath?: string;
124
- /** Image source URL (for image entries) - deprecated, use imageMetadata */
125
- imageSrc?: string;
126
- /** Image alt text (for image entries) - deprecated, use imageMetadata */
127
- imageAlt?: string;
128
142
  /** Stable ID derived from content + context hash, survives rebuilds */
129
143
  stableId?: string;
130
144
  /** SHA256 hash of sourceSnippet at generation time for conflict detection */
@@ -193,5 +207,7 @@ export interface CmsManifest {
193
207
  collections?: Record<string, CollectionEntry>;
194
208
  /** Available Tailwind colors from the project's config */
195
209
  availableColors?: AvailableColors;
210
+ /** Available text styles from the project's Tailwind config */
211
+ availableTextStyles?: AvailableTextStyles;
196
212
  }
197
213
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAEpE,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,cAAc,CAAA;IAC9B,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACzD,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAClC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;CAC7C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAoCrE"}
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAEpE,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,cAAc,CAAA;IAC9B,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACzD,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAClC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;CAC7C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA6BrE"}
package/package.json CHANGED
@@ -14,12 +14,13 @@
14
14
  "directory": "packages/cms-marker"
15
15
  },
16
16
  "license": "Apache-2.0",
17
- "version": "0.0.64",
17
+ "version": "0.0.66",
18
18
  "module": "src/index.ts",
19
19
  "types": "src/index.ts",
20
20
  "type": "module",
21
21
  "dependencies": {
22
22
  "@astrojs/compiler": "^2.13.0",
23
+ "@babel/parser": "^7.24.0",
23
24
  "astro": "^5.16.6",
24
25
  "node-html-parser": "^6.1.13"
25
26
  },
@@ -4,7 +4,15 @@ import path from 'node:path'
4
4
  import { fileURLToPath } from 'node:url'
5
5
  import { processHtml } from './html-processor'
6
6
  import type { ManifestWriter } from './manifest-writer'
7
- import { findCollectionSource, findImageSourceLocation, findMarkdownSourceLocation, findSourceLocation, parseMarkdownContent } from './source-finder'
7
+ import {
8
+ clearSourceFinderCache,
9
+ findCollectionSource,
10
+ findImageSourceLocation,
11
+ findMarkdownSourceLocation,
12
+ findSourceLocation,
13
+ initializeSearchIndex,
14
+ parseMarkdownContent,
15
+ } from './source-finder'
8
16
  import type { CmsMarkerOptions, CollectionEntry } from './types'
9
17
 
10
18
  // Concurrency limit for parallel processing
@@ -110,22 +118,23 @@ async function processFile(
110
118
  }
111
119
  }
112
120
 
113
- for (const entry of Object.values(result.entries)) {
121
+ // Process entries in parallel for better performance
122
+ const entryLookups = Object.values(result.entries).map(async (entry) => {
114
123
  // Skip entries that already have source info from component detection
115
124
  if (entry.sourcePath && !entry.sourcePath.endsWith('.html')) {
116
- continue
125
+ return
117
126
  }
118
127
 
119
128
  // Handle image entries specially - search by image src
120
- if (entry.sourceType === 'image' && entry.imageSrc) {
121
- const imageSource = await findImageSourceLocation(entry.imageSrc)
129
+ if (entry.sourceType === 'image' && entry.imageMetadata?.src) {
130
+ const imageSource = await findImageSourceLocation(entry.imageMetadata.src)
122
131
  if (imageSource) {
123
132
  entry.sourcePath = imageSource.file
124
133
  entry.sourceLine = imageSource.line
125
134
  entry.sourceSnippet = imageSource.snippet
126
135
  entry.sourceType = 'image'
127
136
  }
128
- continue
137
+ return
129
138
  }
130
139
 
131
140
  // Try to find source in collection markdown frontmatter first
@@ -139,7 +148,7 @@ async function processFile(
139
148
  entry.variableName = mdSource.variableName
140
149
  entry.collectionName = mdSource.collectionName
141
150
  entry.collectionSlug = mdSource.collectionSlug
142
- continue
151
+ return
143
152
  }
144
153
  }
145
154
 
@@ -152,7 +161,9 @@ async function processFile(
152
161
  entry.sourceType = sourceLocation.type
153
162
  entry.variableName = sourceLocation.variableName
154
163
  }
155
- }
164
+ })
165
+
166
+ await Promise.all(entryLookups)
156
167
 
157
168
  // Add to manifest writer (handles per-page manifest writes)
158
169
  manifestWriter.addPage(pagePath, result.entries, result.components, collectionEntry)
@@ -163,8 +174,15 @@ async function processFile(
163
174
  return Object.keys(result.entries).length
164
175
  }
165
176
 
177
+ /** Result of batch processing with error aggregation */
178
+ interface BatchProcessingResult {
179
+ totalEntries: number
180
+ errors: Array<{ file: string; error: Error }>
181
+ }
182
+
166
183
  /**
167
- * Process HTML files in parallel with concurrency limit
184
+ * Process HTML files in parallel with concurrency limit and error aggregation.
185
+ * Unlike Promise.all, this continues processing even if some files fail.
168
186
  */
169
187
  async function processFilesInBatches(
170
188
  files: string[],
@@ -172,23 +190,37 @@ async function processFilesInBatches(
172
190
  config: Required<CmsMarkerOptions>,
173
191
  manifestWriter: ManifestWriter,
174
192
  idCounter: { value: number },
175
- ): Promise<number> {
193
+ ): Promise<BatchProcessingResult> {
176
194
  let totalEntries = 0
195
+ const errors: Array<{ file: string; error: Error }> = []
177
196
 
178
197
  // Process files in batches of MAX_CONCURRENT
179
198
  for (let i = 0; i < files.length; i += MAX_CONCURRENT) {
180
199
  const batch = files.slice(i, i + MAX_CONCURRENT)
181
- const results = await Promise.all(
182
- batch.map(file => processFile(file, outDir, config, manifestWriter, idCounter)),
200
+ const results = await Promise.allSettled(
201
+ batch.map(file =>
202
+ processFile(file, outDir, config, manifestWriter, idCounter)
203
+ .then(count => ({ file, count }))
204
+ .catch(err => Promise.reject({ file, error: err }))
205
+ ),
183
206
  )
184
- totalEntries += results.reduce((sum, count) => sum + count, 0)
207
+
208
+ for (const result of results) {
209
+ if (result.status === 'fulfilled') {
210
+ totalEntries += result.value.count
211
+ } else {
212
+ const { file, error } = result.reason as { file: string; error: Error }
213
+ errors.push({ file, error })
214
+ }
215
+ }
185
216
  }
186
217
 
187
- return totalEntries
218
+ return { totalEntries, errors }
188
219
  }
189
220
 
190
221
  /**
191
- * Process build output - processes all HTML files in parallel
222
+ * Process build output - processes all HTML files in parallel.
223
+ * Uses error aggregation to continue processing even if some files fail.
192
224
  */
193
225
  export async function processBuildOutput(
194
226
  dir: URL,
@@ -200,6 +232,9 @@ export async function processBuildOutput(
200
232
  const outDir = fileURLToPath(dir)
201
233
  manifestWriter.setOutDir(outDir)
202
234
 
235
+ // Clear caches from previous builds and initialize search index
236
+ clearSourceFinderCache()
237
+
203
238
  const htmlFiles = await findHtmlFiles(outDir)
204
239
 
205
240
  if (htmlFiles.length === 0) {
@@ -209,17 +244,36 @@ export async function processBuildOutput(
209
244
 
210
245
  const startTime = Date.now()
211
246
 
212
- // Process all files in parallel batches
213
- await processFilesInBatches(htmlFiles, outDir, config, manifestWriter, idCounter)
247
+ // Pre-build search index for fast source lookups (single pass through all source files)
248
+ await initializeSearchIndex()
249
+
250
+ // Process all files in parallel batches with error aggregation
251
+ const { totalEntries, errors } = await processFilesInBatches(htmlFiles, outDir, config, manifestWriter, idCounter)
252
+
253
+ // Report any errors that occurred during processing
254
+ if (errors.length > 0) {
255
+ const errorLog = logger?.error?.bind(logger) ?? console.error.bind(console)
256
+ errorLog(`[astro-cms-marker] ${errors.length} file(s) failed to process:`)
257
+ for (const { file, error } of errors) {
258
+ const relPath = path.relative(outDir, file)
259
+ errorLog(` - ${relPath}: ${error.message}`)
260
+ }
261
+ }
214
262
 
215
263
  // Finalize manifest (writes global manifest and waits for all per-page writes)
216
264
  const stats = await manifestWriter.finalize()
217
265
 
218
266
  const duration = Date.now() - startTime
219
- const msg = `Processed ${stats.totalPages} pages with ${stats.totalEntries} entries and ${stats.totalComponents} components in ${duration}ms`
267
+ const successCount = htmlFiles.length - errors.length
268
+ const msg =
269
+ `Processed ${successCount}/${htmlFiles.length} pages with ${stats.totalEntries} entries and ${stats.totalComponents} components in ${duration}ms`
220
270
 
221
271
  if (logger) {
222
- logger.info(msg)
272
+ if (errors.length > 0) {
273
+ logger.warn(msg)
274
+ } else {
275
+ logger.info(msg)
276
+ }
223
277
  } else {
224
278
  console.log(`[astro-cms-marker] ${msg}`)
225
279
  }
@@ -1,5 +1,7 @@
1
1
  import fs from 'node:fs/promises'
2
2
  import path from 'node:path'
3
+ import { getProjectRoot } from './config'
4
+ import { getErrorCollector } from './error-collector'
3
5
  import type { ComponentDefinition, ComponentProp } from './types'
4
6
 
5
7
  /**
package/src/config.ts ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Global configuration for cms-marker.
3
+ * This allows overriding the project root for testing.
4
+ */
5
+
6
+ let projectRootOverride: string | null = null
7
+
8
+ /**
9
+ * Get the current project root directory.
10
+ * Returns the override if set, otherwise process.cwd().
11
+ */
12
+ export function getProjectRoot(): string {
13
+ return projectRootOverride ?? process.cwd()
14
+ }
15
+
16
+ /**
17
+ * Set the project root directory override.
18
+ * Call this to use a specific directory instead of process.cwd().
19
+ */
20
+ export function setProjectRoot(root: string): void {
21
+ projectRootOverride = root
22
+ }
23
+
24
+ /**
25
+ * Reset the project root to use process.cwd() again.
26
+ */
27
+ export function resetProjectRoot(): void {
28
+ projectRootOverride = null
29
+ }
@@ -1,9 +1,17 @@
1
- import type { ViteDevServer } from 'vite'
1
+ import type { IncomingMessage, ServerResponse } from 'node:http'
2
2
  import { processHtml } from './html-processor'
3
3
  import type { ManifestWriter } from './manifest-writer'
4
4
  import { findCollectionSource, findImageSourceLocation, parseMarkdownContent } from './source-finder'
5
5
  import type { CmsMarkerOptions, CollectionEntry, ComponentDefinition } from './types'
6
6
 
7
+ /** Minimal ViteDevServer interface to avoid version conflicts between Astro's bundled Vite and root Vite */
8
+ interface ViteDevServerLike {
9
+ middlewares: {
10
+ use: (middleware: (req: IncomingMessage, res: ServerResponse, next: () => void) => void) => void
11
+ }
12
+ transformIndexHtml: (url: string, html: string) => Promise<string>
13
+ }
14
+
7
15
  /**
8
16
  * Get the normalized page path from a URL
9
17
  * For example: /about/ -> /about
@@ -21,7 +29,7 @@ function normalizePagePath(url: string): string {
21
29
  }
22
30
 
23
31
  export function createDevMiddleware(
24
- server: ViteDevServer,
32
+ server: ViteDevServerLike,
25
33
  config: Required<CmsMarkerOptions>,
26
34
  manifestWriter: ManifestWriter,
27
35
  componentDefinitions: Record<string, ComponentDefinition>,
@@ -217,8 +225,8 @@ async function processHtmlForDev(
217
225
  // However, images may not have source info if their ancestors don't have it
218
226
  // In that case, fall back to searching for the image src
219
227
  for (const entry of Object.values(result.entries)) {
220
- if (entry.sourceType === 'image' && entry.imageSrc && !entry.sourcePath) {
221
- const imageSource = await findImageSourceLocation(entry.imageSrc)
228
+ if (entry.sourceType === 'image' && entry.imageMetadata?.src && !entry.sourcePath) {
229
+ const imageSource = await findImageSourceLocation(entry.imageMetadata.src)
222
230
  if (imageSource) {
223
231
  entry.sourcePath = imageSource.file
224
232
  entry.sourceLine = imageSource.line
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Collects errors during processing for aggregated reporting.
3
+ * This allows the build to continue while tracking what failed.
4
+ */
5
+ export class ErrorCollector {
6
+ private errors: Array<{ context: string; error: Error }> = []
7
+ private warnings: Array<{ context: string; message: string }> = []
8
+
9
+ /**
10
+ * Record an error with context about where it occurred.
11
+ */
12
+ addError(context: string, error: Error): void {
13
+ this.errors.push({ context, error })
14
+ }
15
+
16
+ /**
17
+ * Record a warning (non-fatal issue).
18
+ */
19
+ addWarning(context: string, message: string): void {
20
+ this.warnings.push({ context, message })
21
+ }
22
+
23
+ /**
24
+ * Check if any errors were recorded.
25
+ */
26
+ hasErrors(): boolean {
27
+ return this.errors.length > 0
28
+ }
29
+
30
+ /**
31
+ * Check if any warnings were recorded.
32
+ */
33
+ hasWarnings(): boolean {
34
+ return this.warnings.length > 0
35
+ }
36
+
37
+ /**
38
+ * Get all recorded errors.
39
+ */
40
+ getErrors(): ReadonlyArray<{ context: string; error: Error }> {
41
+ return this.errors
42
+ }
43
+
44
+ /**
45
+ * Get all recorded warnings.
46
+ */
47
+ getWarnings(): ReadonlyArray<{ context: string; message: string }> {
48
+ return this.warnings
49
+ }
50
+
51
+ /**
52
+ * Get a summary of all errors and warnings.
53
+ */
54
+ getSummary(): string {
55
+ const lines: string[] = []
56
+
57
+ if (this.errors.length > 0) {
58
+ lines.push(`${this.errors.length} error(s):`)
59
+ for (const { context, error } of this.errors) {
60
+ lines.push(` - ${context}: ${error.message}`)
61
+ }
62
+ }
63
+
64
+ if (this.warnings.length > 0) {
65
+ lines.push(`${this.warnings.length} warning(s):`)
66
+ for (const { context, message } of this.warnings) {
67
+ lines.push(` - ${context}: ${message}`)
68
+ }
69
+ }
70
+
71
+ return lines.join('\n')
72
+ }
73
+
74
+ /**
75
+ * Clear all recorded errors and warnings.
76
+ */
77
+ clear(): void {
78
+ this.errors = []
79
+ this.warnings = []
80
+ }
81
+ }
82
+
83
+ /** Singleton error collector for the build process */
84
+ let globalErrorCollector: ErrorCollector | null = null
85
+
86
+ /**
87
+ * Get the global error collector instance.
88
+ * Creates one if it doesn't exist.
89
+ */
90
+ export function getErrorCollector(): ErrorCollector {
91
+ if (!globalErrorCollector) {
92
+ globalErrorCollector = new ErrorCollector()
93
+ }
94
+ return globalErrorCollector
95
+ }
96
+
97
+ /**
98
+ * Reset the global error collector (call at start of each build).
99
+ */
100
+ export function resetErrorCollector(): void {
101
+ if (globalErrorCollector) {
102
+ globalErrorCollector.clear()
103
+ } else {
104
+ globalErrorCollector = new ErrorCollector()
105
+ }
106
+ }