From fc7283cd454c3bcec3e3f834ff119a371b1f4f06 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 18 Oct 2024 19:50:38 +0200 Subject: [PATCH] chore: wip --- bin/cli.ts | 9 +++++---- build.ts | 3 ++- bun.lockb | Bin 202501 -> 203473 bytes eslint.config.js | 4 ++-- package.json | 32 ++------------------------------ pkgx.yaml | 2 +- scripts/generate-dts.ts | 2 +- scripts/generate-output.ts | 2 +- src/extract.ts | 23 +++++++++++++---------- src/generate.ts | 17 ++++++++++------- src/utils.ts | 17 ++++++++++------- test/dts.test.ts | 9 +++++---- 12 files changed, 52 insertions(+), 68 deletions(-) diff --git a/bin/cli.ts b/bin/cli.ts index fafeba8..5aa7e19 100644 --- a/bin/cli.ts +++ b/bin/cli.ts @@ -1,8 +1,8 @@ +import type { DtsGenerationConfig, DtsGenerationOption } from '../src/types' +import { resolve } from 'node:path' import { CAC } from '@stacksjs/cli' import { version } from '../package.json' import { generate } from '../src/generate' -import type { DtsGenerationOption, DtsGenerationConfig } from '../src/types' -import { resolve } from 'node:path' const cli = new CAC('dtsx') @@ -22,7 +22,7 @@ cli .option('--root ', 'Root directory of the project', { default: defaultOptions.root }) .option('--entrypoints ', 'Entry point files (comma-separated)', { default: defaultOptions.entrypoints?.join(','), - type: [String] + type: [String], }) .option('--outdir ', 'Output directory for generated .d.ts files', { default: defaultOptions.outdir }) .option('--keep-comments', 'Keep comments in generated .d.ts files', { default: defaultOptions.keepComments }) @@ -48,7 +48,8 @@ cli // } await generate(config) - } catch (error) { + } + catch (error) { console.error('Error generating .d.ts files:', error) process.exit(1) } diff --git a/build.ts b/build.ts index 8e28219..5df2d4d 100644 --- a/build.ts +++ b/build.ts @@ -13,7 +13,8 @@ await Bun.build({ try { await generateDeclarationsFromFiles() console.log('Generated declarations') -} catch (error) { +} +catch (error) { console.error('Error generating declarations:', error) } diff --git a/bun.lockb b/bun.lockb index a721972a6a7f05c36932e1a06bef12f8fbe5ddc6..a4a2aea72fba12472cb615553603a0542bda4298 100755 GIT binary patch delta 40617 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 KA}w6;bpHbna6R(? delta 40388 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ⅆ-n(aq6iErQyCDXx!&9VJ-a4N1>^!2W8Cm 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�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.1.3", - "@stacksjs/storage": "^0.66.0", - "@stylistic/eslint-plugin": "^2.9.0", + "@stacksjs/eslint-config": "^3.8.1-beta.2", "@types/bun": "^1.1.11", - "@typescript-eslint/eslint-plugin": "^8.10.0", - "@typescript-eslint/parser": "^8.10.0", - "@vitest/eslint-plugin": "^1.1.7", "c12": "^2.0.1", - "eslint": "^9.12.0", - "eslint-config-flat-gitignore": "^0.3.0", - "eslint-flat-config-utils": "^0.4.0", - "eslint-merge-processors": "^0.1.0", - "eslint-plugin-antfu": "^2.7.0", - "eslint-plugin-command": "^0.2.6", - "eslint-plugin-format": ">=0.1.2", - "eslint-plugin-import-x": "^4.3.1", - "eslint-plugin-jsdoc": "^50.4.3", - "eslint-plugin-jsonc": "^2.16.0", - "eslint-plugin-n": "^17.11.1", - "eslint-plugin-no-only-tests": "^3.3.0", - "eslint-plugin-perfectionist": "^3.9.1", - "eslint-plugin-regexp": "^2.6.0", - "eslint-plugin-toml": "^0.11.1", - "eslint-plugin-unicorn": "^55.0.0", - "eslint-plugin-unused-imports": "^4.1.4", - "eslint-plugin-yml": "^1.14.0", - "local-pkg": "^0.5.0", "neverthrow": "^8.0.0", "tinyglobby": "^0.2.9", "vitepress": "^1.4.1" diff --git a/pkgx.yaml b/pkgx.yaml index b51a299..587759a 100644 --- a/pkgx.yaml +++ b/pkgx.yaml @@ -1,2 +1,2 @@ dependencies: - bun.sh: ^1.1.30 + bun.sh: ^1.1.31 diff --git a/scripts/generate-dts.ts b/scripts/generate-dts.ts index feb5db5..a5b519c 100644 --- a/scripts/generate-dts.ts +++ b/scripts/generate-dts.ts @@ -1,4 +1,4 @@ -import path from 'path' +import path from 'node:path' import { generate } from '../src' console.log('Generating output...', path.join(__dirname, '..')) diff --git a/scripts/generate-output.ts b/scripts/generate-output.ts index 4977c0f..3327d34 100644 --- a/scripts/generate-output.ts +++ b/scripts/generate-output.ts @@ -1,4 +1,4 @@ -import path from 'path' +import path from 'node:path' import { generate } from '../src' console.log('Generating output...', path.join(__dirname, '..')) diff --git a/src/extract.ts b/src/extract.ts index 85c5381..7ddbda1 100644 --- a/src/extract.ts +++ b/src/extract.ts @@ -4,8 +4,8 @@ import { formatComment, formatDeclarations } from './utils' export async function extractTypeFromSource(filePath: string): Promise { const fileContent = await readFile(filePath, 'utf-8') let declarations = '' - let usedTypes = new Set() - let importMap = new Map>() + const usedTypes = new Set() + const importMap = new Map>() // Handle re-exports const reExportRegex = /export\s*(?:\*|\{[^}]*\})\s*from\s*['"]([^'"]+)['"]/g @@ -25,7 +25,7 @@ export async function extractTypeFromSource(filePath: string): Promise { const processImports = (imports: string | undefined, isType: boolean) => { if (imports) { - const types = imports.replace(/[{}]/g, '').split(',').map(t => { + const types = imports.replace(/[{}]/g, '').split(',').map((t) => { const [name, alias] = t.split(' as ').map(s => s.trim()) return { name: name.replace(/^type\s+/, ''), alias: alias || name.replace(/^type\s+/, '') } }) @@ -37,12 +37,14 @@ export async function extractTypeFromSource(filePath: string): Promise { processImports(namedImports1, !!isTypeImport) processImports(namedImports2, !!isTypeImport) - if (defaultImport1) importMap.get(from)!.add(defaultImport1) - if (defaultImport2) importMap.get(from)!.add(defaultImport2) + if (defaultImport1) + importMap.get(from)!.add(defaultImport1) + if (defaultImport2) + importMap.get(from)!.add(defaultImport2) } // Handle exports with comments - const exportRegex = /(\/\*\*[\s\S]*?\*\/\s*)?(export\s+(?:async\s+)?(?:function|const|let|var|class|interface|type)\s+\w+[\s\S]*?)(?=\n\s*(?:\/\*\*|export|$))/g; + const exportRegex = /(\/\*\*[\s\S]*?\*\/\s*)?(export\s+(?:async\s+)?(?:function|const|let|var|class|interface|type)\s+\w[\s\S]*?)(?=\n\s*(?:\/\*\*|export|$))/g let match while ((match = exportRegex.exec(fileContent)) !== null) { const [, comment, exportStatement] = match @@ -54,13 +56,14 @@ export async function extractTypeFromSource(filePath: string): Promise { const functionSignature = formattedExport.match(/^.*?\)/) if (functionSignature) { let params = functionSignature[0].slice(functionSignature[0].indexOf('(') + 1, -1) - params = params.replace(/\s*=\s*[^,)]+/g, '') // Remove default values + params = params.replace(/\s*=[^,)]+/g, '') // Remove default values const returnType = formattedExport.match(/\):\s*([^{]+)/) formattedExport = `export declare function ${formattedExport.split('function')[1].split('(')[0].trim()}(${params})${returnType ? `: ${returnType[1].trim()}` : ''};` } - } else if (formattedExport.startsWith('export const') || formattedExport.startsWith('export let') || formattedExport.startsWith('export var')) { + } + else if (formattedExport.startsWith('export const') || formattedExport.startsWith('export let') || formattedExport.startsWith('export var')) { formattedExport = formattedExport.replace(/^export\s+(const|let|var)/, 'export declare $1') - formattedExport = formattedExport.split('=')[0].trim() + ';' + formattedExport = `${formattedExport.split('=')[0].trim()};` } declarations += `${formattedComment}\n${formattedExport}\n\n` @@ -83,7 +86,7 @@ export async function extractTypeFromSource(filePath: string): Promise { }) if (importDeclarations) { - declarations = importDeclarations + '\n' + declarations + declarations = `${importDeclarations}\n${declarations}` } // Apply final formatting diff --git a/src/generate.ts b/src/generate.ts index b968e90..64398b0 100644 --- a/src/generate.ts +++ b/src/generate.ts @@ -1,10 +1,10 @@ import type { DtsGenerationConfig, DtsGenerationOption } from './types' -import { rm, mkdir } from 'node:fs/promises' -import { join, relative, dirname, parse } from 'node:path' +import { mkdir, rm } from 'node:fs/promises' +import { dirname, join, parse, relative } from 'node:path' +import { glob } from 'tinyglobby' import { config } from './config' -import { writeToFile, getAllTypeScriptFiles, checkIsolatedDeclarations } from './utils' import { extractTypeFromSource } from './extract' -import { glob } from 'tinyglobby' +import { checkIsolatedDeclarations, getAllTypeScriptFiles, writeToFile } from './utils' export async function generateDeclarationsFromFiles(options?: DtsGenerationConfig): Promise { // console.log('Generating declaration files...', options) @@ -24,7 +24,8 @@ export async function generateDeclarationsFromFiles(options?: DtsGenerationConfi let files: string[] if (options?.entrypoints) { files = await glob(options.entrypoints, { cwd: options.root ?? options.cwd, absolute: true }) - } else { + } + else { files = await getAllTypeScriptFiles(options?.root) } @@ -46,13 +47,15 @@ export async function generateDeclarationsFromFiles(options?: DtsGenerationConfi await writeToFile(outputPath, fileDeclarations) // console.log(`Generated ${outputPath}`) - } else { + } + else { console.warn(`No declarations extracted for ${file}`) } } // console.log('Declaration file generation complete') - } catch (error) { + } + catch (error) { console.error('Error generating declarations:', error) } } diff --git a/src/utils.ts b/src/utils.ts index 527ea84..586d4b1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,7 +1,7 @@ +import type { DtsGenerationConfig } from './types' import { readdir, readFile } from 'node:fs/promises' import { extname, join } from 'node:path' import { config } from './config' -import { type DtsGenerationConfig } from './types' export async function writeToFile(filePath: string, content: string): Promise { await Bun.write(filePath, content) @@ -26,14 +26,15 @@ export async function checkIsolatedDeclarations(options?: DtsGenerationConfig): const tsconfig = JSON.parse(tsconfigContent) return tsconfig.compilerOptions?.isolatedDeclarations === true - } catch (error) { + } + catch (error) { return false } } export function formatDeclarations(declarations: string): string { const lines = declarations.split('\n') - const formattedLines = lines.map(line => { + const formattedLines = lines.map((line) => { // Trim trailing spaces line = line.trimEnd() @@ -61,20 +62,22 @@ export function formatDeclarations(declarations: string): string { result = result.replace(/\/\*\*\n([^*]*)(\n \*\/)/g, (match, content) => { const formattedContent = content .split('\n') - .map((line: string) => ` *${line.trim() ? ' ' + line.trim() : ''}`) + .map((line: string) => ` *${line.trim() ? ` ${line.trim()}` : ''}`) .join('\n') return `/**\n${formattedContent}\n */` }) - return result.trim() + '\n' + return `${result.trim()}\n` } export function formatComment(comment: string): string { const lines = comment.split('\n') return lines .map((line, index) => { - if (index === 0) return '/**' - if (index === lines.length - 1) return ' */' + if (index === 0) + return '/**' + if (index === lines.length - 1) + return ' */' const trimmedLine = line.replace(/^\s*\*?\s?/, '').trim() return ` * ${trimmedLine}` }) diff --git a/test/dts.test.ts b/test/dts.test.ts index d3260bc..e9f2966 100644 --- a/test/dts.test.ts +++ b/test/dts.test.ts @@ -1,8 +1,8 @@ -import { describe, it, expect, afterEach } from 'bun:test' -import { join } from 'node:path' -import { generate } from '../src/generate' import type { DtsGenerationOption } from '../src/types' +import { afterEach, describe, expect, it } from 'bun:test' import { rm } from 'node:fs/promises' +import { join } from 'node:path' +import { generate } from '../src/generate' describe('dts-generation', () => { const testDir = join(__dirname, '../fixtures') @@ -119,7 +119,8 @@ describe('dts-generation', () => { // Clean up generated files try { await rm(generatedDir, { recursive: true, force: true }) - } catch (error) { + } + catch (error) { console.error('Error cleaning up generated files:', error) } })