diff --git a/.github/workflows/lint-test-build.yml b/.github/workflows/lint-test-build.yml index 1b76d8f17..82ea2a484 100644 --- a/.github/workflows/lint-test-build.yml +++ b/.github/workflows/lint-test-build.yml @@ -16,9 +16,9 @@ jobs: with: path: datasets key: datasets-${{ hashFiles('datasets/**') }} - - run: ./datasets/populate + - run: datasets/populate - lint-lib-core: + lint-lib: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -27,10 +27,10 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run lint + - run: npm --workspace=discojs run lint lint-lib-node: - needs: build-lib-core + needs: build-lib runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -39,11 +39,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run build - - run: npm --workspace=./discojs/discojs-node run lint + - run: npm --workspace=discojs run build + - run: npm --workspace=discojs-node run lint lint-lib-web: - needs: build-lib-core + needs: build-lib runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -52,11 +52,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run build - - run: npm --workspace=./discojs/discojs-web run lint + - run: npm --workspace=discojs run build + - run: npm --workspace=discojs-web run lint lint-server: - needs: [build-lib-core, build-lib-node] + needs: [build-lib, build-lib-node] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -65,11 +65,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-{core,node} run build - - run: npm --workspace=./server run lint + - run: npm --workspace={discojs,discojs-node} run build + - run: npm --workspace=server run lint lint-cli: - needs: [build-lib-core, build-lib-node, build-server] + needs: [build-lib, build-lib-node, build-server] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -78,11 +78,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace={./discojs/discojs-{core,node},./server} run build - - run: npm --workspace=./cli run lint + - run: npm --workspace={discojs,discojs-node,server} run build + - run: npm --workspace=cli run lint - lint-web-client: - needs: [build-lib-core, build-lib-web] + lint-webapp: + needs: [build-lib, build-lib-web] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -91,11 +91,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-{core,web} run build - - run: npm --workspace=./web-client run lint + - run: npm --workspace={discojs,discojs-web} run build + - run: npm --workspace=webapp run lint lint-docs-examples: - needs: [build-lib-core, build-lib-node, build-server] + needs: [build-lib, build-lib-node, build-server] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -104,11 +104,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace={./discojs/discojs-{core,node},./server} run build + - run: npm --workspace={discojs,discojs-node,server} run build - run: npm run lint working-directory: docs/examples - build-lib-core: + build-lib: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -117,10 +117,10 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run build + - run: npm --workspace=discojs run build build-lib-node: - needs: build-lib-core + needs: build-lib runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -129,11 +129,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run build - - run: npm --workspace=./discojs/discojs-node run build + - run: npm --workspace=discojs run build + - run: npm --workspace=discojs-node run build build-lib-web: - needs: build-lib-core + needs: build-lib runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -142,11 +142,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm run --workspace=./discojs/discojs-core build - - run: npm run --workspace=./discojs/discojs-web build + - run: npm run --workspace=discojs build + - run: npm run --workspace=discojs-web build build-server: - needs: [build-lib-core, build-lib-node] + needs: [build-lib, build-lib-node] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -155,8 +155,8 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm run --workspace=./discojs/discojs-{core,node} build - - run: npm run --workspace=./server build + - run: npm run --workspace={discojs,discojs-node} build + - run: npm run --workspace=server build build-server-docker: needs: build-server @@ -169,7 +169,7 @@ jobs: - run: docker build . build-cli: - needs: [build-lib-core, build-lib-node, build-server] + needs: [build-lib, build-lib-node, build-server] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -178,11 +178,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm run --workspace={./discojs/discojs-{core,node},./server} build - - run: npm run --workspace=./cli build + - run: npm run --workspace={discojs,discojs-node,server} build + - run: npm run --workspace=cli build - build-web-client: - needs: [build-lib-core, build-lib-web] + build-webapp: + needs: [build-lib, build-lib-web] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -191,11 +191,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-{core,web} run build - - run: npm --workspace=./web-client run build + - run: npm --workspace={discojs,discojs-web} run build + - run: npm --workspace=webapp run build build-docs-examples: - needs: [build-lib-core, build-lib-node, build-server] + needs: [build-lib, build-lib-node, build-server] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -204,12 +204,12 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace={./discojs/discojs-{core,node},./server} run build + - run: npm --workspace={discojs,discojs-node,server} run build - run: npm run build working-directory: docs/examples - test-lib-core: - needs: [build-lib-core, download-datasets] + test-lib: + needs: [build-lib, download-datasets] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -225,10 +225,10 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core test + - run: npm --workspace=discojs test test-lib-node: - needs: [build-lib-core, download-datasets] + needs: [build-lib, download-datasets] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -244,11 +244,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run build - - run: npm --workspace=./discojs/discojs-node test + - run: npm --workspace=discojs run build + - run: npm --workspace=discojs-node test test-lib-web: - needs: [build-lib-core] + needs: [build-lib] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -264,11 +264,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-core run build - - run: npm --workspace=./discojs/discojs-web test + - run: npm --workspace=discojs run build + - run: npm --workspace=discojs-web test test-server: - needs: [build-lib-core, build-lib-node, download-datasets] + needs: [build-lib, build-lib-node, download-datasets] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -284,11 +284,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-{core,node} run build - - run: npm --workspace=./server test + - run: npm --workspace={discojs,discojs-node} run build + - run: npm --workspace=server test - test-web-client: - needs: [build-lib-core, build-lib-web, download-datasets] + test-webapp: + needs: [build-lib, build-lib-web, download-datasets] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -304,18 +304,18 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace=./discojs/discojs-{core,web} run build - - run: npm --workspace=./web-client run test:unit + - run: npm --workspace={discojs,discojs-web} run build + - run: npm --workspace=webapp run test:unit - uses: cypress-io/github-action@v6 with: - working-directory: ./web-client + working-directory: webapp install: false start: npm start env: VITE_SERVER_URL: http://server test-cli: - needs: [build-lib-core, build-lib-node, build-server, download-datasets] + needs: [build-lib, build-lib-node, build-server, download-datasets] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -331,11 +331,11 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace={./discojs/discojs-{core,node},./server} run build - - run: npm --workspace=./cli start -- -t cifar10 -u 1 -e 1 + - run: npm --workspace={discojs,discojs-node,server} run build + - run: npm --workspace=cli start -- -t cifar10 -u 1 -e 1 test-docs-examples: - needs: [build-lib-core, build-lib-node, build-server, download-datasets] + needs: [build-lib, build-lib-node, build-server, download-datasets] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -351,6 +351,6 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci - - run: npm --workspace={./discojs/discojs-{core,node},./server} run build + - run: npm --workspace={discojs,discojs-node,server} run build - run: npm run test working-directory: docs/examples diff --git a/DEV.md b/DEV.md index ce854f0fa..b34e25dac 100644 --- a/DEV.md +++ b/DEV.md @@ -13,14 +13,14 @@ Here you will have a first overview of the project, how to install and run an in ## Structure -The DISCO project is composed of multiple parts. At the root level, there are four main folders: `discojs`, `server`, `web-client` and `cli`. +The DISCO project is composed of multiple parts. At the root level, there are six main folders: `discojs`, `disco-node`, `disco-web`, `server`, `webapp` and `cli`. -- `discojs`, or Disco.js, is the TypeScript library that contains federated and decentralized learning logic. The library allows to train and use machine learning models in a distributed fashion. The library itself is composed of the `disco-node` and `disco-web` modules, both of them extending the platform-agnostic code in `disco-core`. In other words, `disco-core` contains most of the implementation but can't be used by itself, while `disco-web` and `disco-node` allow using `disco-core` via different architectures. To some extents, you can think of `disco-core` as an abstract class extended by `disco-web`and `disco-node`. - - `disco-node` lets you use Disco.js with Node.js. For example, the `server` and the `cli` rely on `disco-node`. A user can also directly import the `disco-node` package in their Node.js programs. - - `disco-web` allows using Disco.js through a browser. The `web-client`, discussed below, relies on `disco-web` to implement a browser UI. - The main difference between the two is how they handle storage: a browser doesn't have access to the file system (for security reasons) while a Node.js application does. +- `discojs`, or Disco.js, is the TypeScript library that contains federated and decentralized learning logic. The library allows to train and use machine learning models in a distributed fashion. The library itself is composed of the `disco-node` and `disco-web` modules, both of them extending the platform-agnostic code in `disco`. In other words, `disco` contains most of the implementation but can't be used by itself, while `disco-web` and `disco-node` allow using `disco` via different architectures. To some extents, you can think of `disco` as an abstract class extended by `disco-web`and `disco-node`. +- `disco-node` lets you use Disco.js with Node.js. For example, the `server` and the `cli` rely on `disco-node`. A user can also directly import the `disco-node` package in their Node.js programs. +- `disco-web` allows using Disco.js through a browser. The `webapp`, discussed below, relies on `disco-web` to implement a browser UI. + The main difference between the two is how they handle storage: a browser doesn't have access to the file system (for security reasons) while a Node.js application does. - `server` contains the server implementation necessary to use Disco.js. Indeed, while the federated and decentralized learning logic is implemented by Disco.js, we still need a server to orchestrate users in both paradigms. In decentralized learning, the server exposes an API for users to query the necessary information to train models in a decentralized fashion, such as the list of other peers. Thus, the server never receives training data or model parameters. In federated learning, the server receives model updates but never training data. It keeps track of participants and updates the model weights. A `server` instance is **always** necessary to use DISCO, whether one is using a browser UI, the CLI or directly programming with `disco-node`. -- `web-client` implements a browser User Interface. In other words, it implements a website allowing users to use DISCO without coding. Via the browser, a user can create and participate in federated and decentralized training sessions, evaluate models, etc. +- `webapp` implements a browser User Interface. In other words, it implements a website allowing users to use DISCO without coding. Via the browser, a user can create and participate in federated and decentralized training sessions, evaluate models, etc. - `cli` contains the Command Line Interface for Disco.js. For example, the CLI allows a user to create and join training sessions from the command line, benchmark performance by emulating multiple clients, etc. Here is a summary diagram: @@ -28,11 +28,11 @@ Here is a summary diagram: ```mermaid flowchart LR subgraph discojs - discojs-node-->|extends|discojs-core; - discojs-web-->|extends|discojs-core; + discojs-node-->|extends|discojs; + discojs-web-->|extends|discojs; end subgraph User Interface - web-client-->|uses|discojs-web; + webapp-->|uses|discojs-web; custom_browser["custom browser implementation"]-->|uses|discojs-web; server-->| uses |discojs-node; cli-->|uses|discojs-node; @@ -108,7 +108,7 @@ The server should be listening on `http://localhost:8080/`. - Secondly, start a web client, which will allow you to use DISCO from your browser. You will have to do so **from another terminal** since the previous one is now used by the server. ``` -npm -w web-client start # from another terminal +npm -w webapp start # from another terminal ``` The web client should be running on `http://localhost:8081`, if not first restart the server and then the web client. @@ -119,13 +119,13 @@ The web client should be running on `http://localhost:8081`, if not first restar There are multiple ways to use and interact with DISCO, depending on your objective: -- A non-technical user that wants to train models in a distributed manner without coding would want to use DISCO through the `web-client`. To do so, starting a local `server` instance is also needed as a backend to the `web-client`. Similarly, a contributor aiming to implement new UI features would certainly want to run the same setup. +- A non-technical user that wants to train models in a distributed manner without coding would want to use DISCO through the `webapp`. To do so, starting a local `server` instance is also needed as a backend to the `webapp`. Similarly, a contributor aiming to implement new UI features would certainly want to run the same setup. - A technical user may find it more flexible to use DISCO from a Node.js script, which gives users a finer control over the process. The `discojs-node` module is tailored to be used in Node.js scripts and allows to load data, helps starting a server and run distributed machine learning training tasks. - Finally, the `cli` (command line interface) can also be used to quickly start distributed model trainings. The `CLI` is more restricting than using `discojs-node` but allows to start training with multiple users in a single command. It is useful for benchmarking for example. -**Training on your own datasets:** DISCO provides pre-defined training tasks, such as CIFAR10, Titanic, etc. The [Tasks document guide](./docs/TASK.md) describes how to add custom tasks from the web-client UI, a `discojs-node` script or how to add support for a new pre-defined task. +**Training on your own datasets:** DISCO provides pre-defined training tasks, such as CIFAR10, Titanic, etc. The [Tasks document guide](./docs/TASK.md) describes how to add custom tasks from the webapp UI, a `discojs-node` script or how to add support for a new pre-defined task. -### `web-client` and `server` +### `webapp` and `server` The last step of the installation instructions describe how to start a web interface along with a helper server. The server is used to provide some predefined machine learning tasks and orchestrate distributed training. @@ -137,13 +137,13 @@ npm -w server start The server should be listening on `http://localhost:8080/`. -Start the web-client: +Start the webapp: ``` -npm -w web-client start # from another terminal +npm -w webapp start # from another terminal ``` -The web client should be running on `http://localhost:8081`. Running the last command should also output a Network address at which devices on the same network can access the UI. You can find more information in the [Contributing to the `web-client`](./docs/CONTRIBUTING.md#contributing-to-web-client) Section as well as the [server README](./server/README.md). +The web client should be running on `http://localhost:8081`. Running the last command should also output a Network address at which devices on the same network can access the UI. You can find more information in the [Contributing to the `webapp`](./docs/CONTRIBUTING.md#contributing-to-webapp) Section as well as the [server README](./server/README.md). ### Importing `discojs-node` with Node.js diff --git a/Dockerfile b/Dockerfile index 6192fb4bb..a5bf20102 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,20 +2,16 @@ FROM node:20 COPY package*.json . COPY isomorphic-wrtc/package.json isomorphic-wrtc/ -COPY discojs/discojs-core/package.json discojs/discojs-core/ -COPY discojs/discojs-node/package.json discojs/discojs-node/ +COPY discojs/package.json discojs/ +COPY discojs-node/package.json discojs-node/ COPY server/package.json server/ RUN npm ci -COPY isomorphic-wrtc/ isomorphic-wrtc/ -COPY tsconfig.base.json . -COPY discojs/discojs-core/ discojs/discojs-core/ -COPY discojs/discojs-node/ discojs/discojs-node/ -RUN npm run build --workspace=@epfml/discojs-core --workspace=@epfml/discojs-node +COPY isomorphic-wrtc/ discojs/ discojs-node/ tsconfig.base.json . +RUN npm run build --workspace=@epfml/discojs --workspace=@epfml/discojs-node -COPY server/ server/ +COPY server/ . RUN cd server/ && npm run build WORKDIR /server CMD [ "npm", "start" ] - diff --git a/cli/README.md b/cli/README.md index b2f2bc903..6d62afc38 100644 --- a/cli/README.md +++ b/cli/README.md @@ -27,7 +27,7 @@ npm -w cli start -- --help # or -h The CLI can be used on several pre-defined tasks: titanic, simple-face and CIFAR10. In order to understand how to add a new task have a look at [TASK.md](../docs/TASK.md). -Once a new task has been defined in `discojs`, it can be loaded in [data.ts](./src/data.ts) as it is already implemented for current tasks. There are currently [multiple classes](../discojs/discojs-node/src/dataset/data_loader) you can use to load data using Node.js and preprocess data: ImageLoader, TabularLoader and TextLoader. +Once a new task has been defined in `discojs`, it can be loaded in [data.ts](./src/data.ts) as it is already implemented for current tasks. There are currently [multiple classes](../discojs-node/src/dataset/data_loader) you can use to load data using Node.js and preprocess data: ImageLoader, TabularLoader and TextLoader. Once a function to load data has been added, make sure to extend `getTaskData` in `data.ts`, which matches each task with it respective with data loading function. The last thing to add is to add the task as a CLI argument in [args.ts](./src/args.ts) to the `supportedTasks` Map. diff --git a/cli/package.json b/cli/package.json index 51d9c6d04..cc2a1eefd 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,10 +1,10 @@ { - "name": "@epfml/disco-cli", + "name": "cli", "private": true, "type": "module", "main": "dist/cli.js", "scripts": { - "watch": "nodemon --ext ts --ignore dist --watch ../discojs/discojs-node/dist --watch ../server/dist --watch . --exec npm run", + "watch": "nodemon --ext ts --ignore dist --watch ../discojs-node/dist --watch ../server/dist --watch . --exec npm run", "start": "npm run build && node dist/cli.js", "benchmark_gpt": "npm run build && node dist/benchmark_gpt.js", "build": "tsc", @@ -14,7 +14,7 @@ "author": "", "license": "ISC", "dependencies": { - "@epfml/disco-server": "*", + "server": "*", "@epfml/discojs-node": "*", "immutable": "4", "tslib": "2" diff --git a/cli/src/args.ts b/cli/src/args.ts index 60c847d8f..1b2c8067f 100644 --- a/cli/src/args.ts +++ b/cli/src/args.ts @@ -1,8 +1,8 @@ import { parse } from 'ts-command-line-args' import { Map } from 'immutable' -import type { Task } from '@epfml/discojs-core' -import { defaultTasks } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' +import { defaultTasks } from '@epfml/discojs' interface BenchmarkArguments { task: Task diff --git a/cli/src/benchmark_gpt.ts b/cli/src/benchmark_gpt.ts index 462b94f6a..4a2b20c70 100644 --- a/cli/src/benchmark_gpt.ts +++ b/cli/src/benchmark_gpt.ts @@ -1,8 +1,8 @@ import { parse } from 'ts-command-line-args'; -import type { Task } from '@epfml/discojs-core' -import { fetchTasks, data, models } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' +import { fetchTasks, data, models } from '@epfml/discojs' import { NodeTextLoader, loadModelFromDisk } from '@epfml/discojs-node' -import { startServer } from '@epfml/disco-server' +import { startServer } from 'server' interface CLIArguments{ modelType?: string; // 'gpt-nano', 'gpt-micro', 'gpt-mini', 'gpt2' diff --git a/cli/src/cli.ts b/cli/src/cli.ts index b1fa8b578..e49f2f5a4 100644 --- a/cli/src/cli.ts +++ b/cli/src/cli.ts @@ -1,9 +1,9 @@ import { List, Range } from 'immutable' import fs from 'node:fs/promises' -import type { data, RoundLogs, Task } from '@epfml/discojs-core' -import { Disco, aggregator as aggregators, client as clients } from '@epfml/discojs-core' -import { startServer } from '@epfml/disco-server' +import type { data, RoundLogs, Task } from '@epfml/discojs' +import { Disco, aggregator as aggregators, client as clients } from '@epfml/discojs' +import { startServer } from 'server' import { getTaskData } from './data.js' import { args } from './args.js' diff --git a/cli/src/data.ts b/cli/src/data.ts index 74b50120a..289fa385e 100644 --- a/cli/src/data.ts +++ b/cli/src/data.ts @@ -2,7 +2,7 @@ import { Range } from 'immutable' import fs from 'node:fs/promises' import path from 'node:path' -import type { Task, data } from '@epfml/discojs-core' +import type { Task, data } from '@epfml/discojs' import { NodeImageLoader, NodeTabularLoader } from '@epfml/discojs-node' async function simplefaceData (task: Task): Promise { diff --git a/discojs/discojs-core/.mocharc.json b/discojs-node/.mocharc.json similarity index 100% rename from discojs/discojs-core/.mocharc.json rename to discojs-node/.mocharc.json diff --git a/discojs/discojs-core/.npmignore b/discojs-node/.npmignore similarity index 100% rename from discojs/discojs-core/.npmignore rename to discojs-node/.npmignore diff --git a/discojs/discojs-node/package.json b/discojs-node/package.json similarity index 82% rename from discojs/discojs-node/package.json rename to discojs-node/package.json index 1c672d90d..2d4cd3f83 100644 --- a/discojs/discojs-node/package.json +++ b/discojs-node/package.json @@ -5,7 +5,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "watch": "nodemon --ext ts --ignore dist --watch ../discojs-core/dist --watch . --exec npm run", + "watch": "nodemon --ext ts --ignore dist --watch ../discojs/dist --watch . --exec npm run", "build": "tsc", "lint": "npx eslint .", "test": "mocha" @@ -19,7 +19,7 @@ }, "homepage": "https://github.com/epfml/disco#readme", "dependencies": { - "@epfml/discojs-core": "*", + "@epfml/discojs": "*", "@koush/wrtc": "0.5", "@tensorflow/tfjs-node": "4" }, diff --git a/discojs/discojs-node/src/data/image_loader.spec.ts b/discojs-node/src/data/image_loader.spec.ts similarity index 96% rename from discojs/discojs-node/src/data/image_loader.spec.ts rename to discojs-node/src/data/image_loader.spec.ts index 63009b645..f4b93ed13 100644 --- a/discojs/discojs-node/src/data/image_loader.spec.ts +++ b/discojs-node/src/data/image_loader.spec.ts @@ -4,10 +4,10 @@ import fs from 'node:fs/promises' import * as tf from '@tensorflow/tfjs' import { node as tfNode } from '@tensorflow/tfjs-node' -import { defaultTasks } from '@epfml/discojs-core' +import { defaultTasks } from '@epfml/discojs' import { ImageLoader } from './image_loader.js' -const DATASET_DIR = '../../datasets/' +const DATASET_DIR = '../datasets/' async function readFilesFromDir(dir: string): Promise{ return (await fs.readdir(dir)).map((file: string) => dir + file) @@ -33,7 +33,7 @@ const imagesCIFAR10 = await Promise.all(FILES.CIFAR10.map(source => readImageTen describe('image loader', () => { it('loads single MNIST sample without label', async () => { - const source = '../../datasets/9-mnist-example.png' + const source = `${DATASET_DIR}/9-mnist-example.png` const singletonDataset = await LOADERS.MNIST.load(source) const imageContent = await readImageTensor(source) @@ -43,7 +43,7 @@ describe('image loader', () => { })) }) it('loads single simple face sample without label', async () => { - const source = '../../datasets/simple_face-example.png' + const source = `${DATASET_DIR}/simple_face-example.png` const singletonDataset = await LOADERS.SIMPLE_FACE.load(source) const imageContent = await readImageTensor(source) diff --git a/discojs/discojs-node/src/data/image_loader.ts b/discojs-node/src/data/image_loader.ts similarity index 93% rename from discojs/discojs-node/src/data/image_loader.ts rename to discojs-node/src/data/image_loader.ts index 8110ab309..7b3a4d6f6 100644 --- a/discojs/discojs-node/src/data/image_loader.ts +++ b/discojs-node/src/data/image_loader.ts @@ -2,7 +2,7 @@ import fs from 'node:fs/promises' import type tf from '@tensorflow/tfjs' import { node as tfNode } from '@tensorflow/tfjs-node' -import { data } from '@epfml/discojs-core' +import { data } from '@epfml/discojs' export class ImageLoader extends data.ImageLoader { async readImageFrom(source: string, channels?: number): Promise { diff --git a/discojs/discojs-node/src/data/index.ts b/discojs-node/src/data/index.ts similarity index 100% rename from discojs/discojs-node/src/data/index.ts rename to discojs-node/src/data/index.ts diff --git a/discojs/discojs-node/src/data/tabular_loader.spec.ts b/discojs-node/src/data/tabular_loader.spec.ts similarity index 95% rename from discojs/discojs-node/src/data/tabular_loader.spec.ts rename to discojs-node/src/data/tabular_loader.spec.ts index 81dcc8fba..98c537194 100644 --- a/discojs/discojs-node/src/data/tabular_loader.spec.ts +++ b/discojs-node/src/data/tabular_loader.spec.ts @@ -1,11 +1,11 @@ import { assert, expect } from 'chai' import * as tf from '@tensorflow/tfjs' -import type { Task } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' import { TabularLoader } from './tabular_loader.js' -const inputFiles = ['../../datasets/titanic_train.csv'] +const inputFiles = ['../datasets/titanic_train.csv'] const titanicMock: Task = { id: 'titanic', diff --git a/discojs/discojs-node/src/data/tabular_loader.ts b/discojs-node/src/data/tabular_loader.ts similarity index 90% rename from discojs/discojs-node/src/data/tabular_loader.ts rename to discojs-node/src/data/tabular_loader.ts index b5e616ea7..355371926 100644 --- a/discojs/discojs-node/src/data/tabular_loader.ts +++ b/discojs-node/src/data/tabular_loader.ts @@ -1,6 +1,6 @@ import { data as tfData } from '@tensorflow/tfjs-node' -import { data } from '@epfml/discojs-core' +import { data } from '@epfml/discojs' export class TabularLoader extends data.TabularLoader { loadDatasetFrom (source: string, csvConfig: Record): Promise { diff --git a/discojs/discojs-node/src/data/text_loader.ts b/discojs-node/src/data/text_loader.ts similarity index 94% rename from discojs/discojs-node/src/data/text_loader.ts rename to discojs-node/src/data/text_loader.ts index b6d8efc44..8647b0b69 100644 --- a/discojs/discojs-node/src/data/text_loader.ts +++ b/discojs-node/src/data/text_loader.ts @@ -1,6 +1,6 @@ import { data as tfData } from '@tensorflow/tfjs-node' import fs from 'node:fs/promises' -import { data } from '@epfml/discojs-core' +import { data } from '@epfml/discojs' export class TextLoader extends data.TextLoader { async loadDatasetFrom (source: string): Promise { diff --git a/discojs/discojs-node/src/index.ts b/discojs-node/src/index.ts similarity index 100% rename from discojs/discojs-node/src/index.ts rename to discojs-node/src/index.ts diff --git a/discojs/discojs-node/src/models/model_loader.ts b/discojs-node/src/models/model_loader.ts similarity index 90% rename from discojs/discojs-node/src/models/model_loader.ts rename to discojs-node/src/models/model_loader.ts index 39fd377b1..6ea5a0db5 100644 --- a/discojs/discojs-node/src/models/model_loader.ts +++ b/discojs-node/src/models/model_loader.ts @@ -1,5 +1,5 @@ import fs from 'node:fs/promises' -import { serialization, models } from '@epfml/discojs-core' +import { serialization, models } from '@epfml/discojs' export async function saveModelToDisk(model: models.Model, modelFolder: string, modelFileName: string): Promise { try { @@ -14,4 +14,4 @@ export async function saveModelToDisk(model: models.Model, modelFolder: string, export async function loadModelFromDisk(modelPath: string): Promise { const content = await fs.readFile(modelPath) return await serialization.model.decode(content) as models.GPT -} \ No newline at end of file +} diff --git a/discojs/discojs-node/tsconfig.json b/discojs-node/tsconfig.json similarity index 79% rename from discojs/discojs-node/tsconfig.json rename to discojs-node/tsconfig.json index 71b6902b9..212e2d26c 100644 --- a/discojs/discojs-node/tsconfig.json +++ b/discojs-node/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../tsconfig.base.json", "compilerOptions": { "types": ["mocha", "node"], "outDir": "dist", diff --git a/discojs/discojs-node/.mocharc.json b/discojs-web/.mocharc.json similarity index 100% rename from discojs/discojs-node/.mocharc.json rename to discojs-web/.mocharc.json diff --git a/discojs/discojs-node/.npmignore b/discojs-web/.npmignore similarity index 100% rename from discojs/discojs-node/.npmignore rename to discojs-web/.npmignore diff --git a/discojs/discojs-web/package.json b/discojs-web/package.json similarity index 76% rename from discojs/discojs-web/package.json rename to discojs-web/package.json index dd46c335c..a319b9a54 100644 --- a/discojs/discojs-web/package.json +++ b/discojs-web/package.json @@ -1,11 +1,11 @@ { - "name": "@epfml/discojs", + "name": "@epfml/discojs-web", "version": "2.1.1", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "watch": "nodemon --ext ts --ignore dist --watch ../discojs-core/dist --watch . --exec npm run", + "watch": "nodemon --ext ts --ignore dist --watch ../discojs/dist --watch . --exec npm run", "build": "tsc", "lint": "npx eslint .", "test": ": nothing" @@ -19,7 +19,7 @@ }, "homepage": "https://github.com/epfml/disco#readme", "dependencies": { - "@epfml/discojs-core": "*", + "@epfml/discojs": "*", "@tensorflow/tfjs": "4" }, "devDependencies": { diff --git a/discojs/discojs-web/src/data/image_loader.ts b/discojs-web/src/data/image_loader.ts similarity index 84% rename from discojs/discojs-web/src/data/image_loader.ts rename to discojs-web/src/data/image_loader.ts index 597149557..d47510475 100644 --- a/discojs/discojs-web/src/data/image_loader.ts +++ b/discojs-web/src/data/image_loader.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs' -import { data } from '@epfml/discojs-core' +import { data } from '@epfml/discojs' export class ImageLoader extends data.ImageLoader { async readImageFrom (source: File): Promise { diff --git a/discojs/discojs-web/src/data/index.ts b/discojs-web/src/data/index.ts similarity index 100% rename from discojs/discojs-web/src/data/index.ts rename to discojs-web/src/data/index.ts diff --git a/discojs/discojs-web/src/data/tabular_loader.ts b/discojs-web/src/data/tabular_loader.ts similarity index 88% rename from discojs/discojs-web/src/data/tabular_loader.ts rename to discojs-web/src/data/tabular_loader.ts index 034f1d641..f610752e7 100644 --- a/discojs/discojs-web/src/data/tabular_loader.ts +++ b/discojs-web/src/data/tabular_loader.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs' -import { data } from '@epfml/discojs-core' +import { data } from '@epfml/discojs' export class TabularLoader extends data.TabularLoader { async loadDatasetFrom (source: File, csvConfig: Record): Promise { diff --git a/discojs/discojs-web/src/data/text_loader.ts b/discojs-web/src/data/text_loader.ts similarity index 89% rename from discojs/discojs-web/src/data/text_loader.ts rename to discojs-web/src/data/text_loader.ts index b76d03016..55959ffcb 100644 --- a/discojs/discojs-web/src/data/text_loader.ts +++ b/discojs-web/src/data/text_loader.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs' -import { data } from '@epfml/discojs-core' +import { data } from '@epfml/discojs' export class TextLoader extends data.TextLoader { loadDatasetFrom (source: File): Promise { diff --git a/discojs/discojs-web/src/index.ts b/discojs-web/src/index.ts similarity index 100% rename from discojs/discojs-web/src/index.ts rename to discojs-web/src/index.ts diff --git a/discojs/discojs-web/src/memory/index.ts b/discojs-web/src/memory/index.ts similarity index 100% rename from discojs/discojs-web/src/memory/index.ts rename to discojs-web/src/memory/index.ts diff --git a/discojs/discojs-web/src/memory/memory.ts b/discojs-web/src/memory/memory.ts similarity index 98% rename from discojs/discojs-web/src/memory/memory.ts rename to discojs-web/src/memory/memory.ts index dff1497b8..e6eb99c1c 100644 --- a/discojs/discojs-web/src/memory/memory.ts +++ b/discojs-web/src/memory/memory.ts @@ -9,8 +9,8 @@ import { Map } from 'immutable' import * as tf from '@tensorflow/tfjs' -import type { Path, Model, ModelInfo, ModelSource } from '@epfml/discojs-core' -import { Memory, ModelType, models } from '@epfml/discojs-core' +import type { Path, Model, ModelInfo, ModelSource } from '@epfml/discojs' +import { Memory, ModelType, models } from '@epfml/discojs' export class IndexedDB extends Memory { override pathFor (source: ModelSource): Path { diff --git a/discojs/discojs-web/tsconfig.json b/discojs-web/tsconfig.json similarity index 78% rename from discojs/discojs-web/tsconfig.json rename to discojs-web/tsconfig.json index bbf2759e8..6484044a8 100644 --- a/discojs/discojs-web/tsconfig.json +++ b/discojs-web/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../tsconfig.base.json", "compilerOptions": { "lib": ["DOM"], "outDir": "dist", diff --git a/discojs/.gitignore b/discojs/.gitignore deleted file mode 100644 index 366cc549b..000000000 --- a/discojs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs/ - diff --git a/discojs/discojs-web/.mocharc.json b/discojs/.mocharc.json similarity index 100% rename from discojs/discojs-web/.mocharc.json rename to discojs/.mocharc.json diff --git a/discojs/discojs-web/.npmignore b/discojs/.npmignore similarity index 100% rename from discojs/discojs-web/.npmignore rename to discojs/.npmignore diff --git a/discojs/discojs-core/package.json b/discojs/package.json similarity index 96% rename from discojs/discojs-core/package.json rename to discojs/package.json index c811ff7af..28bb04bd7 100644 --- a/discojs/discojs-core/package.json +++ b/discojs/package.json @@ -1,5 +1,5 @@ { - "name": "@epfml/discojs-core", + "name": "@epfml/discojs", "version": "2.1.1", "type": "module", "main": "dist/index.js", diff --git a/discojs/discojs-core/src/aggregator/base.ts b/discojs/src/aggregator/base.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/base.ts rename to discojs/src/aggregator/base.ts diff --git a/discojs/discojs-core/src/aggregator/get.ts b/discojs/src/aggregator/get.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/get.ts rename to discojs/src/aggregator/get.ts diff --git a/discojs/discojs-core/src/aggregator/index.ts b/discojs/src/aggregator/index.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/index.ts rename to discojs/src/aggregator/index.ts diff --git a/discojs/discojs-core/src/aggregator/mean.spec.ts b/discojs/src/aggregator/mean.spec.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/mean.spec.ts rename to discojs/src/aggregator/mean.spec.ts diff --git a/discojs/discojs-core/src/aggregator/mean.ts b/discojs/src/aggregator/mean.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/mean.ts rename to discojs/src/aggregator/mean.ts diff --git a/discojs/discojs-core/src/aggregator/secure.spec.ts b/discojs/src/aggregator/secure.spec.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/secure.spec.ts rename to discojs/src/aggregator/secure.spec.ts diff --git a/discojs/discojs-core/src/aggregator/secure.ts b/discojs/src/aggregator/secure.ts similarity index 100% rename from discojs/discojs-core/src/aggregator/secure.ts rename to discojs/src/aggregator/secure.ts diff --git a/discojs/discojs-core/src/async_informant.spec.ts b/discojs/src/async_informant.spec.ts similarity index 100% rename from discojs/discojs-core/src/async_informant.spec.ts rename to discojs/src/async_informant.spec.ts diff --git a/discojs/discojs-core/src/async_informant.ts b/discojs/src/async_informant.ts similarity index 100% rename from discojs/discojs-core/src/async_informant.ts rename to discojs/src/async_informant.ts diff --git a/discojs/discojs-core/src/client/base.ts b/discojs/src/client/base.ts similarity index 100% rename from discojs/discojs-core/src/client/base.ts rename to discojs/src/client/base.ts diff --git a/discojs/discojs-core/src/client/decentralized/base.ts b/discojs/src/client/decentralized/base.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/base.ts rename to discojs/src/client/decentralized/base.ts diff --git a/discojs/discojs-core/src/client/decentralized/index.ts b/discojs/src/client/decentralized/index.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/index.ts rename to discojs/src/client/decentralized/index.ts diff --git a/discojs/discojs-core/src/client/decentralized/messages.ts b/discojs/src/client/decentralized/messages.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/messages.ts rename to discojs/src/client/decentralized/messages.ts diff --git a/discojs/discojs-core/src/client/decentralized/peer.spec.ts b/discojs/src/client/decentralized/peer.spec.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/peer.spec.ts rename to discojs/src/client/decentralized/peer.spec.ts diff --git a/discojs/discojs-core/src/client/decentralized/peer.ts b/discojs/src/client/decentralized/peer.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/peer.ts rename to discojs/src/client/decentralized/peer.ts diff --git a/discojs/discojs-core/src/client/decentralized/peer_pool.spec.ts b/discojs/src/client/decentralized/peer_pool.spec.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/peer_pool.spec.ts rename to discojs/src/client/decentralized/peer_pool.spec.ts diff --git a/discojs/discojs-core/src/client/decentralized/peer_pool.ts b/discojs/src/client/decentralized/peer_pool.ts similarity index 100% rename from discojs/discojs-core/src/client/decentralized/peer_pool.ts rename to discojs/src/client/decentralized/peer_pool.ts diff --git a/discojs/discojs-core/src/client/event_connection.ts b/discojs/src/client/event_connection.ts similarity index 100% rename from discojs/discojs-core/src/client/event_connection.ts rename to discojs/src/client/event_connection.ts diff --git a/discojs/discojs-core/src/client/federated/base.ts b/discojs/src/client/federated/base.ts similarity index 100% rename from discojs/discojs-core/src/client/federated/base.ts rename to discojs/src/client/federated/base.ts diff --git a/discojs/discojs-core/src/client/federated/index.ts b/discojs/src/client/federated/index.ts similarity index 100% rename from discojs/discojs-core/src/client/federated/index.ts rename to discojs/src/client/federated/index.ts diff --git a/discojs/discojs-core/src/client/federated/messages.ts b/discojs/src/client/federated/messages.ts similarity index 100% rename from discojs/discojs-core/src/client/federated/messages.ts rename to discojs/src/client/federated/messages.ts diff --git a/discojs/discojs-core/src/client/index.ts b/discojs/src/client/index.ts similarity index 100% rename from discojs/discojs-core/src/client/index.ts rename to discojs/src/client/index.ts diff --git a/discojs/discojs-core/src/client/local.ts b/discojs/src/client/local.ts similarity index 100% rename from discojs/discojs-core/src/client/local.ts rename to discojs/src/client/local.ts diff --git a/discojs/discojs-core/src/client/messages.ts b/discojs/src/client/messages.ts similarity index 100% rename from discojs/discojs-core/src/client/messages.ts rename to discojs/src/client/messages.ts diff --git a/discojs/discojs-core/src/client/types.ts b/discojs/src/client/types.ts similarity index 100% rename from discojs/discojs-core/src/client/types.ts rename to discojs/src/client/types.ts diff --git a/discojs/discojs-core/src/client/utils.ts b/discojs/src/client/utils.ts similarity index 100% rename from discojs/discojs-core/src/client/utils.ts rename to discojs/src/client/utils.ts diff --git a/discojs/discojs-core/src/dataset/data/data.ts b/discojs/src/dataset/data/data.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/data.ts rename to discojs/src/dataset/data/data.ts diff --git a/discojs/discojs-core/src/dataset/data/data_split.ts b/discojs/src/dataset/data/data_split.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/data_split.ts rename to discojs/src/dataset/data/data_split.ts diff --git a/discojs/discojs-core/src/dataset/data/image_data.spec.ts b/discojs/src/dataset/data/image_data.spec.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/image_data.spec.ts rename to discojs/src/dataset/data/image_data.spec.ts diff --git a/discojs/discojs-core/src/dataset/data/image_data.ts b/discojs/src/dataset/data/image_data.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/image_data.ts rename to discojs/src/dataset/data/image_data.ts diff --git a/discojs/discojs-core/src/dataset/data/index.ts b/discojs/src/dataset/data/index.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/index.ts rename to discojs/src/dataset/data/index.ts diff --git a/discojs/discojs-core/src/dataset/data/preprocessing/base.ts b/discojs/src/dataset/data/preprocessing/base.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/preprocessing/base.ts rename to discojs/src/dataset/data/preprocessing/base.ts diff --git a/discojs/discojs-core/src/dataset/data/preprocessing/image_preprocessing.ts b/discojs/src/dataset/data/preprocessing/image_preprocessing.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/preprocessing/image_preprocessing.ts rename to discojs/src/dataset/data/preprocessing/image_preprocessing.ts diff --git a/discojs/discojs-core/src/dataset/data/preprocessing/index.ts b/discojs/src/dataset/data/preprocessing/index.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/preprocessing/index.ts rename to discojs/src/dataset/data/preprocessing/index.ts diff --git a/discojs/discojs-core/src/dataset/data/preprocessing/tabular_preprocessing.ts b/discojs/src/dataset/data/preprocessing/tabular_preprocessing.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/preprocessing/tabular_preprocessing.ts rename to discojs/src/dataset/data/preprocessing/tabular_preprocessing.ts diff --git a/discojs/discojs-core/src/dataset/data/preprocessing/text_preprocessing.spec.ts b/discojs/src/dataset/data/preprocessing/text_preprocessing.spec.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/preprocessing/text_preprocessing.spec.ts rename to discojs/src/dataset/data/preprocessing/text_preprocessing.spec.ts diff --git a/discojs/discojs-core/src/dataset/data/preprocessing/text_preprocessing.ts b/discojs/src/dataset/data/preprocessing/text_preprocessing.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/preprocessing/text_preprocessing.ts rename to discojs/src/dataset/data/preprocessing/text_preprocessing.ts diff --git a/discojs/discojs-core/src/dataset/data/tabular_data.spec.ts b/discojs/src/dataset/data/tabular_data.spec.ts similarity index 87% rename from discojs/discojs-core/src/dataset/data/tabular_data.spec.ts rename to discojs/src/dataset/data/tabular_data.spec.ts index a0d727570..91b0a738c 100644 --- a/discojs/discojs-core/src/dataset/data/tabular_data.spec.ts +++ b/discojs/src/dataset/data/tabular_data.spec.ts @@ -51,7 +51,7 @@ describe('tabular data checks', () => { it('throw an error on incorrectly formatted data', async () => { try { - await TabularData.init(tf.data.csv('file://../../datasets/cifar10-labels.csv', csvConfig), titanicMock, 3) + await TabularData.init(tf.data.csv('file://../datasets/cifar10-labels.csv', csvConfig), titanicMock, 3) } catch (e) { expect(e).to.be.an.instanceOf(Error) return @@ -61,6 +61,6 @@ describe('tabular data checks', () => { }) it('do nothing on correctly formatted data', async () => { - await TabularData.init(tf.data.csv('file://../../datasets/titanic_train.csv', csvConfig), titanicMock, 3) + await TabularData.init(tf.data.csv('file://../datasets/titanic_train.csv', csvConfig), titanicMock, 3) }) }) diff --git a/discojs/discojs-core/src/dataset/data/tabular_data.ts b/discojs/src/dataset/data/tabular_data.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/tabular_data.ts rename to discojs/src/dataset/data/tabular_data.ts diff --git a/discojs/discojs-core/src/dataset/data/text_data.ts b/discojs/src/dataset/data/text_data.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data/text_data.ts rename to discojs/src/dataset/data/text_data.ts diff --git a/discojs/discojs-core/src/dataset/data_loader/data_loader.ts b/discojs/src/dataset/data_loader/data_loader.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data_loader/data_loader.ts rename to discojs/src/dataset/data_loader/data_loader.ts diff --git a/discojs/discojs-core/src/dataset/data_loader/image_loader.ts b/discojs/src/dataset/data_loader/image_loader.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data_loader/image_loader.ts rename to discojs/src/dataset/data_loader/image_loader.ts diff --git a/discojs/discojs-core/src/dataset/data_loader/index.ts b/discojs/src/dataset/data_loader/index.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data_loader/index.ts rename to discojs/src/dataset/data_loader/index.ts diff --git a/discojs/discojs-core/src/dataset/data_loader/tabular_loader.ts b/discojs/src/dataset/data_loader/tabular_loader.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data_loader/tabular_loader.ts rename to discojs/src/dataset/data_loader/tabular_loader.ts diff --git a/discojs/discojs-core/src/dataset/data_loader/text_loader.ts b/discojs/src/dataset/data_loader/text_loader.ts similarity index 100% rename from discojs/discojs-core/src/dataset/data_loader/text_loader.ts rename to discojs/src/dataset/data_loader/text_loader.ts diff --git a/discojs/discojs-core/src/dataset/dataset.ts b/discojs/src/dataset/dataset.ts similarity index 100% rename from discojs/discojs-core/src/dataset/dataset.ts rename to discojs/src/dataset/dataset.ts diff --git a/discojs/discojs-core/src/dataset/dataset_builder.ts b/discojs/src/dataset/dataset_builder.ts similarity index 100% rename from discojs/discojs-core/src/dataset/dataset_builder.ts rename to discojs/src/dataset/dataset_builder.ts diff --git a/discojs/discojs-core/src/dataset/index.ts b/discojs/src/dataset/index.ts similarity index 100% rename from discojs/discojs-core/src/dataset/index.ts rename to discojs/src/dataset/index.ts diff --git a/discojs/discojs-core/src/default_tasks/cifar10.ts b/discojs/src/default_tasks/cifar10.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/cifar10.ts rename to discojs/src/default_tasks/cifar10.ts diff --git a/discojs/discojs-core/src/default_tasks/geotags.ts b/discojs/src/default_tasks/geotags.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/geotags.ts rename to discojs/src/default_tasks/geotags.ts diff --git a/discojs/discojs-core/src/default_tasks/index.ts b/discojs/src/default_tasks/index.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/index.ts rename to discojs/src/default_tasks/index.ts diff --git a/discojs/discojs-core/src/default_tasks/lus_covid.ts b/discojs/src/default_tasks/lus_covid.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/lus_covid.ts rename to discojs/src/default_tasks/lus_covid.ts diff --git a/discojs/discojs-core/src/default_tasks/mnist.ts b/discojs/src/default_tasks/mnist.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/mnist.ts rename to discojs/src/default_tasks/mnist.ts diff --git a/discojs/discojs-core/src/default_tasks/simple_face.ts b/discojs/src/default_tasks/simple_face.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/simple_face.ts rename to discojs/src/default_tasks/simple_face.ts diff --git a/discojs/discojs-core/src/default_tasks/skin_mnist.ts b/discojs/src/default_tasks/skin_mnist.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/skin_mnist.ts rename to discojs/src/default_tasks/skin_mnist.ts diff --git a/discojs/discojs-core/src/default_tasks/titanic.ts b/discojs/src/default_tasks/titanic.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/titanic.ts rename to discojs/src/default_tasks/titanic.ts diff --git a/discojs/discojs-core/src/default_tasks/wikitext.ts b/discojs/src/default_tasks/wikitext.ts similarity index 100% rename from discojs/discojs-core/src/default_tasks/wikitext.ts rename to discojs/src/default_tasks/wikitext.ts diff --git a/discojs/discojs-core/src/index.ts b/discojs/src/index.ts similarity index 100% rename from discojs/discojs-core/src/index.ts rename to discojs/src/index.ts diff --git a/discojs/discojs-core/src/informant/graph_informant.ts b/discojs/src/informant/graph_informant.ts similarity index 100% rename from discojs/discojs-core/src/informant/graph_informant.ts rename to discojs/src/informant/graph_informant.ts diff --git a/discojs/discojs-core/src/informant/index.ts b/discojs/src/informant/index.ts similarity index 100% rename from discojs/discojs-core/src/informant/index.ts rename to discojs/src/informant/index.ts diff --git a/discojs/discojs-core/src/logging/console_logger.ts b/discojs/src/logging/console_logger.ts similarity index 100% rename from discojs/discojs-core/src/logging/console_logger.ts rename to discojs/src/logging/console_logger.ts diff --git a/discojs/discojs-core/src/logging/index.ts b/discojs/src/logging/index.ts similarity index 100% rename from discojs/discojs-core/src/logging/index.ts rename to discojs/src/logging/index.ts diff --git a/discojs/discojs-core/src/logging/logger.ts b/discojs/src/logging/logger.ts similarity index 100% rename from discojs/discojs-core/src/logging/logger.ts rename to discojs/src/logging/logger.ts diff --git a/discojs/discojs-core/src/memory/base.ts b/discojs/src/memory/base.ts similarity index 100% rename from discojs/discojs-core/src/memory/base.ts rename to discojs/src/memory/base.ts diff --git a/discojs/discojs-core/src/memory/empty.ts b/discojs/src/memory/empty.ts similarity index 100% rename from discojs/discojs-core/src/memory/empty.ts rename to discojs/src/memory/empty.ts diff --git a/discojs/discojs-core/src/memory/index.ts b/discojs/src/memory/index.ts similarity index 100% rename from discojs/discojs-core/src/memory/index.ts rename to discojs/src/memory/index.ts diff --git a/discojs/discojs-core/src/memory/model_type.ts b/discojs/src/memory/model_type.ts similarity index 100% rename from discojs/discojs-core/src/memory/model_type.ts rename to discojs/src/memory/model_type.ts diff --git a/discojs/discojs-core/src/models/gpt/LICENSE.md b/discojs/src/models/gpt/LICENSE.md similarity index 100% rename from discojs/discojs-core/src/models/gpt/LICENSE.md rename to discojs/src/models/gpt/LICENSE.md diff --git a/discojs/discojs-core/src/models/gpt/config.ts b/discojs/src/models/gpt/config.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/config.ts rename to discojs/src/models/gpt/config.ts diff --git a/discojs/discojs-core/src/models/gpt/evaluate.ts b/discojs/src/models/gpt/evaluate.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/evaluate.ts rename to discojs/src/models/gpt/evaluate.ts diff --git a/discojs/discojs-core/src/models/gpt/gpt.spec.ts b/discojs/src/models/gpt/gpt.spec.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/gpt.spec.ts rename to discojs/src/models/gpt/gpt.spec.ts diff --git a/discojs/discojs-core/src/models/gpt/index.ts b/discojs/src/models/gpt/index.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/index.ts rename to discojs/src/models/gpt/index.ts diff --git a/discojs/discojs-core/src/models/gpt/layers.ts b/discojs/src/models/gpt/layers.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/layers.ts rename to discojs/src/models/gpt/layers.ts diff --git a/discojs/discojs-core/src/models/gpt/model.ts b/discojs/src/models/gpt/model.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/model.ts rename to discojs/src/models/gpt/model.ts diff --git a/discojs/discojs-core/src/models/gpt/optimizers.ts b/discojs/src/models/gpt/optimizers.ts similarity index 100% rename from discojs/discojs-core/src/models/gpt/optimizers.ts rename to discojs/src/models/gpt/optimizers.ts diff --git a/discojs/discojs-core/src/models/index.ts b/discojs/src/models/index.ts similarity index 100% rename from discojs/discojs-core/src/models/index.ts rename to discojs/src/models/index.ts diff --git a/discojs/discojs-core/src/models/model.ts b/discojs/src/models/model.ts similarity index 100% rename from discojs/discojs-core/src/models/model.ts rename to discojs/src/models/model.ts diff --git a/discojs/discojs-core/src/models/tfjs.ts b/discojs/src/models/tfjs.ts similarity index 100% rename from discojs/discojs-core/src/models/tfjs.ts rename to discojs/src/models/tfjs.ts diff --git a/discojs/discojs-core/src/models/tokenizer.ts b/discojs/src/models/tokenizer.ts similarity index 100% rename from discojs/discojs-core/src/models/tokenizer.ts rename to discojs/src/models/tokenizer.ts diff --git a/discojs/discojs-core/src/privacy.ts b/discojs/src/privacy.ts similarity index 100% rename from discojs/discojs-core/src/privacy.ts rename to discojs/src/privacy.ts diff --git a/discojs/discojs-core/src/serialization/index.ts b/discojs/src/serialization/index.ts similarity index 100% rename from discojs/discojs-core/src/serialization/index.ts rename to discojs/src/serialization/index.ts diff --git a/discojs/discojs-core/src/serialization/model.spec.ts b/discojs/src/serialization/model.spec.ts similarity index 100% rename from discojs/discojs-core/src/serialization/model.spec.ts rename to discojs/src/serialization/model.spec.ts diff --git a/discojs/discojs-core/src/serialization/model.ts b/discojs/src/serialization/model.ts similarity index 100% rename from discojs/discojs-core/src/serialization/model.ts rename to discojs/src/serialization/model.ts diff --git a/discojs/discojs-core/src/serialization/weights.spec.ts b/discojs/src/serialization/weights.spec.ts similarity index 100% rename from discojs/discojs-core/src/serialization/weights.spec.ts rename to discojs/src/serialization/weights.spec.ts diff --git a/discojs/discojs-core/src/serialization/weights.ts b/discojs/src/serialization/weights.ts similarity index 100% rename from discojs/discojs-core/src/serialization/weights.ts rename to discojs/src/serialization/weights.ts diff --git a/discojs/discojs-core/src/task/data_example.ts b/discojs/src/task/data_example.ts similarity index 100% rename from discojs/discojs-core/src/task/data_example.ts rename to discojs/src/task/data_example.ts diff --git a/discojs/discojs-core/src/task/digest.ts b/discojs/src/task/digest.ts similarity index 100% rename from discojs/discojs-core/src/task/digest.ts rename to discojs/src/task/digest.ts diff --git a/discojs/discojs-core/src/task/display_information.ts b/discojs/src/task/display_information.ts similarity index 100% rename from discojs/discojs-core/src/task/display_information.ts rename to discojs/src/task/display_information.ts diff --git a/discojs/discojs-core/src/task/index.ts b/discojs/src/task/index.ts similarity index 100% rename from discojs/discojs-core/src/task/index.ts rename to discojs/src/task/index.ts diff --git a/discojs/discojs-core/src/task/label_type.ts b/discojs/src/task/label_type.ts similarity index 100% rename from discojs/discojs-core/src/task/label_type.ts rename to discojs/src/task/label_type.ts diff --git a/discojs/discojs-core/src/task/summary.ts b/discojs/src/task/summary.ts similarity index 100% rename from discojs/discojs-core/src/task/summary.ts rename to discojs/src/task/summary.ts diff --git a/discojs/discojs-core/src/task/task.ts b/discojs/src/task/task.ts similarity index 100% rename from discojs/discojs-core/src/task/task.ts rename to discojs/src/task/task.ts diff --git a/discojs/discojs-core/src/task/task_handler.ts b/discojs/src/task/task_handler.ts similarity index 100% rename from discojs/discojs-core/src/task/task_handler.ts rename to discojs/src/task/task_handler.ts diff --git a/discojs/discojs-core/src/task/task_provider.ts b/discojs/src/task/task_provider.ts similarity index 100% rename from discojs/discojs-core/src/task/task_provider.ts rename to discojs/src/task/task_provider.ts diff --git a/discojs/discojs-core/src/task/training_information.ts b/discojs/src/task/training_information.ts similarity index 100% rename from discojs/discojs-core/src/task/training_information.ts rename to discojs/src/task/training_information.ts diff --git a/discojs/discojs-core/src/training/disco.ts b/discojs/src/training/disco.ts similarity index 100% rename from discojs/discojs-core/src/training/disco.ts rename to discojs/src/training/disco.ts diff --git a/discojs/discojs-core/src/training/index.ts b/discojs/src/training/index.ts similarity index 100% rename from discojs/discojs-core/src/training/index.ts rename to discojs/src/training/index.ts diff --git a/discojs/discojs-core/src/training/trainer/distributed_trainer.ts b/discojs/src/training/trainer/distributed_trainer.ts similarity index 100% rename from discojs/discojs-core/src/training/trainer/distributed_trainer.ts rename to discojs/src/training/trainer/distributed_trainer.ts diff --git a/discojs/discojs-core/src/training/trainer/local_trainer.ts b/discojs/src/training/trainer/local_trainer.ts similarity index 100% rename from discojs/discojs-core/src/training/trainer/local_trainer.ts rename to discojs/src/training/trainer/local_trainer.ts diff --git a/discojs/discojs-core/src/training/trainer/trainer.ts b/discojs/src/training/trainer/trainer.ts similarity index 100% rename from discojs/discojs-core/src/training/trainer/trainer.ts rename to discojs/src/training/trainer/trainer.ts diff --git a/discojs/discojs-core/src/training/trainer/trainer_builder.ts b/discojs/src/training/trainer/trainer_builder.ts similarity index 100% rename from discojs/discojs-core/src/training/trainer/trainer_builder.ts rename to discojs/src/training/trainer/trainer_builder.ts diff --git a/discojs/discojs-core/src/types.ts b/discojs/src/types.ts similarity index 100% rename from discojs/discojs-core/src/types.ts rename to discojs/src/types.ts diff --git a/discojs/discojs-core/src/utils/event_emitter.ts b/discojs/src/utils/event_emitter.ts similarity index 100% rename from discojs/discojs-core/src/utils/event_emitter.ts rename to discojs/src/utils/event_emitter.ts diff --git a/discojs/discojs-core/src/validation/index.ts b/discojs/src/validation/index.ts similarity index 100% rename from discojs/discojs-core/src/validation/index.ts rename to discojs/src/validation/index.ts diff --git a/discojs/discojs-core/src/validation/validator.ts b/discojs/src/validation/validator.ts similarity index 100% rename from discojs/discojs-core/src/validation/validator.ts rename to discojs/src/validation/validator.ts diff --git a/discojs/discojs-core/src/weights/aggregation.spec.ts b/discojs/src/weights/aggregation.spec.ts similarity index 100% rename from discojs/discojs-core/src/weights/aggregation.spec.ts rename to discojs/src/weights/aggregation.spec.ts diff --git a/discojs/discojs-core/src/weights/aggregation.ts b/discojs/src/weights/aggregation.ts similarity index 100% rename from discojs/discojs-core/src/weights/aggregation.ts rename to discojs/src/weights/aggregation.ts diff --git a/discojs/discojs-core/src/weights/index.ts b/discojs/src/weights/index.ts similarity index 100% rename from discojs/discojs-core/src/weights/index.ts rename to discojs/src/weights/index.ts diff --git a/discojs/discojs-core/src/weights/weights_container.ts b/discojs/src/weights/weights_container.ts similarity index 100% rename from discojs/discojs-core/src/weights/weights_container.ts rename to discojs/src/weights/weights_container.ts diff --git a/discojs/discojs-core/tsconfig.json b/discojs/tsconfig.json similarity index 76% rename from discojs/discojs-core/tsconfig.json rename to discojs/tsconfig.json index 1e0adf398..38438c338 100644 --- a/discojs/discojs-core/tsconfig.json +++ b/discojs/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../tsconfig.base.json", "compilerOptions": { "outDir": "dist", "declaration": true diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 2a97e4827..d2597e648 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -20,8 +20,8 @@ with both to a certain extent. If not, the following references might be useful: ## First steps -DISCO is a complex project composed of the Disco.js library (`discojs`), a front-end (`web-client`), -a `server` and a `cli` (e.g., for benchmarking). Depending on what your goal is, you might only use a subset of them, e.g. you won't need an in-depth understanding of the web-client and Vue.js to add a new decentralized learning feature. Instead, you will probably rely on the CLI. +DISCO is a complex project composed of the Disco.js library (`discojs`), a front-end (`webapp`), +a `server` and a `cli` (e.g., for benchmarking). Depending on what your goal is, you might only use a subset of them, e.g. you won't need an in-depth understanding of the webapp and Vue.js to add a new decentralized learning feature. Instead, you will probably rely on the CLI. 1. If you are going to work, contribute and improve the project, I first recommend you get a good understand of what DISCO does: play around with the [website](https://epfml.github.io/disco/#/), train a model from the pre-defined tasks, or even create your own custom task. Feedback is always appreciated, feel free to let us know on slack/in the github issues/in person if you noticed any issues or thought of an improvement. @@ -32,7 +32,7 @@ a `server` and a `cli` (e.g., for benchmarking). Depending on what your goal is, > [!TIP] > The most common issues with running DISCO are usually due to using old Node.js versions and setting the appropriate environment on M1 Macs, see [our FAQ](./FAQ.md) for more troubleshooting. Note that DISCO has been not tested on Windows (only Linux and macOS). -There are many ways to use Disco.js: from a browser, a CLI, by importing `discojs-node` in your own Node.js scripts and applications or from your own UI implementation. Note that whatever your setting, using Disco.js always requires a `server` instance. Some cases like the CLI starts a server instance automatically, but others like the web-client doesn't and require either an existing instance or to have you launch a local server instance. As described in the [`server` README file](../server/REDME.md), the server is in charge of connecting peers to the ML tasks. In order to connect and partake in a distributed training session you first need to find the session and how to join it so the sever exposes an API to that end. +There are many ways to use Disco.js: from a browser, a CLI, by importing `discojs-node` in your own Node.js scripts and applications or from your own UI implementation. Note that whatever your setting, using Disco.js always requires a `server` instance. Some cases like the CLI starts a server instance automatically, but others like the webapp doesn't and require either an existing instance or to have you launch a local server instance. As described in the [`server` README file](../server/REDME.md), the server is in charge of connecting peers to the ML tasks. In order to connect and partake in a distributed training session you first need to find the session and how to join it so the sever exposes an API to that end. ## Contributing in practice @@ -65,24 +65,24 @@ Make sure you are not running a server at the same time as the test suite will l Server tests live in the `server/tests/` folder. All files ending with the `.spec.ts` extension written in this folder will be run as tests. Simply write a new `your_own_test.spec.ts` file to include it in the testing pipeline. -### Contributing to `web-client` +### Contributing to `webapp` -If you are planning to contribute to the `web-client`, have a look at [VUEJS.md](./VUEJS.md) to read more on how Vue.js is used in this project. +If you are planning to contribute to the `webapp`, have a look at [VUEJS.md](./VUEJS.md) to read more on how Vue.js is used in this project. -The `web-client` requires that an server instance is running. You can start a local one as described in the last section with: +The `webapp` requires that an server instance is running. You can start a local one as described in the last section with: ``` npm -w server start # from the root folder ``` -The web-client can now be started with: +The webapp can now be started with: ``` -npm -w web-client start # from the root folder -npm start # from the web-client folder +npm -w webapp start # from the root folder +npm start # from the webapp folder ``` -The Vue development mode supports hot-reloading via `vite` and the client will automatically restart whenever a change in `web-client` is detected. Starting the Web Client should print something similar to +The Vue development mode supports hot-reloading via `vite` and the client will automatically restart whenever a change in `webapp` is detected. Starting the Web Client should print something similar to ``` VITE v5.2.7 ready in 1312 ms @@ -92,17 +92,17 @@ The Vue development mode supports hot-reloading via `vite` and the client will a ➜ press h + enter to show help ``` -You can access the client at the Local address from the machine running the web-client and any device on the same network can access the app with the Network address. +You can access the client at the Local address from the machine running the webapp and any device on the same network can access the app with the Network address. As said previously, modifying `discojs` isn't effective automatically and requires a build. -You can test the `web-client` with: +You can test the `webapp` with: ``` -npm -w web-client test +npm -w webapp test ``` -The web-client tests rely on `cypress` and the test suite is located in the `web-client/cypress` folder. +The webapp tests rely on `cypress` and the test suite is located in the `webapp/cypress` folder. ### Contributing to `discojs` @@ -114,17 +114,17 @@ Because TypeScript needs to be transpiled to JavaScript, you need to rebuild the npm -w discojs run build ``` -The previous command invokes the TypeScript compiler (`tsc`) which successively compiles `discojs-core`, `discojs-node` and `discojs-web`, creating equivalent JavaScript files in the modules' respective `dist/` directory. +The previous command invokes the TypeScript compiler (`tsc`) which successively compiles `discojs`, `discojs-node` and `discojs-web`, creating equivalent JavaScript files in the modules' respective `dist/` directory. -To automate the building phase, you can use the `watch` command to rebuild a module whenever changes are detected. The `watch` command currently only works at the level of `discojs-core`, `discojs-node` or `discojs-web` (i.e., running watch over the whole `discojs` folder doesn't work and would only watch `discojs-core`) +To automate the building phase, you can use the `watch` command to rebuild a module whenever changes are detected. The `watch` command currently only works at the level of `discojs`, `discojs-node` or `discojs-web` (i.e., running watch over the whole `discojs` folder doesn't work and would only watch `discojs`) ```sh -npm -w ./discojs/discojs-core run watch build -npm -w ./discojs/discojs-node run watch build # another terminal -npm -w ./discojs/discojs-web run watch build # one more terminal +npm -w ./discojs run watch build +npm -w ./discojs-node run watch build # another terminal +npm -w ./discojs-web run watch build # one more terminal ``` -Building is not necessary for other modules like the `server` the `web-client` or `cli` as long as no change have been made to `discojs`. However you may need to restart the `server` or the `web-client` after rebuilding `discojs`. +Building is not necessary for other modules like the `server` the `webapp` or `cli` as long as no change have been made to `discojs`. However you may need to restart the `server` or the `webapp` after rebuilding `discojs`. To test `discojs`, first make sure a server instance is running: @@ -140,9 +140,9 @@ npm -w discojs test Similarly to the server, any file ending with `.spec.ts` will be ran in the test suite. As a convention, we duplicate the name of the TypeScript file we are testing. For example, `async_informant.spec.ts` tests features implemented in `async_informant.ts` and is located in the same folder. -### `discojs-core`, `discojs-node` and `discojs-web` +### `discojs`, `discojs-node` and `discojs-web` -`discojs-core` contains the core, platform-agnostic code of Disco.js, used by both `discojs-web` and `discojs-node`. As such, contributions to `discojs-core` must only contain code independent of either Node or the browser. As the names subtly suggest, `discojs-node` and `discojs-web` implement features specific to Node.js and browsers respectively, mostly related to memory and data handling as browser don't allow access to the file system. +`discojs` contains the core, platform-agnostic code of Disco.js, used by both `discojs-web` and `discojs-node`. As such, contributions to `discojs` must only contain code independent of either Node or the browser. As the names subtly suggest, `discojs-node` and `discojs-web` implement features specific to Node.js and browsers respectively, mostly related to memory and data handling as browser don't allow access to the file system. Currently, the `discojs-node` project is available as the `@epfml/discojs-node` NPM package, which can be installed with `npm i @epfml/discojs-node` while the `discojs-web` project is available as the `@epfml/discojs` (and **not** as `@epfml/discojs-web`) NPM package, which can be installed with `npm i @epfml/discojs`. @@ -208,7 +208,7 @@ It is important to give a good description to your PR as this makes it easier fo Once you have finished your work on your draft PR, make sure to do the following before turning it into review PR. -1. Run the adequate test suites (server, web-client, discojs). +1. Run the adequate test suites (server, webapp, discojs). 2. Make sure you remove debugging comments / console outputs. 3. Merge (or rebase if you can do it properly) `develop` into your feature branch: diff --git a/docs/DISCOJS.md b/docs/DISCOJS.md index d5ec44370..ee387540d 100644 --- a/docs/DISCOJS.md +++ b/docs/DISCOJS.md @@ -1,7 +1,7 @@ # `Disco.js` under the hood -This guide goes over how the core logic is structured and what are the main abstractions of Disco.js, implemented in `discojs/discojs-core`. -As described in the [developer guide](../DEV.md), `discojs-node` and `discojs-web` are simple wrappers allowing to use `discojs-core` code from different platforms and technology, namely, a browser or Node.js. +This guide goes over how the core logic is structured and what are the main abstractions of Disco.js, implemented in `discojs`. +As described in the [developer guide](../DEV.md), `discojs-node` and `discojs-web` are simple wrappers allowing to use `discojs` code from different platforms and technology, namely, a browser or Node.js. ### Terminology @@ -118,7 +118,7 @@ flowchart LR ### Memory -The `DistributedTrainer` has a `memory` attribute that is used to abstract how trained models are stored by the client. As mentioned in various guides, `discojs-core` is platform-agnostic and only what endpoints the memory storage should offer. The actual implementation is in `discojs-web` used by the browser UI and implements the memory via IndexedDB, a browser storage. `discojs-core` also implements a dummy memory, used by the CLI for example, to benchmark performance metrics without saving any models. +The `DistributedTrainer` has a `memory` attribute that is used to abstract how trained models are stored by the client. As mentioned in various guides, `discojs` is platform-agnostic and only what endpoints the memory storage should offer. The actual implementation is in `discojs-web` used by the browser UI and implements the memory via IndexedDB, a browser storage. `discojs` also implements a dummy memory, used by the CLI for example, to benchmark performance metrics without saving any models. ### Training informant diff --git a/docs/FAQ.md b/docs/FAQ.md index ac02e0bcf..d2beb00eb 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -26,8 +26,4 @@ which should output something similar to `arm64`. Then, `npm i @tensorflow/tfjs` ### VSCode can't resolve imports -You may not be able to open the editor from the repo root level without VSCode raising imports errors. If that is the case, you should start VSCode from inside the module you are working such that the editor can resolve the imports. In practice, that is any folder level that contains a package.json such as `server`, `web-client`, etc. For example, if you are working on the CLI, you should start VSCode with the command `code cli` from the root level (or `cd cli`, `code .`) - - - - +You may not be able to open the editor from the repo root level without VSCode raising imports errors. If that is the case, you should start VSCode from inside the module you are working such that the editor can resolve the imports. In practice, that is any folder level that contains a package.json such as `server`, `webapp`, etc. For example, if you are working on the CLI, you should start VSCode with the command `code cli` from the root level (or `cd cli`, `code .`) diff --git a/docs/TASK.md b/docs/TASK.md index 5ad89a0e6..068fcea3e 100644 --- a/docs/TASK.md +++ b/docs/TASK.md @@ -2,7 +2,7 @@ DISCO currently allows learning of arbitrary machine learning tasks, where tasks can be defined in three possible ways: -1. **Predefined tasks**: As examples, DISCO already hosts several pre-defined popular tasks such as [Titanic](../discojs/discojs-core/src/tasks/titanic.ts), [CIFAR-10](../discojs/discojs-core/src/tasks/cifar10.ts), and [MNIST](../discojs/discojs-core/src/tasks/mnist.ts) among others. +1. **Predefined tasks**: As examples, DISCO already hosts several pre-defined popular tasks such as [Titanic](../discojs/src/tasks/titanic.ts), [CIFAR-10](../discojs/src/tasks/cifar10.ts), and [MNIST](../discojs/src/tasks/mnist.ts) among others. 2. **Task creation UI**: new tasks can be defined via the [**task creation form**](https://epfml.github.io/disco/#/create) 3. **Implementing custom tasks**: tasks too specific for the UI form need to be implemented in the repository directly. @@ -53,7 +53,7 @@ The [task creation form](https://epfml.github.io/disco/#/create) lets users crea Programming skills are necessary to add a custom task not supported by the task creation UI. A task is mainly defined by a `TaskProvider` which needs to implement two methods: -- `getTask` which returns a `Task` as defined by the [Task interface](../discojs/discojs-core/src/task/task.ts). The `Task` contains all the crucial information from training to the mode +- `getTask` which returns a `Task` as defined by the [Task interface](../discojs/src/task/task.ts). The `Task` contains all the crucial information from training to the mode - `getModel` which returns a `Promise` specifying a model architecture for the task You can add a new task in two different ways: @@ -61,7 +61,7 @@ You can add a new task in two different ways: - a) As a new default task, e.g. to make the task available in production - b) By using the `disco.addTask` method if you run the server yourself -a) By creating (and exporting in [`index.ts`](https://github.com/epfml/disco/blob/develop/discojs/discojs-core/src/default_tasks/index.ts)) a new `TaskProvider` in [`default_tasks`](https://github.com/epfml/disco/tree/develop/discojs/discojs-core/src/default_tasks) it will be loaded automatically by the server. Adding a new task this way is necessary to add a new task to the production server. +a) By creating (and exporting in [`index.ts`](../discojs/src/default_tasks/index.ts)) a new `TaskProvider` in [`default_tasks`](../discojs/src/default_tasks) it will be loaded automatically by the server. Adding a new task this way is necessary to add a new task to the production server. b) If you run the server yourself you directly provide the task to the server without modifying Disco.js. An example is given in [custom_task.ts](./examples/README.md). @@ -134,9 +134,9 @@ async function getModel(modelPath: string): Promise { In summary here are the most common ways of loading a model: -- Loading the model from the web (example in [cifar10](../discojs/discojs-core/src/default_tasks/cifar10.ts)) +- Loading the model from the web (example in [cifar10](../discojs/src/default_tasks/cifar10.ts)) - Loading the model from the local filesystem (similar to the web with a file path from the server filesystem) -- Defining the architecture directly in the `TaskProvider` (example in [luscovid](../discojs/discojs-core/src/default_tasks/lus_covid.ts)) +- Defining the architecture directly in the `TaskProvider` (example in [luscovid](../discojs/src/default_tasks/lus_covid.ts)) At runtime, the models are stored in `disco/server/models/`, and it is also in the server side that we let disco know where exactly they are saved. @@ -150,7 +150,7 @@ scheme of distributed learning (federated or decentralized), along with other me The [`TrainingInformation` object](../discojs/src/task/training_information.ts) of a task contains all the customizable parameters and their descriptions. -As an example, the task class for `simple-face` can be found [here](../discojs/discojs-core/src/default_tasks/simple_face.ts). Suppose +As an example, the task class for `simple-face` can be found [here](../discojs/src/default_tasks/simple_face.ts). Suppose our own task is a binary classification for age detection (similar to simple face), then we could write: ```js @@ -184,14 +184,14 @@ export const customTask: TaskProvider = { } ``` -The `Task` interface has three fields: a mandatory `id` (of `string` type), an optional `displayInformation`, and an optional `trainingInformation`. The interfaces for the optional fields are [`DisplayInformation`](../discojs/discojs-core/src/task/display_information.ts) and [`TrainingInformation`](../discojs/discojs-core/src/task/training_information.ts). +The `Task` interface has three fields: a mandatory `id` (of `string` type), an optional `displayInformation`, and an optional `trainingInformation`. The interfaces for the optional fields are [`DisplayInformation`](../discojs/src/task/display_information.ts) and [`TrainingInformation`](../discojs/src/task/training_information.ts). ### Preprocessing -In the Task object we can optionally choose to add preprocessing functions. Preprocessing is defined [here](../discojs/discojs-core/src/dataset/data/preprocessing.ts), +In the Task object we can optionally choose to add preprocessing functions. Preprocessing is defined [here](../discojs/src/dataset/data/preprocessing.ts), and is currently only implemented for images (e.g. resize, normalize, ...). -Suppose we want our custom preprocessing that divides each pixel value by 2. In the [preprocessing](../discojs/discojs-core/src/dataset/data/preprocessing.ts) file, +Suppose we want our custom preprocessing that divides each pixel value by 2. In the [preprocessing](../discojs/src/dataset/data/preprocessing.ts) file, first we add the enum of our custom function: ```js @@ -202,7 +202,7 @@ export enum ImagePreprocessing { } ``` -If your task requires a preprocessing function to be applied to the data before training, you can specify it in the `preprocessingFunctions` field of the `trainingInformation` parameter in the task object. In order to add custom preprocessing function, either extend the `Preprocessing` type and define your preprocessing functions in the [preprocessing](../discojs/discojs-core/src/dataset/data/preprocessing.ts) file. If the preprocessing function is challenging to implement in JS (e.g requires complex audio preprocessing for JS), we recommend implementing in some other language which supports the desired preprocessing (e.g. Python) and feed the preprocessed data to the task. +If your task requires a preprocessing function to be applied to the data before training, you can specify it in the `preprocessingFunctions` field of the `trainingInformation` parameter in the task object. In order to add custom preprocessing function, either extend the `Preprocessing` type and define your preprocessing functions in the [preprocessing](../discojs/src/dataset/data/preprocessing.ts) file. If the preprocessing function is challenging to implement in JS (e.g requires complex audio preprocessing for JS), we recommend implementing in some other language which supports the desired preprocessing (e.g. Python) and feed the preprocessed data to the task. #### Rebuild @@ -255,14 +255,10 @@ export const task: Task = { ## Summary -- In `disco/discojs/discojs-core/src/default_tasks/` define your new custom task by implementing the `TaskProvider` interface. You will need to have your model in the .json + .bin format. -- In `disco/discojs/discojs-core/src/default_tasks/index.ts` export your newly defined task -- Run the `./build.sh` script from `discojs/discojs-core` -- Reinstall cleanly the server by running `npm ci` from `disco/server` -- Reinstall cleanly the client by running `npm ci` from `disco/web-client` -- Instantiate a Disco server by running `npm run dev` from `disco/server` -- Instantiate a Disco client by running `npm run dev` from `disco/web-client` +- In `discojs/src/default_tasks/` define your new custom task by implementing the `TaskProvider` interface. +- In `discojs/src/default_tasks/index.ts` export your newly defined task +- Run `npm -ws run build` +- Instantiate a Disco server by running `npm start` from `server` +- Instantiate a Disco client by running `npm start` from `webapp` Your task has been successfully uploaded. - -**Or** just use the NPM `disco-server` package and add your own custom `TaskProvider` directly to the server. diff --git a/docs/examples/custom_task.ts b/docs/examples/custom_task.ts index 064813ba6..006e6daed 100644 --- a/docs/examples/custom_task.ts +++ b/docs/examples/custom_task.ts @@ -1,7 +1,7 @@ import tf from '@tensorflow/tfjs' -import type { TaskProvider } from '@epfml/discojs-core' -import { models } from '@epfml/discojs-core' +import type { TaskProvider } from '@epfml/discojs' +import { models } from '@epfml/discojs' import { Disco as DiscoServer } from '@epfml/disco-server' // Define your own task provider (task definition + model) diff --git a/docs/examples/package.json b/docs/examples/package.json index 6c75c7c16..851084116 100644 --- a/docs/examples/package.json +++ b/docs/examples/package.json @@ -15,7 +15,7 @@ "license": "ISC", "dependencies": { "@epfml/disco-server": "*", - "@epfml/discojs-core": "*", + "@epfml/discojs": "*", "@epfml/discojs-node": "*" }, "devDependencies": { diff --git a/docs/examples/training.ts b/docs/examples/training.ts index 608dc6013..56849e216 100644 --- a/docs/examples/training.ts +++ b/docs/examples/training.ts @@ -1,7 +1,7 @@ import fs from 'node:fs/promises' -import type { data, Task } from '@epfml/discojs-core' -import { Disco, fetchTasks, defaultTasks } from '@epfml/discojs-core' +import type { data, Task } from '@epfml/discojs' +import { Disco, fetchTasks, defaultTasks } from '@epfml/discojs' import { NodeImageLoader, NodeTabularLoader } from '@epfml/discojs-node' import { startServer } from '@epfml/disco-server' diff --git a/docs/examples/wikitext.ts b/docs/examples/wikitext.ts index e76edc65f..b3b15e6ae 100644 --- a/docs/examples/wikitext.ts +++ b/docs/examples/wikitext.ts @@ -1,8 +1,8 @@ -import type { Task } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' import { Disco, fetchTasks, data, client as clients, aggregator as aggregators, models -} from '@epfml/discojs-core' +} from '@epfml/discojs' import { NodeTextLoader, saveModelToDisk, loadModelFromDisk } from '@epfml/discojs-node' diff --git a/eslint.config.js b/eslint.config.js index 87ed9ea81..1de747c75 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -33,5 +33,5 @@ export default tseslint.config( }, { ignores: ['**/dist/*'] }, // TODO waiting for eslintflat+vue+typescript @ https://eslint.vuejs.org/ - { ignores: ['web-client/*'] } + { ignores: ['webapp/*'] } ) diff --git a/package-lock.json b/package-lock.json index 3aac6be98..e03ad7d4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,13 +6,13 @@ "": { "name": "disco", "workspaces": [ - "discojs/discojs-core", - "discojs/discojs-node", - "discojs/discojs-web", + "isomorphic-wrtc", + "discojs", + "discojs-node", + "discojs-web", "server", "cli", - "web-client", - "isomorphic-wrtc" + "webapp" ], "dependencies": { "immutable": "4" @@ -25,12 +25,11 @@ } }, "cli": { - "name": "@epfml/disco-cli", "license": "ISC", "dependencies": { - "@epfml/disco-server": "*", "@epfml/discojs-node": "*", "immutable": "4", + "server": "*", "tslib": "2" }, "devDependencies": { @@ -38,8 +37,8 @@ "ts-command-line-args": "2" } }, - "discojs/discojs-core": { - "name": "@epfml/discojs-core", + "discojs": { + "name": "@epfml/discojs", "version": "2.1.1", "dependencies": { "@tensorflow/tfjs": "4", @@ -64,11 +63,11 @@ "ts-node": "10" } }, - "discojs/discojs-node": { + "discojs-node": { "name": "@epfml/discojs-node", "version": "2.1.1", "dependencies": { - "@epfml/discojs-core": "*", + "@epfml/discojs": "*", "@koush/wrtc": "0.5", "@tensorflow/tfjs-node": "4" }, @@ -78,11 +77,11 @@ "ts-node": "10" } }, - "discojs/discojs-web": { - "name": "@epfml/discojs", + "discojs-web": { + "name": "@epfml/discojs-web", "version": "2.1.1", "dependencies": { - "@epfml/discojs-core": "*", + "@epfml/discojs": "*", "@tensorflow/tfjs": "4" }, "devDependencies": { @@ -96,15 +95,6 @@ "node-datachannel": "*" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -118,9 +108,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -225,28 +215,16 @@ "ms": "^2.1.1" } }, - "node_modules/@epfml/disco-cli": { - "resolved": "cli", - "link": true - }, - "node_modules/@epfml/disco-server": { - "resolved": "server", - "link": true - }, - "node_modules/@epfml/disco-web-client": { - "resolved": "web-client", - "link": true - }, "node_modules/@epfml/discojs": { - "resolved": "discojs/discojs-web", + "resolved": "discojs", "link": true }, - "node_modules/@epfml/discojs-core": { - "resolved": "discojs/discojs-core", + "node_modules/@epfml/discojs-node": { + "resolved": "discojs-node", "link": true }, - "node_modules/@epfml/discojs-node": { - "resolved": "discojs/discojs-node", + "node_modules/@epfml/discojs-web": { + "resolved": "discojs-web", "link": true }, "node_modules/@esbuild/aix-ppc64": { @@ -1192,212 +1170,196 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", "cpu": [ "arm" ], "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", "cpu": [ "arm64" ], "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", "cpu": [ "arm64" ], "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", "cpu": [ "x64" ], "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", "cpu": [ "arm" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", "cpu": [ "arm" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", "cpu": [ "arm64" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", "cpu": [ "arm64" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", "cpu": [ "ppc64" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", "cpu": [ "riscv64" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", "cpu": [ "s390x" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", "cpu": [ "x64" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", "cpu": [ "x64" ], "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", "cpu": [ "arm64" ], "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", "cpu": [ "ia32" ], "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", "cpu": [ "x64" ], "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@sideway/address": { "version": "4.1.5", @@ -1427,16 +1389,16 @@ "dev": true }, "node_modules/@tensorflow/tfjs": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.18.0.tgz", - "integrity": "sha512-MjA2M91wSkTkpFSuyQAuZm+DT9Y7DFu3rsTaO1BjCbf1S7o8DgJPKMmh6hk6uEn6/SBBbZVXPu+ZTQ/SyrP2Pw==", - "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.18.0", - "@tensorflow/tfjs-backend-webgl": "4.18.0", - "@tensorflow/tfjs-converter": "4.18.0", - "@tensorflow/tfjs-core": "4.18.0", - "@tensorflow/tfjs-data": "4.18.0", - "@tensorflow/tfjs-layers": "4.18.0", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.19.0.tgz", + "integrity": "sha512-d2A1lTc6my7GJ5LwqzXa+igJ5+18exwsnaphZ3roi5nJ197uwxVSMIc2vSJnqZz1KajC5/mZgQr67EZrpTFlBg==", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.19.0", + "@tensorflow/tfjs-backend-webgl": "4.19.0", + "@tensorflow/tfjs-converter": "4.19.0", + "@tensorflow/tfjs-core": "4.19.0", + "@tensorflow/tfjs-data": "4.19.0", + "@tensorflow/tfjs-layers": "4.19.0", "argparse": "^1.0.10", "chalk": "^4.1.0", "core-js": "3.29.1", @@ -1448,9 +1410,9 @@ } }, "node_modules/@tensorflow/tfjs-backend-cpu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.18.0.tgz", - "integrity": "sha512-zk6NyGGsv0mCDnc5xWxLB5Zi8GaHVI2gg7KC0FSw/r5wW9SfA3ZIqUHVZhbIVhNqZSWy6L/+EIJa7l6q1XCkrg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.19.0.tgz", + "integrity": "sha512-7pT05Ea6GTXjbqRgkmayZRYvaiNl3LLk1TyfUvC8iIqMw5d7p4Wgte2pfM2gMbIZ/opOxURhFYuI0FiQvUrW6g==", "dependencies": { "@types/seedrandom": "^2.4.28", "seedrandom": "^3.0.5" @@ -1459,15 +1421,15 @@ "yarn": ">= 1.3.2" }, "peerDependencies": { - "@tensorflow/tfjs-core": "4.18.0" + "@tensorflow/tfjs-core": "4.19.0" } }, "node_modules/@tensorflow/tfjs-backend-webgl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.18.0.tgz", - "integrity": "sha512-ZLQ8MnWnIttMDqHepEzPL0Y4HkTePl8+AaYm9AcNnDUK7VF2jn+BXcTHCUOGfiwKu/OMwRc6osDrjxr0cCqNrA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.19.0.tgz", + "integrity": "sha512-R0DC1W65lqTOccCwxMhH+VOKCgSrhd9GEejIIGhjeXt6oZlACFnOx4SuUr/qKLCDsL5I4E9iFLxAJMmsfYvARw==", "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.18.0", + "@tensorflow/tfjs-backend-cpu": "4.19.0", "@types/offscreencanvas": "~2019.3.0", "@types/seedrandom": "^2.4.28", "seedrandom": "^3.0.5" @@ -1476,21 +1438,21 @@ "yarn": ">= 1.3.2" }, "peerDependencies": { - "@tensorflow/tfjs-core": "4.18.0" + "@tensorflow/tfjs-core": "4.19.0" } }, "node_modules/@tensorflow/tfjs-converter": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.18.0.tgz", - "integrity": "sha512-b7utNMvmI986OPaQvDyHoiHKiIyip7ubSjG4KzTcFOWEKTsirtHxRp/6QKY/XSuH3AJK9Switu1/B5QC7xR2Zg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.19.0.tgz", + "integrity": "sha512-xIOE6enaVHPYCXKpHxJnUlN8hzlcQkgFSymHjBmdDnNCresuRwBGz4dqYAQMeQG21Ei3lxCQFdDDH7aSvUEAPw==", "peerDependencies": { - "@tensorflow/tfjs-core": "4.18.0" + "@tensorflow/tfjs-core": "4.19.0" } }, "node_modules/@tensorflow/tfjs-core": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.18.0.tgz", - "integrity": "sha512-wjyq+F8AZJjhtr5xUBAON4VrNBXr9Poows/LnRh1K7wS+w41sCk0EQfeo6NfgUZXbHE/jgcqU6+fZDUKt3qRrg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.19.0.tgz", + "integrity": "sha512-GZ0d53PG0HGQCC7hbWv1qDnZctHYe/cafHZrBY5eNeQjQE6fBr3NsR5GfLadT0TELwmX9/nyritGDzvy6xmzHQ==", "dependencies": { "@types/long": "^4.0.1", "@types/offscreencanvas": "~2019.7.0", @@ -1548,16 +1510,16 @@ } }, "node_modules/@tensorflow/tfjs-data": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.18.0.tgz", - "integrity": "sha512-JGfEwq8a0nEXwwU04/PW7O6kZ3FdqAd6ofMboM9qwGTv47QdeO/G1657sy4N21Q/qiz5qFDbGLhim3Nq9gZm9g==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.19.0.tgz", + "integrity": "sha512-n0ZgJp5UhhBatohUt9pXSCCApusK+1Flyk6yDrQYuxOTjhRppd6jYrF7LCDG3hMFi3QLGl0jab1zYrn9BwtC/w==", "dependencies": { "@types/node-fetch": "^2.1.2", "node-fetch": "~2.6.1", "string_decoder": "^1.3.0" }, "peerDependencies": { - "@tensorflow/tfjs-core": "4.18.0", + "@tensorflow/tfjs-core": "4.19.0", "seedrandom": "^3.0.5" } }, @@ -1600,21 +1562,21 @@ } }, "node_modules/@tensorflow/tfjs-layers": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.18.0.tgz", - "integrity": "sha512-9AyxUdvjMDbDOkNzdkMRToJZF/le5ia8X3lVfGRGxzsuyoWDBGlV9V1ICufD+Z8sODXVyu+cgE8kAMtVK4aHFA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.19.0.tgz", + "integrity": "sha512-NufvuRaZdIyoG+R13d7oL8G5Bywox+ihPMiMZ3tWU+me8C8Y0pVC69mrnhOS9R8an7GDxKKSTTNEZhUvPvMGiQ==", "peerDependencies": { - "@tensorflow/tfjs-core": "4.18.0" + "@tensorflow/tfjs-core": "4.19.0" } }, "node_modules/@tensorflow/tfjs-node": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.18.0.tgz", - "integrity": "sha512-jat7J/K8OEKyO/w20PXN8OBQMwdUMQxfPpNGsyS21lq93dr6g+z4vVH0RT+soPsVX2NvdIrAxHT3RWkinSCikw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.19.0.tgz", + "integrity": "sha512-1HLIAuu5azP8SW7t5EZc1W5VOdjWndJYz1N1agz0It/tMtnuWIdAfcY08VjfuiI/NhAwuPShehqv6CZ3SYh+Vg==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "1.0.9", - "@tensorflow/tfjs": "4.18.0", + "@tensorflow/tfjs": "4.19.0", "adm-zip": "^0.5.2", "google-protobuf": "^3.9.2", "https-proxy-agent": "^2.2.1", @@ -2213,9 +2175,9 @@ } }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "dependencies": { "undici-types": "~5.26.4" } @@ -2328,16 +2290,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", - "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/type-utils": "7.7.1", - "@typescript-eslint/utils": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.3.1", @@ -2363,15 +2325,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", - "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/typescript-estree": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4" }, "engines": { @@ -2391,13 +2353,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", - "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2408,13 +2370,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", - "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.1", - "@typescript-eslint/utils": "7.7.1", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2435,9 +2397,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", - "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2448,13 +2410,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", - "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/visitor-keys": "7.7.1", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2476,17 +2438,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", - "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.15", "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.1", - "@typescript-eslint/types": "7.7.1", - "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", "semver": "^7.6.0" }, "engines": { @@ -2501,12 +2463,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", - "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/types": "7.8.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2537,13 +2499,13 @@ } }, "node_modules/@vitest/expect": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.1.tgz", - "integrity": "sha512-w3Bn+VUMqku+oWmxvPhTE86uMTbfmBl35aGaIPlwVW7Q89ZREC/icfo2HBsEZ3AAW6YR9lObfZKPEzstw9tJOQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.3.tgz", + "integrity": "sha512-y+waPz31pOFr3rD7vWTbwiLe5+MgsMm40jTZbQE8p8/qXyBX3CQsIXRx9XK12IbY7q/t5a5aM/ckt33b4PxK2g==", "dev": true, "dependencies": { - "@vitest/spy": "1.5.1", - "@vitest/utils": "1.5.1", + "@vitest/spy": "1.5.3", + "@vitest/utils": "1.5.3", "chai": "^4.3.10" }, "funding": { @@ -2620,12 +2582,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.1.tgz", - "integrity": "sha512-mt372zsz0vFR7L1xF/ert4t+teD66oSuXoTyaZbl0eJgilvyzCKP1tJ21gVa8cDklkBOM3DLnkE1ljj/BskyEw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.3.tgz", + "integrity": "sha512-7PlfuReN8692IKQIdCxwir1AOaP5THfNkp0Uc4BKr2na+9lALNit7ub9l3/R7MP8aV61+mHKRGiqEKRIwu6iiQ==", "dev": true, "dependencies": { - "@vitest/utils": "1.5.1", + "@vitest/utils": "1.5.3", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -2661,9 +2623,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.1.tgz", - "integrity": "sha512-h/1SGaZYXmjn6hULRBOlqam2z4oTlEe6WwARRzLErAPBqljAs6eX7tfdyN0K+MpipIwSZ5sZsubDWkCPAiVXZQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.3.tgz", + "integrity": "sha512-K3mvIsjyKYBhNIDujMD2gfQEzddLe51nNOAf45yKRt/QFJcUIeTQd2trRvv6M6oCBHNVnZwFWbQ4yj96ibiDsA==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -2675,9 +2637,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.1.tgz", - "integrity": "sha512-vsqczk6uPJjmPLy6AEtqfbFqgLYcGBe9BTY+XL8L6y8vrGOhyE23CJN9P/hPimKXnScbqiZ/r/UtUSOQ2jIDGg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.3.tgz", + "integrity": "sha512-Llj7Jgs6lbnL55WoshJUUacdJfjU2honvGcAJBxhra5TPEzTJH8ZuhI3p/JwqqfnTr4PmP7nDmOXP53MS7GJlg==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -2687,9 +2649,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.1.tgz", - "integrity": "sha512-92pE17bBXUxA0Y7goPcvnATMCuq4NQLOmqsG0e2BtzRi7KLwZB5jpiELi/8ybY8IQNWemKjSD5rMoO7xTdv8ug==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.3.tgz", + "integrity": "sha512-rE9DTN1BRhzkzqNQO+kw8ZgfeEBCLXiHJwetk668shmNBpSagQxneT5eSqEBLP+cqSiAeecvQmbpFfdMyLcIQA==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -2720,64 +2682,64 @@ } }, "node_modules/@volar/language-core": { - "version": "2.2.0-alpha.8", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.0-alpha.8.tgz", - "integrity": "sha512-Ew1Iw7/RIRNuDLn60fWJdOLApAlfTVPxbPiSLzc434PReC9kleYtaa//Wo2WlN1oiRqneW0pWQQV0CwYqaimLQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-a8WG9+4OdeNDW4ywABZIM6S6UN7em8uIlM/BZ2pWQUYrVmX+m8sj/X+QadvO+Li/t/LjAqbWJQtVgxdpEWLALQ==", "dev": true, "dependencies": { - "@volar/source-map": "2.2.0-alpha.8" + "@volar/source-map": "2.2.0" } }, "node_modules/@volar/source-map": { - "version": "2.2.0-alpha.8", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.0-alpha.8.tgz", - "integrity": "sha512-E1ZVmXFJ5DU4fWDcWHzi8OLqqReqIDwhXvIMhVdk6+VipfMVv4SkryXu7/rs4GA/GsebcRyJdaSkKBB3OAkIcA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.0.tgz", + "integrity": "sha512-HQlPRlHOVqCCHK8wI76ZldHkEwKsjp7E6idUc36Ekni+KJDNrqgSqPvyHQixybXPHNU7CI9Uxd9/IkxO7LuNBw==", "dev": true, "dependencies": { "muggle-string": "^0.4.0" } }, "node_modules/@volar/typescript": { - "version": "2.2.0-alpha.8", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.0-alpha.8.tgz", - "integrity": "sha512-RLbRDI+17CiayHZs9HhSzlH0FhLl/+XK6o2qoiw2o2GGKcyD1aDoY6AcMd44acYncTOrqoTNoY6LuCiRyiJiGg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.0.tgz", + "integrity": "sha512-wC6l4zLiiCLxF+FGaHCbWlQYf4vMsnRxYhcI6WgvaNppOD6r1g+Ef1RKRJUApALWU46Yy/JDU/TbdV6w/X6Liw==", "dev": true, "dependencies": { - "@volar/language-core": "2.2.0-alpha.8", + "@volar/language-core": "2.2.0", "path-browserify": "^1.0.1" } }, "node_modules/@vue/compiler-core": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.25.tgz", - "integrity": "sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.26.tgz", + "integrity": "sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==", "dependencies": { "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.25", + "@vue/shared": "3.4.26", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.25.tgz", - "integrity": "sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.26.tgz", + "integrity": "sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==", "dependencies": { - "@vue/compiler-core": "3.4.25", - "@vue/shared": "3.4.25" + "@vue/compiler-core": "3.4.26", + "@vue/shared": "3.4.26" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.25.tgz", - "integrity": "sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.26.tgz", + "integrity": "sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==", "dependencies": { "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.25", - "@vue/compiler-dom": "3.4.25", - "@vue/compiler-ssr": "3.4.25", - "@vue/shared": "3.4.25", + "@vue/compiler-core": "3.4.26", + "@vue/compiler-dom": "3.4.26", + "@vue/compiler-ssr": "3.4.26", + "@vue/shared": "3.4.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -2785,12 +2747,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.25.tgz", - "integrity": "sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.26.tgz", + "integrity": "sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==", "dependencies": { - "@vue/compiler-dom": "3.4.25", - "@vue/shared": "3.4.25" + "@vue/compiler-dom": "3.4.26", + "@vue/shared": "3.4.26" } }, "node_modules/@vue/devtools-api": { @@ -2837,12 +2799,12 @@ } }, "node_modules/@vue/language-core": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.13.tgz", - "integrity": "sha512-oQgM+BM66SU5GKtUMLQSQN0bxHFkFpLSSAiY87wVziPaiNQZuKVDt/3yA7GB9PiQw0y/bTNL0bOc0jM/siYjKg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.16.tgz", + "integrity": "sha512-Bc2sexRH99pznOph8mLw2BlRZ9edm7tW51kcBXgx8adAoOcZUWJj3UNSsdQ6H9Y8meGz7BoazVrVo/jUukIsPw==", "dev": true, "dependencies": { - "@volar/language-core": "2.2.0-alpha.8", + "@volar/language-core": "~2.2.0", "@vue/compiler-dom": "^3.4.0", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", @@ -2860,48 +2822,48 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.25.tgz", - "integrity": "sha512-mKbEtKr1iTxZkAG3vm3BtKHAOhuI4zzsVcN0epDldU/THsrvfXRKzq+lZnjczZGnTdh3ojd86/WrP+u9M51pWQ==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.26.tgz", + "integrity": "sha512-E/ynEAu/pw0yotJeLdvZEsp5Olmxt+9/WqzvKff0gE67tw73gmbx6tRkiagE/eH0UCubzSlGRebCbidB1CpqZQ==", "dependencies": { - "@vue/shared": "3.4.25" + "@vue/shared": "3.4.26" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.25.tgz", - "integrity": "sha512-3qhsTqbEh8BMH3pXf009epCI5E7bKu28fJLi9O6W+ZGt/6xgSfMuGPqa5HRbUxLoehTNp5uWvzCr60KuiRIL0Q==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.26.tgz", + "integrity": "sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw==", "dependencies": { - "@vue/reactivity": "3.4.25", - "@vue/shared": "3.4.25" + "@vue/reactivity": "3.4.26", + "@vue/shared": "3.4.26" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.25.tgz", - "integrity": "sha512-ode0sj77kuwXwSc+2Yhk8JMHZh1sZp9F/51wdBiz3KGaWltbKtdihlJFhQG4H6AY+A06zzeMLkq6qu8uDSsaoA==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.26.tgz", + "integrity": "sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw==", "dependencies": { - "@vue/runtime-core": "3.4.25", - "@vue/shared": "3.4.25", + "@vue/runtime-core": "3.4.26", + "@vue/shared": "3.4.26", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.25.tgz", - "integrity": "sha512-8VTwq0Zcu3K4dWV0jOwIVINESE/gha3ifYCOKEhxOj6MEl5K5y8J8clQncTcDhKF+9U765nRw4UdUEXvrGhyVQ==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.26.tgz", + "integrity": "sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw==", "dependencies": { - "@vue/compiler-ssr": "3.4.25", - "@vue/shared": "3.4.25" + "@vue/compiler-ssr": "3.4.26", + "@vue/shared": "3.4.26" }, "peerDependencies": { - "vue": "3.4.25" + "vue": "3.4.26" } }, "node_modules/@vue/shared": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.25.tgz", - "integrity": "sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA==" + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.26.tgz", + "integrity": "sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==" }, "node_modules/@vue/test-utils": { "version": "2.4.5", @@ -3385,9 +3347,9 @@ "optional": true }, "node_modules/bare-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.1.tgz", - "integrity": "sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.2.tgz", + "integrity": "sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig==", "optional": true, "dependencies": { "bare-os": "^2.1.0" @@ -3839,9 +3801,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "version": "1.0.30001615", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz", + "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==", "dev": true, "funding": [ { @@ -3990,6 +3952,10 @@ "node": ">=6" } }, + "node_modules/cli": { + "resolved": "cli", + "link": true + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -4944,9 +4910,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" }, "node_modules/de-indent": { "version": "1.0.2", @@ -5275,9 +5241,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.748", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.748.tgz", - "integrity": "sha512-VWqjOlPZn70UZ8FTKUOkUvBLeTQ0xpty66qV0yJcAGY2/CthI4xyW9aEozRVtuwv3Kpf5xTesmJUcPwuJmgP4A==", + "version": "1.4.754", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.754.tgz", + "integrity": "sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA==", "dev": true }, "node_modules/elliptic": { @@ -7178,9 +7144,9 @@ } }, "node_modules/joi": { - "version": "17.13.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.0.tgz", - "integrity": "sha512-9qcrTyoBmFZRNHeVP4edKqIUEgFzq7MHvTNSDuHSqkpOPtiBkgNgcmTSqmiw1kw9tdKaiddvIDv/eCJDxmqWCA==", + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", + "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", "dev": true, "dependencies": { "@hapi/hoek": "^9.3.0", @@ -7922,15 +7888,15 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz", + "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "pkg-types": "^1.1.0", + "ufo": "^1.5.3" } }, "node_modules/mocha": { @@ -8699,17 +8665,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -8900,9 +8866,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -9603,9 +9569,9 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/read-cache": { @@ -9825,9 +9791,9 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", "dependencies": { "@types/estree": "1.0.5" }, @@ -9839,22 +9805,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", "fsevents": "~2.3.2" } }, @@ -10019,6 +9985,10 @@ "node": ">= 0.8.0" } }, + "node_modules/server": { + "resolved": "server", + "link": true + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10092,9 +10062,9 @@ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" }, "node_modules/sharp/node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -11070,9 +11040,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -11280,14 +11250,14 @@ } }, "node_modules/typescript-eslint": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.7.1.tgz", - "integrity": "sha512-ykEBfa3xx3odjZy6GRED4SCPrjo0rgHwstLlEgLX4EMEuv7QeIDSmfV+S6Kk+XkbsYn4BDEcPvsci1X26lRpMQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.8.0.tgz", + "integrity": "sha512-sheFG+/D8N/L7gC3WT0Q8sB97Nm573Yfr+vZFzl/4nBdYcmviBPtwGSX9TJ7wpVg28ocerKVOt+k2eGmHzcgVA==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "7.7.1", - "@typescript-eslint/parser": "7.7.1", - "@typescript-eslint/utils": "7.7.1" + "@typescript-eslint/eslint-plugin": "7.8.0", + "@typescript-eslint/parser": "7.8.0", + "@typescript-eslint/utils": "7.8.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -11356,9 +11326,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.14.tgz", + "integrity": "sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==", "dev": true, "funding": [ { @@ -11375,7 +11345,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -11508,9 +11478,9 @@ } }, "node_modules/vee-validate/node_modules/type-fest": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.17.0.tgz", - "integrity": "sha512-9flrz1zkfLRH3jO3bLflmTxryzKMxVa7841VeMgBaNQGY6vH4RCcpN/sQLB7mQQYh1GZ5utT2deypMuCy4yicw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.1.tgz", + "integrity": "sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==", "engines": { "node": ">=16" }, @@ -11532,9 +11502,9 @@ } }, "node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "dependencies": { "esbuild": "^0.20.1", @@ -11587,9 +11557,9 @@ } }, "node_modules/vite-node": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.1.tgz", - "integrity": "sha512-HNpfV7BrAsjkYVNWIcPleJwvJmydJqqJRrRbpoQ/U7QDwJKyEzNa4g5aYg8MjXJyKsk29IUCcMLFRcsEvqUIsA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.3.tgz", + "integrity": "sha512-axFo00qiCpU/JLd8N1gu9iEYL3xTbMbMrbe5nDp9GL0nb6gurIdZLkkFogZXWnE8Oyy5kfSLwNVIcVsnhE7lgQ==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -11625,16 +11595,16 @@ } }, "node_modules/vitest": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.1.tgz", - "integrity": "sha512-3GvBMpoRnUNbZRX1L3mJCv3Ou3NAobb4dM48y8k9ZGwDofePpclTOyO+lqJFKSQpubH1V8tEcAEw/Y3mJKGJQQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.3.tgz", + "integrity": "sha512-2oM7nLXylw3mQlW6GXnRriw+7YvZFk/YNV8AxIC3Z3MfFbuziLGWP9GPxxu/7nRlXhqyxBikpamr+lEEj1sUEw==", "dev": true, "dependencies": { - "@vitest/expect": "1.5.1", - "@vitest/runner": "1.5.1", - "@vitest/snapshot": "1.5.1", - "@vitest/spy": "1.5.1", - "@vitest/utils": "1.5.1", + "@vitest/expect": "1.5.3", + "@vitest/runner": "1.5.3", + "@vitest/snapshot": "1.5.3", + "@vitest/spy": "1.5.3", + "@vitest/utils": "1.5.3", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -11648,7 +11618,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.5.1", + "vite-node": "1.5.3", "why-is-node-running": "^2.2.2" }, "bin": { @@ -11663,8 +11633,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.1", - "@vitest/ui": "1.5.1", + "@vitest/browser": "1.5.3", + "@vitest/ui": "1.5.3", "happy-dom": "*", "jsdom": "*" }, @@ -11899,15 +11869,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.25", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.25.tgz", - "integrity": "sha512-HWyDqoBHMgav/OKiYA2ZQg+kjfMgLt/T0vg4cbIF7JbXAjDexRf5JRg+PWAfrAkSmTd2I8aPSXtooBFWHB98cg==", + "version": "3.4.26", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.26.tgz", + "integrity": "sha512-bUIq/p+VB+0xrJubaemrfhk1/FiW9iX+pDV+62I/XJ6EkspAO9/DXEjbDFoe8pIfOZBqfk45i9BMc41ptP/uRg==", "dependencies": { - "@vue/compiler-dom": "3.4.25", - "@vue/compiler-sfc": "3.4.25", - "@vue/runtime-dom": "3.4.25", - "@vue/server-renderer": "3.4.25", - "@vue/shared": "3.4.25" + "@vue/compiler-dom": "3.4.26", + "@vue/compiler-sfc": "3.4.26", + "@vue/runtime-dom": "3.4.26", + "@vue/server-renderer": "3.4.26", + "@vue/shared": "3.4.26" }, "peerDependencies": { "typescript": "*" @@ -11919,9 +11889,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.14.tgz", - "integrity": "sha512-DInfgOyXlMyliyqAAD9frK28tTfch0+tMi4qoWJcZlRxUf+NFAtraJBnAsKLep+FOyLMiajkhfyEb3xLK08i7w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.16.tgz", + "integrity": "sha512-qisL/iAfdO++7w+SsfYQJVPj6QKvxp4i1MMxvsNO41z/8zu3KuAw9LkhKUfP/kcOWGDxESp+pQObWppXusejCA==", "dev": true }, "node_modules/vue-demi": { @@ -12028,13 +11998,13 @@ } }, "node_modules/vue-tsc": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.13.tgz", - "integrity": "sha512-a3nL3FvguCWVJUQW/jFrUxdeUtiEkbZoQjidqvMeBK//tuE2w6NWQAbdrEpY2+6nSa4kZoKZp8TZUMtHpjt4mQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.16.tgz", + "integrity": "sha512-/gHAWJa216PeEhfxtAToIbxdWgw01wuQzo48ZUqMYVEyNqDp+OYV9xMO5HaPS2P3Ls0+EsjguMZLY4cGobX4Ew==", "dev": true, "dependencies": { - "@volar/typescript": "2.2.0-alpha.8", - "@vue/language-core": "2.0.13", + "@volar/typescript": "~2.2.0", + "@vue/language-core": "2.0.16", "semver": "^7.5.4" }, "bin": { @@ -12093,6 +12063,10 @@ "node": ">=12.0.0" } }, + "node_modules/webapp": { + "resolved": "webapp", + "link": true + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -12204,6 +12178,15 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", @@ -12272,9 +12255,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -12330,9 +12313,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -12434,7 +12417,6 @@ } }, "server": { - "name": "@epfml/disco-server", "version": "2.1.1", "license": "ISC", "dependencies": { @@ -12464,11 +12446,10 @@ "ts-node": "10" } }, - "web-client": { - "name": "@epfml/disco-web-client", + "webapp": { "dependencies": { "@epfml/discojs": "*", - "@epfml/discojs-core": "*", + "@epfml/discojs-web": "*", "apexcharts": "3", "cypress": "13", "d3": "7", diff --git a/package.json b/package.json index 7f78df702..c43d094d7 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,13 @@ "name": "disco", "type": "module", "workspaces": [ - "discojs/discojs-core", - "discojs/discojs-node", - "discojs/discojs-web", + "isomorphic-wrtc", + "discojs", + "discojs-node", + "discojs-web", "server", "cli", - "web-client", - "isomorphic-wrtc" + "webapp" ], "dependencies": { "immutable": "4" diff --git a/server/package.json b/server/package.json index 7380e659d..ab902f69c 100644 --- a/server/package.json +++ b/server/package.json @@ -1,5 +1,6 @@ { - "name": "@epfml/disco-server", + "name": "server", + "private": true, "version": "2.1.1", "type": "module", "main": "dist/index.js", @@ -7,7 +8,7 @@ "disco-server": "./dist/run_server.js" }, "scripts": { - "watch": "nodemon --ext ts --ignore dist --watch ../discojs/discojs-node/dist --watch . --exec npm run", + "watch": "nodemon --ext ts --ignore dist --watch ../discojs-node/dist --watch . --exec npm run", "start": "npm run build && node dist/run_server.js", "build": "tsc", "lint": "npx eslint .", diff --git a/server/src/config.ts b/server/src/config.ts index ad2e763fd..b269067fa 100644 --- a/server/src/config.ts +++ b/server/src/config.ts @@ -1,6 +1,6 @@ import path from 'path' -import type { Path, TaskID } from '@epfml/discojs-core' +import type { Path, TaskID } from '@epfml/discojs' export class Config { public readonly serverUrl: URL diff --git a/server/src/get_server.ts b/server/src/get_server.ts index f04fd954b..2f80fa587 100644 --- a/server/src/get_server.ts +++ b/server/src/get_server.ts @@ -3,7 +3,7 @@ import express from 'express' import expressWS from 'express-ws' import type * as http from 'http' -import type { Model, Task, TaskProvider } from '@epfml/discojs-core' +import type { Model, Task, TaskProvider } from '@epfml/discojs' import { CONFIG } from './config.js' import { Router } from './router/index.js' diff --git a/server/src/router/decentralized/server.ts b/server/src/router/decentralized/server.ts index 409b6eda6..4aab534cf 100644 --- a/server/src/router/decentralized/server.ts +++ b/server/src/router/decentralized/server.ts @@ -3,8 +3,8 @@ import msgpack from 'msgpack-lite' import type WebSocket from 'ws' import { Map, Set } from 'immutable' -import type { Task, TaskID } from '@epfml/discojs-core' -import { client } from '@epfml/discojs-core' +import type { Task, TaskID } from '@epfml/discojs' +import { client } from '@epfml/discojs' import { Server } from '../server.js' diff --git a/server/src/router/federated/server.ts b/server/src/router/federated/server.ts index 2461113ff..8dd04dac7 100644 --- a/server/src/router/federated/server.ts +++ b/server/src/router/federated/server.ts @@ -10,14 +10,14 @@ import type { WeightsContainer, MetadataKey, MetadataValue -} from '@epfml/discojs-core' +} from '@epfml/discojs' import { client, serialization, AsyncInformant, aggregator as aggregators, aggregation -} from '@epfml/discojs-core' +} from '@epfml/discojs' import { Server } from '../server.js' diff --git a/server/src/router/server.ts b/server/src/router/server.ts index 5005024ce..927950aff 100644 --- a/server/src/router/server.ts +++ b/server/src/router/server.ts @@ -2,7 +2,7 @@ import express from 'express' import type expressWS from 'express-ws' import type WebSocket from 'ws' -import type { Model, Task, TaskID } from '@epfml/discojs-core' +import type { Model, Task, TaskID } from '@epfml/discojs' import type { TasksAndModels } from '../tasks.js' diff --git a/server/src/router/tasks.ts b/server/src/router/tasks.ts index b34bcf2ea..6fa5e61df 100644 --- a/server/src/router/tasks.ts +++ b/server/src/router/tasks.ts @@ -2,8 +2,8 @@ import type { Request, Response } from 'express' import express from 'express' import { Set } from 'immutable' -import type { Model, Task, TaskID } from '@epfml/discojs-core' -import { serialization, isTask } from '@epfml/discojs-core' +import type { Model, Task, TaskID } from '@epfml/discojs' +import { serialization, isTask } from '@epfml/discojs' import type { Config } from '../config.js' import type { TasksAndModels } from '../tasks.js' diff --git a/server/src/tasks.ts b/server/src/tasks.ts index 627fe77db..619477be5 100644 --- a/server/src/tasks.ts +++ b/server/src/tasks.ts @@ -4,8 +4,8 @@ import fs from 'node:fs/promises' import tf from '@tensorflow/tfjs' import '@tensorflow/tfjs-node' -import { Task, Path, Digest, TaskProvider, isTask } from '@epfml/discojs-core' -import { Model, defaultTasks, models, serialization } from '@epfml/discojs-core' +import { Task, Path, Digest, TaskProvider, isTask } from '@epfml/discojs' +import { Model, defaultTasks, models, serialization } from '@epfml/discojs' // default tasks and added ones // register 'taskAndModel' event to get tasks diff --git a/server/tests/client/decentralized.spec.ts b/server/tests/client/decentralized.spec.ts index 4c7f8f6cd..8818cdcd7 100644 --- a/server/tests/client/decentralized.spec.ts +++ b/server/tests/client/decentralized.spec.ts @@ -1,7 +1,7 @@ import type * as http from 'http' -import type { Task } from '@epfml/discojs-core' -import { aggregator as aggregators, client as clients, defaultTasks } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' +import { aggregator as aggregators, client as clients, defaultTasks } from '@epfml/discojs' import { startServer } from '../../src/index.js' diff --git a/server/tests/client/federated.spec.ts b/server/tests/client/federated.spec.ts index 61d5fa884..9df184102 100644 --- a/server/tests/client/federated.spec.ts +++ b/server/tests/client/federated.spec.ts @@ -4,7 +4,7 @@ import { aggregator as aggregators, client as clients, defaultTasks, -} from "@epfml/discojs-core"; +} from "@epfml/discojs"; import { startServer } from "../../src/index.js"; diff --git a/server/tests/e2e/decentralized.spec.ts b/server/tests/e2e/decentralized.spec.ts index 241709bc8..5fb45050a 100644 --- a/server/tests/e2e/decentralized.spec.ts +++ b/server/tests/e2e/decentralized.spec.ts @@ -2,10 +2,10 @@ import type { Server } from 'node:http' import { List } from 'immutable' import { assert } from 'chai' -import type { Task } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' import { aggregator as aggregators, client as clients, WeightsContainer, defaultTasks, aggregation -} from '@epfml/discojs-core' +} from '@epfml/discojs' import { startServer } from '../../src/index.js' diff --git a/server/tests/e2e/federated.spec.ts b/server/tests/e2e/federated.spec.ts index aa61ec29d..94fd52aa7 100644 --- a/server/tests/e2e/federated.spec.ts +++ b/server/tests/e2e/federated.spec.ts @@ -4,11 +4,11 @@ import type { Server } from 'node:http' import { List, Range } from 'immutable' import { assert, expect } from 'chai' -import type { RoundLogs, WeightsContainer } from '@epfml/discojs-core' +import type { RoundLogs, WeightsContainer } from '@epfml/discojs' import { Disco, client as clients, data, aggregator as aggregators, defaultTasks -} from '@epfml/discojs-core' +} from '@epfml/discojs' import { NodeImageLoader, NodeTabularLoader, NodeTextLoader } from '@epfml/discojs-node' import { startServer } from '../../src/index.js' diff --git a/server/tests/router/decentralized.spec.ts b/server/tests/router/decentralized.spec.ts index 824f1a0d1..0841c353a 100644 --- a/server/tests/router/decentralized.spec.ts +++ b/server/tests/router/decentralized.spec.ts @@ -1,6 +1,6 @@ // import { agent as request } from 'supertest' -// import { serialization, WeightsContainer } from '@epfml/discojs' +// import { serialization, WeightsContainer } from '@epfml/discojs-web' // import { getApp } from '../../src/get_server' diff --git a/server/tests/router/federated.spec.ts b/server/tests/router/federated.spec.ts index 25d548735..44127deb5 100644 --- a/server/tests/router/federated.spec.ts +++ b/server/tests/router/federated.spec.ts @@ -1,6 +1,6 @@ // import { agent as request } from 'supertest' -// import { serialization, WeightsContainer } from '@epfml/discojs' +// import { serialization, WeightsContainer } from '@epfml/discojs-web' // import { getApp } from '../../src/get_server' diff --git a/server/tests/validator.spec.ts b/server/tests/validator.spec.ts index d413324bb..4f4220f05 100644 --- a/server/tests/validator.spec.ts +++ b/server/tests/validator.spec.ts @@ -5,7 +5,7 @@ import type { Server } from 'node:http' import { Validator, ConsoleLogger, EmptyMemory, client as clients, aggregator, defaultTasks, data -} from '@epfml/discojs-core' +} from '@epfml/discojs' import { NodeImageLoader, NodeTabularLoader } from '@epfml/discojs-node' import { startServer } from '../src/index.js' diff --git a/web-client/.editorconfig b/webapp/.editorconfig similarity index 100% rename from web-client/.editorconfig rename to webapp/.editorconfig diff --git a/web-client/.env.development b/webapp/.env.development similarity index 100% rename from web-client/.env.development rename to webapp/.env.development diff --git a/web-client/.env.production b/webapp/.env.production similarity index 100% rename from web-client/.env.production rename to webapp/.env.production diff --git a/web-client/.env.test b/webapp/.env.test similarity index 100% rename from web-client/.env.test rename to webapp/.env.test diff --git a/web-client/.eslintrc.cjs b/webapp/.eslintrc.cjs similarity index 100% rename from web-client/.eslintrc.cjs rename to webapp/.eslintrc.cjs diff --git a/web-client/.gitignore b/webapp/.gitignore similarity index 100% rename from web-client/.gitignore rename to webapp/.gitignore diff --git a/web-client/cypress.config.ts b/webapp/cypress.config.ts similarity index 100% rename from web-client/cypress.config.ts rename to webapp/cypress.config.ts diff --git a/web-client/cypress/.gitignore b/webapp/cypress/.gitignore similarity index 100% rename from web-client/cypress/.gitignore rename to webapp/cypress/.gitignore diff --git a/web-client/cypress/e2e/tasks.cy.ts b/webapp/cypress/e2e/tasks.cy.ts similarity index 94% rename from web-client/cypress/e2e/tasks.cy.ts rename to webapp/cypress/e2e/tasks.cy.ts index 6a3ea672a..1fa9b7133 100644 --- a/web-client/cypress/e2e/tasks.cy.ts +++ b/webapp/cypress/e2e/tasks.cy.ts @@ -1,4 +1,4 @@ -import { defaultTasks } from "@epfml/discojs-core"; +import { defaultTasks } from "@epfml/discojs"; describe("tasks page", () => { it("displays tasks", () => { diff --git a/web-client/cypress/e2e/training.cy.ts b/webapp/cypress/e2e/training.cy.ts similarity index 96% rename from web-client/cypress/e2e/training.cy.ts rename to webapp/cypress/e2e/training.cy.ts index 7241f68fb..c1b9d0c3e 100644 --- a/web-client/cypress/e2e/training.cy.ts +++ b/webapp/cypress/e2e/training.cy.ts @@ -1,4 +1,4 @@ -import { defaultTasks, serialization } from "@epfml/discojs-core"; +import { defaultTasks, serialization } from "@epfml/discojs"; describe("training page", () => { it("is navigable", () => { diff --git a/web-client/cypress/tsconfig.json b/webapp/cypress/tsconfig.json similarity index 100% rename from web-client/cypress/tsconfig.json rename to webapp/cypress/tsconfig.json diff --git a/web-client/env.d.ts b/webapp/env.d.ts similarity index 100% rename from web-client/env.d.ts rename to webapp/env.d.ts diff --git a/web-client/index.html b/webapp/index.html similarity index 100% rename from web-client/index.html rename to webapp/index.html diff --git a/web-client/package.json b/webapp/package.json similarity index 95% rename from web-client/package.json rename to webapp/package.json index a44cb7c5b..c290f78ce 100644 --- a/web-client/package.json +++ b/webapp/package.json @@ -1,5 +1,5 @@ { - "name": "@epfml/disco-web-client", + "name": "webapp", "private": true, "type": "module", "scripts": { @@ -12,7 +12,7 @@ }, "dependencies": { "@epfml/discojs": "*", - "@epfml/discojs-core": "*", + "@epfml/discojs-web": "*", "apexcharts": "3", "cypress": "13", "d3": "7", diff --git a/web-client/postcss.config.js b/webapp/postcss.config.js similarity index 100% rename from web-client/postcss.config.js rename to webapp/postcss.config.js diff --git a/web-client/public/discoicon.ico b/webapp/public/discoicon.ico similarity index 100% rename from web-client/public/discoicon.ico rename to webapp/public/discoicon.ico diff --git a/web-client/src/assets/css/styles.css b/webapp/src/assets/css/styles.css similarity index 100% rename from web-client/src/assets/css/styles.css rename to webapp/src/assets/css/styles.css diff --git a/web-client/src/assets/css/tailwind.css b/webapp/src/assets/css/tailwind.css similarity index 100% rename from web-client/src/assets/css/tailwind.css rename to webapp/src/assets/css/tailwind.css diff --git a/web-client/src/assets/fonts/AmpleSoftMedium.woff b/webapp/src/assets/fonts/AmpleSoftMedium.woff similarity index 100% rename from web-client/src/assets/fonts/AmpleSoftMedium.woff rename to webapp/src/assets/fonts/AmpleSoftMedium.woff diff --git a/web-client/src/assets/fonts/AmpleSoftMedium.woff2 b/webapp/src/assets/fonts/AmpleSoftMedium.woff2 similarity index 100% rename from web-client/src/assets/fonts/AmpleSoftMedium.woff2 rename to webapp/src/assets/fonts/AmpleSoftMedium.woff2 diff --git a/web-client/src/assets/gif/DecentralizedGIF.vue b/webapp/src/assets/gif/DecentralizedGIF.vue similarity index 100% rename from web-client/src/assets/gif/DecentralizedGIF.vue rename to webapp/src/assets/gif/DecentralizedGIF.vue diff --git a/web-client/src/assets/gif/DiscoGIF.vue b/webapp/src/assets/gif/DiscoGIF.vue similarity index 100% rename from web-client/src/assets/gif/DiscoGIF.vue rename to webapp/src/assets/gif/DiscoGIF.vue diff --git a/web-client/src/assets/gif/FederatedGIF.vue b/webapp/src/assets/gif/FederatedGIF.vue similarity index 100% rename from web-client/src/assets/gif/FederatedGIF.vue rename to webapp/src/assets/gif/FederatedGIF.vue diff --git a/web-client/src/assets/images/mlologo.png b/webapp/src/assets/images/mlologo.png similarity index 100% rename from web-client/src/assets/images/mlologo.png rename to webapp/src/assets/images/mlologo.png diff --git a/web-client/src/assets/svg/AboutUsIcon.vue b/webapp/src/assets/svg/AboutUsIcon.vue similarity index 100% rename from web-client/src/assets/svg/AboutUsIcon.vue rename to webapp/src/assets/svg/AboutUsIcon.vue diff --git a/web-client/src/assets/svg/Bezier2.vue b/webapp/src/assets/svg/Bezier2.vue similarity index 100% rename from web-client/src/assets/svg/Bezier2.vue rename to webapp/src/assets/svg/Bezier2.vue diff --git a/web-client/src/assets/svg/Bin.vue b/webapp/src/assets/svg/Bin.vue similarity index 100% rename from web-client/src/assets/svg/Bin.vue rename to webapp/src/assets/svg/Bin.vue diff --git a/web-client/src/assets/svg/Bin2Icon.vue b/webapp/src/assets/svg/Bin2Icon.vue similarity index 100% rename from web-client/src/assets/svg/Bin2Icon.vue rename to webapp/src/assets/svg/Bin2Icon.vue diff --git a/web-client/src/assets/svg/CheckList.vue b/webapp/src/assets/svg/CheckList.vue similarity index 100% rename from web-client/src/assets/svg/CheckList.vue rename to webapp/src/assets/svg/CheckList.vue diff --git a/web-client/src/assets/svg/Clock.vue b/webapp/src/assets/svg/Clock.vue similarity index 100% rename from web-client/src/assets/svg/Clock.vue rename to webapp/src/assets/svg/Clock.vue diff --git a/web-client/src/assets/svg/Contact.vue b/webapp/src/assets/svg/Contact.vue similarity index 100% rename from web-client/src/assets/svg/Contact.vue rename to webapp/src/assets/svg/Contact.vue diff --git a/web-client/src/assets/svg/CrossIcon.vue b/webapp/src/assets/svg/CrossIcon.vue similarity index 100% rename from web-client/src/assets/svg/CrossIcon.vue rename to webapp/src/assets/svg/CrossIcon.vue diff --git a/web-client/src/assets/svg/DecentralisedIcon.vue b/webapp/src/assets/svg/DecentralisedIcon.vue similarity index 100% rename from web-client/src/assets/svg/DecentralisedIcon.vue rename to webapp/src/assets/svg/DecentralisedIcon.vue diff --git a/web-client/src/assets/svg/DecentralizedImage.vue b/webapp/src/assets/svg/DecentralizedImage.vue similarity index 100% rename from web-client/src/assets/svg/DecentralizedImage.vue rename to webapp/src/assets/svg/DecentralizedImage.vue diff --git a/web-client/src/assets/svg/Disco.vue b/webapp/src/assets/svg/Disco.vue similarity index 100% rename from web-client/src/assets/svg/Disco.vue rename to webapp/src/assets/svg/Disco.vue diff --git a/web-client/src/assets/svg/DownArrow.vue b/webapp/src/assets/svg/DownArrow.vue similarity index 100% rename from web-client/src/assets/svg/DownArrow.vue rename to webapp/src/assets/svg/DownArrow.vue diff --git a/web-client/src/assets/svg/Download.vue b/webapp/src/assets/svg/Download.vue similarity index 100% rename from web-client/src/assets/svg/Download.vue rename to webapp/src/assets/svg/Download.vue diff --git a/web-client/src/assets/svg/Download2Icon.vue b/webapp/src/assets/svg/Download2Icon.vue similarity index 100% rename from web-client/src/assets/svg/Download2Icon.vue rename to webapp/src/assets/svg/Download2Icon.vue diff --git a/web-client/src/assets/svg/FederatedIcon.vue b/webapp/src/assets/svg/FederatedIcon.vue similarity index 100% rename from web-client/src/assets/svg/FederatedIcon.vue rename to webapp/src/assets/svg/FederatedIcon.vue diff --git a/web-client/src/assets/svg/FederatedImage.vue b/webapp/src/assets/svg/FederatedImage.vue similarity index 100% rename from web-client/src/assets/svg/FederatedImage.vue rename to webapp/src/assets/svg/FederatedImage.vue diff --git a/web-client/src/assets/svg/File.vue b/webapp/src/assets/svg/File.vue similarity index 100% rename from web-client/src/assets/svg/File.vue rename to webapp/src/assets/svg/File.vue diff --git a/web-client/src/assets/svg/FileEarmarkRuled.vue b/webapp/src/assets/svg/FileEarmarkRuled.vue similarity index 100% rename from web-client/src/assets/svg/FileEarmarkRuled.vue rename to webapp/src/assets/svg/FileEarmarkRuled.vue diff --git a/web-client/src/assets/svg/FileIcon.vue b/webapp/src/assets/svg/FileIcon.vue similarity index 100% rename from web-client/src/assets/svg/FileIcon.vue rename to webapp/src/assets/svg/FileIcon.vue diff --git a/web-client/src/assets/svg/Forward.vue b/webapp/src/assets/svg/Forward.vue similarity index 100% rename from web-client/src/assets/svg/Forward.vue rename to webapp/src/assets/svg/Forward.vue diff --git a/web-client/src/assets/svg/HomeIcon.vue b/webapp/src/assets/svg/HomeIcon.vue similarity index 100% rename from web-client/src/assets/svg/HomeIcon.vue rename to webapp/src/assets/svg/HomeIcon.vue diff --git a/web-client/src/assets/svg/InfoIcon.vue b/webapp/src/assets/svg/InfoIcon.vue similarity index 100% rename from web-client/src/assets/svg/InfoIcon.vue rename to webapp/src/assets/svg/InfoIcon.vue diff --git a/web-client/src/assets/svg/ListIcon.vue b/webapp/src/assets/svg/ListIcon.vue similarity index 100% rename from web-client/src/assets/svg/ListIcon.vue rename to webapp/src/assets/svg/ListIcon.vue diff --git a/web-client/src/assets/svg/LoadIcon.vue b/webapp/src/assets/svg/LoadIcon.vue similarity index 100% rename from web-client/src/assets/svg/LoadIcon.vue rename to webapp/src/assets/svg/LoadIcon.vue diff --git a/web-client/src/assets/svg/Model.vue b/webapp/src/assets/svg/Model.vue similarity index 100% rename from web-client/src/assets/svg/Model.vue rename to webapp/src/assets/svg/Model.vue diff --git a/web-client/src/assets/svg/MoonIcon.vue b/webapp/src/assets/svg/MoonIcon.vue similarity index 100% rename from web-client/src/assets/svg/MoonIcon.vue rename to webapp/src/assets/svg/MoonIcon.vue diff --git a/web-client/src/assets/svg/People.vue b/webapp/src/assets/svg/People.vue similarity index 100% rename from web-client/src/assets/svg/People.vue rename to webapp/src/assets/svg/People.vue diff --git a/web-client/src/assets/svg/Performances.vue b/webapp/src/assets/svg/Performances.vue similarity index 100% rename from web-client/src/assets/svg/Performances.vue rename to webapp/src/assets/svg/Performances.vue diff --git a/web-client/src/assets/svg/PictureBackground.vue b/webapp/src/assets/svg/PictureBackground.vue similarity index 100% rename from web-client/src/assets/svg/PictureBackground.vue rename to webapp/src/assets/svg/PictureBackground.vue diff --git a/web-client/src/assets/svg/SettingsIcon.vue b/webapp/src/assets/svg/SettingsIcon.vue similarity index 100% rename from web-client/src/assets/svg/SettingsIcon.vue rename to webapp/src/assets/svg/SettingsIcon.vue diff --git a/web-client/src/assets/svg/StackIcon.vue b/webapp/src/assets/svg/StackIcon.vue similarity index 100% rename from web-client/src/assets/svg/StackIcon.vue rename to webapp/src/assets/svg/StackIcon.vue diff --git a/web-client/src/assets/svg/StarIcon.vue b/webapp/src/assets/svg/StarIcon.vue similarity index 100% rename from web-client/src/assets/svg/StarIcon.vue rename to webapp/src/assets/svg/StarIcon.vue diff --git a/web-client/src/assets/svg/Tasks.vue b/webapp/src/assets/svg/Tasks.vue similarity index 100% rename from web-client/src/assets/svg/Tasks.vue rename to webapp/src/assets/svg/Tasks.vue diff --git a/web-client/src/assets/svg/Timer.vue b/webapp/src/assets/svg/Timer.vue similarity index 100% rename from web-client/src/assets/svg/Timer.vue rename to webapp/src/assets/svg/Timer.vue diff --git a/web-client/src/assets/svg/UpArrow.vue b/webapp/src/assets/svg/UpArrow.vue similarity index 100% rename from web-client/src/assets/svg/UpArrow.vue rename to webapp/src/assets/svg/UpArrow.vue diff --git a/web-client/src/assets/svg/Upload.vue b/webapp/src/assets/svg/Upload.vue similarity index 100% rename from web-client/src/assets/svg/Upload.vue rename to webapp/src/assets/svg/Upload.vue diff --git a/web-client/src/charts.ts b/webapp/src/charts.ts similarity index 100% rename from web-client/src/charts.ts rename to webapp/src/charts.ts diff --git a/web-client/src/clients.ts b/webapp/src/clients.ts similarity index 91% rename from web-client/src/clients.ts rename to webapp/src/clients.ts index 581d91260..e32cb5d45 100644 --- a/web-client/src/clients.ts +++ b/webapp/src/clients.ts @@ -1,5 +1,5 @@ -import type { Task } from '@epfml/discojs-core' -import { client as clients, aggregator as aggregators } from '@epfml/discojs-core' +import type { Task } from '@epfml/discojs' +import { client as clients, aggregator as aggregators } from '@epfml/discojs' import { CONFIG } from './config' diff --git a/web-client/src/components/App.vue b/webapp/src/components/App.vue similarity index 100% rename from web-client/src/components/App.vue rename to webapp/src/components/App.vue diff --git a/web-client/src/components/containers/BaseLayout.vue b/webapp/src/components/containers/BaseLayout.vue similarity index 100% rename from web-client/src/components/containers/BaseLayout.vue rename to webapp/src/components/containers/BaseLayout.vue diff --git a/web-client/src/components/containers/ButtonCard.vue b/webapp/src/components/containers/ButtonCard.vue similarity index 100% rename from web-client/src/components/containers/ButtonCard.vue rename to webapp/src/components/containers/ButtonCard.vue diff --git a/web-client/src/components/containers/Card.vue b/webapp/src/components/containers/Card.vue similarity index 100% rename from web-client/src/components/containers/Card.vue rename to webapp/src/components/containers/Card.vue diff --git a/web-client/src/components/containers/DropdownCard.vue b/webapp/src/components/containers/DropdownCard.vue similarity index 100% rename from web-client/src/components/containers/DropdownCard.vue rename to webapp/src/components/containers/DropdownCard.vue diff --git a/web-client/src/components/containers/IconCard.vue b/webapp/src/components/containers/IconCard.vue similarity index 100% rename from web-client/src/components/containers/IconCard.vue rename to webapp/src/components/containers/IconCard.vue diff --git a/web-client/src/components/containers/IconCardSmall.vue b/webapp/src/components/containers/IconCardSmall.vue similarity index 100% rename from web-client/src/components/containers/IconCardSmall.vue rename to webapp/src/components/containers/IconCardSmall.vue diff --git a/web-client/src/components/containers/ImageCard.vue b/webapp/src/components/containers/ImageCard.vue similarity index 100% rename from web-client/src/components/containers/ImageCard.vue rename to webapp/src/components/containers/ImageCard.vue diff --git a/web-client/src/components/containers/TableLayout.vue b/webapp/src/components/containers/TableLayout.vue similarity index 100% rename from web-client/src/components/containers/TableLayout.vue rename to webapp/src/components/containers/TableLayout.vue diff --git a/web-client/src/components/containers/TitleCard.vue b/webapp/src/components/containers/TitleCard.vue similarity index 100% rename from web-client/src/components/containers/TitleCard.vue rename to webapp/src/components/containers/TitleCard.vue diff --git a/web-client/src/components/data/Data.vue b/webapp/src/components/data/Data.vue similarity index 86% rename from web-client/src/components/data/Data.vue rename to webapp/src/components/data/Data.vue index c484ef56e..f6a0a9cf0 100644 --- a/web-client/src/components/data/Data.vue +++ b/webapp/src/components/data/Data.vue @@ -10,8 +10,8 @@