diff --git a/.dagger/.gitattributes b/.dagger/.gitattributes new file mode 100644 index 000000000..827418463 --- /dev/null +++ b/.dagger/.gitattributes @@ -0,0 +1 @@ +/sdk/** linguist-generated diff --git a/.dagger/.gitignore b/.dagger/.gitignore new file mode 100644 index 000000000..a78c445d5 --- /dev/null +++ b/.dagger/.gitignore @@ -0,0 +1,3 @@ +/sdk +/**/node_modules/** +/**/.pnpm-store/** diff --git a/.dagger/package.json b/.dagger/package.json new file mode 100644 index 000000000..3184033a9 --- /dev/null +++ b/.dagger/package.json @@ -0,0 +1,7 @@ +{ + "type": "module", + "dependencies": { + "typescript": "^5.5.4" + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" +} diff --git a/.dagger/src/index.ts b/.dagger/src/index.ts new file mode 100644 index 000000000..10f739050 --- /dev/null +++ b/.dagger/src/index.ts @@ -0,0 +1,573 @@ +import { + dag, + Container, + Directory, + object, + func, + argument, + Secret, + File, + Platform, + Service, +} from "@dagger.io/dagger"; + +const NODE_IMAGE = "node:24"; +const RUST_IMAGE = "rust:bookworm"; + +// See https://github.com/rust-cross/rust-musl-cross?tab=readme-ov-file#prebuilt-images +const TARGET_IMAGE_MAP = { + "x86_64-unknown-linux-musl": "ghcr.io/rust-cross/rust-musl-cross:x86_64-musl", + "aarch64-unknown-linux-musl": + "ghcr.io/rust-cross/rust-musl-cross:aarch64-musl", + "armv7-unknown-linux-musleabihf": + "ghcr.io/rust-cross/rust-musl-cross:armv7-musleabihf", +} as const; + +@object() +export class AtomicServer { + source: Directory; + + constructor( + @argument({ + defaultPath: ".", + ignore: [ + "**/node_modules", + "**/.git", + "**/.github", + "**/.husky", + "**/.vscode", + // rust + "**/target", + "**/artifact", + // browser + "**/.swc", + "**/.netlify", + // e2e + "**/test-results", + "**/template-tests", + "**/playwright-report", + "**/tmp", + "**/.temp", + "**/.cargo", + "**/.DS_Store", + "**/.vscode", + "**/dist", + "**/assets_tmp", + "**/build", + "**/.env", + "**/.envrc", + ], + }) + source: Directory + ) { + this.source = source; + } + + @func() + async ci(@argument() netlifyAuthToken: Secret): Promise { + await Promise.all([ + this.docsPublish(netlifyAuthToken), + this.typedocPublish(netlifyAuthToken), + this.endToEnd(netlifyAuthToken), + this.jsLint(), + this.jsTest(), + this.rustTest(), + this.rustClippy(), + this.rustFmt(), + ]); + + return "CI pipeline completed successfully"; + } + + @func() + async jsLint(): Promise { + const depsContainer = this.jsBuild(); + return depsContainer + .withWorkdir("/app") + .withExec(["pnpm", "run", "lint"]) + .stdout(); + } + + @func() + async jsTest(): Promise { + const depsContainer = this.jsBuild(); + return depsContainer + .withWorkdir("/app") + .withExec(["pnpm", "run", "test"]) + .stdout(); + } + + @func() + docsPublish(@argument() netlifyAuthToken: Secret): Promise { + const builtDocsHtml = this.docsFolder(); + return this.netlifyDeploy(builtDocsHtml, "atomic-docs", netlifyAuthToken); + } + + private netlifyDeploy( + /** The directory to deploy */ + directory: Directory, + siteName: string, + netlifyAuthToken: Secret + ): Promise { + return dag + .container() + .from(NODE_IMAGE) + .withExec(["npm", "install", "-g", "netlify-cli"]) + .withDirectory("/deploy", directory) + .withWorkdir("/deploy") + .withSecretVariable("NETLIFY_AUTH_TOKEN", netlifyAuthToken) + .withExec([ + "sh", + "-c", + `for i in $(seq 1 5); do netlify link --name ${siteName} --auth $NETLIFY_AUTH_TOKEN && break || sleep 2; done`, + ]) + .withExec(["netlify", "deploy", "--dir", ".", "--prod"]) + .stdout(); + } + + /** Extracts the unique deploy URL from netlify output */ + private extractDeployUrl(netlifyOutput: string): string { + const match = netlifyOutput.match(/https:\/\/[a-f0-9]+--.+\.netlify\.app/); + return match ? match[0] : "Deploy URL not found"; + } + + @func() + docsFolder(): Directory { + const cargoCache = dag.cacheVolume("cargo"); + + const mdBookContainer = dag + .container() + .from(RUST_IMAGE) + .withMountedCache("/usr/local/cargo/registry", cargoCache) + .withExec(["cargo", "install", "mdbook"]) + .withExec(["cargo", "install", "mdbook-linkcheck"]); + + const actualDocsDirectory = this.source.directory("docs"); + return mdBookContainer + .withMountedDirectory("/docs", actualDocsDirectory) + .withWorkdir("/docs") + .withExec(["mdbook", "build"]) + .directory("/docs/build/html"); + } + @func() + typedocPublish(@argument() netlifyAuthToken: Secret): Promise { + const browserDir = this.jsBuild(); + return browserDir + .withWorkdir("/app") + .withSecretVariable("NETLIFY_AUTH_TOKEN", netlifyAuthToken) + .withExec(["pnpm", "run", "typedoc-publish"]) + .stdout(); + } + + @func() + private jsBuild(): Container { + const source = this.source.directory("browser"); + + // Create a container with PNPM installed + const pnpmContainer = dag + .container() + .from(NODE_IMAGE) + .withExec(["npm", "install", "--global", "corepack@latest"]) + .withExec(["corepack", "enable"]) + .withExec(["corepack", "prepare", "pnpm@latest-10", "--activate"]) + .withWorkdir("/app"); + + // Copy workspace files first + const workspaceContainer = pnpmContainer + .withFile("/app/package.json", source.file("package.json")) + .withFile("/app/pnpm-lock.yaml", source.file("pnpm-lock.yaml")) + .withFile("/app/pnpm-workspace.yaml", source.file("pnpm-workspace.yaml")) + .withFile( + "/app/data-browser/package.json", + source.file("data-browser/package.json") + ) + .withFile("/app/lib/package.json", source.file("lib/package.json")) + .withFile("/app/react/package.json", source.file("react/package.json")) + .withFile("/app/svelte/package.json", source.file("svelte/package.json")) + .withFile("/app/cli/package.json", source.file("cli/package.json")); + + // Install dependencies + const depsContainer = workspaceContainer.withExec([ + "sh", + "-c", + "yes | pnpm install --frozen-lockfile --shamefully-hoist", + ]); + + // Copy the source so installed dependencies persist in the container + const sourceContainer = depsContainer.withDirectory("/app", source); + + // Build all packages since they may depend on each other's built artifacts + return sourceContainer.withExec(["pnpm", "run", "build"]); + } + + @func() + /** Builds the Rust server binary on the host architecture */ + rustBuild( + @argument() release: boolean = false, + @argument() target: string = "x86_64-unknown-linux-musl" + ): Container { + const source = this.source; + const cargoCache = dag.cacheVolume("cargo"); + + const image = TARGET_IMAGE_MAP[target as keyof typeof TARGET_IMAGE_MAP]; + + const rustContainer = dag + .container() + .from(image) + .withExec(["apt-get", "update", "-qq"]) + .withExec(["apt", "install", "-y", "nasm"]) + .withExec(["rustup", "component", "add", "clippy"]) + .withExec(["rustup", "component", "add", "rustfmt"]) + .withExec(["cargo", "install", "cargo-nextest"]) + .withMountedCache("/usr/local/cargo/registry", cargoCache); + + const sourceContainer = rustContainer + .withFile("/code/Cargo.toml", source.file("Cargo.toml")) + .withFile("/code/Cargo.lock", source.file("Cargo.lock")) + .withFile("/code/Cross.toml", source.file("Cross.toml")) + .withDirectory("/code/server", source.directory("server")) + .withDirectory("/code/lib", source.directory("lib")) + .withDirectory("/code/cli", source.directory("cli")) + .withMountedCache("/code/target", dag.cacheVolume("rust-target")) + .withWorkdir("/code") + .withExec(["cargo", "fetch"]); + + const browserDir = this.jsBuild().directory("/app/data-browser/dist"); + const containerWithAssets = sourceContainer.withDirectory( + "/code/server/assets_tmp", + browserDir + ); + + const buildArgs = release + ? ["cargo", "build", "--release"] + : ["cargo", "build"]; + const targetPath = release + ? `/code/target/${target}/release/atomic-server` + : `/code/target/${target}/debug/atomic-server`; + + return ( + containerWithAssets + .withExec(buildArgs) + // .withExec([targetPath, "--version"]) + .withExec(["cp", targetPath, "/atomic-server-binary"]) + ); + } + + @func() + /** Returns the release binary */ + rustBuildRelease( + @argument() target: string = "x86_64-unknown-linux-musl" + ): File { + const container = this.rustBuild(true, target); + return container.file("/atomic-server-binary"); + } + + @func() + rustTest(): Promise { + return this.rustBuild().withExec(["cargo", "nextest", "run"]).stdout(); + } + + @func() + rustClippy(): Promise { + const rustContainer = this.rustBuild(); + + return rustContainer + .withExec([ + "cargo", + "clippy", + "--no-deps", + "--all-features", + "--all-targets", + ]) + .stdout(); + } + + @func() + rustFmt(): Promise { + const rustContainer = this.rustBuild(); + + return rustContainer.withExec(["cargo", "fmt", "--check"]).stdout(); + } + + // @func() + // /** Doesn't work on M1 macs */ + // rustCrossBuild(@argument() target: string): Container { + // let engineSvc = dag.docker().engine(); + // const source = this.source; + + // const sourceContainer = dag + // // To allow cross-compilation to work on M1 macs + // .container({ platform: "linux/amd64" as Platform }) + // .from("docker:cli") + // .withServiceBinding("docker", engineSvc) + // .withEnvVariable("DOCKER_HOST", "tcp://docker:2375") + // .withExec(["docker", "ps"]) + // .withExec([ + // "apk", + // "add", + // "--no-cache", + // // For installing rust + // "curl", + // // CC linker deps, compiling cross + // "build-base", + // "gcc", + // "musl-dev", + // "cmake", + // ]) + // .withExec([ + // "sh", + // "-c", + // "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable", + // ]) + // .withEnvVariable( + // "PATH", + // "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + // ) + // .withExec(["docker", "ps"]) + // .withExec(["cargo", "install", "cross"]) + // .withExec(["rustup", "target", "add", target]) + // .withExec([ + // "rustup", + // "toolchain", + // "add", + // "stable-x86_64-unknown-linux-gnu", + // "--profile", + // "minimal", + // "--force-non-host", + // ]) + // .withFile("/home/rust/src/Cargo.toml", source.file("Cargo.toml")) + // .withFile("/home/rust/src/Cargo.lock", source.file("Cargo.lock")) + // .withDirectory("/home/rust/src/server", source.directory("server")) + // .withDirectory("/home/rust/src/lib", source.directory("lib")) + // .withDirectory("/home/rust/src/cli", source.directory("cli")) + // .withMountedCache("/home/rust/src/target", dag.cacheVolume("rust-target")) + // .withWorkdir("/home/rust/src"); + + // // Include frontend assets for the server build + // const browserDir = this.jsBuild().directory("/app/data-browser/dist"); + // const containerWithAssets = sourceContainer.withDirectory( + // "/home/rust/src/server/assets_tmp", + // browserDir + // ); + + // // Build using native cargo with target specification + // const binaryPath = `./target/${target}/release/atomic-server`; + + // return containerWithAssets + // .withExec(["cross", "build", "--target", target, "--release"]) + // .withExec(["cp", binaryPath, "/atomic-server-binary"]); + // } + + @func() + /** Returns a Service running atomic-server for use in tests */ + atomicService(): Service { + const atomicServerBinary = this.rustBuild().file("/atomic-server-binary"); + return dag + .container() + .from("alpine:latest") + .withFile("/atomic-server-bin", atomicServerBinary, { + permissions: 0o755, + }) + .withEnvVariable("ATOMIC_DOMAIN", "atomic") + .withExposedPort(9883) + .withEntrypoint(["/atomic-server-bin"]) + .asService() + .withHostname("atomic"); + } + + @func() + async endToEnd(@argument() netlifyAuthToken: Secret): Promise { + const e2eSource = this.source.directory("browser/e2e"); + + // Setup Playwright container - debug and fix package manager + const playwrightContainer = dag + .container() + .from("mcr.microsoft.com/playwright:v1.48.1-noble") + .withExec([ + "/bin/sh", + "-c", + 'curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=9.3.0 ENV="$HOME/.shrc" SHELL="$(which sh)" sh - && export PATH=/root/.local/share/pnpm:$PATH && /bin/apt update && /bin/apt install -y zip', + ]) + .withEnvVariable( + "PATH", + "/root/.local/share/pnpm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ) + .withExec(["pnpm", "dlx", "playwright", "install", "--with-deps"]) + .withExec(["npm", "install", "-g", "netlify-cli"]); + + // Setup e2e test environment + const e2eContainer = playwrightContainer + .withMountedDirectory("/app", e2eSource) + .withWorkdir("/app") + .withExec(["pnpm", "install"]) + .withEnvVariable("LANGUAGE", "en_GB") + .withEnvVariable("DELETE_PREVIOUS_TEST_DRIVES", "false") + .withEnvVariable("FRONTEND_URL", "http://atomic:9883") + .withServiceBinding("atomic", this.atomicService()) + // Wait for the server to be ready + .withExec([ + "sh", + "-c", + "for i in $(seq 1 10); do curl http://atomic:9883/setup && exit 0 || sleep 1; done; exit 1", + ]) + // Test the server is running + .withExec([ + "/bin/sh", + "-c", + "pnpm run test-e2e; echo $? > /test-exit-code", + ]); + + // Extract the test results directory and upload to Netlify + const testReportDirectory = e2eContainer.directory("playwright-report"); + const deployOutput = await this.netlifyDeploy( + testReportDirectory, + "atomic-tests", + netlifyAuthToken + ); + + // Extract the deploy URL + const deployUrl = this.extractDeployUrl(deployOutput); + + // Check the test exit code and fail if tests failed + const exitCode = await e2eContainer.file("/test-exit-code").contents(); + if (exitCode.trim() !== "0") { + throw new Error( + `E2E tests failed (exit code: ${exitCode.trim()}). Test report deployed to: \n${deployUrl}` + ); + } + + return deployUrl; + } + + @func() + async deployServer( + @argument() remoteHost: string, + @argument() remoteUser: Secret, + @argument() sshPrivateKey: Secret + ): Promise { + // Build the cross-compiled binary for x86_64-unknown-linux-musl + const binaryFile = this.rustBuildRelease("x86_64-unknown-linux-musl"); + + // Create deployment container with SSH client + const deployContainer = dag + .container() + .from("alpine:latest") + .withExec(["apk", "add", "--no-cache", "openssh-client", "rsync"]) + .withFile("/atomic-server-binary", binaryFile, { permissions: 0o755 }); + + // Setup SSH key + const sshContainer = deployContainer + .withExec(["mkdir", "-p", "/root/.ssh"]) + .withSecretVariable("SSH_PRIVATE_KEY", sshPrivateKey) + .withExec(["sh", "-c", 'echo "$SSH_PRIVATE_KEY" > /root/.ssh/id_rsa']) + .withExec(["chmod", "600", "/root/.ssh/id_rsa"]) + .withExec(["ssh-keyscan", "-H", remoteHost]) + .withExec([ + "sh", + "-c", + `ssh-keyscan -H ${remoteHost} >> /root/.ssh/known_hosts`, + ]); + + // Transfer binary using rsync + const transferResult = await sshContainer + .withSecretVariable("REMOTE_USER", remoteUser) + .withExec([ + "sh", + "-c", + `rsync -rltgoDzvO /atomic-server-binary $REMOTE_USER@${remoteHost}:~/atomic-server-x86_64-unknown-linux-musl`, + ]) + .stdout(); + + // Execute deployment commands on remote server + const deployResult = await sshContainer + .withSecretVariable("REMOTE_USER", remoteUser) + .withExec([ + "sh", + "-c", + `ssh -i /root/.ssh/id_rsa $REMOTE_USER@${remoteHost} ' + mv ~/atomic-server-x86_64-unknown-linux-musl ~/atomic-server && + cp ~/atomic-server ~/atomic-server-$(date +"%Y-%m-%dT%H:%M:%S") && + systemctl stop atomic && + ./atomic-server export && + systemctl start atomic && + systemctl status atomic + '`, + ]) + .stdout(); + + return `Deployment to ${remoteHost} completed successfully:\n${deployResult}`; + } + + @func() + async releaseAssets(): Promise { + const targets = Object.keys(TARGET_IMAGE_MAP); + + const builds = targets.map((target) => { + const container = this.rustBuild(true, target); + return { + target, + binary: container.file("/atomic-server-binary"), + }; + }); + + // Create a directory with all the binaries + let outputDir = dag.directory(); + + for (const build of builds) { + outputDir = outputDir.withFile( + `atomic-server-${build.target}`, + build.binary + ); + } + + return outputDir; + } + + @func() + /** Creates a Docker image for a specific target architecture */ + createDockerImage( + @argument() target: string = "x86_64-unknown-linux-musl" + ): Container { + const binary = this.rustBuild(true, target).file("/atomic-server-binary"); + + // Map targets to their corresponding platform strings + const platformMap = { + "x86_64-unknown-linux-musl": "linux/amd64" as Platform, + "aarch64-unknown-linux-musl": "linux/arm64" as Platform, + "armv7-unknown-linux-musleabihf": "linux/arm/v7" as Platform, + }; + + const platform = platformMap[target as keyof typeof platformMap]; + if (!platform) { + throw new Error(`Unknown platform for target: ${target}`); + } + + return dag + .container({ platform }) + .from("alpine:latest") + .withFile("/usr/local/bin/atomic-server", binary) + .withExec(["chmod", "+x", "/usr/local/bin/atomic-server"]) + .withEntrypoint(["/usr/local/bin/atomic-server"]) + .withDefaultArgs([]); + } + + @func() + /** Creates Docker images for all supported architectures */ + async createDockerImages(@argument() tag: string = "latest"): Promise { + const targets = Object.keys(TARGET_IMAGE_MAP); + + // Build one variant first. + let firstImageArchitecture = "x86_64-unknown-linux-musl"; + const firstImage = this.createDockerImage(firstImageArchitecture); + + // Build other variants + const otherVariants = targets + .filter((target) => target !== firstImageArchitecture) + .map((target) => this.createDockerImage(target)); + + // Publish the multi-platform image with all variants + await firstImage.publish(`joepmeneer/atomic-server:${tag}`, { + platformVariants: otherVariants, + }); + } +} diff --git a/.dagger/tsconfig.json b/.dagger/tsconfig.json new file mode 100644 index 000000000..aab5941a2 --- /dev/null +++ b/.dagger/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "moduleResolution": "Node", + "experimentalDecorators": true, + "strict": true, + "skipLibCheck": true, + "paths": { + "@dagger.io/dagger": [ + "./sdk/index.ts" + ], + "@dagger.io/dagger/telemetry": [ + "./sdk/telemetry.ts" + ] + } + } +} \ No newline at end of file diff --git a/.dagger/yarn.lock b/.dagger/yarn.lock new file mode 100644 index 000000000..ab49665af --- /dev/null +++ b/.dagger/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +typescript@^5.5.4: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.earthlyignore b/.earthlyignore index 0d5506d0d..10c3b55ca 100644 --- a/.earthlyignore +++ b/.earthlyignore @@ -9,4 +9,3 @@ Earthfile */node_modules node_modules */assets_tmp -.earthlyignore diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 611959092..d69f133b0 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -20,41 +20,15 @@ jobs: environment: ${{ inputs.environment }} runs-on: ubuntu-latest env: - EARTHLY_TOKEN: ${{ secrets.EARTHLY_TOKEN }} + REMOTE_USER: ${{ secrets.REMOTE_USER }} + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} steps: - - uses: actions/checkout@v2 - - - uses: earthly/actions-setup@v1 + - name: Checkout + uses: actions/checkout@v4 + - name: Deploy using Dagger + uses: dagger/dagger-for-github@8.0.0 with: - github-token: ${{ secrets.GITHUB_TOKEN }} version: "latest" - - - name: Set env - run: echo "RELEASE_VERSION=$(echo ${GITHUB_REF#refs/*/})" >> $GITHUB_ENV - - - name: Earthly build - run: earthly --org ontola --sat henk -P +cross-build -TARGET=x86_64-unknown-linux-musl - - - name: Transfer binary rsync - uses: easingthemes/ssh-deploy@v3 - env: - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - ARGS: "-rltgoDzvO" - SOURCE: "./artifact/bin/atomic-server-x86_64-unknown-linux-musl" - REMOTE_HOST: ${{ inputs.remote_host }} - REMOTE_USER: ${{ secrets.REMOTE_USER }} - TARGET: ~/ - - - name: executing remote ssh commands using ssh key - uses: appleboy/ssh-action@master - with: - host: ${{ inputs.remote_host }} - username: ${{ secrets.REMOTE_USER }} - key: ${{ secrets.SSH_PRIVATE_KEY }} - script: | - mv ~/atomic-server-x86_64-unknown-linux-musl ~/atomic-server - cp ~/atomic-server ~/atomic-server-$(date +'%Y-%m-%dT%H:%M:%S') - systemctl stop atomic - ./atomic-server export && - systemctl start atomic - systemctl status atomic + verb: call + args: deploy-server --remote-host ${{ inputs.remote_host }} --remote-user env://REMOTE_USER --ssh-private-key env://SSH_PRIVATE_KEY + cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 41066910a..fbd155458 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,16 +2,12 @@ on: [push, workflow_dispatch] name: "Main pipeline: build, lint, test" jobs: - earthly: - name: Earthly + Main: + name: Main runs-on: ubuntu-latest env: - EARTHLY_TOKEN: ${{ secrets.EARTHLY_TOKEN }} + NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }} steps: - - uses: earthly/actions-setup@v1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - version: "latest" - uses: actions/checkout@v2 - name: Log in to Docker Hub uses: docker/login-action@v3 @@ -24,11 +20,21 @@ jobs: with: images: joepmeneer/atomic-server github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Earthly +tests - run: earthly --org ontola --ci --sat henk -P +tests - - name: Earthly +builds + - name: Dagger CI (test, lint, build) + uses: dagger/dagger-for-github@8.0.0 + with: + version: "latest" + cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }} + verb: call + args: ci --netlify-auth-token env://NETLIFY_TOKEN + - name: Dagger docker images (build images & publish) if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' - run: earthly --org ontola --ci --sat henk -P --push +builds --tags="${{ steps.meta.outputs.tags }}" + uses: dagger/dagger-for-github@8.0.0 + with: + version: "latest" + cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }} + verb: call + args: create-docker-images --tags ${{ steps.meta.outputs.tags }} - name: Upload artifacts uses: actions/upload-artifact@v4 with: diff --git a/.gitignore b/.gitignore index da927db46..8f365917c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ /target +.envrc .env trace-*.json **/.temp .DS_Store .cargo -.tmp-earthly-out artifact server/assets_tmp .netlify diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 223a84826..780c39159 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -57,16 +57,9 @@ "problemMatcher": [] }, { - "label": "earthly pipeline locally", + "label": "dagger call rust-build", "type": "shell", - "command": "earthly -i -P +pipeline", - "group": "none", - "problemMatcher": [] - }, - { - "label": "earthly cross-compile", - "type": "shell", - "command": "earthly -i -P +compile-all", + "command": "dagger call rust-build", "group": "none", "problemMatcher": [] }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 728825436..b141c7984 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,15 @@ # Changelog -## UNRELEASED - -- [#1048](https://github.com/atomicdata-dev/atomic-server/issues/1048) Fix search index not removing old versions of resources. - List of changes for this repo, including `atomic-cli`, `atomic-server` and `atomic-lib`. By far most changes relate to `atomic-server`, so if not specified, assume the changes are relevant only for the server. **Changes to JS assets (including the front-end and JS libraries) are not shown here**, but in [`/browser/CHANGELOG`](/browser/CHANGELOG.md). See [STATUS.md](server/STATUS.md) to learn more about which features will remain stable. +## UNRELEASED + +- [#1048](https://github.com/atomicdata-dev/atomic-server/issues/1048) Fix search index not removing old versions of resources. +- [#1056](https://github.com/atomicdata-dev/atomic-server/issues/1056) Switched from Earthly to Dagger for CI. Also made improvements to E2E test publishing and building docker images. + ## [v0.40.2] - fix property sort order when importing + add tests #980 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 53fa38035..ab921f581 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,7 @@ Check out the [Roadmap](https://docs.atomicdata.dev/roadmap.html) if you want to - [Running \& compiling](#running--compiling) - [Running locally (with local development browser)](#running-locally-with-local-development-browser) - [IDE setup (VSCode)](#ide-setup-vscode) - - [Compilation using Earthly](#compilation-using-earthly) + - [Using Dagger](#using-dagger) - [Improve local compilation speed](#improve-local-compilation-speed) - [Cross compilation](#cross-compilation) - [Git policy](#git-policy) @@ -59,14 +59,27 @@ That doesn't mean that you should, too, but it means you're less likely to run i - **Debugging**: Install the `CodeLLDB` plugin, and press F5 to start debugging. Breakpoints, inspect... The good stuff. - **Extensions**: That same directory will give a couple of suggestions for extensions to install. -### Compilation using Earthly +### Using Dagger -There are `earthfile`s in `browser` and in `atomic-server`. -These can be used by Earthly to build all steps, including a full docker image. +Dagger is a tool that's used for building the project. +The `.dagger` directory and the `dagger.json` file contain most of the configuration. +Install the Dagger CLI from [here](https://docs.dagger.io/install/) and run the `dagger` command in the root of the project. +Then you can run the commands from the `.dagger/src/index.ts` file, e.g. +`dagger call build-browser` -- Make sure `earthly` is installed -- `earthly --org ontola -P --satellite henk --artifact +e2e/test-results +pipeline` -- `earthly --org ontola -P --satellite henk --artifact +build-server/atomic-server ./output/atomicserver` +If you want to output artifacts (e.g. binaries), use: +`dagger call --interactive release-assets export --pa +th="./build"` + +You can pass secrets / ENVS to dagger like so: +`dagger call typedoc-publish --netlify-auth-token="env://NETLIFY_AUTH_TOKEN"` + +If Dagger is taking up a lot of storage, run: +`dagger core engine local-cache prune` + +Add `-i` to the command to run in interactive mode, add `--output` to save the output to a folder. +Note that the camelCase functions in the `index.ts` file are converted to kebab-case commands in the Dagger API. +Check out the [Dagger docs](https://docs.dagger.io/) for more information. ### Improve local compilation speed @@ -83,7 +96,7 @@ cargo install cross cross build --target x86_64-unknown-linux-musl --bin atomic-server --release ``` -Note that this is also done in the `earthly` file. +Check the Dagger index.ts file to see how cross compilation is done in the CI. ## Git policy @@ -218,7 +231,7 @@ Note: ### CI situation -- Github Action for `push`: builds + tests + docker (using `earthly`, see `Earthfile`) +- Github Action for `push`: builds + tests + docker (using `dagger`, see `.dagger` and the `.github` folders) - Github Action for `tag`: create release + publish binaries ### Publishing manually - doing the CI's work diff --git a/Cross.toml b/Cross.toml index a7b7c40ce..90c57516d 100644 --- a/Cross.toml +++ b/Cross.toml @@ -5,6 +5,7 @@ # "apt-get install --assume-yes nasm:$CROSS_DEB_ARCH", # ] [target.x86_64-unknown-linux-musl] +image = "ghcr.io/cross-rs/x86_64-unknown-linux-musl:edge" pre-build = [ "dpkg --add-architecture $CROSS_DEB_ARCH", "apt-get update", @@ -16,3 +17,19 @@ pre-build = [ # "apt-get update", # "apt-get install --assume-yes nasm:$CROSS_DEB_ARCH", # ] + +[target.aarch64-unknown-linux-musl] +image = "ghcr.io/cross-rs/aarch64-unknown-linux-musl:edge" +pre-build = [ + "dpkg --add-architecture $CROSS_DEB_ARCH", + "apt-get update", + "apt-get install --assume-yes nasm:$CROSS_DEB_ARCH", +] + +[target.armv7-unknown-linux-musleabihf] +image = "ghcr.io/cross-rs/armv7-unknown-linux-musleabihf:edge" +pre-build = [ + "dpkg --add-architecture $CROSS_DEB_ARCH", + "apt-get update", + "apt-get install --assume-yes nasm:$CROSS_DEB_ARCH", +] diff --git a/Earthfile b/Earthfile deleted file mode 100644 index 6a4aa8b47..000000000 --- a/Earthfile +++ /dev/null @@ -1,155 +0,0 @@ -VERSION --try 0.8 -PROJECT ontola/atomic-server -IMPORT ./browser AS browser -IMPORT github.com/earthly/lib/rust AS rust -FROM rust:bookworm -WORKDIR /code - -tests: - BUILD browser+test - BUILD browser+lint - BUILD +fmt - BUILD +lint - BUILD +test - BUILD +build - BUILD +e2e - -# Should only run _after_ tests have passed -# Requires --push to update things externally -builds: - BUILD +docs-pages - BUILD +docker-all - -# Creates a `./artifact/bin` folder with all the atomic-server binaries -build-all: - BUILD +build # x86_64-unknown-linux-gnu - BUILD +cross-build --TARGET=x86_64-unknown-linux-musl - BUILD +cross-build --TARGET=armv7-unknown-linux-musleabihf - # GLIBC issue, see #833 - # BUILD +cross-build --TARGET=aarch64-unknown-linux-musl - # Errors - # BUILD +cross-build --TARGET=aarch64-apple-darwin - -docker-all: - BUILD --platform=linux/amd64 +docker-musl --TARGET=x86_64-unknown-linux-musl - BUILD --platform=linux/arm/v7 +docker-musl --TARGET=armv7-unknown-linux-musleabihf - # GLIBC issue, see #833 - # BUILD --platform=linux/arm64/v8 +docker-musl --TARGET=aarch64-unknown-linux-musl - -install: - RUN apt-get update -qq - # Libraries that we install here, may also need to be added to `Cross.toml` - # NASM is required for the image library - RUN apt install nasm - RUN rustup component add clippy - RUN rustup component add rustfmt - RUN cargo install cross - DO rust+INIT --keep_fingerprints=true - -source: - FROM +install - COPY --keep-ts Cargo.toml Cargo.lock Cross.toml ./ - COPY --keep-ts --dir server lib cli ./ - COPY browser+build/dist /code/server/assets_tmp - DO rust+CARGO --args=fetch - -fmt: - FROM +source - DO rust+CARGO --args="fmt --check" - -lint: - FROM +source - DO rust+CARGO --args="clippy --no-deps --all-features --all-targets" - -build: - FROM +source - DO rust+CARGO --args="build --offline --release" --output="release/[^/\.]+" - RUN ./target/release/atomic-server --version - SAVE ARTIFACT ./target/release/atomic-server AS LOCAL artifact/bin/atomic-server-x86_64-unknown-linux-gnu - -test: - FROM +build - DO rust+CARGO --args="test" - -cross-build: - FROM +source - # The TARGETs may need custom libraries defined in `atomic-server/Cross.toml` - ARG --required TARGET - DO rust+SET_CACHE_MOUNTS_ENV - DO rust+CROSS --target ${TARGET} - # DO rust+COPY_OUTPUT --output="release/[^\./]+" - DO rust+COPY_OUTPUT --output=".*" # Copies all files to ./target - RUN ./target/$TARGET/release/atomic-server --version - SAVE ARTIFACT ./target/$TARGET/release/atomic-server AS LOCAL artifact/bin/atomic-server-$TARGET - -docker-musl: - FROM alpine:3.18 - # You can pass multiple tags, space separated - ARG tags="joepmeneer/atomic-server:develop" - ARG --required TARGET - COPY --chmod=0755 --platform=linux/amd64 (+cross-build/atomic-server --TARGET=${TARGET}) /atomic-server-bin - RUN /atomic-server-bin --version - # For a complete list of possible ENV vars or available flags, run with `--help` - ENV ATOMIC_DATA_DIR="/atomic-storage/data" - ENV ATOMIC_CONFIG_DIR="/atomic-storage/config" - ENV ATOMIC_PORT="80" - EXPOSE 80 - VOLUME /atomic-storage - ENTRYPOINT ["/atomic-server-bin"] - RUN echo "Pushing tags: ${tags}" - FOR tag IN ${tags} - SAVE IMAGE --push ${tag} - END - -setup-playwright: - FROM mcr.microsoft.com/playwright:v1.48.1-noble - RUN curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=9.3.0 ENV="$HOME/.shrc" SHELL="$(which sh)" sh - - ENV PATH="/root/.local/share/pnpm:$PATH" - RUN apt update && apt install -y zip - RUN pnpm dlx playwright install --with-deps - RUN npm install -g netlify-cli - -e2e: - FROM +setup-playwright - COPY --keep-ts browser/e2e/package.json /app/e2e/package.json - WORKDIR /app/e2e - RUN pnpm install - COPY --keep-ts --dir browser/e2e /app - RUN pnpm install - ENV LANGUAGE="en_GB" - ENV DELETE_PREVIOUS_TEST_DRIVES="false" - ENV FRONTEND_URL=http://localhost:9883 - COPY --chmod=0755 +build/atomic-server /atomic-server-bin - # We'll have to zip it https://github.com/earthly/earthly/issues/2817 - TRY - RUN nohup /atomic-server-bin --initialize & pnpm run test-e2e ; zip -r test.zip /app/e2e/playwright-report - FINALLY - SAVE ARTIFACT test.zip AS LOCAL artifact/test-results.zip - END - RUN unzip -o test.zip -d /artifact - # upload to https://atomic-tests.netlify.app/ - RUN --secret NETLIFY_AUTH_TOKEN=NETLIFY_TOKEN netlify deploy --dir /artifact/app/e2e/playwright-report --prod --auth $NETLIFY_AUTH_TOKEN --site atomic-tests - - # USE DOCKER - # TRY - # WITH DOCKER \ - # --load test:latest=+docker - # RUN docker run -d -p 80:80 test:latest & \ - # pnpm run test-e2e - # END - # FINALLY - # SAVE ARTIFACT /app/data-browser/test-results AS LOCAL artifact/test-results - # END - -docs-pages: - RUN cargo install mdbook - RUN cargo install mdbook-linkcheck - RUN cargo install mdbook-sitemap-generator - RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash - RUN bash -c "source $HOME/.nvm/nvm.sh && nvm install 20 && npm install -g netlify-cli" - COPY --keep-ts docs /docs - WORKDIR /docs - RUN mdbook --version - RUN mdbook build - RUN mdbook-sitemap-generator -d docs.atomicdata.dev -o /docs/book/html/sitemap.xml - RUN --secret NETLIFY_AUTH_TOKEN=NETLIFY_TOKEN bash -c "source $HOME/.nvm/nvm.sh && netlify deploy --dir /docs/book/html --prod --auth $NETLIFY_AUTH_TOKEN --site atomic-docs" diff --git a/browser/.earthlyignore b/browser/.earthlyignore deleted file mode 100644 index 609be7e68..000000000 --- a/browser/.earthlyignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -*/node_modules -Earthfile -.earthlyignore diff --git a/browser/Earthfile b/browser/Earthfile deleted file mode 100644 index 0ab92cf54..000000000 --- a/browser/Earthfile +++ /dev/null @@ -1,40 +0,0 @@ -VERSION 0.7 -PROJECT ontola/atomic-server -FROM node:22.13-bookworm # LTS -WORKDIR browser - -all: - BUILD +build - BUILD +test - BUILD +lint - BUILD +typedoc - -deps: - RUN curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=9.3.0 ENV="$HOME/.shrc" SHELL="$(which sh)" sh - - ENV PATH="/root/.local/share/pnpm:$PATH" - COPY package.json pnpm-lock.yaml pnpm-workspace.yaml . - COPY data-browser/package.json data-browser/. - COPY lib/package.json lib/. - COPY react/package.json react/. - COPY svelte/package.json svelte/. - COPY cli/package.json cli/. - RUN pnpm install --frozen-lockfile --shamefully-hoist - COPY . . - -test: - FROM +deps - RUN pnpm run build - RUN pnpm run test - -lint: - FROM +deps - RUN pnpm run lint - -build: - FROM +deps - RUN pnpm run build - SAVE ARTIFACT ./data-browser/dist - -typedoc: - FROM +build - RUN --secret NETLIFY_AUTH_TOKEN=NETLIFY_TOKEN pnpm run typedoc-publish diff --git a/browser/e2e/playwright.config.ts b/browser/e2e/playwright.config.ts index 50872b294..d4106ff26 100644 --- a/browser/e2e/playwright.config.ts +++ b/browser/e2e/playwright.config.ts @@ -29,7 +29,7 @@ const config: PlaywrightTestConfig = { }, ], ], - retries: 3, + retries: 0, // timeout: 1000 * 120, // 2 minutes projects: [ { diff --git a/browser/e2e/tests/test-utils.ts b/browser/e2e/tests/test-utils.ts index 2b939fd9e..bfd6349ba 100644 --- a/browser/e2e/tests/test-utils.ts +++ b/browser/e2e/tests/test-utils.ts @@ -105,7 +105,7 @@ export async function newDrive(page: Page) { await expect(currentDriveTitle(page)).not.toHaveText('localhost'); await expect(currentDriveTitle(page)).toHaveText(driveTitle); const driveURL = await getCurrentSubject(page); - expect(driveURL).toContain('localhost'); + expect(driveURL).toContain(FRONTEND_URL); return { driveURL: driveURL as string, driveTitle }; } diff --git a/browser/lib/package.json b/browser/lib/package.json index c497fa62e..c29b515fe 100644 --- a/browser/lib/package.json +++ b/browser/lib/package.json @@ -33,6 +33,8 @@ "!dist/**/*.d.ts.map" ], "license": "MIT", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "exports": { ".": { "import": { diff --git a/browser/pnpm-lock.yaml b/browser/pnpm-lock.yaml index f6c16462a..bbeea8d3f 100644 --- a/browser/pnpm-lock.yaml +++ b/browser/pnpm-lock.yaml @@ -379,73 +379,6 @@ importers: specifier: ^5 version: 5.6.3 - e2e/template-tests/sveltekit-site: - dependencies: - '@tomic/lib': - specifier: ^0.40.0 - version: 0.40.0 - '@tomic/svelte': - specifier: ^0.40.0 - version: 0.40.0(@tomic/lib@0.40.0)(svelte@5.1.4) - svelte-markdown: - specifier: ^0.4.1 - version: 0.4.1(svelte@5.1.4) - devDependencies: - '@sveltejs/adapter-auto': - specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))) - '@sveltejs/adapter-node': - specifier: ^5.2.9 - version: 5.2.12(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))) - '@sveltejs/kit': - specifier: ^2.7.3 - version: 2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) - '@sveltejs/vite-plugin-svelte': - specifier: ^4.0.0-next.6 - version: 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) - '@tomic/cli': - specifier: ^0.39.0 - version: 0.39.0(@tomic/lib@0.40.0) - '@types/eslint': - specifier: ^9.6.1 - version: 9.6.1 - eslint: - specifier: ^9.13.0 - version: 9.13.0(jiti@2.3.3) - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@9.13.0(jiti@2.3.3)) - eslint-plugin-svelte: - specifier: ^2.46.0 - version: 2.46.0(eslint@9.13.0(jiti@2.3.3))(svelte@5.1.4)(ts-node@10.9.2(@swc/core@1.7.39)(@types/node@20.17.0)(typescript@5.6.3)) - globals: - specifier: ^15.11.0 - version: 15.11.0 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - prettier-plugin-svelte: - specifier: ^3.2.7 - version: 3.2.7(prettier@3.3.3)(svelte@5.1.4) - svelte: - specifier: ^5.1.4 - version: 5.1.4 - svelte-check: - specifier: ^4.0.5 - version: 4.1.4(picomatch@4.0.2)(svelte@5.1.4)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 - typescript-eslint: - specifier: ^8.11.0 - version: 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) - vite: - specifier: ^5.4.10 - version: 5.4.10(@types/node@20.17.0)(terser@5.39.0) - vitest: - specifier: ^2.1.3 - version: 2.1.3(@types/node@20.17.0)(terser@5.39.0) - lib: dependencies: '@noble/ed25519': @@ -1256,8 +1189,14 @@ packages: peerDependencies: react: '>=16.8.0' - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} '@emoji-mart/react@1.1.1': resolution: {integrity: sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==} @@ -2114,6 +2053,9 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@napi-rs/wasm-runtime@0.2.10': + resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} + '@netlify/binary-info@1.0.0': resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} @@ -2858,24 +2800,6 @@ packages: '@types/babel__core': optional: true - '@rollup/plugin-commonjs@28.0.2': - resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-node-resolve@15.3.1': resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} engines: {node: '>=14.0.0'} @@ -2885,15 +2809,6 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.0': - resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-replace@2.4.2': resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: @@ -3010,8 +2925,8 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.5': - resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@rushstack/eslint-patch@1.11.0': + resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} '@rushstack/node-core-library@5.10.0': resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} @@ -3059,25 +2974,6 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/adapter-auto@3.3.1': - resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} - peerDependencies: - '@sveltejs/kit': ^2.0.0 - - '@sveltejs/adapter-node@5.2.12': - resolution: {integrity: sha512-0bp4Yb3jKIEcZWVcJC/L1xXp9zzJS4hDwfb4VITAkfT4OVdkspSHsx7YhqJDbb2hgLl6R9Vs7VQR+fqIVOxPUQ==} - peerDependencies: - '@sveltejs/kit': ^2.4.0 - - '@sveltejs/kit@2.17.3': - resolution: {integrity: sha512-GcNaPDr0ti4O/TonPewkML2DG7UVXkSxPN3nPMlpmx0Rs4b2kVP4gymz98WEHlfzPXdd4uOOT1Js26DtieTNBQ==} - engines: {node: '>=18.13'} - hasBin: true - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 || ^6.0.0 - '@sveltejs/kit@2.7.2': resolution: {integrity: sha512-bFwrl+0bNr0/DHQZM0INwwSPNYqDjfsKRhUoa6rj9d8tDZzszBrJ3La6/HVFxWGONEigtG+SzHXa1BEa1BLdwA==} engines: {node: '>=18.13'} @@ -3399,21 +3295,6 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tomic/cli@0.39.0': - resolution: {integrity: sha512-A0zH830nMywkBvGjVm6ZUuvTJLDtFR3MuZ9Sx//BNzM1bs3Ckn++Nt509ohUkRaFPem/XBwstC9p0Q1+SRaeIQ==} - hasBin: true - peerDependencies: - '@tomic/lib': 0.39.0 - - '@tomic/lib@0.40.0': - resolution: {integrity: sha512-Js8e6EEAnC0zKmk7OuHWv+fkA+2i8C/H2HI8IARD8HPBHO1t4cwnuMsNhVQght3i5d/CSdYysvg44DAiGFGgbQ==} - - '@tomic/svelte@0.40.0': - resolution: {integrity: sha512-x8RZM2TUxuoB8rYxU3ZEHLU5XNHPEbNxCG/OqAFRXdQGZkZwfcR1pDJfD7pK94X+xwSl18W2yfv+TQTn+alIgw==} - peerDependencies: - '@tomic/lib': 0.40.0 - svelte: ^4.0.0 - '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3430,6 +3311,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -3605,9 +3489,6 @@ packages: '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - '@types/marked@5.0.2': - resolution: {integrity: sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -3822,6 +3703,91 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@unrs/resolver-binding-darwin-arm64@1.7.2': + resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.7.2': + resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.7.2': + resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} + cpu: [x64] + os: [win32] + '@vercel/nft@0.27.5': resolution: {integrity: sha512-b2A7M+4yMHdWKY7xCC+kBEcnMrpaSE84CnuauTjhKKoCEeej0byJMAB8h/RBVnw/HdZOAFVcxR0Izr3LL24FwA==} engines: {node: '>=16'} @@ -3934,6 +3900,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -5211,10 +5182,6 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -5377,8 +5344,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.3: - resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -5453,8 +5420,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -5510,9 +5477,6 @@ packages: esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} - esm-env@1.2.2: - resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - espree@10.2.0: resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5702,8 +5666,8 @@ packages: picomatch: optional: true - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -6024,8 +5988,8 @@ packages: get-them-args@1.3.2: resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -6464,8 +6428,8 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} - is-bun-module@1.3.0: - resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -6631,9 +6595,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} @@ -7155,11 +7116,6 @@ packages: engines: {node: '>= 12'} hasBin: true - marked@5.1.2: - resolution: {integrity: sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==} - engines: {node: '>= 16'} - hasBin: true - marked@9.1.6: resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} engines: {node: '>= 16'} @@ -7515,6 +7471,11 @@ packages: napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -8246,8 +8207,8 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} prosemirror-changeset@2.2.1: resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} @@ -8824,6 +8785,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -9025,8 +8991,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -9274,14 +9240,6 @@ packages: peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - svelte-check@4.1.4: - resolution: {integrity: sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==} - engines: {node: '>= 18.0.0'} - hasBin: true - peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: '>=5.0.0' - svelte-eslint-parser@0.43.0: resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9291,11 +9249,6 @@ packages: svelte: optional: true - svelte-markdown@0.4.1: - resolution: {integrity: sha512-pOlLY6EruKJaWI9my/2bKX8PdTeP5CM0s4VMmwmC2prlOkjAf+AOmTM4wW/l19Y6WZ87YmP8+ZCJCCwBChWjYw==} - peerDependencies: - svelte: ^4.0.0 - svelte-preprocess@5.1.4: resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} @@ -9359,10 +9312,6 @@ packages: tabtab@3.0.2: resolution: {integrity: sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -9460,8 +9409,8 @@ packages: tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} tinyglobby@0.2.9: @@ -9840,6 +9789,9 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unrs-resolver@1.7.2: + resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} + unstorage@1.12.0: resolution: {integrity: sha512-ARZYTXiC+e8z3lRM7/qY9oyaOkaozCeNd2xoz7sYK9fv7OLGhVsf+BZbmASqiK/HTZ7T6eAlnVq9JynZppyk3w==} peerDependencies: @@ -11244,7 +11196,18 @@ snapshots: react: 19.0.0 tslib: 2.8.0 - '@emnapi/runtime@1.3.1': + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.0 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.0 + optional: true + + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.0 optional: true @@ -11750,7 +11713,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.3.1 + '@emnapi/runtime': 1.4.3 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -11863,6 +11826,13 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} + '@napi-rs/wasm-runtime@0.2.10': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + '@netlify/binary-info@1.0.0': {} '@netlify/blobs@7.4.0': {} @@ -12743,24 +12713,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@28.0.2(rollup@4.24.0)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.24.0) - commondir: 1.0.1 - estree-walker: 2.0.2 - fdir: 6.4.2(picomatch@4.0.2) - is-reference: 1.2.1 - magic-string: 0.30.12 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.24.0 - - '@rollup/plugin-json@6.1.0(rollup@4.24.0)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.24.0) - optionalDependencies: - rollup: 4.24.0 - '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@2.79.2) @@ -12771,16 +12723,6 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.24.0)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.24.0) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 - optionalDependencies: - rollup: 4.24.0 - '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.2) @@ -12815,14 +12757,6 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.1.4(rollup@4.24.0)': - dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.24.0 - '@rollup/rollup-android-arm-eabi@4.24.0': optional: true @@ -12873,7 +12807,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.5': {} + '@rushstack/eslint-patch@1.11.0': {} '@rushstack/node-core-library@5.10.0(@types/node@20.17.0)': dependencies: @@ -12934,36 +12868,6 @@ snapshots: '@sveltejs/kit': 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))': - dependencies: - '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) - import-meta-resolve: 4.1.0 - - '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))': - dependencies: - '@rollup/plugin-commonjs': 28.0.2(rollup@4.24.0) - '@rollup/plugin-json': 6.1.0(rollup@4.24.0) - '@rollup/plugin-node-resolve': 16.0.0(rollup@4.24.0) - '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) - rollup: 4.24.0 - - '@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': - dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) - '@types/cookie': 0.6.0 - cookie: 0.6.0 - devalue: 5.1.1 - esm-env: 1.2.2 - import-meta-resolve: 4.1.0 - kleur: 4.1.5 - magic-string: 0.30.12 - mrmime: 2.0.0 - sade: 1.8.1 - set-cookie-parser: 2.7.1 - sirv: 3.0.0 - svelte: 5.1.4 - vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) - '@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': dependencies: '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) @@ -13301,25 +13205,6 @@ snapshots: '@tokenizer/token@0.3.0': {} - '@tomic/cli@0.39.0(@tomic/lib@0.40.0)': - dependencies: - '@tomic/lib': 0.40.0 - chalk: 5.3.0 - prettier: 3.0.3 - - '@tomic/lib@0.40.0': - dependencies: - '@noble/ed25519': 1.6.0 - '@noble/hashes': 0.5.9 - base64-arraybuffer: 1.0.2 - fast-json-stable-stringify: 2.1.0 - ulidx: 2.4.1 - - '@tomic/svelte@0.40.0(@tomic/lib@0.40.0)(svelte@5.1.4)': - dependencies: - '@tomic/lib': 0.40.0 - svelte: 5.1.4 - '@trysound/sax@0.2.0': {} '@tsconfig/node10@1.0.11': {} @@ -13330,6 +13215,11 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.0 + optional: true + '@types/argparse@1.0.38': {} '@types/babel__core@7.20.5': @@ -13540,8 +13430,6 @@ snapshots: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 - '@types/marked@5.0.2': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -13863,12 +13751,65 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@unrs/resolver-binding-darwin-arm64@1.7.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.7.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.10 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + optional: true + '@vercel/nft@0.27.5(supports-color@9.4.0)': dependencies: '@mapbox/node-pre-gyp': 1.0.11(supports-color@9.4.0) '@rollup/pluginutils': 4.2.1 - acorn: 8.13.0 - acorn-import-attributes: 1.9.5(acorn@8.13.0) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -13998,26 +13939,32 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.13.0): + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: - acorn: 8.13.0 + acorn: 8.14.0 acorn-jsx@5.3.2(acorn@8.13.0): dependencies: acorn: 8.13.0 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn-typescript@1.4.13(acorn@8.13.0): dependencies: acorn: 8.13.0 acorn-walk@8.3.4: dependencies: - acorn: 8.13.0 + acorn: 8.14.0 acorn@8.13.0: {} acorn@8.14.0: {} + acorn@8.14.1: {} + agent-base@6.0.2(supports-color@9.4.0): dependencies: debug: 4.4.0(supports-color@9.4.0) @@ -15343,11 +15290,6 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -15675,16 +15617,16 @@ snapshots: eslint-config-next@15.0.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): dependencies: '@next/eslint-plugin-next': 15.0.2 - '@rushstack/eslint-patch': 1.10.5 + '@rushstack/eslint-patch': 1.11.0 '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) '@typescript-eslint/parser': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.13.0(jiti@2.3.3)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.13.0(jiti@2.3.3)) eslint-plugin-jsx-a11y: 6.10.1(eslint@9.13.0(jiti@2.3.3)) eslint-plugin-react: 7.37.2(eslint@9.13.0(jiti@2.3.3)) - eslint-plugin-react-hooks: 5.1.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.13.0(jiti@2.3.3)) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -15703,23 +15645,23 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@9.4.0) - enhanced-resolve: 5.18.1 eslint: 9.13.0(jiti@2.3.3) - get-tsconfig: 4.10.0 - is-bun-module: 1.3.0 - stable-hash: 0.0.4 - tinyglobby: 0.2.12 + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.14 + unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.13.0(jiti@2.3.3)) transitivePeerDependencies: - supports-color @@ -15733,14 +15675,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) transitivePeerDependencies: - supports-color @@ -15773,7 +15715,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.13.0(jiti@2.3.3)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.13.0(jiti@2.3.3)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -15784,7 +15726,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -15868,7 +15810,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.13.0(jiti@2.3.3)): + eslint-plugin-react-hooks@5.2.0(eslint@9.13.0(jiti@2.3.3)): dependencies: eslint: 9.13.0(jiti@2.3.3) @@ -16036,12 +15978,10 @@ snapshots: esm-env@1.0.0: {} - esm-env@1.2.2: {} - espree@10.2.0: dependencies: - acorn: 8.13.0 - acorn-jsx: 5.3.2(acorn@8.13.0) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.1.0 espree@9.6.1: @@ -16299,7 +16239,7 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -16644,7 +16584,7 @@ snapshots: get-them-args@1.3.2: {} - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -16875,7 +16815,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -17185,9 +17125,9 @@ snapshots: dependencies: builtin-modules: 3.3.0 - is-bun-module@1.3.0: + is-bun-module@2.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.2 is-callable@1.2.7: {} @@ -17311,10 +17251,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.6 - is-reference@3.0.2: dependencies: '@types/estree': 1.0.6 @@ -17852,8 +17788,6 @@ snapshots: marked@4.3.0: {} - marked@5.1.2: {} - marked@9.1.6: {} math-intrinsics@1.1.0: {} @@ -18322,7 +18256,7 @@ snapshots: mlly@1.7.2: dependencies: - acorn: 8.13.0 + acorn: 8.14.0 pathe: 1.1.2 pkg-types: 1.2.1 ufo: 1.5.4 @@ -18372,6 +18306,8 @@ snapshots: napi-build-utils@1.0.2: {} + napi-postinstall@0.2.4: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -19241,7 +19177,7 @@ snapshots: property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} prosemirror-changeset@2.2.1: dependencies: @@ -19953,6 +19889,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.2: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -20227,7 +20165,7 @@ snapshots: sprintf-js@1.0.3: {} - stable-hash@0.0.4: {} + stable-hash@0.0.5: {} stack-generator@2.0.10: dependencies: @@ -20522,18 +20460,6 @@ snapshots: - stylus - sugarss - svelte-check@4.1.4(picomatch@4.0.2)(svelte@5.1.4)(typescript@5.6.3): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - chokidar: 4.0.1 - fdir: 6.4.2(picomatch@4.0.2) - picocolors: 1.1.1 - sade: 1.8.1 - svelte: 5.1.4 - typescript: 5.6.3 - transitivePeerDependencies: - - picomatch - svelte-eslint-parser@0.43.0(svelte@5.1.4): dependencies: eslint-scope: 7.2.2 @@ -20544,12 +20470,6 @@ snapshots: optionalDependencies: svelte: 5.1.4 - svelte-markdown@0.4.1(svelte@5.1.4): - dependencies: - '@types/marked': 5.0.2 - marked: 5.1.2 - svelte: 5.1.4 - svelte-preprocess@5.1.4(@babel/core@7.26.0)(postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.39)(@types/node@20.17.0)(typescript@5.6.3)))(postcss@8.4.47)(svelte@5.1.4)(typescript@5.6.3): dependencies: '@types/pug': 2.0.10 @@ -20615,8 +20535,6 @@ snapshots: transitivePeerDependencies: - supports-color - tapable@2.2.1: {} - tar-fs@2.1.1: dependencies: chownr: 1.1.4 @@ -20681,7 +20599,7 @@ snapshots: terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -20737,9 +20655,9 @@ snapshots: tinyexec@0.3.1: {} - tinyglobby@0.2.12: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 tinyglobby@0.2.9: @@ -20832,7 +20750,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.17.0 - acorn: 8.13.0 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -21137,6 +21055,28 @@ snapshots: unpipe@1.0.0: {} + unrs-resolver@1.7.2: + dependencies: + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.7.2 + '@unrs/resolver-binding-darwin-x64': 1.7.2 + '@unrs/resolver-binding-freebsd-x64': 1.7.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-musl': 1.7.2 + '@unrs/resolver-binding-wasm32-wasi': 1.7.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 + unstorage@1.12.0(@netlify/blobs@8.1.0): dependencies: anymatch: 3.1.3 diff --git a/browser/DOCS.MD b/browser/typedoc-entry.md similarity index 100% rename from browser/DOCS.MD rename to browser/typedoc-entry.md diff --git a/browser/typedoc.json b/browser/typedoc.json index cf9c8124d..62506df35 100644 --- a/browser/typedoc.json +++ b/browser/typedoc.json @@ -7,7 +7,7 @@ ], "excludeExternals": true, "includeVersion": true, - "readme": "DOCS.md", + "readme": "typedoc-entry.md", "name": "@tomic", "out": "data-browser/publish/docs" } diff --git a/build/atomic-server-aarch64-unknown-linux-musl b/build/atomic-server-aarch64-unknown-linux-musl new file mode 100755 index 000000000..116c1afdf Binary files /dev/null and b/build/atomic-server-aarch64-unknown-linux-musl differ diff --git a/build/atomic-server-armv7-unknown-linux-musleabihf b/build/atomic-server-armv7-unknown-linux-musleabihf new file mode 100755 index 000000000..a74a59ed6 Binary files /dev/null and b/build/atomic-server-armv7-unknown-linux-musleabihf differ diff --git a/build/atomic-server-x86_64-unknown-linux-musl b/build/atomic-server-x86_64-unknown-linux-musl new file mode 100755 index 000000000..ee456c36c Binary files /dev/null and b/build/atomic-server-x86_64-unknown-linux-musl differ diff --git a/dagger.json b/dagger.json new file mode 100644 index 000000000..c12c92a3e --- /dev/null +++ b/dagger.json @@ -0,0 +1,15 @@ +{ + "name": "atomic-server", + "engineVersion": "v0.18.8", + "sdk": { + "source": "typescript" + }, + "dependencies": [ + { + "name": "docker", + "source": "github.com/shykes/x/docker@811fa8a47958c484441304cec08d6fe30a7550b3", + "pin": "811fa8a47958c484441304cec08d6fe30a7550b3" + } + ], + "source": ".dagger" +} diff --git a/docs/book.toml b/docs/book.toml index a160b96ac..0c670cd88 100644 --- a/docs/book.toml +++ b/docs/book.toml @@ -1,3 +1,6 @@ +[build] +build-dir = "build" + [book] title = "Atomic Data Docs" authors = ["Joep Meindertsma"] diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index abe5c2252..ee1d4a6d6 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -38,9 +38,9 @@ - [Image](svelte/image.md) - [@tomic/template](create-template/atomic-template.md) - [@tomic/cli](js-cli.md) - - [Rust](rust-lib.md) - - [Rust lib](rust-lib.md) - - [Rust CLI](rust-cli.md) + - [Rust](rust.md) + - [CLI](rust-cli.md) + - [Lib](rust-lib.md) # Guides diff --git a/docs/src/rust.md b/docs/src/rust.md new file mode 100644 index 000000000..104d46383 --- /dev/null +++ b/docs/src/rust.md @@ -0,0 +1,7 @@ +{{#title Rust libraries & tools for Atomic Data}} +# atomic-lib: Rust libraries & tools for Atomic Data + +We have a [CLI] and a [library] for Rust. + +[CLI]: rust-cli.md +[library]: rust-lib.md