Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 3 additions & 14 deletions .github/workflows/e2e_wsl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,9 @@ jobs:
with:
node-version: lts/*
cache: 'npm'

- name: Enable WSL
run: |
curl -L "https://cloud-images.ubuntu.com/releases/jammy/release/ubuntu-22.04-server-cloudimg-amd64-root.tar.xz" -o ubuntu-22.04.tar.xz
wsl --import glacier . ubuntu-22.04.tar.xz
- name: Install dependencies inside WSL
run: |
wsl bash -lc "sudo apt-get update"
wsl bash -lc "sudo apt-get install -y openjdk-17-jre curl unzip"
- name: Install Nextflow inside WSL
run: |
wsl bash -lc "curl -s https://get.nextflow.io | bash"
wsl bash -lc "sudo mv nextflow /usr/local/bin/"

- name: Setup WSL
shell: pwsh
run: ./scripts/wsl-setup.ps1
- name: Install dependencies
run: npm ci
- name: Install Playwright Browsers
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '25'
java-version: '21'

- name: Setup Node.js
uses: actions/setup-node@v4
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
bundle
tests/test-data/instances*

# Logs
logs
Expand Down
87 changes: 69 additions & 18 deletions api-server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ async function call(fcn, ...args) {
}

app.post('/api/create-workflow-instance', async (req, res) =>
post_response(res, collection.createWorkflowInstance(req.body.workflow_id))
post_response(res, collection.createWorkflowInstance(req.body.workflow_id, req.body.version))
);

app.post('/api/run-workflow', async (req, res) =>
Expand Down Expand Up @@ -97,15 +97,76 @@ app.post('/api/get-available-profiles', async (req, res) =>
);

app.post('/api/clone-repo', async (req, res) =>
post_response(res, collection.cloneRepo(req.body.repoUrl, req.body.ver))
post_response(res, call(collection.cloneRepo.bind(collection), req.body.repoUrl, req.body.ver))
);

app.post('/api/is-repo-installed', async (req, res) =>
post_response(
res,
call(collection.isRepoInstalled.bind(collection), req.body.repoUrl, req.body.ver)
)
);

app.post('/api/sync-repo', async (req, res) =>
post_response(res, collection.syncRepo(req.body.repo))
);

app.post('/api/get-collections', async (req, res) =>
post_response(res, collection.getCollections())
app.post('/api/add-catalogue', async (req, res) =>
post_response(res, call(collection.addCatalogue.bind(collection), req.body.repoUrl, req.body.ver))
);

app.post('/api/remove-catalogue', async (req, res) =>
post_response(res, collection.removeCatalogue(req.body.catalogue_name))
);

app.post('/api/remove-catalogue-section', async (req, res) =>
post_response(
res,
collection.removeCatalogueSection(req.body.catalogue_name, req.body.section_name)
)
);

app.post('/api/remove-catalogue-workflow', async (req, res) =>
post_response(
res,
collection.removeCatalogueWorkflow(
req.body.catalogue_name,
req.body.section_name,
req.body.workflow_name
)
)
);

app.post('/api/update-catalogue-workflow', async (req, res) =>
post_response(
res,
collection.updateCatalogueWorkflow(
req.body.catalogue_name,
req.body.section_name,
req.body.workflow_name
)
)
);

app.post('/api/get-catalogues', async (req, res) =>
post_response(res, call(collection.getCatalogues.bind(collection)))
);

app.post('/api/add-user-workflow', async (req, res) =>
post_response(
res,
call(
collection.addUserWorkflow.bind(collection),
req.body.name,
req.body.repoUrl,
req.body.ver,
req.body.section
)
)
);

app.post('/api/get-collection-repos', async (req, res) =>
post_response(res, collection.getCollectionRepos())
);

app.post('/api/get-collections-path', async (req, res) =>
Expand Down Expand Up @@ -136,18 +197,6 @@ app.post('/api/get-workflow-schema', async (req, res) =>
post_response(res, collection.getWorkflowSchema(req.body.repoPath))
);

app.post('/api/get-projects-list', async (req, res) =>
post_response(res, collection.getProjectsList())
);

app.post('/api/add-project', async (req, res) =>
post_response(res, collection.addProject(req.body.repoPath))
);

app.post('/api/remove-project', async (req, res) =>
post_response(res, collection.removeProject(req.body.project))
);

app.post('/api/get-installable-repos-list', async (req, res) =>
post_response(res, collection.getInstallableReposList())
);
Expand All @@ -164,10 +213,12 @@ app.post('/api/get-workflow-information', async (req, res) =>
post_response(res, collection.getWorkflowInformation(req.body.instance))
);

app.post('/api/settings-get', async (req, res) => post_response(res, collection.settingsGet()));
app.post('/api/settings-get', async (req, res) =>
post_response(res, collection.settingsGet(req.body.key))
);

app.post('/api/settings-set', async (req, res) =>
post_response(res, collection.settingsSet(req.body.value))
post_response(res, collection.settingsSet(req.body.key, req.body.value))
);

app.post('/api/open-web-page', async (req, res) =>
Expand Down
116 changes: 106 additions & 10 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@ import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import prettier from 'eslint-config-prettier';
import tsParser from '@typescript-eslint/parser';
import tsPlugin from '@typescript-eslint/eslint-plugin';
import importPlugin from 'eslint-plugin-import';
import { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript';
import unusedImports from 'eslint-plugin-unused-imports';

export default [
// Global ignore block
{
ignores: ['node_modules', 'public', 'coverage']
ignores: ['node_modules', 'public', 'coverage', 'dist']
},

// Vite config (ESM)
Expand All @@ -16,32 +21,94 @@ export default [
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
settings: {
'import-x/resolver-next': [
createTypeScriptImportResolver({
project: 'src'
})
]
}
},

// Backend (ESM)
// Backend (Node / ESM + TypeScript)
{
files: ['src/main/**/*.{js,jsx}', 'src/preload/**/*.{js,jsx}', 'vite.config.js'],
files: ['src/main/**/*.{js,jsx,ts,tsx}', 'src/preload/**/*.{js,jsx,ts,tsx}', 'vite.config.js'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: tsParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
globals: {
require: 'readonly',
module: 'readonly',
__dirname: 'readonly',
process: 'readonly',
URL: 'readonly'
}
},
plugins: {
'@typescript-eslint': tsPlugin,
import: importPlugin,
'unused-imports': unusedImports,
'jsx-a11y': jsxA11y
},
settings: {
'import/resolver': {
typescript: {
/* project: './tsconfig.json' or backend tsconfig */
}
}
},
rules: {
'no-unused-vars': 'off', // JS core rule off
'@typescript-eslint/no-unused-vars': [
'warn',
{
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true
}
],

'unused-imports/no-unused-imports': 'warn',
'unused-imports/no-unused-vars': 'off',

// backend-specific import rules:
// allow devDependencies in scripts/tests but not in src
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'test/**',
'tests/**',
'**/*.test.{js,jsx,ts,tsx}',
'scripts/**',
'build/**',
'tools/**'
],
optionalDependencies: false,
peerDependencies: false
}
],

'import/no-unresolved': 'error'
}
},

// Frontend (ESM + React)
{
files: ['src/renderer/**/*.{js,jsx}'],
files: ['src/renderer/**/*.{js,jsx,ts,tsx}'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: tsParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: { jsx: true }
},
globals: {
Expand All @@ -53,15 +120,44 @@ export default [
plugins: {
react,
'react-hooks': reactHooks,
'jsx-a11y': jsxA11y
},
rules: {
'react/react-in-jsx-scope': 'off'
'jsx-a11y': jsxA11y,
'@typescript-eslint': tsPlugin,
import: importPlugin,
'unused-imports': unusedImports
},
settings: {
react: {
version: 'detect'
react: { version: 'detect' },
'import/resolver': {
typescript: {
/* project: './tsconfig.json' if needed */
}
}
},
rules: {
'react/react-in-jsx-scope': 'off',

'no-unused-vars': 'off', // JS core rule off
'@typescript-eslint/no-unused-vars': [
'warn',
{
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true
}
],

// unused-imports plugin (detects & can auto-fix unused imports)
'unused-imports/no-unused-imports': 'warn',
'unused-imports/no-unused-vars': 'off',

// helpful import resolution rules
'import/no-unresolved': 'error',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: ['**/*.test.*', 'test/**', 'tests/**', 'scripts/**']
}
]
}
}
];
Loading