@clarify-labs/templates 0.9.4 → 0.10.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, relative, resolve } from 'node:path'\n\nexport const supportedTemplates = ['minimal', 'standard', 'complete'] as const\n\nexport type ClarifyTemplate = typeof supportedTemplates[number]\n\nexport type TemplateVariables = {\n contentDir: string\n}\n\nexport type TemplateCopyOptions = {\n contentDir: string\n force?: boolean\n variables?: Partial<TemplateVariables>\n}\n\nexport type TemplateCopyResult = {\n created: string[]\n}\n\nexport class TemplateConflictError extends Error {\n constructor(public readonly conflicts: string[]) {\n super(`[clarify] Init target has conflicting files:\\n${conflicts.map(file => ` - ${file}`).join('\\n')}\\nUse --force to overwrite them.`)\n this.name = 'TemplateConflictError'\n }\n}\n\nexport function resolveTemplate(template?: string): ClarifyTemplate {\n const selectedTemplate = template ?? 'standard'\n if (supportedTemplates.includes(selectedTemplate as ClarifyTemplate)) return selectedTemplate as ClarifyTemplate\n throw new Error(`[clarify] Unknown template \"${selectedTemplate}\". Available templates: ${supportedTemplates.join(', ')}.`)\n}\n\nexport function getTemplateDirectory(templatesDirectory: string, template: ClarifyTemplate): string {\n return resolve(templatesDirectory, template)\n}\n\nexport function renderTemplate(content: string, variables: TemplateVariables): string {\n return content.replaceAll('{{contentDir}}', variables.contentDir)\n}\n\nexport function toTemplateTargetPath(relativePath: string, contentDir: string): string {\n return relativePath.replace(/^source(?=\\/|$)/, contentDir)\n}\n\nexport function copyTemplateDirectory(templateDirectory: string, targetDirectory: string, options: TemplateCopyOptions): TemplateCopyResult {\n const created: string[] = []\n const variables = {\n contentDir: options.contentDir,\n ...options.variables,\n }\n\n if (options.force !== true) {\n const conflicts = findTemplateConflicts(templateDirectory, targetDirectory, options.contentDir)\n if (conflicts.length > 0) throw new TemplateConflictError(conflicts)\n }\n\n copyDirectory(templateDirectory, templateDirectory, targetDirectory, options.contentDir, variables, created)\n\n return { created }\n}\n\nfunction findTemplateConflicts(templateDirectory: string, targetDirectory: string, contentDir: string): string[] {\n const conflicts: string[] = []\n collectTemplateConflicts(templateDirectory, templateDirectory, targetDirectory, contentDir, conflicts)\n return conflicts\n}\n\nfunction collectTemplateConflicts(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, conflicts: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n collectTemplateConflicts(templateDirectory, sourcePath, targetDirectory, contentDir, conflicts)\n continue\n }\n\n if (entry.isFile() && existsSync(targetPath)) conflicts.push(targetRelativePath)\n }\n}\n\nfunction copyDirectory(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, variables: TemplateVariables, created: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n copyDirectory(templateDirectory, sourcePath, targetDirectory, contentDir, variables, created)\n continue\n }\n\n if (!entry.isFile()) continue\n\n const content = renderTemplate(readFileSync(sourcePath, 'utf-8'), variables)\n mkdirSync(dirname(targetPath), { recursive: true })\n writeFileSync(targetPath, content, 'utf-8')\n created.push(targetRelativePath)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, relative, resolve } from 'node:path'\n\nexport const supportedTemplates = ['minimal', 'standard', 'complete'] as const\n\nexport type ClarifyTemplate = typeof supportedTemplates[number]\n\nexport type TemplateVariables = {\n contentDir: string\n}\n\nexport type TemplateCopyOptions = {\n contentDir: string\n force?: boolean\n variables?: Partial<TemplateVariables>\n}\n\nexport type TemplateCopyResult = {\n created: string[]\n}\n\nexport class TemplateConflictError extends Error {\n constructor(public readonly conflicts: string[]) {\n super(`[clarify] Init target has conflicting files:\\n${conflicts.map(file => ` - ${file}`).join('\\n')}\\nUse --force to overwrite them.`)\n this.name = 'TemplateConflictError'\n }\n}\n\nexport function resolveTemplate(template?: string): ClarifyTemplate {\n const selectedTemplate = template ?? 'standard'\n if (supportedTemplates.includes(selectedTemplate as ClarifyTemplate)) return selectedTemplate as ClarifyTemplate\n throw new Error(`[clarify] Unknown template \"${selectedTemplate}\". Available templates: ${supportedTemplates.join(', ')}.`)\n}\n\nexport function getTemplateDirectory(templatesDirectory: string, template: ClarifyTemplate): string {\n return resolve(templatesDirectory, template)\n}\n\nexport function renderTemplate(content: string, variables: TemplateVariables): string {\n return content.replaceAll('{{contentDir}}', variables.contentDir)\n}\n\nexport function toTemplateTargetPath(relativePath: string, contentDir: string): string {\n return relativePath.replace(/^source(?=\\/|$)/, contentDir)\n}\n\nexport function copyTemplateDirectory(templateDirectory: string, targetDirectory: string, options: TemplateCopyOptions): TemplateCopyResult {\n const created: string[] = []\n const variables = {\n contentDir: options.contentDir,\n ...options.variables,\n }\n\n if (options.force !== true) {\n const conflicts = findTemplateConflicts(templateDirectory, targetDirectory, options.contentDir)\n if (conflicts.length > 0) throw new TemplateConflictError(conflicts)\n }\n\n copyDirectory(templateDirectory, templateDirectory, targetDirectory, options.contentDir, variables, created)\n\n return { created }\n}\n\nfunction findTemplateConflicts(templateDirectory: string, targetDirectory: string, contentDir: string): string[] {\n const conflicts: string[] = []\n collectTemplateConflicts(templateDirectory, templateDirectory, targetDirectory, contentDir, conflicts)\n return conflicts\n}\n\nfunction collectTemplateConflicts(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, conflicts: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n collectTemplateConflicts(templateDirectory, sourcePath, targetDirectory, contentDir, conflicts)\n continue\n }\n\n if (entry.isFile() && existsSync(targetPath)) conflicts.push(targetRelativePath)\n }\n}\n\nfunction copyDirectory(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, variables: TemplateVariables, created: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n copyDirectory(templateDirectory, sourcePath, targetDirectory, contentDir, variables, created)\n continue\n }\n\n if (!entry.isFile()) continue\n\n const content = renderTemplate(readFileSync(sourcePath, 'utf-8'), variables)\n mkdirSync(dirname(targetPath), { recursive: true })\n writeFileSync(targetPath, content, 'utf-8')\n created.push(targetRelativePath)\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, relative, resolve } from 'node:path'\n\nexport const supportedTemplates = ['minimal', 'standard', 'complete'] as const\n\nexport type ClarifyTemplate = typeof supportedTemplates[number]\n\nexport type TemplateVariables = {\n contentDir: string\n}\n\nexport type TemplateCopyOptions = {\n contentDir: string\n force?: boolean\n variables?: Partial<TemplateVariables>\n}\n\nexport type TemplateCopyResult = {\n created: string[]\n}\n\nexport class TemplateConflictError extends Error {\n constructor(public readonly conflicts: string[]) {\n super(`[clarify] Init target has conflicting files:\\n${conflicts.map(file => ` - ${file}`).join('\\n')}\\nUse --force to overwrite them.`)\n this.name = 'TemplateConflictError'\n }\n}\n\nexport function resolveTemplate(template?: string): ClarifyTemplate {\n const selectedTemplate = template ?? 'standard'\n if (supportedTemplates.includes(selectedTemplate as ClarifyTemplate)) return selectedTemplate as ClarifyTemplate\n throw new Error(`[clarify] Unknown template \"${selectedTemplate}\". Available templates: ${supportedTemplates.join(', ')}.`)\n}\n\nexport function getTemplateDirectory(templatesDirectory: string, template: ClarifyTemplate): string {\n return resolve(templatesDirectory, template)\n}\n\nexport function renderTemplate(content: string, variables: TemplateVariables): string {\n return content.replaceAll('{{contentDir}}', variables.contentDir)\n}\n\nexport function toTemplateTargetPath(relativePath: string, contentDir: string): string {\n return relativePath.replace(/^source(?=\\/|$)/, contentDir)\n}\n\nexport function copyTemplateDirectory(templateDirectory: string, targetDirectory: string, options: TemplateCopyOptions): TemplateCopyResult {\n const created: string[] = []\n const variables = {\n contentDir: options.contentDir,\n ...options.variables,\n }\n\n if (options.force !== true) {\n const conflicts = findTemplateConflicts(templateDirectory, targetDirectory, options.contentDir)\n if (conflicts.length > 0) throw new TemplateConflictError(conflicts)\n }\n\n copyDirectory(templateDirectory, templateDirectory, targetDirectory, options.contentDir, variables, created)\n\n return { created }\n}\n\nfunction findTemplateConflicts(templateDirectory: string, targetDirectory: string, contentDir: string): string[] {\n const conflicts: string[] = []\n collectTemplateConflicts(templateDirectory, templateDirectory, targetDirectory, contentDir, conflicts)\n return conflicts\n}\n\nfunction collectTemplateConflicts(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, conflicts: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n collectTemplateConflicts(templateDirectory, sourcePath, targetDirectory, contentDir, conflicts)\n continue\n }\n\n if (entry.isFile() && existsSync(targetPath)) conflicts.push(targetRelativePath)\n }\n}\n\nfunction copyDirectory(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, variables: TemplateVariables, created: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n copyDirectory(templateDirectory, sourcePath, targetDirectory, contentDir, variables, created)\n continue\n }\n\n if (!entry.isFile()) continue\n\n const content = renderTemplate(readFileSync(sourcePath, 'utf-8'), variables)\n mkdirSync(dirname(targetPath), { recursive: true })\n writeFileSync(targetPath, content, 'utf-8')\n created.push(targetRelativePath)\n }\n}\n"],"mappings":";;;AAGA,IAAa,qBAAqB;CAAC;CAAW;CAAY;AAAU;AAkBpE,IAAa,wBAAb,cAA2C,MAAM;CACnB;CAA5B,YAAY,WAAqC;EAC/C,MAAM,iDAAiD,UAAU,KAAI,SAAQ,OAAO,MAAM,EAAE,KAAK,IAAI,EAAE,iCAAiC;EAD9G,KAAA,YAAA;EAE1B,KAAK,OAAO;CACd;AACF;AAEA,SAAgB,gBAAgB,UAAoC;CAClE,MAAM,mBAAmB,YAAY;CACrC,IAAI,mBAAmB,SAAS,gBAAmC,GAAG,OAAO;CAC7E,MAAM,IAAI,MAAM,+BAA+B,iBAAiB,0BAA0B,mBAAmB,KAAK,IAAI,EAAE,EAAE;AAC5H;AAEA,SAAgB,qBAAqB,oBAA4B,UAAmC;CAClG,OAAO,QAAQ,oBAAoB,QAAQ;AAC7C;AAEA,SAAgB,eAAe,SAAiB,WAAsC;CACpF,OAAO,QAAQ,WAAW,kBAAkB,UAAU,UAAU;AAClE;AAEA,SAAgB,qBAAqB,cAAsB,YAA4B;CACrF,OAAO,aAAa,QAAQ,mBAAmB,UAAU;AAC3D;AAEA,SAAgB,sBAAsB,mBAA2B,iBAAyB,SAAkD;CAC1I,MAAM,UAAoB,CAAC;CAC3B,MAAM,YAAY;EAChB,YAAY,QAAQ;EACpB,GAAG,QAAQ;CACb;CAEA,IAAI,QAAQ,UAAU,MAAM;EAC1B,MAAM,YAAY,sBAAsB,mBAAmB,iBAAiB,QAAQ,UAAU;EAC9F,IAAI,UAAU,SAAS,GAAG,MAAM,IAAI,sBAAsB,SAAS;CACrE;CAEA,cAAc,mBAAmB,mBAAmB,iBAAiB,QAAQ,YAAY,WAAW,OAAO;CAE3G,OAAO,EAAE,QAAQ;AACnB;AAEA,SAAS,sBAAsB,mBAA2B,iBAAyB,YAA8B;CAC/G,MAAM,YAAsB,CAAC;CAC7B,yBAAyB,mBAAmB,mBAAmB,iBAAiB,YAAY,SAAS;CACrG,OAAO;AACT;AAEA,SAAS,yBAAyB,mBAA2B,iBAAyB,iBAAyB,YAAoB,WAA2B;CAC5J,KAAK,MAAM,SAAS,YAAY,iBAAiB,EAAE,eAAe,KAAK,CAAC,GAAG;EACzE,MAAM,aAAa,QAAQ,iBAAiB,MAAM,IAAI;EAEtD,MAAM,qBAAqB,qBADA,SAAS,mBAAmB,UACP,GAAoB,UAAU;EAC9E,MAAM,aAAa,QAAQ,iBAAiB,kBAAkB;EAE9D,IAAI,MAAM,YAAY,GAAG;GACvB,yBAAyB,mBAAmB,YAAY,iBAAiB,YAAY,SAAS;GAC9F;EACF;EAEA,IAAI,MAAM,OAAO,KAAK,WAAW,UAAU,GAAG,UAAU,KAAK,kBAAkB;CACjF;AACF;AAEA,SAAS,cAAc,mBAA2B,iBAAyB,iBAAyB,YAAoB,WAA8B,SAAyB;CAC7K,KAAK,MAAM,SAAS,YAAY,iBAAiB,EAAE,eAAe,KAAK,CAAC,GAAG;EACzE,MAAM,aAAa,QAAQ,iBAAiB,MAAM,IAAI;EAEtD,MAAM,qBAAqB,qBADA,SAAS,mBAAmB,UACP,GAAoB,UAAU;EAC9E,MAAM,aAAa,QAAQ,iBAAiB,kBAAkB;EAE9D,IAAI,MAAM,YAAY,GAAG;GACvB,cAAc,mBAAmB,YAAY,iBAAiB,YAAY,WAAW,OAAO;GAC5F;EACF;EAEA,IAAI,CAAC,MAAM,OAAO,GAAG;EAErB,MAAM,UAAU,eAAe,aAAa,YAAY,OAAO,GAAG,SAAS;EAC3E,UAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;EAClD,cAAc,YAAY,SAAS,OAAO;EAC1C,QAAQ,KAAK,kBAAkB;CACjC;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, relative, resolve } from 'node:path'\n\nexport const supportedTemplates = ['minimal', 'standard', 'complete'] as const\n\nexport type ClarifyTemplate = typeof supportedTemplates[number]\n\nexport type TemplateVariables = {\n contentDir: string\n}\n\nexport type TemplateCopyOptions = {\n contentDir: string\n force?: boolean\n variables?: Partial<TemplateVariables>\n}\n\nexport type TemplateCopyResult = {\n created: string[]\n}\n\nexport class TemplateConflictError extends Error {\n constructor(public readonly conflicts: string[]) {\n super(`[clarify] Init target has conflicting files:\\n${conflicts.map(file => ` - ${file}`).join('\\n')}\\nUse --force to overwrite them.`)\n this.name = 'TemplateConflictError'\n }\n}\n\nexport function resolveTemplate(template?: string): ClarifyTemplate {\n const selectedTemplate = template ?? 'standard'\n if (supportedTemplates.includes(selectedTemplate as ClarifyTemplate)) return selectedTemplate as ClarifyTemplate\n throw new Error(`[clarify] Unknown template \"${selectedTemplate}\". Available templates: ${supportedTemplates.join(', ')}.`)\n}\n\nexport function getTemplateDirectory(templatesDirectory: string, template: ClarifyTemplate): string {\n return resolve(templatesDirectory, template)\n}\n\nexport function renderTemplate(content: string, variables: TemplateVariables): string {\n return content.replaceAll('{{contentDir}}', variables.contentDir)\n}\n\nexport function toTemplateTargetPath(relativePath: string, contentDir: string): string {\n return relativePath.replace(/^source(?=\\/|$)/, contentDir)\n}\n\nexport function copyTemplateDirectory(templateDirectory: string, targetDirectory: string, options: TemplateCopyOptions): TemplateCopyResult {\n const created: string[] = []\n const variables = {\n contentDir: options.contentDir,\n ...options.variables,\n }\n\n if (options.force !== true) {\n const conflicts = findTemplateConflicts(templateDirectory, targetDirectory, options.contentDir)\n if (conflicts.length > 0) throw new TemplateConflictError(conflicts)\n }\n\n copyDirectory(templateDirectory, templateDirectory, targetDirectory, options.contentDir, variables, created)\n\n return { created }\n}\n\nfunction findTemplateConflicts(templateDirectory: string, targetDirectory: string, contentDir: string): string[] {\n const conflicts: string[] = []\n collectTemplateConflicts(templateDirectory, templateDirectory, targetDirectory, contentDir, conflicts)\n return conflicts\n}\n\nfunction collectTemplateConflicts(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, conflicts: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n collectTemplateConflicts(templateDirectory, sourcePath, targetDirectory, contentDir, conflicts)\n continue\n }\n\n if (entry.isFile() && existsSync(targetPath)) conflicts.push(targetRelativePath)\n }\n}\n\nfunction copyDirectory(templateDirectory: string, sourceDirectory: string, targetDirectory: string, contentDir: string, variables: TemplateVariables, created: string[]): void {\n for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {\n const sourcePath = resolve(sourceDirectory, entry.name)\n const sourceRelativePath = relative(templateDirectory, sourcePath)\n const targetRelativePath = toTemplateTargetPath(sourceRelativePath, contentDir)\n const targetPath = resolve(targetDirectory, targetRelativePath)\n\n if (entry.isDirectory()) {\n copyDirectory(templateDirectory, sourcePath, targetDirectory, contentDir, variables, created)\n continue\n }\n\n if (!entry.isFile()) continue\n\n const content = renderTemplate(readFileSync(sourcePath, 'utf-8'), variables)\n mkdirSync(dirname(targetPath), { recursive: true })\n writeFileSync(targetPath, content, 'utf-8')\n created.push(targetRelativePath)\n }\n}\n"],"mappings":";;;AAGA,IAAa,qBAAqB;CAAC;CAAW;CAAY;AAAU;AAkBpE,IAAa,wBAAb,cAA2C,MAAM;CACnB;CAA5B,YAAY,WAAqC;EAC/C,MAAM,iDAAiD,UAAU,KAAI,SAAQ,OAAO,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,iCAAiC;EAD9G,KAAA,YAAA;EAE1B,KAAK,OAAO;CACd;AACF;AAEA,SAAgB,gBAAgB,UAAoC;CAClE,MAAM,mBAAmB,YAAY;CACrC,IAAI,mBAAmB,SAAS,gBAAmC,GAAG,OAAO;CAC7E,MAAM,IAAI,MAAM,+BAA+B,iBAAiB,0BAA0B,mBAAmB,KAAK,IAAI,EAAE,EAAE;AAC5H;AAEA,SAAgB,qBAAqB,oBAA4B,UAAmC;CAClG,OAAO,QAAQ,oBAAoB,QAAQ;AAC7C;AAEA,SAAgB,eAAe,SAAiB,WAAsC;CACpF,OAAO,QAAQ,WAAW,kBAAkB,UAAU,UAAU;AAClE;AAEA,SAAgB,qBAAqB,cAAsB,YAA4B;CACrF,OAAO,aAAa,QAAQ,mBAAmB,UAAU;AAC3D;AAEA,SAAgB,sBAAsB,mBAA2B,iBAAyB,SAAkD;CAC1I,MAAM,UAAoB,CAAC;CAC3B,MAAM,YAAY;EAChB,YAAY,QAAQ;EACpB,GAAG,QAAQ;CACb;CAEA,IAAI,QAAQ,UAAU,MAAM;EAC1B,MAAM,YAAY,sBAAsB,mBAAmB,iBAAiB,QAAQ,UAAU;EAC9F,IAAI,UAAU,SAAS,GAAG,MAAM,IAAI,sBAAsB,SAAS;CACrE;CAEA,cAAc,mBAAmB,mBAAmB,iBAAiB,QAAQ,YAAY,WAAW,OAAO;CAE3G,OAAO,EAAE,QAAQ;AACnB;AAEA,SAAS,sBAAsB,mBAA2B,iBAAyB,YAA8B;CAC/G,MAAM,YAAsB,CAAC;CAC7B,yBAAyB,mBAAmB,mBAAmB,iBAAiB,YAAY,SAAS;CACrG,OAAO;AACT;AAEA,SAAS,yBAAyB,mBAA2B,iBAAyB,iBAAyB,YAAoB,WAA2B;CAC5J,KAAK,MAAM,SAAS,YAAY,iBAAiB,EAAE,eAAe,KAAK,CAAC,GAAG;EACzE,MAAM,aAAa,QAAQ,iBAAiB,MAAM,IAAI;EAEtD,MAAM,qBAAqB,qBADA,SAAS,mBAAmB,UACP,GAAoB,UAAU;EAC9E,MAAM,aAAa,QAAQ,iBAAiB,kBAAkB;EAE9D,IAAI,MAAM,YAAY,GAAG;GACvB,yBAAyB,mBAAmB,YAAY,iBAAiB,YAAY,SAAS;GAC9F;EACF;EAEA,IAAI,MAAM,OAAO,KAAK,WAAW,UAAU,GAAG,UAAU,KAAK,kBAAkB;CACjF;AACF;AAEA,SAAS,cAAc,mBAA2B,iBAAyB,iBAAyB,YAAoB,WAA8B,SAAyB;CAC7K,KAAK,MAAM,SAAS,YAAY,iBAAiB,EAAE,eAAe,KAAK,CAAC,GAAG;EACzE,MAAM,aAAa,QAAQ,iBAAiB,MAAM,IAAI;EAEtD,MAAM,qBAAqB,qBADA,SAAS,mBAAmB,UACP,GAAoB,UAAU;EAC9E,MAAM,aAAa,QAAQ,iBAAiB,kBAAkB;EAE9D,IAAI,MAAM,YAAY,GAAG;GACvB,cAAc,mBAAmB,YAAY,iBAAiB,YAAY,WAAW,OAAO;GAC5F;EACF;EAEA,IAAI,CAAC,MAAM,OAAO,GAAG;EAErB,MAAM,UAAU,eAAe,aAAa,YAAY,OAAO,GAAG,SAAS;EAC3E,UAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;EAClD,cAAc,YAAY,SAAS,OAAO;EAC1C,QAAQ,KAAK,kBAAkB;CACjC;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clarify-labs/templates",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "type": "module",
6
6
  "repository": {
@@ -34,9 +34,9 @@
34
34
  "typecheck": "tsc -p tsconfig.json --noEmit"
35
35
  },
36
36
  "devDependencies": {
37
- "@types/node": "^24.0.0",
38
- "typescript": "^5.8.3",
39
- "vite": "^8.0.15",
40
- "vite-plugin-dts": "^4.5.4"
37
+ "@types/node": "^26.1.1",
38
+ "typescript": "^6.0.3",
39
+ "vite": "^8.1.4",
40
+ "vite-plugin-dts": "^5.0.3"
41
41
  }
42
42
  }