vscode encontrar Los archivos no devuelven nada pero npm glob devuelve los resultados correctos

Estoy escribiendo y vscode extension en la que necesito una lista de los archivos de prueba dentro del espacio de trabajo.

Para encontrar los archivos de prueba que estoy usando el predeterminado testMatch de la jest.config.js que es:

[
    '**/__tests__/**/*.[jt]s?(x)',
    '**/?(*.)+(spec|test).[jt]s?(x)'
]

Mi problema es que vscode.workspace.findFiles devuelve la matriz vacía y no puedo configurarlo para obtener resultados correctos, pero usando Glob empaquetar la salida es correcta.

    protected async findTestFiles(
        matchTestsGlobPatterns: string[]
    ): Promise {
        const testFilesUris: vscode.Uri[] = [];
        const glob_testFilesUris: vscode.Uri[] = [];
        const { name: workspaceName, workspaceFolders } = vscode.workspace;
        if (workspaceName === undefined || workspaceFolders === undefined) {
            throw new Error(`No active workspace${!workspaceFolders ? ' folders' : ''}.`);
        }
        for (let folderIdx = 0; folderIdx < workspaceFolders.length; folderIdx++) {
            const folder = workspaceFolders[folderIdx];

            // - by vscode.workspace.findFiles
            for (let patternIdx = 0; patternIdx < matchTestsGlobPatterns.length; patternIdx++) {
                const currentPattern = matchTestsGlobPatterns[patternIdx];
                const pattern = new vscode.RelativePattern(
                    folder.uri.fsPath,
                    currentPattern
                );
                const files = await vscode.workspace.findFiles(
                    pattern,
                    '**/node_modules/**'
                );
                testFilesUris.push(...files);
            }
            console.log('by [vscode.workspace.findFiles]', testFilesUris.length);

            // - by npm Glob
            var glob = require('glob');
            for (let patternIdx = 0; patternIdx < matchTestsGlobPatterns.length; patternIdx++) {
                const currentPattern = matchTestsGlobPatterns[patternIdx];
                const files: any[] = await new Promise((resolve, reject) => {
                    glob(
                        currentPattern,
                        {
                            absolute: true,
                            cwd: folder.uri.fsPath,
                            ignore: ['**/node_modules/**']
                        },
                        function (err: Error, files: any[]) {
                            if (err) {
                                return reject(err);
                            }
                            resolve(files);
                        }
                    );
                });
                glob_testFilesUris.push(...files);
            }
            console.log('by [npm Glob]', glob_testFilesUris.length);
        }

        
        // @todo: remove duplicates.
        return testFilesUris;
    }

La salida de la consola de ejemplo de esta función para algún proyecto es:

by [vscode.workspace.findFiles] 0
by [npm Glob] 45

Estructura del proyecto:

 rootFolder
     src
        __tests__
             files.test.ts
             ...
             utils
                 array.test.ts
                 ...

Así que mi pregunta es cómo llamo vscode.workspace.findFiles para obtener resultados correctos, o hay un problema conocido con esta función?


He encontrado algún tipo de respuesta a la pregunta.
El problema es ?(x) en patrones. El vscode.workspace.findFiles no funciona con este patrón como lo hacen otros paquetes. Si lo eliminan de patrones de glob mencionados que trabajan excepto el .jsx | .tsx Los archivos están omitidos.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por debugdragon


3 Respuestas:

  • Después de la profunda inmersión en los problemas de vscode github que he aprendido (Aquí.) que vscode.workspace.findFiles no soporta patrones extendidos como ?(patterLike)

    Respondida el Dec 17, 2020 a las 09:51 - por codealchemy

    Votos positivos: 0 | Votos negativos: 0

  • Gracias por proporcionar información adicional sobre tu problema. Parece que el problema está relacionado con el uso de los patrones de globs en la función findTestFiles, especialmente con el patrón ?(x). Según lo que has encontrado, vscode.workspace.findFiles puede no funcionar correctamente con este patrón en particular.

    Una posible solución podría ser ajustar los patrones de glob que estás utilizando en findTestFiles para que funcionen con vscode.workspace.findFiles. Puedes probar eliminando el patrón ?(x) de los glob patterns en jest.config.js y en la función findTestFiles.

    Por ejemplo, puedes ajustar los glob patterns de esta manera:

    typescript
    const testMatchPatterns = [
        '/__tests__//.[jt]s',
        '/?(.)+(spec|test).[jt]s'
    ];
    

    Y luego usar estos patrones en tu función findTestFiles:

    typescript
    for (let patternIdx = 0; patternIdx < matchTestsGlobPatterns.length; patternIdx++) {
        const currentPattern = matchTestsGlobPatterns[patternIdx];
        const pattern = new vscode.RelativePattern(
            folder.uri.fsPath,
            currentPattern
        );
        const files = await vscode.workspace.findFiles(
            pattern,
            '/node_modules/'
        );
        testFilesUris.push(...files);
    }
    

    Al eliminar el ?(x) de los patrones de glob, es posible que vscode.workspace.findFiles funcione correctamente y devuelva los resultados esperados.

    Espero que esta sugerencia sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta o si necesitas más asistencia!

    Respondida el Dec 18, 2020 a las 09:53 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Gracias por proporcionar detalles sobre el problema que estás enfrentando. Aquí hay algunas ideas que podrían ayudarte a resolverlo:

    1. Confirma que estás usando la versión correcta de vscode:

    Asegúrate de estar utilizando la última versión de Visual Studio Code. Se han realizado mejoras y correcciones en funciones como workspace.findFiles en versiones más recientes.

    2. Verifica la sintaxis del patrón:

    Comprueba cuidadosamente la sintaxis del patrón que estás utilizando en workspace.findFiles. Asegúrate de que coincida con la documentación y que no haya caracteres o símbolos adicionales que puedan estar causando problemas.

    • 3. Exclusión de la carpeta `node_modules`:

    Ten en cuenta que estás excluyendo la carpeta node_modules en tu llamada a glob, pero no en tu llamada a workspace.findFiles. Esto podría resultar en resultados diferentes. Intenta excluir node_modules en ambas llamadas utilizando el argumento ignore.

    4. Comprueba los resultados del patrón:

    Utiliza una herramienta como console.log() para imprimir los resultados del patrón que estás utilizando en workspace.findFiles. Esto te ayudará a verificar si el patrón está funcionando como esperas.

    5. Utiliza una biblioteca de patrones:

    Considera utilizar una biblioteca de patrones como fast-glob o globby para manejar los patrones de archivo. Estas bibliotecas pueden proporcionar un manejo más robusto y coherente de los patrones.

    6. Busca problemas conocidos:*

    Busca problemas conocidos o informes de errores relacionados con workspace.findFiles en repositorios como vscode-issues o vscode-extension-samples.

    Si has probado estas sugerencias y el problema persiste, considera crear un problema mínimo y reproducible (MRE) y compartirlo en un repositorio de GitHub o en un foro de soporte para obtener más ayuda.

    Respondida el Dec 18, 2020 a las 10:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0