From da24c95608e4e37937dbdb0dd935c9356393e0f9 Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Mon, 17 Jul 2023 15:00:54 +0200 Subject: [PATCH] fix: cspell-tools: fix init option output (#4650) --- packages/cspell-tools/src/compile.test.ts | 35 ++++++++++++- packages/cspell-tools/src/compile.ts | 5 +- .../createCompileRequest.test.ts.snap | 52 +++++++++++++++++++ .../src/compiler/createCompileRequest.test.ts | 21 ++++---- .../src/compiler/createCompileRequest.ts | 39 +++++++++++--- 5 files changed, 132 insertions(+), 20 deletions(-) diff --git a/packages/cspell-tools/src/compile.test.ts b/packages/cspell-tools/src/compile.test.ts index 263a43a7c7d..babcd0c3305 100644 --- a/packages/cspell-tools/src/compile.test.ts +++ b/packages/cspell-tools/src/compile.test.ts @@ -2,7 +2,7 @@ import { writeFile } from 'node:fs/promises'; import { describe, expect, test, vi } from 'vitest'; -import { processCompileAction } from './compile.js'; +import { configFileHeader, processCompileAction } from './compile.js'; vi.mock('node:fs/promises', () => ({ writeFile: vi.fn().mockImplementation(() => Promise.resolve(undefined)), @@ -22,7 +22,9 @@ describe('compile', () => { listFile: ['source-files.txt'], init: true, }; - const expected = `\ + const expected = + configFileHeader + + `\ targets: - name: public-licenses targetDirectory: . @@ -31,6 +33,35 @@ targets: sources: - listFile: source-files.txt sort: true +`; + await processCompileAction([], options, undefined); + expect(mockWriteFile).toHaveBeenLastCalledWith('cspell-tools.config.yaml', expected); + }); + + test('--init option', async () => { + const options = { + compress: false, + trie3: true, + experimental: ['compound'], + sort: true, + merge: 'nl-nl', + output: '.', + listFile: ['src\\source-files.txt'], + init: true, + max_depth: '5', + }; + const expected = + configFileHeader + + `\ +targets: + - name: nl-nl + targetDirectory: . + compress: false + format: trie3 + sources: + - listFile: src/source-files.txt + generateNonStrict: true +maxDepth: 5 `; await processCompileAction([], options, undefined); expect(mockWriteFile).toHaveBeenLastCalledWith('cspell-tools.config.yaml', expected); diff --git a/packages/cspell-tools/src/compile.ts b/packages/cspell-tools/src/compile.ts index 97df3614b35..57c0c33dfa4 100644 --- a/packages/cspell-tools/src/compile.ts +++ b/packages/cspell-tools/src/compile.ts @@ -15,6 +15,9 @@ getSystemFeatureFlags().register('compound', 'Enable compound dictionary sources const defaultConfigFile = 'cspell-tools.config.yaml'; +export const configFileHeader = + '# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/packages/cspell-tools/cspell-tools.config.schema.json\n\n'; + export async function processCompileAction( src: string[], options: CompileCommonAppOptions, @@ -50,7 +53,7 @@ async function useCompile(src: string[], options: CompileCommonAppOptions): Prom } async function initConfig(request: CompileRequest): Promise { - const content = YAML.stringify(request, null, 2); + const content = configFileHeader + YAML.stringify(request, null, 2); console.log('Writing config file: %s', defaultConfigFile); await writeFile(defaultConfigFile, content); diff --git a/packages/cspell-tools/src/compiler/__snapshots__/createCompileRequest.test.ts.snap b/packages/cspell-tools/src/compiler/__snapshots__/createCompileRequest.test.ts.snap index ddf08ade540..f9839f493c2 100644 --- a/packages/cspell-tools/src/compiler/__snapshots__/createCompileRequest.test.ts.snap +++ b/packages/cspell-tools/src/compiler/__snapshots__/createCompileRequest.test.ts.snap @@ -117,3 +117,55 @@ exports[`createCompileRequest > createCompileRequest 7`] = ` ], } `; + +exports[`createCompileRequest > createCompileRequest 8`] = ` +{ + "targets": [ + { + "compress": false, + "format": "plaintext", + "name": "company-words", + "sources": [ + "src/c-words.txt", + ], + "targetDirectory": ".", + }, + ], +} +`; + +exports[`createCompileRequest > createCompileRequest 9`] = ` +{ + "targets": [ + { + "compress": false, + "format": "plaintext", + "name": "python", + "sources": [ + { + "listFile": "src/source-files.txt", + }, + ], + "targetDirectory": ".", + }, + ], +} +`; + +exports[`createCompileRequest > createCompileRequest 10`] = ` +{ + "targets": [ + { + "compress": false, + "format": "plaintext", + "name": "python", + "sources": [ + { + "filename": "src/python.txt", + }, + ], + "targetDirectory": ".", + }, + ], +} +`; diff --git a/packages/cspell-tools/src/compiler/createCompileRequest.test.ts b/packages/cspell-tools/src/compiler/createCompileRequest.test.ts index e4da45c4752..2d9839c1739 100644 --- a/packages/cspell-tools/src/compiler/createCompileRequest.test.ts +++ b/packages/cspell-tools/src/compiler/createCompileRequest.test.ts @@ -5,18 +5,21 @@ import { createCompileRequest } from './createCompileRequest.js'; describe('createCompileRequest', () => { test.each` - source | options - ${[]} | ${comp()} - ${['src/words.txt']} | ${comp()} - ${['src/words.txt', 'src/cities.txt']} | ${comp({ output: 'out' })} - ${['src/words.txt', 'src/cities.txt']} | ${comp({ output: 'out', merge: 'combo' })} - ${[]} | ${comp({ listFile: ['python-sources.txt'] })} - ${[]} | ${comp({ listFile: ['python-sources.txt'], output: 'python' })} - ${[]} | ${comp({ listFile: ['python-sources.txt'], merge: 'python' })} + source | options + ${[]} | ${comp()} + ${['src/words.txt']} | ${comp()} + ${['src/words.txt', 'src/cities.txt']} | ${comp({ output: 'out' })} + ${['src/words.txt', 'src/cities.txt']} | ${comp({ output: 'out', merge: 'combo' })} + ${[]} | ${comp({ listFile: ['python-sources.txt'] })} + ${[]} | ${comp({ listFile: ['python-sources.txt'], output: 'python' })} + ${[]} | ${comp({ listFile: ['python-sources.txt'], merge: 'python' })} + ${['src\\c-words.txt']} | ${comp({ merge: 'company-words' })} + ${[{ listFile: 'src\\source-files.txt' }]} | ${comp({ merge: 'python' })} + ${[{ filename: 'src\\python.txt' }]} | ${comp({ merge: 'python' })} `('createCompileRequest', ({ source, options }) => { const req = createCompileRequest(source, options); // Make sure the test passes on Windows. - const reqClean = JSON.parse(JSON.stringify(req, null, 2).replace(/\\\\/g, '/')); + const reqClean = JSON.parse(JSON.stringify(req, null, 2) /* .replace(/\\\\/g, '/') */); expect(reqClean).toMatchSnapshot(); }); }); diff --git a/packages/cspell-tools/src/compiler/createCompileRequest.ts b/packages/cspell-tools/src/compiler/createCompileRequest.ts index eeab8e6d325..296521a8ad8 100644 --- a/packages/cspell-tools/src/compiler/createCompileRequest.ts +++ b/packages/cspell-tools/src/compiler/createCompileRequest.ts @@ -4,17 +4,18 @@ import type { CompileCommonAppOptions } from '../AppOptions.js'; import type { CompileRequest, DictionaryFormats, DictionarySource, FileSource, Target } from '../config/index.js'; export function createCompileRequest(sourceFiles: string[], options: CompileCommonAppOptions): CompileRequest { - const { max_depth, maxDepth, experimental = [], split, keepRawCase, useLegacySplitter } = options; + options = { ...options }; + options.maxDepth ??= options.max_depth; + + const { maxDepth, split, keepRawCase, useLegacySplitter } = options; const sources: DictionarySource[] = [...sourceFiles, ...(options.listFile || []).map((listFile) => ({ listFile }))]; const targets = calcTargets(sources, options); - const generateNonStrict = experimental.includes('compound') || undefined; const req: CompileRequest = { targets, - generateNonStrict, - maxDepth: parseNumber(maxDepth) ?? parseNumber(max_depth), + maxDepth: parseNumber(maxDepth), split: useLegacySplitter ? 'legacy' : split, /** * Do not generate lower case / accent free versions of words. @@ -25,10 +26,16 @@ export function createCompileRequest(sourceFiles: string[], options: CompileComm return req; } + function calcTargets(sources: DictionarySource[], options: CompileCommonAppOptions): Target[] { - const { merge, output = '.' } = options; + const { merge, output = '.', experimental = [] } = options; + + const generateNonStrict = experimental.includes('compound') || undefined; + + // console.log('%o', sources); const format = calcFormat(options); + const sort = (format === 'plaintext' && options.sort) || undefined; if (merge) { const target: Target = { @@ -36,9 +43,10 @@ function calcTargets(sources: DictionarySource[], options: CompileCommonAppOptio targetDirectory: output, compress: options.compress, format, - sources, - sort: options.sort, + sources: sources.map(normalizeSource), + sort, trieBase: parseNumber(options.trieBase), + generateNonStrict, }; return [target]; } @@ -50,9 +58,10 @@ function calcTargets(sources: DictionarySource[], options: CompileCommonAppOptio targetDirectory: output, compress: options.compress, format, - sources: [source], + sources: [normalizeSource(source)], sort: options.sort, trieBase: parseNumber(options.trieBase), + generateNonStrict, }; return target; }); @@ -79,3 +88,17 @@ function baseNameOfSource(source: DictionarySource): string { function isFileSource(source: DictionarySource): source is FileSource { return typeof source !== 'string' && (source).filename !== undefined; } + +function normalizeSource(source: DictionarySource): DictionarySource { + if (typeof source === 'string') { + return normalizeSourcePath(source); + } + if (isFileSource(source)) return { ...source, filename: normalizeSourcePath(source.filename) }; + return { ...source, listFile: normalizeSourcePath(source.listFile) }; +} + +function normalizeSourcePath(source: string): string { + const cwd = process.cwd(); + const rel = path.relative(cwd, source); + return rel.split('\\').join('/'); +}