@collie-lang/vite 1.5.23 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +34 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +34 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -106,13 +106,28 @@ function formatLocation(location, root) {
|
|
|
106
106
|
}
|
|
107
107
|
return file;
|
|
108
108
|
}
|
|
109
|
+
function compareLocations(a, b) {
|
|
110
|
+
const pathOrder = (0, import_vite.normalizePath)(a.file).localeCompare((0, import_vite.normalizePath)(b.file));
|
|
111
|
+
if (pathOrder !== 0) {
|
|
112
|
+
return pathOrder;
|
|
113
|
+
}
|
|
114
|
+
const lineOrder = (a.line ?? 0) - (b.line ?? 0);
|
|
115
|
+
if (lineOrder !== 0) {
|
|
116
|
+
return lineOrder;
|
|
117
|
+
}
|
|
118
|
+
return (a.col ?? 0) - (b.col ?? 0);
|
|
119
|
+
}
|
|
109
120
|
function formatDuplicateIdError(duplicates, root) {
|
|
110
121
|
const lines = ["[collie] Duplicate template ids detected:"];
|
|
111
122
|
const entries = Array.from(duplicates.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
112
123
|
for (const [id, locations] of entries) {
|
|
113
|
-
const
|
|
114
|
-
lines.push(`- ${id}
|
|
124
|
+
const sorted = [...locations].sort(compareLocations);
|
|
125
|
+
lines.push(`- ${id}:`);
|
|
126
|
+
for (const location of sorted) {
|
|
127
|
+
lines.push(` ${formatLocation(location, root)}`);
|
|
128
|
+
}
|
|
115
129
|
}
|
|
130
|
+
lines.push("Recommended action: rename one #id to be unique.");
|
|
116
131
|
return lines.join("\n");
|
|
117
132
|
}
|
|
118
133
|
function areSetsEqual(a, b) {
|
|
@@ -217,12 +232,12 @@ function colliePlugin(options = {}) {
|
|
|
217
232
|
templateIdToVirtualId.clear();
|
|
218
233
|
const root = resolvedConfig.root ?? process.cwd();
|
|
219
234
|
const ignore = buildIgnoreGlobs(resolvedConfig);
|
|
220
|
-
const filePaths = await (0, import_fast_glob.default)(COLLIE_GLOB, {
|
|
235
|
+
const filePaths = (await (0, import_fast_glob.default)(COLLIE_GLOB, {
|
|
221
236
|
cwd: root,
|
|
222
237
|
absolute: true,
|
|
223
238
|
onlyFiles: true,
|
|
224
239
|
ignore
|
|
225
|
-
});
|
|
240
|
+
})).sort((a, b) => (0, import_vite.normalizePath)(a).localeCompare((0, import_vite.normalizePath)(b)));
|
|
226
241
|
const diagnostics = [];
|
|
227
242
|
const locationsById = /* @__PURE__ */ new Map();
|
|
228
243
|
for (const filePath of filePaths) {
|
|
@@ -310,17 +325,27 @@ ${formatted}`));
|
|
|
310
325
|
return [];
|
|
311
326
|
}
|
|
312
327
|
const duplicates = /* @__PURE__ */ new Map();
|
|
328
|
+
const seenInFile = /* @__PURE__ */ new Map();
|
|
313
329
|
for (const template of document.templates) {
|
|
330
|
+
const location = {
|
|
331
|
+
file: filePath,
|
|
332
|
+
line: template.span?.start.line,
|
|
333
|
+
col: template.span?.start.col
|
|
334
|
+
};
|
|
314
335
|
const existing = templatesById.get(template.id);
|
|
315
336
|
if (existing && existing.filePath !== filePath) {
|
|
316
337
|
const locations = duplicates.get(template.id) ?? [existing.location];
|
|
317
|
-
locations.push(
|
|
318
|
-
file: filePath,
|
|
319
|
-
line: template.span?.start.line,
|
|
320
|
-
col: template.span?.start.col
|
|
321
|
-
});
|
|
338
|
+
locations.push(location);
|
|
322
339
|
duplicates.set(template.id, locations);
|
|
323
340
|
}
|
|
341
|
+
const previousInFile = seenInFile.get(template.id);
|
|
342
|
+
if (previousInFile) {
|
|
343
|
+
const locations = duplicates.get(template.id) ?? [previousInFile];
|
|
344
|
+
locations.push(location);
|
|
345
|
+
duplicates.set(template.id, locations);
|
|
346
|
+
} else {
|
|
347
|
+
seenInFile.set(template.id, location);
|
|
348
|
+
}
|
|
324
349
|
}
|
|
325
350
|
if (duplicates.size) {
|
|
326
351
|
reportHmrError(ctx, new Error(formatDuplicateIdError(duplicates, root)));
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport type { HmrContext, ModuleNode, Plugin, ResolvedConfig } from \"vite\";\nimport { normalizePath, transformWithEsbuild } from \"vite\";\nimport type { Diagnostic, TemplateUnit } from \"@collie-lang/compiler\";\nimport { compileTemplate, parseCollie } from \"@collie-lang/compiler\";\n\ntype JsxRuntime = \"automatic\" | \"classic\";\n\nexport interface ColliePluginOptions {\n jsxRuntime?: JsxRuntime;\n}\n\ninterface TemplateLocation {\n file: string;\n line?: number;\n col?: number;\n}\n\ninterface TemplateRecord {\n id: string;\n encodedId: string;\n filePath: string;\n template: TemplateUnit;\n location: TemplateLocation;\n}\n\nconst VIRTUAL_REGISTRY_ID = \"virtual:collie/registry\";\nconst VIRTUAL_REGISTRY_RESOLVED = \"\\0collie:registry\";\nconst VIRTUAL_IDS_ID = \"virtual:collie/ids\";\nconst VIRTUAL_IDS_RESOLVED = \"\\0collie:ids\";\nconst VIRTUAL_TEMPLATE_PREFIX = \"virtual:collie/template/\";\nconst VIRTUAL_TEMPLATE_RESOLVED_PREFIX = \"\\0collie:template:\";\nconst COLLIE_GLOB = \"**/*.collie\";\nconst DEFAULT_IGNORE_GLOBS = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/build/**\", \"**/.vite/**\"];\n\nfunction stripQuery(id: string): string {\n const q = id.indexOf(\"?\");\n return q === -1 ? id : id.slice(0, q);\n}\n\nfunction isCollieFile(id: string): boolean {\n return stripQuery(id).endsWith(\".collie\");\n}\n\nfunction toDisplayPath(filePath: string, root?: string): string {\n const normalized = normalizePath(filePath);\n if (!root || !path.isAbsolute(filePath)) {\n return normalized;\n }\n const relative = path.relative(root, filePath);\n if (!relative || relative.startsWith(\"..\")) {\n return normalized;\n }\n return normalizePath(relative);\n}\n\nfunction formatDiagnostic(id: string, diagnostic: Diagnostic, root?: string): string {\n const file = diagnostic.filePath ?? diagnostic.file ?? stripQuery(id);\n const displayFile = toDisplayPath(file, root);\n const range = diagnostic.range ?? diagnostic.span;\n const where = range ? `${range.start.line}:${range.start.col}` : \"\";\n const location = where ? `${displayFile}:${where}` : displayFile;\n const code = diagnostic.code ? diagnostic.code : \"COLLIE\";\n return `${location} [${code}] ${diagnostic.message}`;\n}\n\nfunction isVirtualCollieId(id: string): boolean {\n return (\n id === VIRTUAL_REGISTRY_ID ||\n id === VIRTUAL_REGISTRY_RESOLVED ||\n id === VIRTUAL_IDS_ID ||\n id === VIRTUAL_IDS_RESOLVED ||\n id.startsWith(VIRTUAL_TEMPLATE_PREFIX) ||\n id.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)\n );\n}\n\nfunction buildDirectImportError(importedId: string, importer?: string, root?: string): Error {\n const importLine = stripQuery(importedId);\n const importerLabel = importer ? toDisplayPath(importer, root) : \"<unknown>\";\n const lines = [\n \"Direct .collie imports are not supported.\",\n `Importer: ${importerLabel}`,\n `Import: ${importLine}`,\n \"Use the registry runtime instead:\",\n \"import { Collie } from '@collie-lang/react'\",\n '<Collie id=\"Your.TemplateId\" />',\n \"Templates are discovered automatically by @collie-lang/vite.\"\n ];\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction encodeTemplateId(id: string): string {\n return Buffer.from(id, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction decodeTemplateId(encoded: string): string {\n const normalized = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padLength = normalized.length % 4;\n const padded = padLength === 0 ? normalized : normalized + \"=\".repeat(4 - padLength);\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nfunction formatLocation(location: TemplateLocation, root?: string): string {\n const file = toDisplayPath(location.file, root);\n if (typeof location.line === \"number\" && typeof location.col === \"number\") {\n return `${file}:${location.line}:${location.col}`;\n }\n return file;\n}\n\nfunction formatDuplicateIdError(duplicates: Map<string, TemplateLocation[]>, root?: string): string {\n const lines = [\"[collie] Duplicate template ids detected:\"];\n const entries = Array.from(duplicates.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n for (const [id, locations] of entries) {\n const formatted = locations.map((location) => formatLocation(location, root)).join(\", \");\n lines.push(`- ${id}: ${formatted}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction areSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) {\n return false;\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildIgnoreGlobs(config?: ResolvedConfig): string[] {\n const ignore = new Set(DEFAULT_IGNORE_GLOBS);\n if (!config) {\n return Array.from(ignore);\n }\n\n const addRelativeDir = (dir?: string): void => {\n if (!dir) {\n return;\n }\n const absolute = path.isAbsolute(dir) ? dir : path.join(config.root, dir);\n const relative = normalizePath(path.relative(config.root, absolute));\n if (!relative || relative.startsWith(\"..\")) {\n return;\n }\n ignore.add(`${relative}/**`);\n };\n\n addRelativeDir(config.build?.outDir);\n addRelativeDir(config.cacheDir);\n addRelativeDir(config.publicDir);\n\n return Array.from(ignore);\n}\n\nexport default function colliePlugin(options: ColliePluginOptions = {}): Plugin {\n let resolvedRuntime: JsxRuntime = options.jsxRuntime ?? \"automatic\";\n let resolvedConfig: ResolvedConfig | undefined;\n let needsScan = true;\n const templatesById = new Map<string, TemplateRecord>();\n const templatesByEncodedId = new Map<string, TemplateRecord>();\n const fileToTemplateIds = new Map<string, Set<string>>();\n const templateIdToVirtualId = new Map<string, string>();\n\n const resetTemplates = (): void => {\n needsScan = true;\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n };\n\n const trackTemplateRecord = (record: TemplateRecord): void => {\n templatesById.set(record.id, record);\n templatesByEncodedId.set(record.encodedId, record);\n templateIdToVirtualId.set(record.id, `${VIRTUAL_TEMPLATE_RESOLVED_PREFIX}${record.encodedId}`);\n const ids = fileToTemplateIds.get(record.filePath) ?? new Set<string>();\n ids.add(record.id);\n fileToTemplateIds.set(record.filePath, ids);\n };\n\n const removeFileTemplates = (filePath: string): Set<string> => {\n const ids = fileToTemplateIds.get(filePath) ?? new Set<string>();\n for (const id of ids) {\n const record = templatesById.get(id);\n if (record && record.filePath === filePath) {\n templatesById.delete(id);\n templatesByEncodedId.delete(record.encodedId);\n templateIdToVirtualId.delete(id);\n }\n }\n fileToTemplateIds.delete(filePath);\n return ids;\n };\n\n const collectModuleIds = (ids: Iterable<string>): Set<string> => {\n const moduleIds = new Set<string>();\n for (const id of ids) {\n const moduleId = templateIdToVirtualId.get(id);\n if (moduleId) {\n moduleIds.add(moduleId);\n }\n }\n return moduleIds;\n };\n\n const reportHmrError = (ctx: HmrContext, error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n ctx.server.config.logger.error(err.message);\n ctx.server.ws.send({\n type: \"error\",\n err: {\n message: err.message,\n stack: err.stack ?? \"\"\n }\n });\n };\n\n const ensureTemplates = async (watcher?: { addWatchFile: (id: string) => void }): Promise<void> => {\n if (!needsScan) {\n return;\n }\n\n if (!resolvedConfig) {\n throw new Error(\"[collie] Vite config was not resolved before scanning templates.\");\n }\n\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n\n const root = resolvedConfig.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig);\n const filePaths = await fg(COLLIE_GLOB, {\n cwd: root,\n absolute: true,\n onlyFiles: true,\n ignore\n });\n\n const diagnostics: Diagnostic[] = [];\n const locationsById = new Map<string, TemplateLocation[]>();\n\n for (const filePath of filePaths) {\n if (watcher) {\n watcher.addWatchFile(filePath);\n }\n let source: string;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n const document = parseCollie(source, { filename: filePath });\n diagnostics.push(...document.diagnostics);\n\n for (const template of document.templates) {\n const location: TemplateLocation = {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n };\n const encodedId = encodeTemplateId(template.id);\n const record: TemplateRecord = {\n id: template.id,\n encodedId,\n filePath,\n template,\n location\n };\n trackTemplateRecord(record);\n const locations = locationsById.get(template.id) ?? [];\n locations.push(location);\n locationsById.set(template.id, locations);\n }\n }\n\n const errors = diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => {\n const fileForDiag = diag.filePath ?? diag.file ?? root;\n return formatDiagnostic(fileForDiag, diag, root);\n })\n .join(\"\\n\");\n throw new Error(`[collie]\\n${formatted}`);\n }\n\n const duplicates = new Map(\n Array.from(locationsById.entries()).filter(([, locations]) => locations.length > 1)\n );\n if (duplicates.size) {\n throw new Error(formatDuplicateIdError(duplicates, root));\n }\n\n needsScan = false;\n };\n\n const updateFileTemplates = async (ctx: HmrContext): Promise<ModuleNode[]> => {\n if (needsScan) {\n try {\n await ensureTemplates();\n } catch (error) {\n reportHmrError(ctx, error);\n return [];\n }\n }\n\n const filePath = ctx.file;\n const root = resolvedConfig?.root ?? process.cwd();\n const previousIds = new Set(fileToTemplateIds.get(filePath) ?? new Set<string>());\n const previousModuleIds = collectModuleIds(previousIds);\n\n let source: string | null = null;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n removeFileTemplates(filePath);\n return invalidateModules(ctx, previousModuleIds);\n }\n reportHmrError(ctx, error);\n return [];\n }\n\n const document = parseCollie(source, { filename: filePath });\n const errors = document.diagnostics.filter((diag: Diagnostic) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors.map((diag: Diagnostic) => formatDiagnostic(filePath, diag, root)).join(\"\\n\");\n reportHmrError(ctx, new Error(`[collie]\\n${formatted}`));\n return [];\n }\n\n const duplicates = new Map<string, TemplateLocation[]>();\n for (const template of document.templates) {\n const existing = templatesById.get(template.id);\n if (existing && existing.filePath !== filePath) {\n const locations = duplicates.get(template.id) ?? [existing.location];\n locations.push({\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n });\n duplicates.set(template.id, locations);\n }\n }\n if (duplicates.size) {\n reportHmrError(ctx, new Error(formatDuplicateIdError(duplicates, root)));\n return [];\n }\n\n removeFileTemplates(filePath);\n for (const template of document.templates) {\n const record: TemplateRecord = {\n id: template.id,\n encodedId: encodeTemplateId(template.id),\n filePath,\n template,\n location: {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n }\n };\n trackTemplateRecord(record);\n }\n\n const nextIds = fileToTemplateIds.get(filePath) ?? new Set<string>();\n const nextModuleIds = collectModuleIds(nextIds);\n const moduleIds = new Set<string>([...previousModuleIds, ...nextModuleIds]);\n const idsChanged = !areSetsEqual(previousIds, nextIds);\n return invalidateModules(ctx, moduleIds, {\n includeRegistry: idsChanged,\n includeIds: idsChanged\n });\n };\n\n const invalidateModules = (\n ctx: HmrContext,\n moduleIds: Iterable<string>,\n options?: { includeRegistry?: boolean; includeIds?: boolean }\n ): ModuleNode[] => {\n const modules: ModuleNode[] = [];\n const includeRegistry = options?.includeRegistry ?? true;\n const includeIds = options?.includeIds ?? true;\n\n if (includeRegistry) {\n const registryModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_REGISTRY_RESOLVED);\n if (registryModule) {\n ctx.server.moduleGraph.invalidateModule(registryModule);\n modules.push(registryModule);\n }\n }\n\n if (includeIds) {\n const idsModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_IDS_RESOLVED);\n if (idsModule) {\n ctx.server.moduleGraph.invalidateModule(idsModule);\n modules.push(idsModule);\n }\n }\n for (const moduleId of moduleIds) {\n const mod = ctx.server.moduleGraph.getModuleById(moduleId);\n if (mod) {\n ctx.server.moduleGraph.invalidateModule(mod);\n modules.push(mod);\n }\n }\n return modules;\n };\n\n return {\n name: \"collie\",\n enforce: \"pre\",\n\n config(userConfig) {\n const prevExclude = userConfig.optimizeDeps?.exclude ?? [];\n const exclude = Array.from(new Set([...prevExclude, \"@collie-lang/react\"]));\n\n const prevNoExternal = userConfig.ssr?.noExternal;\n\n let nextNoExternal: any;\n if (prevNoExternal === true) {\n // User already wants everything bundled for SSR; nothing to do.\n nextNoExternal = true;\n } else if (Array.isArray(prevNoExternal)) {\n nextNoExternal = Array.from(new Set([...prevNoExternal, \"@collie-lang/react\"]));\n } else if (prevNoExternal == null) {\n nextNoExternal = [\"@collie-lang/react\"];\n } else {\n // Vite allows string/RegExp/etc. Coerce to array and add ours.\n nextNoExternal = Array.from(new Set([prevNoExternal, \"@collie-lang/react\"]));\n }\n\n return {\n optimizeDeps: {\n exclude\n },\n ...(nextNoExternal\n ? {\n ssr: {\n noExternal: nextNoExternal\n }\n }\n : {})\n };\n },\n\n configResolved(config) {\n resolvedRuntime = options.jsxRuntime ?? \"automatic\";\n resolvedConfig = config;\n resetTemplates();\n },\n\n configureServer(server) {\n const root = resolvedConfig?.root ?? server.config.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig ?? server.config);\n const watchPattern = normalizePath(path.join(root, COLLIE_GLOB));\n let watcherReady = false;\n\n const isIgnoredPath = (relative: string): boolean => {\n return ignore.some((pattern) => {\n if (pattern.startsWith(\"**/\") && pattern.endsWith(\"/**\")) {\n const segment = pattern.slice(3, -3);\n return (\n relative === segment ||\n relative.startsWith(`${segment}/`) ||\n relative.includes(`/${segment}/`)\n );\n }\n if (pattern.endsWith(\"/**\")) {\n const prefix = pattern.slice(0, -3);\n return relative === prefix || relative.startsWith(`${prefix}/`);\n }\n return false;\n });\n };\n\n const isRelevant = (filePath: string): boolean => {\n if (!isCollieFile(filePath)) {\n return false;\n }\n const relative = normalizePath(path.relative(root, filePath));\n if (!relative || relative.startsWith(\"..\")) {\n return false;\n }\n return !isIgnoredPath(relative);\n };\n\n server.watcher.add(watchPattern);\n server.watcher.on(\"ready\", () => {\n watcherReady = true;\n });\n server.watcher.on(\"add\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (!fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n server.watcher.on(\"unlink\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n },\n\n resolveId(id, importer) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_ID) {\n return VIRTUAL_REGISTRY_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_IDS_ID) {\n return VIRTUAL_IDS_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_PREFIX)) {\n return VIRTUAL_TEMPLATE_RESOLVED_PREFIX + cleanId.slice(VIRTUAL_TEMPLATE_PREFIX.length);\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n return cleanId;\n }\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isVirtualCollieId(cleanId) && cleanId.endsWith(\".collie\") && !isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n return null;\n },\n\n async load(id) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const entries = Array.from(templatesById.values()).sort((a, b) =>\n a.id.localeCompare(b.id)\n );\n\n const lines = entries.map(\n (record) =>\n ` ${JSON.stringify(record.id)}: () => import(${JSON.stringify(\n `${VIRTUAL_TEMPLATE_PREFIX}${record.encodedId}`\n )}),`\n );\n\n return {\n code: [\n \"/** @type {Record<string, () => Promise<{ render: (__inputs: any) => any }>>} */\",\n \"const __collieRegistry = import.meta.hot?.data?.registry ?? {};\",\n `const __nextRegistry = {\\n${lines.join(\"\\n\")}\\n};`,\n \"for (const key of Object.keys(__collieRegistry)) {\",\n \" if (!(key in __nextRegistry)) {\",\n \" delete __collieRegistry[key];\",\n \" }\",\n \"}\",\n \"for (const [key, value] of Object.entries(__nextRegistry)) {\",\n \" __collieRegistry[key] = value;\",\n \"}\",\n \"export const registry = __collieRegistry;\",\n \"if (import.meta.hot) {\",\n \" import.meta.hot.accept();\",\n \" import.meta.hot.dispose((data) => {\",\n \" data.registry = __collieRegistry;\",\n \" });\",\n \"}\"\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const ids = Array.from(templatesById.keys()).sort((a, b) => a.localeCompare(b));\n return {\n code: [\n \"/** @type {readonly string[]} */\",\n `export const ids = ${JSON.stringify(ids)};`\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n const encoded = cleanId.slice(VIRTUAL_TEMPLATE_RESOLVED_PREFIX.length);\n\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n return null; // <-- TS: stop control-flow here\n }\n\n const record = templatesByEncodedId.get(encoded);\n\n if (!record) {\n let decoded = encoded;\n try {\n decoded = decodeTemplateId(encoded);\n } catch {\n // Keep encoded value for the error message.\n }\n this.error(new Error(`[collie] Unknown template id \"${decoded}\".`));\n return null; // <-- ✅ THIS is what fixes \"'record' is possibly 'undefined'\"\n }\n\n const result = compileTemplate(record.template, {\n filename: record.filePath,\n jsxRuntime: resolvedRuntime,\n flavor: \"tsx\"\n });\n\n const errors = result.diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => formatDiagnostic(record.filePath, diag, resolvedConfig?.root))\n .join(\"\\n\");\n this.error(new Error(`[collie]\\n${formatted}`));\n return null; // <-- TS: stop control-flow here\n }\n\n const transformed = await transformWithEsbuild(result.code, record.filePath, {\n loader: \"tsx\",\n jsx: resolvedRuntime === \"classic\" ? \"transform\" : \"automatic\",\n jsxImportSource: \"react\"\n });\n\n return {\n code: transformed.code,\n map: transformed.map ?? null\n };\n }\n\n if (isCollieFile(cleanId)) {\n const info = this.getModuleInfo(cleanId);\n const importer = info?.importers?.[0];\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n\n return null;\n }\n\n return null;\n },\n\n handleHotUpdate(ctx: HmrContext) {\n if (!isCollieFile(ctx.file)) {\n return;\n }\n\n return updateFileTemplates(ctx);\n }\n };\n}\n"],"mappings":"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","names":["path","fg","fs","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport type { HmrContext, ModuleNode, Plugin, ResolvedConfig } from \"vite\";\nimport { normalizePath, transformWithEsbuild } from \"vite\";\nimport type { Diagnostic, TemplateUnit } from \"@collie-lang/compiler\";\nimport { compileTemplate, parseCollie } from \"@collie-lang/compiler\";\n\ntype JsxRuntime = \"automatic\" | \"classic\";\n\nexport interface ColliePluginOptions {\n jsxRuntime?: JsxRuntime;\n}\n\ninterface TemplateLocation {\n file: string;\n line?: number;\n col?: number;\n}\n\ninterface TemplateRecord {\n id: string;\n encodedId: string;\n filePath: string;\n template: TemplateUnit;\n location: TemplateLocation;\n}\n\nconst VIRTUAL_REGISTRY_ID = \"virtual:collie/registry\";\nconst VIRTUAL_REGISTRY_RESOLVED = \"\\0collie:registry\";\nconst VIRTUAL_IDS_ID = \"virtual:collie/ids\";\nconst VIRTUAL_IDS_RESOLVED = \"\\0collie:ids\";\nconst VIRTUAL_TEMPLATE_PREFIX = \"virtual:collie/template/\";\nconst VIRTUAL_TEMPLATE_RESOLVED_PREFIX = \"\\0collie:template:\";\nconst COLLIE_GLOB = \"**/*.collie\";\nconst DEFAULT_IGNORE_GLOBS = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/build/**\", \"**/.vite/**\"];\n\nfunction stripQuery(id: string): string {\n const q = id.indexOf(\"?\");\n return q === -1 ? id : id.slice(0, q);\n}\n\nfunction isCollieFile(id: string): boolean {\n return stripQuery(id).endsWith(\".collie\");\n}\n\nfunction toDisplayPath(filePath: string, root?: string): string {\n const normalized = normalizePath(filePath);\n if (!root || !path.isAbsolute(filePath)) {\n return normalized;\n }\n const relative = path.relative(root, filePath);\n if (!relative || relative.startsWith(\"..\")) {\n return normalized;\n }\n return normalizePath(relative);\n}\n\nfunction formatDiagnostic(id: string, diagnostic: Diagnostic, root?: string): string {\n const file = diagnostic.filePath ?? diagnostic.file ?? stripQuery(id);\n const displayFile = toDisplayPath(file, root);\n const range = diagnostic.range ?? diagnostic.span;\n const where = range ? `${range.start.line}:${range.start.col}` : \"\";\n const location = where ? `${displayFile}:${where}` : displayFile;\n const code = diagnostic.code ? diagnostic.code : \"COLLIE\";\n return `${location} [${code}] ${diagnostic.message}`;\n}\n\nfunction isVirtualCollieId(id: string): boolean {\n return (\n id === VIRTUAL_REGISTRY_ID ||\n id === VIRTUAL_REGISTRY_RESOLVED ||\n id === VIRTUAL_IDS_ID ||\n id === VIRTUAL_IDS_RESOLVED ||\n id.startsWith(VIRTUAL_TEMPLATE_PREFIX) ||\n id.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)\n );\n}\n\nfunction buildDirectImportError(importedId: string, importer?: string, root?: string): Error {\n const importLine = stripQuery(importedId);\n const importerLabel = importer ? toDisplayPath(importer, root) : \"<unknown>\";\n const lines = [\n \"Direct .collie imports are not supported.\",\n `Importer: ${importerLabel}`,\n `Import: ${importLine}`,\n \"Use the registry runtime instead:\",\n \"import { Collie } from '@collie-lang/react'\",\n '<Collie id=\"Your.TemplateId\" />',\n \"Templates are discovered automatically by @collie-lang/vite.\"\n ];\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction encodeTemplateId(id: string): string {\n return Buffer.from(id, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction decodeTemplateId(encoded: string): string {\n const normalized = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padLength = normalized.length % 4;\n const padded = padLength === 0 ? normalized : normalized + \"=\".repeat(4 - padLength);\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nfunction formatLocation(location: TemplateLocation, root?: string): string {\n const file = toDisplayPath(location.file, root);\n if (typeof location.line === \"number\" && typeof location.col === \"number\") {\n return `${file}:${location.line}:${location.col}`;\n }\n return file;\n}\n\nfunction compareLocations(a: TemplateLocation, b: TemplateLocation): number {\n const pathOrder = normalizePath(a.file).localeCompare(normalizePath(b.file));\n if (pathOrder !== 0) {\n return pathOrder;\n }\n const lineOrder = (a.line ?? 0) - (b.line ?? 0);\n if (lineOrder !== 0) {\n return lineOrder;\n }\n return (a.col ?? 0) - (b.col ?? 0);\n}\n\nfunction formatDuplicateIdError(duplicates: Map<string, TemplateLocation[]>, root?: string): string {\n const lines = [\"[collie] Duplicate template ids detected:\"];\n const entries = Array.from(duplicates.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n for (const [id, locations] of entries) {\n const sorted = [...locations].sort(compareLocations);\n lines.push(`- ${id}:`);\n for (const location of sorted) {\n lines.push(` ${formatLocation(location, root)}`);\n }\n }\n lines.push(\"Recommended action: rename one #id to be unique.\");\n return lines.join(\"\\n\");\n}\n\nfunction areSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) {\n return false;\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildIgnoreGlobs(config?: ResolvedConfig): string[] {\n const ignore = new Set(DEFAULT_IGNORE_GLOBS);\n if (!config) {\n return Array.from(ignore);\n }\n\n const addRelativeDir = (dir?: string): void => {\n if (!dir) {\n return;\n }\n const absolute = path.isAbsolute(dir) ? dir : path.join(config.root, dir);\n const relative = normalizePath(path.relative(config.root, absolute));\n if (!relative || relative.startsWith(\"..\")) {\n return;\n }\n ignore.add(`${relative}/**`);\n };\n\n addRelativeDir(config.build?.outDir);\n addRelativeDir(config.cacheDir);\n addRelativeDir(config.publicDir);\n\n return Array.from(ignore);\n}\n\nexport default function colliePlugin(options: ColliePluginOptions = {}): Plugin {\n let resolvedRuntime: JsxRuntime = options.jsxRuntime ?? \"automatic\";\n let resolvedConfig: ResolvedConfig | undefined;\n let needsScan = true;\n const templatesById = new Map<string, TemplateRecord>();\n const templatesByEncodedId = new Map<string, TemplateRecord>();\n const fileToTemplateIds = new Map<string, Set<string>>();\n const templateIdToVirtualId = new Map<string, string>();\n\n const resetTemplates = (): void => {\n needsScan = true;\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n };\n\n const trackTemplateRecord = (record: TemplateRecord): void => {\n templatesById.set(record.id, record);\n templatesByEncodedId.set(record.encodedId, record);\n templateIdToVirtualId.set(record.id, `${VIRTUAL_TEMPLATE_RESOLVED_PREFIX}${record.encodedId}`);\n const ids = fileToTemplateIds.get(record.filePath) ?? new Set<string>();\n ids.add(record.id);\n fileToTemplateIds.set(record.filePath, ids);\n };\n\n const removeFileTemplates = (filePath: string): Set<string> => {\n const ids = fileToTemplateIds.get(filePath) ?? new Set<string>();\n for (const id of ids) {\n const record = templatesById.get(id);\n if (record && record.filePath === filePath) {\n templatesById.delete(id);\n templatesByEncodedId.delete(record.encodedId);\n templateIdToVirtualId.delete(id);\n }\n }\n fileToTemplateIds.delete(filePath);\n return ids;\n };\n\n const collectModuleIds = (ids: Iterable<string>): Set<string> => {\n const moduleIds = new Set<string>();\n for (const id of ids) {\n const moduleId = templateIdToVirtualId.get(id);\n if (moduleId) {\n moduleIds.add(moduleId);\n }\n }\n return moduleIds;\n };\n\n const reportHmrError = (ctx: HmrContext, error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n ctx.server.config.logger.error(err.message);\n ctx.server.ws.send({\n type: \"error\",\n err: {\n message: err.message,\n stack: err.stack ?? \"\"\n }\n });\n };\n\n const ensureTemplates = async (watcher?: { addWatchFile: (id: string) => void }): Promise<void> => {\n if (!needsScan) {\n return;\n }\n\n if (!resolvedConfig) {\n throw new Error(\"[collie] Vite config was not resolved before scanning templates.\");\n }\n\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n\n const root = resolvedConfig.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig);\n const filePaths = (await fg(COLLIE_GLOB, {\n cwd: root,\n absolute: true,\n onlyFiles: true,\n ignore\n })).sort((a, b) => normalizePath(a).localeCompare(normalizePath(b)));\n\n const diagnostics: Diagnostic[] = [];\n const locationsById = new Map<string, TemplateLocation[]>();\n\n for (const filePath of filePaths) {\n if (watcher) {\n watcher.addWatchFile(filePath);\n }\n let source: string;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n const document = parseCollie(source, { filename: filePath });\n diagnostics.push(...document.diagnostics);\n\n for (const template of document.templates) {\n const location: TemplateLocation = {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n };\n const encodedId = encodeTemplateId(template.id);\n const record: TemplateRecord = {\n id: template.id,\n encodedId,\n filePath,\n template,\n location\n };\n trackTemplateRecord(record);\n const locations = locationsById.get(template.id) ?? [];\n locations.push(location);\n locationsById.set(template.id, locations);\n }\n }\n\n const errors = diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => {\n const fileForDiag = diag.filePath ?? diag.file ?? root;\n return formatDiagnostic(fileForDiag, diag, root);\n })\n .join(\"\\n\");\n throw new Error(`[collie]\\n${formatted}`);\n }\n\n const duplicates = new Map(\n Array.from(locationsById.entries()).filter(([, locations]) => locations.length > 1)\n );\n if (duplicates.size) {\n throw new Error(formatDuplicateIdError(duplicates, root));\n }\n\n needsScan = false;\n };\n\n const updateFileTemplates = async (ctx: HmrContext): Promise<ModuleNode[]> => {\n if (needsScan) {\n try {\n await ensureTemplates();\n } catch (error) {\n reportHmrError(ctx, error);\n return [];\n }\n }\n\n const filePath = ctx.file;\n const root = resolvedConfig?.root ?? process.cwd();\n const previousIds = new Set(fileToTemplateIds.get(filePath) ?? new Set<string>());\n const previousModuleIds = collectModuleIds(previousIds);\n\n let source: string | null = null;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n removeFileTemplates(filePath);\n return invalidateModules(ctx, previousModuleIds);\n }\n reportHmrError(ctx, error);\n return [];\n }\n\n const document = parseCollie(source, { filename: filePath });\n const errors = document.diagnostics.filter((diag: Diagnostic) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors.map((diag: Diagnostic) => formatDiagnostic(filePath, diag, root)).join(\"\\n\");\n reportHmrError(ctx, new Error(`[collie]\\n${formatted}`));\n return [];\n }\n\n const duplicates = new Map<string, TemplateLocation[]>();\n const seenInFile = new Map<string, TemplateLocation>();\n for (const template of document.templates) {\n const location: TemplateLocation = {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n };\n const existing = templatesById.get(template.id);\n if (existing && existing.filePath !== filePath) {\n const locations = duplicates.get(template.id) ?? [existing.location];\n locations.push(location);\n duplicates.set(template.id, locations);\n }\n const previousInFile = seenInFile.get(template.id);\n if (previousInFile) {\n const locations = duplicates.get(template.id) ?? [previousInFile];\n locations.push(location);\n duplicates.set(template.id, locations);\n } else {\n seenInFile.set(template.id, location);\n }\n }\n if (duplicates.size) {\n reportHmrError(ctx, new Error(formatDuplicateIdError(duplicates, root)));\n return [];\n }\n\n removeFileTemplates(filePath);\n for (const template of document.templates) {\n const record: TemplateRecord = {\n id: template.id,\n encodedId: encodeTemplateId(template.id),\n filePath,\n template,\n location: {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n }\n };\n trackTemplateRecord(record);\n }\n\n const nextIds = fileToTemplateIds.get(filePath) ?? new Set<string>();\n const nextModuleIds = collectModuleIds(nextIds);\n const moduleIds = new Set<string>([...previousModuleIds, ...nextModuleIds]);\n const idsChanged = !areSetsEqual(previousIds, nextIds);\n return invalidateModules(ctx, moduleIds, {\n includeRegistry: idsChanged,\n includeIds: idsChanged\n });\n };\n\n const invalidateModules = (\n ctx: HmrContext,\n moduleIds: Iterable<string>,\n options?: { includeRegistry?: boolean; includeIds?: boolean }\n ): ModuleNode[] => {\n const modules: ModuleNode[] = [];\n const includeRegistry = options?.includeRegistry ?? true;\n const includeIds = options?.includeIds ?? true;\n\n if (includeRegistry) {\n const registryModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_REGISTRY_RESOLVED);\n if (registryModule) {\n ctx.server.moduleGraph.invalidateModule(registryModule);\n modules.push(registryModule);\n }\n }\n\n if (includeIds) {\n const idsModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_IDS_RESOLVED);\n if (idsModule) {\n ctx.server.moduleGraph.invalidateModule(idsModule);\n modules.push(idsModule);\n }\n }\n for (const moduleId of moduleIds) {\n const mod = ctx.server.moduleGraph.getModuleById(moduleId);\n if (mod) {\n ctx.server.moduleGraph.invalidateModule(mod);\n modules.push(mod);\n }\n }\n return modules;\n };\n\n return {\n name: \"collie\",\n enforce: \"pre\",\n\n config(userConfig) {\n const prevExclude = userConfig.optimizeDeps?.exclude ?? [];\n const exclude = Array.from(new Set([...prevExclude, \"@collie-lang/react\"]));\n\n const prevNoExternal = userConfig.ssr?.noExternal;\n\n let nextNoExternal: any;\n if (prevNoExternal === true) {\n // User already wants everything bundled for SSR; nothing to do.\n nextNoExternal = true;\n } else if (Array.isArray(prevNoExternal)) {\n nextNoExternal = Array.from(new Set([...prevNoExternal, \"@collie-lang/react\"]));\n } else if (prevNoExternal == null) {\n nextNoExternal = [\"@collie-lang/react\"];\n } else {\n // Vite allows string/RegExp/etc. Coerce to array and add ours.\n nextNoExternal = Array.from(new Set([prevNoExternal, \"@collie-lang/react\"]));\n }\n\n return {\n optimizeDeps: {\n exclude\n },\n ...(nextNoExternal\n ? {\n ssr: {\n noExternal: nextNoExternal\n }\n }\n : {})\n };\n },\n\n configResolved(config) {\n resolvedRuntime = options.jsxRuntime ?? \"automatic\";\n resolvedConfig = config;\n resetTemplates();\n },\n\n configureServer(server) {\n const root = resolvedConfig?.root ?? server.config.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig ?? server.config);\n const watchPattern = normalizePath(path.join(root, COLLIE_GLOB));\n let watcherReady = false;\n\n const isIgnoredPath = (relative: string): boolean => {\n return ignore.some((pattern) => {\n if (pattern.startsWith(\"**/\") && pattern.endsWith(\"/**\")) {\n const segment = pattern.slice(3, -3);\n return (\n relative === segment ||\n relative.startsWith(`${segment}/`) ||\n relative.includes(`/${segment}/`)\n );\n }\n if (pattern.endsWith(\"/**\")) {\n const prefix = pattern.slice(0, -3);\n return relative === prefix || relative.startsWith(`${prefix}/`);\n }\n return false;\n });\n };\n\n const isRelevant = (filePath: string): boolean => {\n if (!isCollieFile(filePath)) {\n return false;\n }\n const relative = normalizePath(path.relative(root, filePath));\n if (!relative || relative.startsWith(\"..\")) {\n return false;\n }\n return !isIgnoredPath(relative);\n };\n\n server.watcher.add(watchPattern);\n server.watcher.on(\"ready\", () => {\n watcherReady = true;\n });\n server.watcher.on(\"add\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (!fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n server.watcher.on(\"unlink\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n },\n\n resolveId(id, importer) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_ID) {\n return VIRTUAL_REGISTRY_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_IDS_ID) {\n return VIRTUAL_IDS_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_PREFIX)) {\n return VIRTUAL_TEMPLATE_RESOLVED_PREFIX + cleanId.slice(VIRTUAL_TEMPLATE_PREFIX.length);\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n return cleanId;\n }\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isVirtualCollieId(cleanId) && cleanId.endsWith(\".collie\") && !isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n return null;\n },\n\n async load(id) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const entries = Array.from(templatesById.values()).sort((a, b) =>\n a.id.localeCompare(b.id)\n );\n\n const lines = entries.map(\n (record) =>\n ` ${JSON.stringify(record.id)}: () => import(${JSON.stringify(\n `${VIRTUAL_TEMPLATE_PREFIX}${record.encodedId}`\n )}),`\n );\n\n return {\n code: [\n \"/** @type {Record<string, () => Promise<{ render: (__inputs: any) => any }>>} */\",\n \"const __collieRegistry = import.meta.hot?.data?.registry ?? {};\",\n `const __nextRegistry = {\\n${lines.join(\"\\n\")}\\n};`,\n \"for (const key of Object.keys(__collieRegistry)) {\",\n \" if (!(key in __nextRegistry)) {\",\n \" delete __collieRegistry[key];\",\n \" }\",\n \"}\",\n \"for (const [key, value] of Object.entries(__nextRegistry)) {\",\n \" __collieRegistry[key] = value;\",\n \"}\",\n \"export const registry = __collieRegistry;\",\n \"if (import.meta.hot) {\",\n \" import.meta.hot.accept();\",\n \" import.meta.hot.dispose((data) => {\",\n \" data.registry = __collieRegistry;\",\n \" });\",\n \"}\"\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const ids = Array.from(templatesById.keys()).sort((a, b) => a.localeCompare(b));\n return {\n code: [\n \"/** @type {readonly string[]} */\",\n `export const ids = ${JSON.stringify(ids)};`\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n const encoded = cleanId.slice(VIRTUAL_TEMPLATE_RESOLVED_PREFIX.length);\n\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n return null; // <-- TS: stop control-flow here\n }\n\n const record = templatesByEncodedId.get(encoded);\n\n if (!record) {\n let decoded = encoded;\n try {\n decoded = decodeTemplateId(encoded);\n } catch {\n // Keep encoded value for the error message.\n }\n this.error(new Error(`[collie] Unknown template id \"${decoded}\".`));\n return null; // <-- ✅ THIS is what fixes \"'record' is possibly 'undefined'\"\n }\n\n const result = compileTemplate(record.template, {\n filename: record.filePath,\n jsxRuntime: resolvedRuntime,\n flavor: \"tsx\"\n });\n\n const errors = result.diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => formatDiagnostic(record.filePath, diag, resolvedConfig?.root))\n .join(\"\\n\");\n this.error(new Error(`[collie]\\n${formatted}`));\n return null; // <-- TS: stop control-flow here\n }\n\n const transformed = await transformWithEsbuild(result.code, record.filePath, {\n loader: \"tsx\",\n jsx: resolvedRuntime === \"classic\" ? \"transform\" : \"automatic\",\n jsxImportSource: \"react\"\n });\n\n return {\n code: transformed.code,\n map: transformed.map ?? null\n };\n }\n\n if (isCollieFile(cleanId)) {\n const info = this.getModuleInfo(cleanId);\n const importer = info?.importers?.[0];\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n\n return null;\n }\n\n return null;\n },\n\n handleHotUpdate(ctx: HmrContext) {\n if (!isCollieFile(ctx.file)) {\n return;\n }\n\n return updateFileTemplates(ctx);\n }\n };\n}\n"],"mappings":"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","names":["path","fg","fs","options"]}
|
package/dist/index.js
CHANGED
|
@@ -72,13 +72,28 @@ function formatLocation(location, root) {
|
|
|
72
72
|
}
|
|
73
73
|
return file;
|
|
74
74
|
}
|
|
75
|
+
function compareLocations(a, b) {
|
|
76
|
+
const pathOrder = normalizePath(a.file).localeCompare(normalizePath(b.file));
|
|
77
|
+
if (pathOrder !== 0) {
|
|
78
|
+
return pathOrder;
|
|
79
|
+
}
|
|
80
|
+
const lineOrder = (a.line ?? 0) - (b.line ?? 0);
|
|
81
|
+
if (lineOrder !== 0) {
|
|
82
|
+
return lineOrder;
|
|
83
|
+
}
|
|
84
|
+
return (a.col ?? 0) - (b.col ?? 0);
|
|
85
|
+
}
|
|
75
86
|
function formatDuplicateIdError(duplicates, root) {
|
|
76
87
|
const lines = ["[collie] Duplicate template ids detected:"];
|
|
77
88
|
const entries = Array.from(duplicates.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
78
89
|
for (const [id, locations] of entries) {
|
|
79
|
-
const
|
|
80
|
-
lines.push(`- ${id}
|
|
90
|
+
const sorted = [...locations].sort(compareLocations);
|
|
91
|
+
lines.push(`- ${id}:`);
|
|
92
|
+
for (const location of sorted) {
|
|
93
|
+
lines.push(` ${formatLocation(location, root)}`);
|
|
94
|
+
}
|
|
81
95
|
}
|
|
96
|
+
lines.push("Recommended action: rename one #id to be unique.");
|
|
82
97
|
return lines.join("\n");
|
|
83
98
|
}
|
|
84
99
|
function areSetsEqual(a, b) {
|
|
@@ -183,12 +198,12 @@ function colliePlugin(options = {}) {
|
|
|
183
198
|
templateIdToVirtualId.clear();
|
|
184
199
|
const root = resolvedConfig.root ?? process.cwd();
|
|
185
200
|
const ignore = buildIgnoreGlobs(resolvedConfig);
|
|
186
|
-
const filePaths = await fg(COLLIE_GLOB, {
|
|
201
|
+
const filePaths = (await fg(COLLIE_GLOB, {
|
|
187
202
|
cwd: root,
|
|
188
203
|
absolute: true,
|
|
189
204
|
onlyFiles: true,
|
|
190
205
|
ignore
|
|
191
|
-
});
|
|
206
|
+
})).sort((a, b) => normalizePath(a).localeCompare(normalizePath(b)));
|
|
192
207
|
const diagnostics = [];
|
|
193
208
|
const locationsById = /* @__PURE__ */ new Map();
|
|
194
209
|
for (const filePath of filePaths) {
|
|
@@ -276,17 +291,27 @@ ${formatted}`));
|
|
|
276
291
|
return [];
|
|
277
292
|
}
|
|
278
293
|
const duplicates = /* @__PURE__ */ new Map();
|
|
294
|
+
const seenInFile = /* @__PURE__ */ new Map();
|
|
279
295
|
for (const template of document.templates) {
|
|
296
|
+
const location = {
|
|
297
|
+
file: filePath,
|
|
298
|
+
line: template.span?.start.line,
|
|
299
|
+
col: template.span?.start.col
|
|
300
|
+
};
|
|
280
301
|
const existing = templatesById.get(template.id);
|
|
281
302
|
if (existing && existing.filePath !== filePath) {
|
|
282
303
|
const locations = duplicates.get(template.id) ?? [existing.location];
|
|
283
|
-
locations.push(
|
|
284
|
-
file: filePath,
|
|
285
|
-
line: template.span?.start.line,
|
|
286
|
-
col: template.span?.start.col
|
|
287
|
-
});
|
|
304
|
+
locations.push(location);
|
|
288
305
|
duplicates.set(template.id, locations);
|
|
289
306
|
}
|
|
307
|
+
const previousInFile = seenInFile.get(template.id);
|
|
308
|
+
if (previousInFile) {
|
|
309
|
+
const locations = duplicates.get(template.id) ?? [previousInFile];
|
|
310
|
+
locations.push(location);
|
|
311
|
+
duplicates.set(template.id, locations);
|
|
312
|
+
} else {
|
|
313
|
+
seenInFile.set(template.id, location);
|
|
314
|
+
}
|
|
290
315
|
}
|
|
291
316
|
if (duplicates.size) {
|
|
292
317
|
reportHmrError(ctx, new Error(formatDuplicateIdError(duplicates, root)));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport type { HmrContext, ModuleNode, Plugin, ResolvedConfig } from \"vite\";\nimport { normalizePath, transformWithEsbuild } from \"vite\";\nimport type { Diagnostic, TemplateUnit } from \"@collie-lang/compiler\";\nimport { compileTemplate, parseCollie } from \"@collie-lang/compiler\";\n\ntype JsxRuntime = \"automatic\" | \"classic\";\n\nexport interface ColliePluginOptions {\n jsxRuntime?: JsxRuntime;\n}\n\ninterface TemplateLocation {\n file: string;\n line?: number;\n col?: number;\n}\n\ninterface TemplateRecord {\n id: string;\n encodedId: string;\n filePath: string;\n template: TemplateUnit;\n location: TemplateLocation;\n}\n\nconst VIRTUAL_REGISTRY_ID = \"virtual:collie/registry\";\nconst VIRTUAL_REGISTRY_RESOLVED = \"\\0collie:registry\";\nconst VIRTUAL_IDS_ID = \"virtual:collie/ids\";\nconst VIRTUAL_IDS_RESOLVED = \"\\0collie:ids\";\nconst VIRTUAL_TEMPLATE_PREFIX = \"virtual:collie/template/\";\nconst VIRTUAL_TEMPLATE_RESOLVED_PREFIX = \"\\0collie:template:\";\nconst COLLIE_GLOB = \"**/*.collie\";\nconst DEFAULT_IGNORE_GLOBS = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/build/**\", \"**/.vite/**\"];\n\nfunction stripQuery(id: string): string {\n const q = id.indexOf(\"?\");\n return q === -1 ? id : id.slice(0, q);\n}\n\nfunction isCollieFile(id: string): boolean {\n return stripQuery(id).endsWith(\".collie\");\n}\n\nfunction toDisplayPath(filePath: string, root?: string): string {\n const normalized = normalizePath(filePath);\n if (!root || !path.isAbsolute(filePath)) {\n return normalized;\n }\n const relative = path.relative(root, filePath);\n if (!relative || relative.startsWith(\"..\")) {\n return normalized;\n }\n return normalizePath(relative);\n}\n\nfunction formatDiagnostic(id: string, diagnostic: Diagnostic, root?: string): string {\n const file = diagnostic.filePath ?? diagnostic.file ?? stripQuery(id);\n const displayFile = toDisplayPath(file, root);\n const range = diagnostic.range ?? diagnostic.span;\n const where = range ? `${range.start.line}:${range.start.col}` : \"\";\n const location = where ? `${displayFile}:${where}` : displayFile;\n const code = diagnostic.code ? diagnostic.code : \"COLLIE\";\n return `${location} [${code}] ${diagnostic.message}`;\n}\n\nfunction isVirtualCollieId(id: string): boolean {\n return (\n id === VIRTUAL_REGISTRY_ID ||\n id === VIRTUAL_REGISTRY_RESOLVED ||\n id === VIRTUAL_IDS_ID ||\n id === VIRTUAL_IDS_RESOLVED ||\n id.startsWith(VIRTUAL_TEMPLATE_PREFIX) ||\n id.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)\n );\n}\n\nfunction buildDirectImportError(importedId: string, importer?: string, root?: string): Error {\n const importLine = stripQuery(importedId);\n const importerLabel = importer ? toDisplayPath(importer, root) : \"<unknown>\";\n const lines = [\n \"Direct .collie imports are not supported.\",\n `Importer: ${importerLabel}`,\n `Import: ${importLine}`,\n \"Use the registry runtime instead:\",\n \"import { Collie } from '@collie-lang/react'\",\n '<Collie id=\"Your.TemplateId\" />',\n \"Templates are discovered automatically by @collie-lang/vite.\"\n ];\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction encodeTemplateId(id: string): string {\n return Buffer.from(id, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction decodeTemplateId(encoded: string): string {\n const normalized = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padLength = normalized.length % 4;\n const padded = padLength === 0 ? normalized : normalized + \"=\".repeat(4 - padLength);\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nfunction formatLocation(location: TemplateLocation, root?: string): string {\n const file = toDisplayPath(location.file, root);\n if (typeof location.line === \"number\" && typeof location.col === \"number\") {\n return `${file}:${location.line}:${location.col}`;\n }\n return file;\n}\n\nfunction formatDuplicateIdError(duplicates: Map<string, TemplateLocation[]>, root?: string): string {\n const lines = [\"[collie] Duplicate template ids detected:\"];\n const entries = Array.from(duplicates.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n for (const [id, locations] of entries) {\n const formatted = locations.map((location) => formatLocation(location, root)).join(\", \");\n lines.push(`- ${id}: ${formatted}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction areSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) {\n return false;\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildIgnoreGlobs(config?: ResolvedConfig): string[] {\n const ignore = new Set(DEFAULT_IGNORE_GLOBS);\n if (!config) {\n return Array.from(ignore);\n }\n\n const addRelativeDir = (dir?: string): void => {\n if (!dir) {\n return;\n }\n const absolute = path.isAbsolute(dir) ? dir : path.join(config.root, dir);\n const relative = normalizePath(path.relative(config.root, absolute));\n if (!relative || relative.startsWith(\"..\")) {\n return;\n }\n ignore.add(`${relative}/**`);\n };\n\n addRelativeDir(config.build?.outDir);\n addRelativeDir(config.cacheDir);\n addRelativeDir(config.publicDir);\n\n return Array.from(ignore);\n}\n\nexport default function colliePlugin(options: ColliePluginOptions = {}): Plugin {\n let resolvedRuntime: JsxRuntime = options.jsxRuntime ?? \"automatic\";\n let resolvedConfig: ResolvedConfig | undefined;\n let needsScan = true;\n const templatesById = new Map<string, TemplateRecord>();\n const templatesByEncodedId = new Map<string, TemplateRecord>();\n const fileToTemplateIds = new Map<string, Set<string>>();\n const templateIdToVirtualId = new Map<string, string>();\n\n const resetTemplates = (): void => {\n needsScan = true;\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n };\n\n const trackTemplateRecord = (record: TemplateRecord): void => {\n templatesById.set(record.id, record);\n templatesByEncodedId.set(record.encodedId, record);\n templateIdToVirtualId.set(record.id, `${VIRTUAL_TEMPLATE_RESOLVED_PREFIX}${record.encodedId}`);\n const ids = fileToTemplateIds.get(record.filePath) ?? new Set<string>();\n ids.add(record.id);\n fileToTemplateIds.set(record.filePath, ids);\n };\n\n const removeFileTemplates = (filePath: string): Set<string> => {\n const ids = fileToTemplateIds.get(filePath) ?? new Set<string>();\n for (const id of ids) {\n const record = templatesById.get(id);\n if (record && record.filePath === filePath) {\n templatesById.delete(id);\n templatesByEncodedId.delete(record.encodedId);\n templateIdToVirtualId.delete(id);\n }\n }\n fileToTemplateIds.delete(filePath);\n return ids;\n };\n\n const collectModuleIds = (ids: Iterable<string>): Set<string> => {\n const moduleIds = new Set<string>();\n for (const id of ids) {\n const moduleId = templateIdToVirtualId.get(id);\n if (moduleId) {\n moduleIds.add(moduleId);\n }\n }\n return moduleIds;\n };\n\n const reportHmrError = (ctx: HmrContext, error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n ctx.server.config.logger.error(err.message);\n ctx.server.ws.send({\n type: \"error\",\n err: {\n message: err.message,\n stack: err.stack ?? \"\"\n }\n });\n };\n\n const ensureTemplates = async (watcher?: { addWatchFile: (id: string) => void }): Promise<void> => {\n if (!needsScan) {\n return;\n }\n\n if (!resolvedConfig) {\n throw new Error(\"[collie] Vite config was not resolved before scanning templates.\");\n }\n\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n\n const root = resolvedConfig.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig);\n const filePaths = await fg(COLLIE_GLOB, {\n cwd: root,\n absolute: true,\n onlyFiles: true,\n ignore\n });\n\n const diagnostics: Diagnostic[] = [];\n const locationsById = new Map<string, TemplateLocation[]>();\n\n for (const filePath of filePaths) {\n if (watcher) {\n watcher.addWatchFile(filePath);\n }\n let source: string;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n const document = parseCollie(source, { filename: filePath });\n diagnostics.push(...document.diagnostics);\n\n for (const template of document.templates) {\n const location: TemplateLocation = {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n };\n const encodedId = encodeTemplateId(template.id);\n const record: TemplateRecord = {\n id: template.id,\n encodedId,\n filePath,\n template,\n location\n };\n trackTemplateRecord(record);\n const locations = locationsById.get(template.id) ?? [];\n locations.push(location);\n locationsById.set(template.id, locations);\n }\n }\n\n const errors = diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => {\n const fileForDiag = diag.filePath ?? diag.file ?? root;\n return formatDiagnostic(fileForDiag, diag, root);\n })\n .join(\"\\n\");\n throw new Error(`[collie]\\n${formatted}`);\n }\n\n const duplicates = new Map(\n Array.from(locationsById.entries()).filter(([, locations]) => locations.length > 1)\n );\n if (duplicates.size) {\n throw new Error(formatDuplicateIdError(duplicates, root));\n }\n\n needsScan = false;\n };\n\n const updateFileTemplates = async (ctx: HmrContext): Promise<ModuleNode[]> => {\n if (needsScan) {\n try {\n await ensureTemplates();\n } catch (error) {\n reportHmrError(ctx, error);\n return [];\n }\n }\n\n const filePath = ctx.file;\n const root = resolvedConfig?.root ?? process.cwd();\n const previousIds = new Set(fileToTemplateIds.get(filePath) ?? new Set<string>());\n const previousModuleIds = collectModuleIds(previousIds);\n\n let source: string | null = null;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n removeFileTemplates(filePath);\n return invalidateModules(ctx, previousModuleIds);\n }\n reportHmrError(ctx, error);\n return [];\n }\n\n const document = parseCollie(source, { filename: filePath });\n const errors = document.diagnostics.filter((diag: Diagnostic) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors.map((diag: Diagnostic) => formatDiagnostic(filePath, diag, root)).join(\"\\n\");\n reportHmrError(ctx, new Error(`[collie]\\n${formatted}`));\n return [];\n }\n\n const duplicates = new Map<string, TemplateLocation[]>();\n for (const template of document.templates) {\n const existing = templatesById.get(template.id);\n if (existing && existing.filePath !== filePath) {\n const locations = duplicates.get(template.id) ?? [existing.location];\n locations.push({\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n });\n duplicates.set(template.id, locations);\n }\n }\n if (duplicates.size) {\n reportHmrError(ctx, new Error(formatDuplicateIdError(duplicates, root)));\n return [];\n }\n\n removeFileTemplates(filePath);\n for (const template of document.templates) {\n const record: TemplateRecord = {\n id: template.id,\n encodedId: encodeTemplateId(template.id),\n filePath,\n template,\n location: {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n }\n };\n trackTemplateRecord(record);\n }\n\n const nextIds = fileToTemplateIds.get(filePath) ?? new Set<string>();\n const nextModuleIds = collectModuleIds(nextIds);\n const moduleIds = new Set<string>([...previousModuleIds, ...nextModuleIds]);\n const idsChanged = !areSetsEqual(previousIds, nextIds);\n return invalidateModules(ctx, moduleIds, {\n includeRegistry: idsChanged,\n includeIds: idsChanged\n });\n };\n\n const invalidateModules = (\n ctx: HmrContext,\n moduleIds: Iterable<string>,\n options?: { includeRegistry?: boolean; includeIds?: boolean }\n ): ModuleNode[] => {\n const modules: ModuleNode[] = [];\n const includeRegistry = options?.includeRegistry ?? true;\n const includeIds = options?.includeIds ?? true;\n\n if (includeRegistry) {\n const registryModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_REGISTRY_RESOLVED);\n if (registryModule) {\n ctx.server.moduleGraph.invalidateModule(registryModule);\n modules.push(registryModule);\n }\n }\n\n if (includeIds) {\n const idsModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_IDS_RESOLVED);\n if (idsModule) {\n ctx.server.moduleGraph.invalidateModule(idsModule);\n modules.push(idsModule);\n }\n }\n for (const moduleId of moduleIds) {\n const mod = ctx.server.moduleGraph.getModuleById(moduleId);\n if (mod) {\n ctx.server.moduleGraph.invalidateModule(mod);\n modules.push(mod);\n }\n }\n return modules;\n };\n\n return {\n name: \"collie\",\n enforce: \"pre\",\n\n config(userConfig) {\n const prevExclude = userConfig.optimizeDeps?.exclude ?? [];\n const exclude = Array.from(new Set([...prevExclude, \"@collie-lang/react\"]));\n\n const prevNoExternal = userConfig.ssr?.noExternal;\n\n let nextNoExternal: any;\n if (prevNoExternal === true) {\n // User already wants everything bundled for SSR; nothing to do.\n nextNoExternal = true;\n } else if (Array.isArray(prevNoExternal)) {\n nextNoExternal = Array.from(new Set([...prevNoExternal, \"@collie-lang/react\"]));\n } else if (prevNoExternal == null) {\n nextNoExternal = [\"@collie-lang/react\"];\n } else {\n // Vite allows string/RegExp/etc. Coerce to array and add ours.\n nextNoExternal = Array.from(new Set([prevNoExternal, \"@collie-lang/react\"]));\n }\n\n return {\n optimizeDeps: {\n exclude\n },\n ...(nextNoExternal\n ? {\n ssr: {\n noExternal: nextNoExternal\n }\n }\n : {})\n };\n },\n\n configResolved(config) {\n resolvedRuntime = options.jsxRuntime ?? \"automatic\";\n resolvedConfig = config;\n resetTemplates();\n },\n\n configureServer(server) {\n const root = resolvedConfig?.root ?? server.config.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig ?? server.config);\n const watchPattern = normalizePath(path.join(root, COLLIE_GLOB));\n let watcherReady = false;\n\n const isIgnoredPath = (relative: string): boolean => {\n return ignore.some((pattern) => {\n if (pattern.startsWith(\"**/\") && pattern.endsWith(\"/**\")) {\n const segment = pattern.slice(3, -3);\n return (\n relative === segment ||\n relative.startsWith(`${segment}/`) ||\n relative.includes(`/${segment}/`)\n );\n }\n if (pattern.endsWith(\"/**\")) {\n const prefix = pattern.slice(0, -3);\n return relative === prefix || relative.startsWith(`${prefix}/`);\n }\n return false;\n });\n };\n\n const isRelevant = (filePath: string): boolean => {\n if (!isCollieFile(filePath)) {\n return false;\n }\n const relative = normalizePath(path.relative(root, filePath));\n if (!relative || relative.startsWith(\"..\")) {\n return false;\n }\n return !isIgnoredPath(relative);\n };\n\n server.watcher.add(watchPattern);\n server.watcher.on(\"ready\", () => {\n watcherReady = true;\n });\n server.watcher.on(\"add\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (!fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n server.watcher.on(\"unlink\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n },\n\n resolveId(id, importer) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_ID) {\n return VIRTUAL_REGISTRY_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_IDS_ID) {\n return VIRTUAL_IDS_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_PREFIX)) {\n return VIRTUAL_TEMPLATE_RESOLVED_PREFIX + cleanId.slice(VIRTUAL_TEMPLATE_PREFIX.length);\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n return cleanId;\n }\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isVirtualCollieId(cleanId) && cleanId.endsWith(\".collie\") && !isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n return null;\n },\n\n async load(id) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const entries = Array.from(templatesById.values()).sort((a, b) =>\n a.id.localeCompare(b.id)\n );\n\n const lines = entries.map(\n (record) =>\n ` ${JSON.stringify(record.id)}: () => import(${JSON.stringify(\n `${VIRTUAL_TEMPLATE_PREFIX}${record.encodedId}`\n )}),`\n );\n\n return {\n code: [\n \"/** @type {Record<string, () => Promise<{ render: (__inputs: any) => any }>>} */\",\n \"const __collieRegistry = import.meta.hot?.data?.registry ?? {};\",\n `const __nextRegistry = {\\n${lines.join(\"\\n\")}\\n};`,\n \"for (const key of Object.keys(__collieRegistry)) {\",\n \" if (!(key in __nextRegistry)) {\",\n \" delete __collieRegistry[key];\",\n \" }\",\n \"}\",\n \"for (const [key, value] of Object.entries(__nextRegistry)) {\",\n \" __collieRegistry[key] = value;\",\n \"}\",\n \"export const registry = __collieRegistry;\",\n \"if (import.meta.hot) {\",\n \" import.meta.hot.accept();\",\n \" import.meta.hot.dispose((data) => {\",\n \" data.registry = __collieRegistry;\",\n \" });\",\n \"}\"\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const ids = Array.from(templatesById.keys()).sort((a, b) => a.localeCompare(b));\n return {\n code: [\n \"/** @type {readonly string[]} */\",\n `export const ids = ${JSON.stringify(ids)};`\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n const encoded = cleanId.slice(VIRTUAL_TEMPLATE_RESOLVED_PREFIX.length);\n\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n return null; // <-- TS: stop control-flow here\n }\n\n const record = templatesByEncodedId.get(encoded);\n\n if (!record) {\n let decoded = encoded;\n try {\n decoded = decodeTemplateId(encoded);\n } catch {\n // Keep encoded value for the error message.\n }\n this.error(new Error(`[collie] Unknown template id \"${decoded}\".`));\n return null; // <-- ✅ THIS is what fixes \"'record' is possibly 'undefined'\"\n }\n\n const result = compileTemplate(record.template, {\n filename: record.filePath,\n jsxRuntime: resolvedRuntime,\n flavor: \"tsx\"\n });\n\n const errors = result.diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => formatDiagnostic(record.filePath, diag, resolvedConfig?.root))\n .join(\"\\n\");\n this.error(new Error(`[collie]\\n${formatted}`));\n return null; // <-- TS: stop control-flow here\n }\n\n const transformed = await transformWithEsbuild(result.code, record.filePath, {\n loader: \"tsx\",\n jsx: resolvedRuntime === \"classic\" ? \"transform\" : \"automatic\",\n jsxImportSource: \"react\"\n });\n\n return {\n code: transformed.code,\n map: transformed.map ?? null\n };\n }\n\n if (isCollieFile(cleanId)) {\n const info = this.getModuleInfo(cleanId);\n const importer = info?.importers?.[0];\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n\n return null;\n }\n\n return null;\n },\n\n handleHotUpdate(ctx: HmrContext) {\n if (!isCollieFile(ctx.file)) {\n return;\n }\n\n return updateFileTemplates(ctx);\n }\n };\n}\n"],"mappings":"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","names":["options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport type { HmrContext, ModuleNode, Plugin, ResolvedConfig } from \"vite\";\nimport { normalizePath, transformWithEsbuild } from \"vite\";\nimport type { Diagnostic, TemplateUnit } from \"@collie-lang/compiler\";\nimport { compileTemplate, parseCollie } from \"@collie-lang/compiler\";\n\ntype JsxRuntime = \"automatic\" | \"classic\";\n\nexport interface ColliePluginOptions {\n jsxRuntime?: JsxRuntime;\n}\n\ninterface TemplateLocation {\n file: string;\n line?: number;\n col?: number;\n}\n\ninterface TemplateRecord {\n id: string;\n encodedId: string;\n filePath: string;\n template: TemplateUnit;\n location: TemplateLocation;\n}\n\nconst VIRTUAL_REGISTRY_ID = \"virtual:collie/registry\";\nconst VIRTUAL_REGISTRY_RESOLVED = \"\\0collie:registry\";\nconst VIRTUAL_IDS_ID = \"virtual:collie/ids\";\nconst VIRTUAL_IDS_RESOLVED = \"\\0collie:ids\";\nconst VIRTUAL_TEMPLATE_PREFIX = \"virtual:collie/template/\";\nconst VIRTUAL_TEMPLATE_RESOLVED_PREFIX = \"\\0collie:template:\";\nconst COLLIE_GLOB = \"**/*.collie\";\nconst DEFAULT_IGNORE_GLOBS = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/build/**\", \"**/.vite/**\"];\n\nfunction stripQuery(id: string): string {\n const q = id.indexOf(\"?\");\n return q === -1 ? id : id.slice(0, q);\n}\n\nfunction isCollieFile(id: string): boolean {\n return stripQuery(id).endsWith(\".collie\");\n}\n\nfunction toDisplayPath(filePath: string, root?: string): string {\n const normalized = normalizePath(filePath);\n if (!root || !path.isAbsolute(filePath)) {\n return normalized;\n }\n const relative = path.relative(root, filePath);\n if (!relative || relative.startsWith(\"..\")) {\n return normalized;\n }\n return normalizePath(relative);\n}\n\nfunction formatDiagnostic(id: string, diagnostic: Diagnostic, root?: string): string {\n const file = diagnostic.filePath ?? diagnostic.file ?? stripQuery(id);\n const displayFile = toDisplayPath(file, root);\n const range = diagnostic.range ?? diagnostic.span;\n const where = range ? `${range.start.line}:${range.start.col}` : \"\";\n const location = where ? `${displayFile}:${where}` : displayFile;\n const code = diagnostic.code ? diagnostic.code : \"COLLIE\";\n return `${location} [${code}] ${diagnostic.message}`;\n}\n\nfunction isVirtualCollieId(id: string): boolean {\n return (\n id === VIRTUAL_REGISTRY_ID ||\n id === VIRTUAL_REGISTRY_RESOLVED ||\n id === VIRTUAL_IDS_ID ||\n id === VIRTUAL_IDS_RESOLVED ||\n id.startsWith(VIRTUAL_TEMPLATE_PREFIX) ||\n id.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)\n );\n}\n\nfunction buildDirectImportError(importedId: string, importer?: string, root?: string): Error {\n const importLine = stripQuery(importedId);\n const importerLabel = importer ? toDisplayPath(importer, root) : \"<unknown>\";\n const lines = [\n \"Direct .collie imports are not supported.\",\n `Importer: ${importerLabel}`,\n `Import: ${importLine}`,\n \"Use the registry runtime instead:\",\n \"import { Collie } from '@collie-lang/react'\",\n '<Collie id=\"Your.TemplateId\" />',\n \"Templates are discovered automatically by @collie-lang/vite.\"\n ];\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction encodeTemplateId(id: string): string {\n return Buffer.from(id, \"utf8\")\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction decodeTemplateId(encoded: string): string {\n const normalized = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padLength = normalized.length % 4;\n const padded = padLength === 0 ? normalized : normalized + \"=\".repeat(4 - padLength);\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nfunction formatLocation(location: TemplateLocation, root?: string): string {\n const file = toDisplayPath(location.file, root);\n if (typeof location.line === \"number\" && typeof location.col === \"number\") {\n return `${file}:${location.line}:${location.col}`;\n }\n return file;\n}\n\nfunction compareLocations(a: TemplateLocation, b: TemplateLocation): number {\n const pathOrder = normalizePath(a.file).localeCompare(normalizePath(b.file));\n if (pathOrder !== 0) {\n return pathOrder;\n }\n const lineOrder = (a.line ?? 0) - (b.line ?? 0);\n if (lineOrder !== 0) {\n return lineOrder;\n }\n return (a.col ?? 0) - (b.col ?? 0);\n}\n\nfunction formatDuplicateIdError(duplicates: Map<string, TemplateLocation[]>, root?: string): string {\n const lines = [\"[collie] Duplicate template ids detected:\"];\n const entries = Array.from(duplicates.entries()).sort((a, b) => a[0].localeCompare(b[0]));\n for (const [id, locations] of entries) {\n const sorted = [...locations].sort(compareLocations);\n lines.push(`- ${id}:`);\n for (const location of sorted) {\n lines.push(` ${formatLocation(location, root)}`);\n }\n }\n lines.push(\"Recommended action: rename one #id to be unique.\");\n return lines.join(\"\\n\");\n}\n\nfunction areSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) {\n return false;\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildIgnoreGlobs(config?: ResolvedConfig): string[] {\n const ignore = new Set(DEFAULT_IGNORE_GLOBS);\n if (!config) {\n return Array.from(ignore);\n }\n\n const addRelativeDir = (dir?: string): void => {\n if (!dir) {\n return;\n }\n const absolute = path.isAbsolute(dir) ? dir : path.join(config.root, dir);\n const relative = normalizePath(path.relative(config.root, absolute));\n if (!relative || relative.startsWith(\"..\")) {\n return;\n }\n ignore.add(`${relative}/**`);\n };\n\n addRelativeDir(config.build?.outDir);\n addRelativeDir(config.cacheDir);\n addRelativeDir(config.publicDir);\n\n return Array.from(ignore);\n}\n\nexport default function colliePlugin(options: ColliePluginOptions = {}): Plugin {\n let resolvedRuntime: JsxRuntime = options.jsxRuntime ?? \"automatic\";\n let resolvedConfig: ResolvedConfig | undefined;\n let needsScan = true;\n const templatesById = new Map<string, TemplateRecord>();\n const templatesByEncodedId = new Map<string, TemplateRecord>();\n const fileToTemplateIds = new Map<string, Set<string>>();\n const templateIdToVirtualId = new Map<string, string>();\n\n const resetTemplates = (): void => {\n needsScan = true;\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n };\n\n const trackTemplateRecord = (record: TemplateRecord): void => {\n templatesById.set(record.id, record);\n templatesByEncodedId.set(record.encodedId, record);\n templateIdToVirtualId.set(record.id, `${VIRTUAL_TEMPLATE_RESOLVED_PREFIX}${record.encodedId}`);\n const ids = fileToTemplateIds.get(record.filePath) ?? new Set<string>();\n ids.add(record.id);\n fileToTemplateIds.set(record.filePath, ids);\n };\n\n const removeFileTemplates = (filePath: string): Set<string> => {\n const ids = fileToTemplateIds.get(filePath) ?? new Set<string>();\n for (const id of ids) {\n const record = templatesById.get(id);\n if (record && record.filePath === filePath) {\n templatesById.delete(id);\n templatesByEncodedId.delete(record.encodedId);\n templateIdToVirtualId.delete(id);\n }\n }\n fileToTemplateIds.delete(filePath);\n return ids;\n };\n\n const collectModuleIds = (ids: Iterable<string>): Set<string> => {\n const moduleIds = new Set<string>();\n for (const id of ids) {\n const moduleId = templateIdToVirtualId.get(id);\n if (moduleId) {\n moduleIds.add(moduleId);\n }\n }\n return moduleIds;\n };\n\n const reportHmrError = (ctx: HmrContext, error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n ctx.server.config.logger.error(err.message);\n ctx.server.ws.send({\n type: \"error\",\n err: {\n message: err.message,\n stack: err.stack ?? \"\"\n }\n });\n };\n\n const ensureTemplates = async (watcher?: { addWatchFile: (id: string) => void }): Promise<void> => {\n if (!needsScan) {\n return;\n }\n\n if (!resolvedConfig) {\n throw new Error(\"[collie] Vite config was not resolved before scanning templates.\");\n }\n\n templatesById.clear();\n templatesByEncodedId.clear();\n fileToTemplateIds.clear();\n templateIdToVirtualId.clear();\n\n const root = resolvedConfig.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig);\n const filePaths = (await fg(COLLIE_GLOB, {\n cwd: root,\n absolute: true,\n onlyFiles: true,\n ignore\n })).sort((a, b) => normalizePath(a).localeCompare(normalizePath(b)));\n\n const diagnostics: Diagnostic[] = [];\n const locationsById = new Map<string, TemplateLocation[]>();\n\n for (const filePath of filePaths) {\n if (watcher) {\n watcher.addWatchFile(filePath);\n }\n let source: string;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n const document = parseCollie(source, { filename: filePath });\n diagnostics.push(...document.diagnostics);\n\n for (const template of document.templates) {\n const location: TemplateLocation = {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n };\n const encodedId = encodeTemplateId(template.id);\n const record: TemplateRecord = {\n id: template.id,\n encodedId,\n filePath,\n template,\n location\n };\n trackTemplateRecord(record);\n const locations = locationsById.get(template.id) ?? [];\n locations.push(location);\n locationsById.set(template.id, locations);\n }\n }\n\n const errors = diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => {\n const fileForDiag = diag.filePath ?? diag.file ?? root;\n return formatDiagnostic(fileForDiag, diag, root);\n })\n .join(\"\\n\");\n throw new Error(`[collie]\\n${formatted}`);\n }\n\n const duplicates = new Map(\n Array.from(locationsById.entries()).filter(([, locations]) => locations.length > 1)\n );\n if (duplicates.size) {\n throw new Error(formatDuplicateIdError(duplicates, root));\n }\n\n needsScan = false;\n };\n\n const updateFileTemplates = async (ctx: HmrContext): Promise<ModuleNode[]> => {\n if (needsScan) {\n try {\n await ensureTemplates();\n } catch (error) {\n reportHmrError(ctx, error);\n return [];\n }\n }\n\n const filePath = ctx.file;\n const root = resolvedConfig?.root ?? process.cwd();\n const previousIds = new Set(fileToTemplateIds.get(filePath) ?? new Set<string>());\n const previousModuleIds = collectModuleIds(previousIds);\n\n let source: string | null = null;\n try {\n source = await fs.readFile(filePath, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n removeFileTemplates(filePath);\n return invalidateModules(ctx, previousModuleIds);\n }\n reportHmrError(ctx, error);\n return [];\n }\n\n const document = parseCollie(source, { filename: filePath });\n const errors = document.diagnostics.filter((diag: Diagnostic) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors.map((diag: Diagnostic) => formatDiagnostic(filePath, diag, root)).join(\"\\n\");\n reportHmrError(ctx, new Error(`[collie]\\n${formatted}`));\n return [];\n }\n\n const duplicates = new Map<string, TemplateLocation[]>();\n const seenInFile = new Map<string, TemplateLocation>();\n for (const template of document.templates) {\n const location: TemplateLocation = {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n };\n const existing = templatesById.get(template.id);\n if (existing && existing.filePath !== filePath) {\n const locations = duplicates.get(template.id) ?? [existing.location];\n locations.push(location);\n duplicates.set(template.id, locations);\n }\n const previousInFile = seenInFile.get(template.id);\n if (previousInFile) {\n const locations = duplicates.get(template.id) ?? [previousInFile];\n locations.push(location);\n duplicates.set(template.id, locations);\n } else {\n seenInFile.set(template.id, location);\n }\n }\n if (duplicates.size) {\n reportHmrError(ctx, new Error(formatDuplicateIdError(duplicates, root)));\n return [];\n }\n\n removeFileTemplates(filePath);\n for (const template of document.templates) {\n const record: TemplateRecord = {\n id: template.id,\n encodedId: encodeTemplateId(template.id),\n filePath,\n template,\n location: {\n file: filePath,\n line: template.span?.start.line,\n col: template.span?.start.col\n }\n };\n trackTemplateRecord(record);\n }\n\n const nextIds = fileToTemplateIds.get(filePath) ?? new Set<string>();\n const nextModuleIds = collectModuleIds(nextIds);\n const moduleIds = new Set<string>([...previousModuleIds, ...nextModuleIds]);\n const idsChanged = !areSetsEqual(previousIds, nextIds);\n return invalidateModules(ctx, moduleIds, {\n includeRegistry: idsChanged,\n includeIds: idsChanged\n });\n };\n\n const invalidateModules = (\n ctx: HmrContext,\n moduleIds: Iterable<string>,\n options?: { includeRegistry?: boolean; includeIds?: boolean }\n ): ModuleNode[] => {\n const modules: ModuleNode[] = [];\n const includeRegistry = options?.includeRegistry ?? true;\n const includeIds = options?.includeIds ?? true;\n\n if (includeRegistry) {\n const registryModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_REGISTRY_RESOLVED);\n if (registryModule) {\n ctx.server.moduleGraph.invalidateModule(registryModule);\n modules.push(registryModule);\n }\n }\n\n if (includeIds) {\n const idsModule = ctx.server.moduleGraph.getModuleById(VIRTUAL_IDS_RESOLVED);\n if (idsModule) {\n ctx.server.moduleGraph.invalidateModule(idsModule);\n modules.push(idsModule);\n }\n }\n for (const moduleId of moduleIds) {\n const mod = ctx.server.moduleGraph.getModuleById(moduleId);\n if (mod) {\n ctx.server.moduleGraph.invalidateModule(mod);\n modules.push(mod);\n }\n }\n return modules;\n };\n\n return {\n name: \"collie\",\n enforce: \"pre\",\n\n config(userConfig) {\n const prevExclude = userConfig.optimizeDeps?.exclude ?? [];\n const exclude = Array.from(new Set([...prevExclude, \"@collie-lang/react\"]));\n\n const prevNoExternal = userConfig.ssr?.noExternal;\n\n let nextNoExternal: any;\n if (prevNoExternal === true) {\n // User already wants everything bundled for SSR; nothing to do.\n nextNoExternal = true;\n } else if (Array.isArray(prevNoExternal)) {\n nextNoExternal = Array.from(new Set([...prevNoExternal, \"@collie-lang/react\"]));\n } else if (prevNoExternal == null) {\n nextNoExternal = [\"@collie-lang/react\"];\n } else {\n // Vite allows string/RegExp/etc. Coerce to array and add ours.\n nextNoExternal = Array.from(new Set([prevNoExternal, \"@collie-lang/react\"]));\n }\n\n return {\n optimizeDeps: {\n exclude\n },\n ...(nextNoExternal\n ? {\n ssr: {\n noExternal: nextNoExternal\n }\n }\n : {})\n };\n },\n\n configResolved(config) {\n resolvedRuntime = options.jsxRuntime ?? \"automatic\";\n resolvedConfig = config;\n resetTemplates();\n },\n\n configureServer(server) {\n const root = resolvedConfig?.root ?? server.config.root ?? process.cwd();\n const ignore = buildIgnoreGlobs(resolvedConfig ?? server.config);\n const watchPattern = normalizePath(path.join(root, COLLIE_GLOB));\n let watcherReady = false;\n\n const isIgnoredPath = (relative: string): boolean => {\n return ignore.some((pattern) => {\n if (pattern.startsWith(\"**/\") && pattern.endsWith(\"/**\")) {\n const segment = pattern.slice(3, -3);\n return (\n relative === segment ||\n relative.startsWith(`${segment}/`) ||\n relative.includes(`/${segment}/`)\n );\n }\n if (pattern.endsWith(\"/**\")) {\n const prefix = pattern.slice(0, -3);\n return relative === prefix || relative.startsWith(`${prefix}/`);\n }\n return false;\n });\n };\n\n const isRelevant = (filePath: string): boolean => {\n if (!isCollieFile(filePath)) {\n return false;\n }\n const relative = normalizePath(path.relative(root, filePath));\n if (!relative || relative.startsWith(\"..\")) {\n return false;\n }\n return !isIgnoredPath(relative);\n };\n\n server.watcher.add(watchPattern);\n server.watcher.on(\"ready\", () => {\n watcherReady = true;\n });\n server.watcher.on(\"add\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (!fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n server.watcher.on(\"unlink\", (filePath) => {\n if (!watcherReady || !isRelevant(filePath) || needsScan) {\n return;\n }\n if (fileToTemplateIds.has(filePath)) {\n resetTemplates();\n server.ws.send({ type: \"full-reload\" });\n }\n });\n },\n\n resolveId(id, importer) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_ID) {\n return VIRTUAL_REGISTRY_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_IDS_ID) {\n return VIRTUAL_IDS_RESOLVED;\n }\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n return cleanId;\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_PREFIX)) {\n return VIRTUAL_TEMPLATE_RESOLVED_PREFIX + cleanId.slice(VIRTUAL_TEMPLATE_PREFIX.length);\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n return cleanId;\n }\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isVirtualCollieId(cleanId) && cleanId.endsWith(\".collie\") && !isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n return null;\n },\n\n async load(id) {\n const cleanId = stripQuery(id);\n\n if (cleanId === VIRTUAL_REGISTRY_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const entries = Array.from(templatesById.values()).sort((a, b) =>\n a.id.localeCompare(b.id)\n );\n\n const lines = entries.map(\n (record) =>\n ` ${JSON.stringify(record.id)}: () => import(${JSON.stringify(\n `${VIRTUAL_TEMPLATE_PREFIX}${record.encodedId}`\n )}),`\n );\n\n return {\n code: [\n \"/** @type {Record<string, () => Promise<{ render: (__inputs: any) => any }>>} */\",\n \"const __collieRegistry = import.meta.hot?.data?.registry ?? {};\",\n `const __nextRegistry = {\\n${lines.join(\"\\n\")}\\n};`,\n \"for (const key of Object.keys(__collieRegistry)) {\",\n \" if (!(key in __nextRegistry)) {\",\n \" delete __collieRegistry[key];\",\n \" }\",\n \"}\",\n \"for (const [key, value] of Object.entries(__nextRegistry)) {\",\n \" __collieRegistry[key] = value;\",\n \"}\",\n \"export const registry = __collieRegistry;\",\n \"if (import.meta.hot) {\",\n \" import.meta.hot.accept();\",\n \" import.meta.hot.dispose((data) => {\",\n \" data.registry = __collieRegistry;\",\n \" });\",\n \"}\"\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId === VIRTUAL_IDS_RESOLVED) {\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n }\n\n const ids = Array.from(templatesById.keys()).sort((a, b) => a.localeCompare(b));\n return {\n code: [\n \"/** @type {readonly string[]} */\",\n `export const ids = ${JSON.stringify(ids)};`\n ].join(\"\\n\"),\n map: null\n };\n }\n\n if (cleanId.startsWith(VIRTUAL_TEMPLATE_RESOLVED_PREFIX)) {\n const encoded = cleanId.slice(VIRTUAL_TEMPLATE_RESOLVED_PREFIX.length);\n\n try {\n await ensureTemplates(this);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.error(err);\n return null; // <-- TS: stop control-flow here\n }\n\n const record = templatesByEncodedId.get(encoded);\n\n if (!record) {\n let decoded = encoded;\n try {\n decoded = decodeTemplateId(encoded);\n } catch {\n // Keep encoded value for the error message.\n }\n this.error(new Error(`[collie] Unknown template id \"${decoded}\".`));\n return null; // <-- ✅ THIS is what fixes \"'record' is possibly 'undefined'\"\n }\n\n const result = compileTemplate(record.template, {\n filename: record.filePath,\n jsxRuntime: resolvedRuntime,\n flavor: \"tsx\"\n });\n\n const errors = result.diagnostics.filter((diag) => diag.severity === \"error\");\n if (errors.length) {\n const formatted = errors\n .map((diag) => formatDiagnostic(record.filePath, diag, resolvedConfig?.root))\n .join(\"\\n\");\n this.error(new Error(`[collie]\\n${formatted}`));\n return null; // <-- TS: stop control-flow here\n }\n\n const transformed = await transformWithEsbuild(result.code, record.filePath, {\n loader: \"tsx\",\n jsx: resolvedRuntime === \"classic\" ? \"transform\" : \"automatic\",\n jsxImportSource: \"react\"\n });\n\n return {\n code: transformed.code,\n map: transformed.map ?? null\n };\n }\n\n if (isCollieFile(cleanId)) {\n const info = this.getModuleInfo(cleanId);\n const importer = info?.importers?.[0];\n\n const isInternalImporter =\n typeof importer === \"string\" &&\n (importer.startsWith(\"\\0collie:\") || importer.startsWith(\"collie:\"));\n\n if (!isInternalImporter) {\n this.error(buildDirectImportError(cleanId, importer, resolvedConfig?.root));\n }\n\n return null;\n }\n\n return null;\n },\n\n handleHotUpdate(ctx: HmrContext) {\n if (!isCollieFile(ctx.file)) {\n return;\n }\n\n return updateFileTemplates(ctx);\n }\n };\n}\n"],"mappings":"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","names":["options"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@collie-lang/vite",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Vite plugin for Collie (.collie -> React component).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"lint": "echo \"(mvp) no lint configured\""
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@collie-lang/compiler": "^1.
|
|
35
|
+
"@collie-lang/compiler": "^1.6.0",
|
|
36
36
|
"fast-glob": "^3.3.3"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|