feat: refs #8698 add module resolution and import finding utilities for Cypress tests
gitea/salix-front/pipeline/pr-dev This commit looks good
Details
gitea/salix-front/pipeline/pr-dev This commit looks good
Details
This commit is contained in:
parent
2fd9067096
commit
31bfe6c44e
|
@ -9,83 +9,6 @@ def BRANCH_ENV = [
|
|||
beta: 'production'
|
||||
]
|
||||
|
||||
def getSpec(path) {
|
||||
return "test/cypress/integration/" + path.split("/")[2] + "/**/*.spec.js"
|
||||
}
|
||||
|
||||
def getSpecs() {
|
||||
return script {
|
||||
def searchFiles = { searchString ->
|
||||
def pagesPath = "src/pages"
|
||||
|
||||
def matchingFiles = sh(
|
||||
script: "grep -rl '${searchString}' ${pagesPath} || true",
|
||||
returnStdout: true
|
||||
).trim().split("\n")
|
||||
|
||||
matchingFiles = matchingFiles.findAll { it.trim() }
|
||||
def extractedFolders = matchingFiles.collect { getSpec(it) }.unique()
|
||||
extractedFolders.add(getSpec(searchString))
|
||||
|
||||
echo "Carpetas donde se encontró '${searchString}': ${extractedFolders}"
|
||||
return extractedFolders
|
||||
}
|
||||
|
||||
def lastCommit
|
||||
def lastSuccessfulBuild = currentBuild.previousBuild
|
||||
def currentCommit = sh(
|
||||
script: "git rev-parse HEAD",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
def files = []
|
||||
|
||||
// while (lastSuccessfulBuild != null && lastSuccessfulBuild.result != 'SUCCESS') {
|
||||
// lastSuccessfulBuild = lastSuccessfulBuild.previousBuild
|
||||
// }
|
||||
// if (lastSuccessfulBuild != null && lastSuccessfulBuild.changeSets.size() > 0) {
|
||||
// for (changeSet in lastSuccessfulBuild.changeSets) {
|
||||
// for (change in changeSet.items) {
|
||||
// lastCommit = change.commitId
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (lastCommit) {
|
||||
// echo "Último commit exitoso: ${lastCommit}"
|
||||
// }
|
||||
// }
|
||||
|
||||
if(!lastCommit) {
|
||||
lastCommit = sh(script: "git rev-parse origin/${env.CHANGE_TARGET}", returnStdout: true).trim()
|
||||
echo "Hash obtenido con git: ${lastCommit}"
|
||||
}
|
||||
|
||||
|
||||
def modifiedFiles = sh(
|
||||
script: "git diff --name-only ${lastCommit} ${currentCommit}",
|
||||
returnStdout: true
|
||||
).trim().split("\n")
|
||||
|
||||
modifiedFiles.each { file ->
|
||||
echo "- ${file}"
|
||||
if(!file.startsWith('src/pages')){
|
||||
if(file.startsWith('test/cypress/integration')){
|
||||
files.add(file)
|
||||
}
|
||||
//else {
|
||||
// files = 'test/cypress/integration/**/*.spec.js'
|
||||
// return
|
||||
// }
|
||||
} else{
|
||||
files = (files + searchFiles(file)).unique()
|
||||
}
|
||||
}
|
||||
return files
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
node {
|
||||
stage('Setup') {
|
||||
env.NODE_ENV = BRANCH_ENV[env.BRANCH_NAME] ?: 'dev'
|
||||
|
@ -198,10 +121,11 @@ pipeline {
|
|||
def image = docker.build('lilium-dev', '-f docs/Dockerfile.dev docs')
|
||||
sh "docker-compose ${env.COMPOSE_PARAMS} up -d"
|
||||
|
||||
def specs = getSpecs()
|
||||
image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ") {
|
||||
sh "cypress run --browser chromium --spec ${specs} || true"
|
||||
}
|
||||
def result = sh(script: 'node test/cypress/docker/find/find.js', returnStdout: true).trim()
|
||||
echo "El resultado es: ${result}"
|
||||
// image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ") {
|
||||
// sh "cypress run --browser chromium || true"
|
||||
// }
|
||||
}
|
||||
}
|
||||
post {
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
"axios": "^1.4.0",
|
||||
"chromium": "^3.0.3",
|
||||
"croppie": "^2.6.5",
|
||||
"es-module-lexer": "^1.6.0",
|
||||
"fast-glob": "^3.3.3",
|
||||
"moment": "^2.30.1",
|
||||
"pinia": "^2.1.3",
|
||||
"quasar": "^2.17.7",
|
||||
|
@ -45,6 +47,7 @@
|
|||
"@quasar/app-vite": "^2.0.8",
|
||||
"@quasar/quasar-app-extension-qcalendar": "^4.0.2",
|
||||
"@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
|
||||
"@vue/compiler-sfc": "^3.5.13",
|
||||
"@vue/test-utils": "^2.4.4",
|
||||
"autoprefixer": "^10.4.14",
|
||||
"cypress": "^13.6.6",
|
||||
|
|
|
@ -20,6 +20,12 @@ dependencies:
|
|||
croppie:
|
||||
specifier: ^2.6.5
|
||||
version: 2.6.5
|
||||
es-module-lexer:
|
||||
specifier: ^1.6.0
|
||||
version: 1.6.0
|
||||
fast-glob:
|
||||
specifier: ^3.3.3
|
||||
version: 3.3.3
|
||||
moment:
|
||||
specifier: ^2.30.1
|
||||
version: 2.30.1
|
||||
|
@ -64,6 +70,9 @@ devDependencies:
|
|||
'@quasar/quasar-app-extension-testing-unit-vitest':
|
||||
specifier: ^0.4.0
|
||||
version: 0.4.0(@vue/test-utils@2.4.6)(quasar@2.17.7)(typescript@5.7.3)(vite@6.0.11)(vitest@0.34.6)(vue@3.5.13)
|
||||
'@vue/compiler-sfc':
|
||||
specifier: ^3.5.13
|
||||
version: 3.5.13
|
||||
'@vue/test-utils':
|
||||
specifier: ^2.4.4
|
||||
version: 2.4.6
|
||||
|
@ -1240,12 +1249,10 @@ packages:
|
|||
dependencies:
|
||||
'@nodelib/fs.stat': 2.0.5
|
||||
run-parallel: 1.2.0
|
||||
dev: true
|
||||
|
||||
/@nodelib/fs.stat@2.0.5:
|
||||
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
|
||||
engines: {node: '>= 8'}
|
||||
dev: true
|
||||
|
||||
/@nodelib/fs.walk@1.2.8:
|
||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||
|
@ -1253,7 +1260,6 @@ packages:
|
|||
dependencies:
|
||||
'@nodelib/fs.scandir': 2.1.5
|
||||
fastq: 1.18.0
|
||||
dev: true
|
||||
|
||||
/@one-ini/wasm@0.1.1:
|
||||
resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
|
||||
|
@ -3716,6 +3722,10 @@ packages:
|
|||
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
/es-module-lexer@1.6.0:
|
||||
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
|
||||
dev: false
|
||||
|
||||
/es-object-atoms@1.1.1:
|
||||
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
@ -4159,7 +4169,6 @@ packages:
|
|||
glob-parent: 5.1.2
|
||||
merge2: 1.4.1
|
||||
micromatch: 4.0.8
|
||||
dev: true
|
||||
|
||||
/fast-json-stable-stringify@2.1.0:
|
||||
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
|
||||
|
@ -4177,7 +4186,6 @@ packages:
|
|||
resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
|
||||
dependencies:
|
||||
reusify: 1.0.4
|
||||
dev: true
|
||||
|
||||
/fd-slicer@1.1.0:
|
||||
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
|
||||
|
@ -4446,7 +4454,6 @@ packages:
|
|||
engines: {node: '>= 6'}
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
dev: true
|
||||
|
||||
/glob-parent@6.0.2:
|
||||
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
||||
|
@ -5368,7 +5375,6 @@ packages:
|
|||
/merge2@1.4.1:
|
||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||
engines: {node: '>= 8'}
|
||||
dev: true
|
||||
|
||||
/methods@1.1.2:
|
||||
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
|
||||
|
@ -6151,7 +6157,6 @@ packages:
|
|||
|
||||
/queue-microtask@1.2.3:
|
||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||
dev: true
|
||||
|
||||
/queue-tick@1.0.1:
|
||||
resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
|
||||
|
@ -6356,7 +6361,6 @@ packages:
|
|||
/reusify@1.0.4:
|
||||
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
|
||||
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/rfdc@1.4.1:
|
||||
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
|
||||
|
@ -6448,7 +6452,6 @@ packages:
|
|||
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
|
||||
dependencies:
|
||||
queue-microtask: 1.2.3
|
||||
dev: true
|
||||
|
||||
/rxjs@7.8.1:
|
||||
resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
import fs from 'fs';
|
||||
import { parse } from 'es-module-lexer';
|
||||
import { parse as vueParse } from '@vue/compiler-sfc';
|
||||
import glob from 'fast-glob';
|
||||
import { resolveImportPath, toRelative } from './resolve-import-path.js';
|
||||
|
||||
const ROUTER_MODULES = 'src/router/modules/';
|
||||
const files = await glob(['src/**/*.{vue,js,ts}'], { absolute: true });
|
||||
const vueFiles = new Map();
|
||||
|
||||
export async function findImports(targetFile, visited = new Set(), identation = '') {
|
||||
if (visited.has(targetFile)) return []; // Avoid infinite loops
|
||||
visited.add(targetFile);
|
||||
|
||||
const usageFiles = files
|
||||
.filter((file) => {
|
||||
let content = fs.readFileSync(file, 'utf8');
|
||||
if (file.endsWith('.vue')) {
|
||||
if (vueFiles.has(file)) {
|
||||
content = vueFiles.get(file);
|
||||
} else {
|
||||
const { descriptor } = vueParse(content);
|
||||
content = descriptor?.scriptSetup?.content ?? '';
|
||||
vueFiles.set(file, content);
|
||||
}
|
||||
}
|
||||
if (!content.trim()) return false;
|
||||
|
||||
return parse(content)[0].some((imp) => {
|
||||
if (!imp?.n) return false;
|
||||
return resolveImportPath(imp.n, targetFile) === targetFile;
|
||||
});
|
||||
})
|
||||
.map((file) => toRelative(file));
|
||||
|
||||
let fullTree = [...usageFiles];
|
||||
for (const file of usageFiles) {
|
||||
if (file.startsWith(ROUTER_MODULES)) {
|
||||
continue;
|
||||
}
|
||||
fullTree = [
|
||||
...fullTree,
|
||||
...(await findImports(file, visited, identation + ' ')),
|
||||
];
|
||||
}
|
||||
|
||||
return getUniques(fullTree); // Remove duplicates
|
||||
}
|
||||
|
||||
function getUniques(array) {
|
||||
return Array.from(new Set(array));
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import { execSync } from 'child_process';
|
||||
import { findImports } from './find-imports.js';
|
||||
import { getModules } from './get-modules.js';
|
||||
function getGitDiff(options) {
|
||||
const TARGET_BRANCH = options[2] || 'dev';
|
||||
const diff = execSync(`git diff --name-only origin/${TARGET_BRANCH}`, {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
return diff.split('\n');
|
||||
}
|
||||
|
||||
async function getChangedModules() {
|
||||
let changedModules = new Set();
|
||||
const changes = getGitDiff(process.argv);
|
||||
for (const change of changes) {
|
||||
changedModules = new Set([
|
||||
...changedModules,
|
||||
...new Set(getModules(await findImports(change))),
|
||||
]);
|
||||
}
|
||||
return [...changedModules].join(',');
|
||||
}
|
||||
|
||||
getChangedModules();
|
|
@ -0,0 +1,11 @@
|
|||
export function getModules(files) {
|
||||
const CYPRESS_PREFIX = 'test/cypress/integration/';
|
||||
const CYPRESS_SUFIX = '/**/*.spec.js';
|
||||
const modules = [];
|
||||
for (const file of files) {
|
||||
if (file.startsWith('src/page')) {
|
||||
modules.push(CYPRESS_PREFIX + file.split('/')[2] + CYPRESS_SUFIX);
|
||||
}
|
||||
}
|
||||
return modules;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import path from 'path';
|
||||
const rootDir = process.cwd();
|
||||
|
||||
function resolveImportPath(importPath, fileBase) {
|
||||
const fileDir = path.dirname(fileBase);
|
||||
|
||||
if (!importPath) return null;
|
||||
|
||||
if (importPath.startsWith('.') || importPath.startsWith('/')) {
|
||||
return path.relative(rootDir, path.resolve(fileDir, importPath));
|
||||
}
|
||||
|
||||
return importPath;
|
||||
}
|
||||
|
||||
function toRelative(file) {
|
||||
return path.relative(rootDir, file);
|
||||
}
|
||||
|
||||
export { resolveImportPath, toRelative };
|
Loading…
Reference in New Issue