Use bun package manager (#68170)

* Use bun in package.json

* Update workflows

* Update more workflows

* Kick ci

* Fix yaml

* Fix type errors

* Compat with snyk

* Fix jest resolutions

* Add another esm package

* Fix aliases and next js missing deps

* Update next js embed tests

* Try fix embed test config

* Fix

* Fix requires in e2e support

* Use bun not yarn in embed bin

* Revert config changes

* Use bun in more scripts and use prepare-release action

* Replace more yarn usages

* Remove overrides from bunfig move to package json

* Revert e2e support changes

* Add back comment

* [ci skip] comment typo

* Update bun lock

* Update to reference bun

* Update to reference bun

* Update license disclaimer

* Tidy tests

* Update to use bun in workflows

* Change aliases

* Update codemirrort selector

* Tidy license generation

* Remove .only

* Fix yarn references

* Checkout .github for release scripts

* Update lockfile

* Re-add package

* update release bunlock

* fix checkout check

---------

Co-authored-by: Ryan Laurie <iethree@gmail.com>
This commit is contained in:
Fraser
2026-02-11 05:27:57 +13:00
committed by GitHub
parent 50241cb516
commit 355a5fc29c
122 changed files with 13238 additions and 30057 deletions

View File

@@ -1,21 +1,21 @@
## Linting and Formatting ## Linting and Formatting
- **Lint:** `yarn lint-eslint-pure` - **Lint:** `bun run lint-eslint-pure`
- Run ESLint on the codebase - Run ESLint on the codebase
- **Format:** `yarn prettier` - **Format:** `bun run prettier`
- Format code using Prettier - Format code using Prettier
- **Type Check:** `yarn type-check-pure` - **Type Check:** `bun run type-check-pure`
- Run TypeScript type checking - Run TypeScript type checking
## Testing ## Testing
### JavaScript/TypeScript Tests ### JavaScript/TypeScript Tests
- **Test a specific file:** `yarn test-unit-keep-cljs path/to/file.unit.spec.js` - **Test a specific file:** `bun run test-unit-keep-cljs path/to/file.unit.spec.js`
- **Test by pattern:** `yarn test-unit-keep-cljs -t "pattern"` - **Test by pattern:** `bun run test-unit-keep-cljs -t "pattern"`
- Runs tests matching the given pattern - Runs tests matching the given pattern
### ClojureScript Tests ### ClojureScript Tests
- **Test ClojureScript:** `yarn test-cljs` - **Test ClojureScript:** `bun run test-cljs`
- Run ClojureScript tests - Run ClojureScript tests

View File

@@ -40,7 +40,7 @@ allowed-tools: Read, Write, Grep, Bash, Glob
**Format:** **Format:**
- Run prettier on the file after making edits: `yarn prettier --write <file-path>` - Run prettier on the file after making edits: `bun run prettier --write <file-path>`
- This ensures consistent formatting across all documentation - This ensures consistent formatting across all documentation
### Common patterns ### Common patterns

View File

@@ -1,11 +1,11 @@
FROM mcr.microsoft.com/vscode/devcontainers/java:21 FROM mcr.microsoft.com/vscode/devcontainers/java:21
# Set up nodesource, install node, yarn, fontconfig for static viz, rlwrap for dev ergonomics # Set up nodesource, install node, bun, fontconfig for static viz, rlwrap for dev ergonomics
RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash ) \ RUN ( curl -fsSL https://deb.nodesource.com/setup_22.x | bash ) \
&& export DEBIAN_FRONTEND=noninteractive \ && export DEBIAN_FRONTEND=noninteractive \
&& apt-get update && apt-get -y install --no-install-recommends nodejs rlwrap fontconfig \ && apt-get update && apt-get -y install --no-install-recommends nodejs rlwrap fontconfig \
&& npm install --global yarn && npm install -g bun
# install Clojure # install Clojure
RUN curl https://download.clojure.org/install/linux-install-1.12.0.1488.sh | bash RUN curl https://download.clojure.org/install/linux-install-1.12.0.1488.sh | bash

View File

@@ -100,7 +100,7 @@ METASTORE_DEV_SERVER_URL="https://token-check.staging.metabase.com"
# #
# The whole environment is already orchestrated via deps.edn using :e2e alias. # The whole environment is already orchestrated via deps.edn using :e2e alias.
# Treat it as a source of truth for JVM flags and ENVs whether you decide to run # Treat it as a source of truth for JVM flags and ENVs whether you decide to run
# backend on your own, or using `yarn test-cypress` (local test runner). # backend on your own, or using `bun run test-cypress` (local test runner).
# #
# You don't _have to_ export any of these vars (except for the tokens below). # You don't _have to_ export any of these vars (except for the tokens below).
# Things will still work. # Things will still work.

View File

@@ -5,7 +5,7 @@ PENDING CI / PENDING REVIEW / READY _(choose one and update accordingly)_
- Reproduces #XXXXX - Reproduces #XXXXX
### How to test this manually? ### How to test this manually?
- `yarn test-cypress` - `bun run test-cypress`
- `relative/path/to/the/file` - `relative/path/to/the/file`
> _(For still unfixed bug)_ > _(For still unfixed bug)_
- Replace `it.skip()` with `it.only()` to run the test in isolation - Replace `it.skip()` with `it.only()` to run the test in isolation

View File

@@ -3,7 +3,7 @@ description: Cypress preparation steps
inputs: inputs:
working-directory: working-directory:
description: "Optional working directory for yarn commands" description: "Optional working directory for bun commands"
required: false required: false
default: "." default: "."
@@ -34,9 +34,9 @@ runs:
- name: Ensure that Cypress executable is ready - name: Ensure that Cypress executable is ready
run: | run: |
yarn cypress install bun run cypress install
yarn cypress cache path bun run cypress cache path
yarn cypress cache list bun run cypress cache list
yarn cypress verify bun run cypress verify
shell: bash shell: bash
working-directory: ${{ inputs.working-directory }} working-directory: ${{ inputs.working-directory }}

View File

@@ -17,6 +17,11 @@ runs:
node-version: ${{ inputs.node-version }} # this overrides, if present node-version: ${{ inputs.node-version }} # this overrides, if present
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Get cache keys - name: Get cache keys
uses: ./.github/actions/get-cache-keys uses: ./.github/actions/get-cache-keys
id: get-cache-keys id: get-cache-keys
@@ -29,12 +34,12 @@ runs:
~/.gitlibs ~/.gitlibs
key: ${{ steps.get-cache-keys.outputs.m2-cache-key }} key: ${{ steps.get-cache-keys.outputs.m2-cache-key }}
- name: Get yarn cache directory - name: Get bun cache directory
id: yarn-cache-dir id: bun-cache
run: | run: |
YARN_CACHE_DIR=$(yarn cache dir) BUN_CACHE_DIR=$(bun pm cache)
echo "Yarn cache directory: $YARN_CACHE_DIR" echo "Bun cache directory: $BUN_CACHE_DIR"
echo "dir=$YARN_CACHE_DIR" >> $GITHUB_OUTPUT echo "dir=$BUN_CACHE_DIR" >> $GITHUB_OUTPUT
shell: bash shell: bash
- name: Restore node_modules cache - name: Restore node_modules cache
@@ -42,7 +47,7 @@ runs:
id: node-modules-cache id: node-modules-cache
with: with:
path: | path: |
${{ steps.yarn-cache-dir.outputs.dir }} ${{ steps.bun-cache.outputs.dir }}
node_modules node_modules
key: ${{ steps.get-cache-keys.outputs.node-cache-key }} key: ${{ steps.get-cache-keys.outputs.node-cache-key }}
@@ -50,9 +55,9 @@ runs:
# If a job wants to patch packages, it does so explicitly in the CI. This setting is opt-out. # If a job wants to patch packages, it does so explicitly in the CI. This setting is opt-out.
# For example, we never want to cache node_modules with patches already applied so cache-generator.yml skips that step. # For example, we never want to cache node_modules with patches already applied so cache-generator.yml skips that step.
- name: Clean install - name: Clean install
run: yarn install --frozen-lockfile --prefer-offline run: bun install --frozen-lockfile
shell: bash shell: bash
- name: Patch frontend dependencies - name: Patch frontend dependencies
if: inputs.apply-patches == 'true' if: inputs.apply-patches == 'true'
run: yarn patch-package run: bun run patch-package
shell: bash shell: bash

View File

@@ -0,0 +1,13 @@
name: Prepare Release Scripts
description: Set up bun and build release scripts
runs:
using: composite
steps:
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Build release scripts
shell: bash
run: cd ${{ github.workspace }}/release && bun install --frozen-lockfile && bun run build

View File

@@ -27,7 +27,7 @@ runs:
uses: ./.github/actions/prepare-frontend uses: ./.github/actions/prepare-frontend
- name: Build static viz frontend - name: Build static viz frontend
if: ${{ inputs.build-static-viz == 'true' }} if: ${{ inputs.build-static-viz == 'true' }}
run: yarn build-static-viz run: bun run build-static-viz
shell: bash shell: bash
env: env:
MB_EDITION: ee MB_EDITION: ee

View File

@@ -26,7 +26,7 @@ frontend_ci: &frontend_ci
- ".github/workflows/frontend.yml" - ".github/workflows/frontend.yml"
frontend_configs: &frontend_configs frontend_configs: &frontend_configs
- "yarn.lock" - "bun.lock"
- "**/tsconfig*.json" - "**/tsconfig*.json"
- "package.json" - "package.json"
- "babel.config.json" - "babel.config.json"

View File

@@ -44,7 +44,7 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Build static viz frontend - name: Build static viz frontend
run: yarn build-static-viz run: bun run build-static-viz
env: env:
MB_EDITION: ee MB_EDITION: ee
- name: Collect the test coverage - name: Collect the test coverage
@@ -91,7 +91,7 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Build static viz frontend - name: Build static viz frontend
run: yarn build-static-viz run: bun run build-static-viz
env: env:
MB_EDITION: ee MB_EDITION: ee
- name: Collect the test coverage - name: Collect the test coverage

View File

@@ -104,7 +104,7 @@ jobs:
with: with:
java-version: "${{ matrix.java-version }}" java-version: "${{ matrix.java-version }}"
- name: Build static-viz frontend - name: Build static-viz frontend
run: yarn build-static-viz run: bun run build-static-viz
env: env:
MB_EDITION: ${{ matrix.job.edition }} MB_EDITION: ${{ matrix.job.edition }}

View File

@@ -19,9 +19,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Send build start message - name: Send build start message
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
@@ -79,9 +81,11 @@ jobs:
exit 1 exit 1
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Version - name: Get Release Version
uses: actions/github-script@v7 uses: actions/github-script@v7
id: canonical_version id: canonical_version
@@ -121,9 +125,11 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 # IMPORTANT! to get all the branches fetch-depth: 0 # IMPORTANT! to get all the branches
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Branch - name: Get Release Branch
uses: actions/github-script@v7 uses: actions/github-script@v7
id: release_branch id: release_branch
@@ -135,12 +141,13 @@ jobs:
const releaseBranch = getReleaseBranch(version); const releaseBranch = getReleaseBranch(version);
return releaseBranch; return releaseBranch;
- name: Ensure that the specified commit exists in the ${{ steps.release_branch.outputs.result }} release branch - name: Ensure that the specified commit exists in the ${{ steps.release_branch.outputs.result }} release branch
run: | run: | # bash
RELEASE_BRANCH=${{ steps.release_branch.outputs.result }} RELEASE_BRANCH=${{ steps.release_branch.outputs.result }}
git checkout $RELEASE_BRANCH git checkout $RELEASE_BRANCH
git branch --contains ${{ inputs.commit }} | grep -q $RELEASE_BRANCH \ git branch --contains ${{ inputs.commit }} | grep -q $RELEASE_BRANCH \
&& echo "Commit found in correct release branch" \ && echo "Commit found in correct release branch" \
|| (echo "Commit not found in correct release branch" && exit 1) || (echo "Commit not found in correct release branch" && exit 1)
git checkout -
get-build-requirements: get-build-requirements:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@@ -152,9 +159,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get build dependencies - name: Get build dependencies
uses: actions/github-script@v7 uses: actions/github-script@v7
id: dependencies id: dependencies

View File

@@ -82,7 +82,7 @@ jobs:
# Frontend preparation and caches # Frontend preparation and caches
# `prepare-frontend` action (1) prepares Node.js and (2) fetches the node_modules cache if it exists. # `prepare-frontend` action (1) prepares Node.js and (2) fetches the node_modules cache if it exists.
# It then (3) runs `yarn install --frozen-lockfile --prefer-offline` which ensures the local cache is fully populated. # It then (3) runs `bun install --frozen-lockfile` which ensures the local cache is fully populated.
# IMPORTANT: Caching node_modules after patches are already applied will break any PR that attempts to either: # IMPORTANT: Caching node_modules after patches are already applied will break any PR that attempts to either:
# - upgrade a patched library # - upgrade a patched library
# - change a patch # - change a patch
@@ -92,31 +92,31 @@ jobs:
with: with:
apply-patches: "false" apply-patches: "false"
- name: Get yarn cache directory - name: Get bun cache directory
id: yarn-cache-dir id: bun-cache
run: | run: |
YARN_CACHE_DIR=$(yarn cache dir) BUN_CACHE_DIR=$(bun pm cache)
echo "Yarn cache directory: $YARN_CACHE_DIR" echo "Bun cache directory: $BUN_CACHE_DIR"
echo "dir=$YARN_CACHE_DIR" >> $GITHUB_OUTPUT echo "dir=$BUN_CACHE_DIR" >> $GITHUB_OUTPUT
- name: Ensure that Cypress executable is ready - name: Ensure that Cypress executable is ready
run: | run: |
yarn cypress install bun run cypress install
yarn cypress cache path bun run cypress cache path
yarn cypress cache list bun run cypress cache list
yarn cypress verify bun run cypress verify
shell: bash shell: bash
# Run Prettier to populate its cache (stored in node_modules/.cache/prettier) # Run Prettier to populate its cache (stored in node_modules/.cache/prettier)
# so it gets saved as part of the node_modules cache below # so it gets saved as part of the node_modules cache below
- name: Run Prettier to populate cache - name: Run Prettier to populate cache
run: yarn lint-prettier-pure run: bun run lint-prettier-pure
- name: Update node_modules cache - name: Update node_modules cache
uses: ./.github/actions/update-cache uses: ./.github/actions/update-cache
with: with:
path: | path: |
${{ steps.yarn-cache-dir.outputs.dir }} ${{ steps.bun-cache.outputs.dir }}
node_modules node_modules
key: ${{ env.NODE_CACHE_KEY }} key: ${{ env.NODE_CACHE_KEY }}
@@ -128,10 +128,10 @@ jobs:
# ESLint cache (requires both backend and frontend) # ESLint cache (requires both backend and frontend)
- name: Compile CLJS - name: Compile CLJS
run: yarn build-pure:cljs run: bun run build-pure:cljs
- name: Run ESLint to populate cache - name: Run ESLint to populate cache
run: yarn lint-eslint-pure run: bun run lint-eslint-pure
- name: Update eslint cache - name: Update eslint cache
uses: ./.github/actions/update-cache uses: ./.github/actions/update-cache

View File

@@ -26,11 +26,13 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
release
.github
fetch-depth: ${{ env.isNewReleaseBranch == 'false' && 3 || 0 }} # we need the full history to get all the commit messages fetch-depth: ${{ env.isNewReleaseBranch == 'false' && 3 || 0 }} # we need the full history to get all the commit messages
ref: master # we want the logic from master, even though we're triggering on a release branch ref: master # we want the logic from master, even though we're triggering on a release branch
- name: Prepare build scripts - name: Prepare release scripts
run: cd ${{ github.workspace }}/release && yarn && yarn build uses: ./.github/actions/prepare-release-scripts
- uses: actions/github-script@v7 - uses: actions/github-script@v7
if: ${{ env.isNewReleaseBranch == 'false' }} if: ${{ env.isNewReleaseBranch == 'false' }}
name: Set milestone for single commit name: Set milestone for single commit

View File

@@ -41,7 +41,7 @@ jobs:
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Compile CLJS - name: Compile CLJS
run: NODE_ENV=development yarn build-pure:cljs run: NODE_ENV=development bun run build-pure:cljs
- name: Publish to Chromatic - name: Publish to Chromatic
uses: chromaui/action@v10.2.0 uses: chromaui/action@v10.2.0
env: env:

View File

@@ -230,6 +230,12 @@ jobs:
mkdir -p .claude-scratchpad mkdir -p .claude-scratchpad
echo "Scratchpad directory created for Claude's temporary verification files" echo "Scratchpad directory created for Claude's temporary verification files"
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate GitHub App Token for Claude - name: Generate GitHub App Token for Claude
uses: actions/create-github-app-token@v1 uses: actions/create-github-app-token@v1
id: claude-app-token id: claude-app-token
@@ -244,7 +250,7 @@ jobs:
github_token: ${{ steps.claude-app-token.outputs.token }} github_token: ${{ steps.claude-app-token.outputs.token }}
prompt: ${{ env.BUG_FIX_PROMPT }} prompt: ${{ env.BUG_FIX_PROMPT }}
claude_args: | claude_args: |
--allowedTools "Bash(yarn test-unit*),Bash(yarn lint-eslint-pure),Bash(./bin/mage*),Bash(clojure*),Bash(find*),Bash(ls*),Bash(grep*),Write,Read,Glob,Grep,Edit,MultiEdit" --allowedTools "Bash(bun run test-unit*),Bash(bun run lint-eslint-pure),Bash(./bin/mage*),Bash(clojure*),Bash(find*),Bash(ls*),Bash(grep*),Write,Read,Glob,Grep,Edit,MultiEdit"
--disallowedTools "Bash(git commit*),Bash(git push*),Bash(gh*)" --disallowedTools "Bash(git commit*),Bash(git push*),Bash(gh*)"
- name: Clean up scratchpad directory - name: Clean up scratchpad directory

View File

@@ -39,4 +39,4 @@ jobs:
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Run Cljs tests - name: Run Cljs tests
run: yarn run test-cljs run: bun run test-cljs

View File

@@ -64,8 +64,8 @@ jobs:
commit: ${{ inputs.commit }} commit: ${{ inputs.commit }}
edition: ${{ inputs.edition }} edition: ${{ inputs.edition }}
release: ${{ inputs.release }} release: ${{ inputs.release }}
- name: Prepare build scripts - name: Prepare release scripts
run: cd ${{ github.workspace }}/release && yarn && yarn build uses: ./.github/actions/prepare-release-scripts
- name: Get platforms - name: Get platforms
id: platforms id: platforms
uses: actions/github-script@v7 uses: actions/github-script@v7

View File

@@ -17,7 +17,7 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests - name: Run frontend unit tests
run: | run: |
yarn run test-unit \ bun run test-unit \
--silent \ --silent \
--coverage \ --coverage \
--testTimeout=60000 --testTimeout=60000

View File

@@ -115,11 +115,15 @@ jobs:
- name: Build Embedding SDK package - name: Build Embedding SDK package
if: ${{ needs.determine-test-type.outputs.type == 'component' }} if: ${{ needs.determine-test-type.outputs.type == 'component' }}
run: yarn build-embedding-sdk-package run: bun run build-embedding-sdk-package
- name: Prepare Cypress environment - name: Prepare Cypress environment
id: cypress-prep id: cypress-prep
uses: ./.github/actions/prepare-cypress uses: ./.github/actions/prepare-cypress
- name: Compile CLJS
run: bun run build-pure:cljs
- name: Run Metabase - name: Run Metabase
run: node e2e/runner/run_cypress_ci.js start run: node e2e/runner/run_cypress_ci.js start

View File

@@ -105,6 +105,9 @@ jobs:
if: github.run_attempt != '1' if: github.run_attempt != '1'
run: echo "specs=$(cat failed-specs)" >> $GITHUB_ENV run: echo "specs=$(cat failed-specs)" >> $GITHUB_ENV
- name: Compile CLJS
run: bun run build-pure:cljs
- name: Run Metabase - name: Run Metabase
run: node e2e/runner/run_cypress_ci.js start run: node e2e/runner/run_cypress_ci.js start

View File

@@ -36,8 +36,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Prepare build scripts - name: Prepare release scripts
run: cd ${{ github.workspace }}/release && yarn && yarn build uses: ./.github/actions/prepare-release-scripts
- name: Build sample app compatibility data - name: Build sample app compatibility data
uses: actions/github-script@v7 uses: actions/github-script@v7

View File

@@ -23,7 +23,7 @@ jobs:
# Remove the matchers to not report false positives on every PR # Remove the matchers to not report false positives on every PR
# unrelated to embedding (EMB-765) # unrelated to embedding (EMB-765)
echo "::remove-matcher owner=tsc::" echo "::remove-matcher owner=tsc::"
yarn build-embedding-sdk-package bun run build-embedding-sdk-package
- name: Prepare Embedding SDK artifact - name: Prepare Embedding SDK artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:

View File

@@ -47,7 +47,7 @@ jobs:
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }} name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
path: ${{ github.workspace }}/resources/embedding-sdk path: ${{ github.workspace }}/resources/embedding-sdk
- name: Run frontend embedding SDK snippets type check - name: Run frontend embedding SDK snippets type check
run: yarn run embedding-sdk:cli-snippets:type-check run: bun run embedding-sdk:cli-snippets:type-check
embedding-sdk-docs-snippets-type-check: embedding-sdk-docs-snippets-type-check:
if: inputs.docs-snippets-type-check && !inputs.skip if: inputs.docs-snippets-type-check && !inputs.skip
@@ -63,7 +63,7 @@ jobs:
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }} name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
path: ${{ github.workspace }}/resources/embedding-sdk path: ${{ github.workspace }}/resources/embedding-sdk
- name: Run frontend embedding SDK snippets type check - name: Run frontend embedding SDK snippets type check
run: yarn run embedding-sdk:docs-snippets:type-check run: bun run embedding-sdk:docs-snippets:type-check
embedding-sdk-api-documentation-generation-validation: embedding-sdk-api-documentation-generation-validation:
if: inputs.documentation-validation && !inputs.skip if: inputs.documentation-validation && !inputs.skip
@@ -86,7 +86,7 @@ jobs:
shell: bash shell: bash
run: | run: |
set -o pipefail set -o pipefail
yarn embedding-sdk:docs:generate:pure --emit none 2>&1 \ bun run embedding-sdk:docs:generate:pure --emit none 2>&1 \
| tee /dev/stdout \ | tee /dev/stdout \
| tee >( tail -n 10 \ | tee >( tail -n 10 \
| sed '1s/^/output<<EOF\n/' \ | sed '1s/^/output<<EOF\n/' \
@@ -98,14 +98,14 @@ jobs:
with: with:
remove-previous-comment: true remove-previous-comment: true
add-new-comment: ${{ steps.docs-generation.outcome == 'failure' && contains(steps.docs-generation.outputs.output, 'not included in the documentation') }} add-new-comment: ${{ steps.docs-generation.outcome == 'failure' && contains(steps.docs-generation.outputs.output, 'not included in the documentation') }}
message: "📝 Some exported types from `@metabase/embedding-sdk-react` reference other types that are not exported, i.e. internal types.<br><br>The internal type reference breaks API documentation generation for the SDK and also may unexpectedly increase the output size of the type declaration file.<br><br>Please check the CI logs to find the name of such type.<br><br>- If a type should be publicly available in the SDK, add a description to it or a TypeDoc annotation and export it from SDK.<br>- If a type is internal and should _not_ be publicly exposed, refactor types to prevent referencing other types that are not exported from SDK.<br><br>You can run `yarn embedding-sdk:docs:generate` locally to verify that the issue has been resolved." message: "📝 Some exported types from `@metabase/embedding-sdk-react` reference other types that are not exported, i.e. internal types.<br><br>The internal type reference breaks API documentation generation for the SDK and also may unexpectedly increase the output size of the type declaration file.<br><br>Please check the CI logs to find the name of such type.<br><br>- If a type should be publicly available in the SDK, add a description to it or a TypeDoc annotation and export it from SDK.<br>- If a type is internal and should _not_ be publicly exposed, refactor types to prevent referencing other types that are not exported from SDK.<br><br>You can run `bun run embedding-sdk:docs:generate` locally to verify that the issue has been resolved."
include-log: true include-log: true
- name: Comment on PR if 'Failed to resolve link' error happens - name: Comment on PR if 'Failed to resolve link' error happens
uses: ./.github/actions/notify-pull-request uses: ./.github/actions/notify-pull-request
with: with:
remove-previous-comment: true remove-previous-comment: true
add-new-comment: ${{ steps.docs-generation.outcome == 'failure' && contains(steps.docs-generation.outputs.output, 'Failed to resolve link') }} add-new-comment: ${{ steps.docs-generation.outcome == 'failure' && contains(steps.docs-generation.outputs.output, 'Failed to resolve link') }}
message: "📝 A typedoc `{@link <TYPE_NAME>}` annotation is found that can't be resolved.<br><br>Most likely it happens when the referenced type is not exported. Please check the CI logs to find the name of such type.<br><br>- If a referenced in `{@link}` type should be publicly available in the SDK, add a description to it or a TypeDoc annotation and export it from SDK.<br>- If a type is internal and should _not_ be publicly exposed, change types to prevent unexported type reference in `{@link}` annotation.<br><br>You can run `yarn embedding-sdk:docs:generate` locally to verify that the issue has been resolved." message: "📝 A typedoc `{@link <TYPE_NAME>}` annotation is found that can't be resolved.<br><br>Most likely it happens when the referenced type is not exported. Please check the CI logs to find the name of such type.<br><br>- If a referenced in `{@link}` type should be publicly available in the SDK, add a description to it or a TypeDoc annotation and export it from SDK.<br>- If a type is internal and should _not_ be publicly exposed, change types to prevent unexported type reference in `{@link}` annotation.<br><br>You can run `bun run embedding-sdk:docs:generate` locally to verify that the issue has been resolved."
include-log: true include-log: true
- name: Fail Job - name: Fail Job
if: ${{ steps.docs-generation.outcome == 'failure' }} if: ${{ steps.docs-generation.outcome == 'failure' }}

View File

@@ -44,11 +44,11 @@ jobs:
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Build cljs - name: Build cljs
run: yarn build:cljs run: bun run build:cljs
- name: Stress-test ${{ github.event.inputs.spec }} ${{ github.event.inputs.burn_in }} times - name: Stress-test ${{ github.event.inputs.spec }} ${{ github.event.inputs.burn_in }} times
run: | run: |
for i in {1..${{ github.event.inputs.burn_in }}}; do for i in {1..${{ github.event.inputs.burn_in }}}; do
yarn jest --runInBand --ci --silent --no-cache \ bun run jest --runInBand --ci --silent --no-cache \
--testPathPattern '${{ github.event.inputs.spec }}' \ --testPathPattern '${{ github.event.inputs.spec }}' \
--testNamePattern '${{ github.event.inputs.grep }}' --testNamePattern '${{ github.event.inputs.grep }}'
if [[ "$?" != 0 ]]; then if [[ "$?" != 0 ]]; then

View File

@@ -46,15 +46,15 @@ jobs:
key: ${{ steps.get-cache-keys.outputs.eslint-cache-key }} key: ${{ steps.get-cache-keys.outputs.eslint-cache-key }}
- name: Compile CLJS - name: Compile CLJS
run: yarn build-pure:cljs run: bun run build-pure:cljs
- name: Find CSS variables that are used but never defined - name: Find CSS variables that are used but never defined
run: yarn find-never-defined-css-variables run: bun run find-never-defined-css-variables
- name: Run Prettier formatting linter - name: Run Prettier formatting linter
run: yarn run lint-prettier-pure run: bun run lint-prettier-pure
- name: Run ESLint linter - name: Run ESLint linter
run: yarn run lint-eslint-pure run: bun run lint-eslint-pure
- name: Run CSS linter - name: Run CSS linter
run: yarn run lint-css run: bun run lint-css
fe-type-check: fe-type-check:
if: ${{ !inputs.skip }} if: ${{ !inputs.skip }}
@@ -66,9 +66,9 @@ jobs:
uses: ./.github/actions/prepare-frontend uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- run: yarn build-pure:cljs - run: bun run build-pure:cljs
name: Compile CLJS name: Compile CLJS
- run: yarn type-check-pure - run: bun run type-check-pure
name: Check types name: Check types
fe-tests-unit: fe-tests-unit:
@@ -90,7 +90,7 @@ jobs:
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests - name: Run frontend unit tests
run: yarn run test-unit --silent --shard=${{ matrix.shard }}/${{ env.SHARDS }} run: bun run test-unit --silent --shard=${{ matrix.shard }}/${{ env.SHARDS }}
# Trunk Quarantine controls the final state of the run in the CI! # Trunk Quarantine controls the final state of the run in the CI!
# Even if this step fails we let it pass, and then `trunk-io/analytics-uploader` determines # Even if this step fails we let it pass, and then `trunk-io/analytics-uploader` determines
# whether to fail or to pass the whole job, based on the quarantine list. # whether to fail or to pass the whole job, based on the quarantine list.
@@ -118,7 +118,7 @@ jobs:
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Run frontend timezones tests - name: Run frontend timezones tests
run: yarn run test-timezones run: bun run test-timezones
fe-tests-result: fe-tests-result:
needs: needs:

View File

@@ -135,10 +135,10 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Compile CLJS - name: Compile CLJS
run: NODE_ENV=development yarn build-pure:cljs run: NODE_ENV=development bun run build-pure:cljs
- name: Build Storybook - name: Build Storybook
run: yarn build-storybook run: bun run build-storybook
env: env:
STORYBOOK_STORIES_FILTER: ${{ needs.detect-changed-stories.outputs.story_files }} STORYBOOK_STORIES_FILTER: ${{ needs.detect-changed-stories.outputs.story_files }}
@@ -157,7 +157,7 @@ jobs:
echo "Run $i of $BURN_IN" echo "Run $i of $BURN_IN"
echo "==========================================" echo "=========================================="
if yarn test-visual:loki \ if bun run test-visual:loki \
--reactUri file:./storybook-static \ --reactUri file:./storybook-static \
--verboseRenderer; then --verboseRenderer; then
echo "✅ Run $i passed" echo "✅ Run $i passed"
@@ -182,7 +182,7 @@ jobs:
- name: Generate Visual Report on Failure - name: Generate Visual Report on Failure
if: failure() if: failure()
run: yarn test-visual:loki-report run: bun run test-visual:loki-report
- name: Upload Artifact - name: Upload Artifact
if: failure() if: failure()

View File

@@ -22,10 +22,10 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Compile CLJS - name: Compile CLJS
run: yarn build-pure:cljs run: bun run build-pure:cljs
- name: Update Loki Snapshots - name: Update Loki Snapshots
run: yarn test-visual:loki:ci || yarn test-visual:loki-approve-diff && yarn test-visual:loki-prune run: bun run test-visual:loki:ci || bun run test-visual:loki-approve-diff && bun run test-visual:loki-prune
- name: Check for changes - name: Check for changes
id: check-changes id: check-changes

View File

@@ -49,14 +49,14 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Compile CLJS - name: Compile CLJS
run: NODE_ENV=development yarn build-pure:cljs run: NODE_ENV=development bun run build-pure:cljs
- name: Run Loki Visual Tests - name: Run Loki Visual Tests
run: yarn test-visual:loki:ci run: bun run test-visual:loki:ci
- name: Generate Visual Report on Failure - name: Generate Visual Report on Failure
if: failure() if: failure()
run: yarn test-visual:loki-report run: bun run test-visual:loki-report
- name: Upload Artifact - name: Upload Artifact
id: artifact-upload-step id: artifact-upload-step

View File

@@ -137,7 +137,7 @@ jobs:
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests - name: Run frontend unit tests
run: yarn run test-unit --silent run: bun run test-unit --silent
continue-on-error: true continue-on-error: true
- name: Upload Test Results - name: Upload Test Results
uses: ./.github/actions/upload-test-results uses: ./.github/actions/upload-test-results

View File

@@ -33,9 +33,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
# note: this block can be removed after we stop needing to be able to test versions before v55 # note: this block can be removed after we stop needing to be able to test versions before v55
- name: Get test mode config - name: Get test mode config
id: config id: config
@@ -255,9 +257,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Send tests complete message - name: Send tests complete message
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:

View File

@@ -44,10 +44,12 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
release
.github
- name: Prepare build scripts - name: Prepare release scripts
run: cd ${{ github.workspace }}/release && yarn && yarn build uses: ./.github/actions/prepare-release-scripts
- name: Cache build scripts - name: Cache build scripts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
@@ -178,8 +180,8 @@ jobs:
with: with:
ref: ${{ inputs.branch }} ref: ${{ inputs.branch }}
- name: Prepare build scripts - name: Prepare release scripts
run: yarn --cwd release --frozen-lockfile && yarn --cwd release build uses: ./.github/actions/prepare-release-scripts
- name: Get current SDK version - name: Get current SDK version
id: current-sdk-version id: current-sdk-version
@@ -256,7 +258,7 @@ jobs:
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- name: Run unit tests - name: Run unit tests
run: yarn embedding-sdk:test-unit run: bun run embedding-sdk:test-unit
build-sdk: build-sdk:
needs: [test, determine-sdk-version] needs: [test, determine-sdk-version]
@@ -282,10 +284,10 @@ jobs:
./bin/embedding-sdk/release_utils.bash update_package_json_template ${{ needs.determine-sdk-version.outputs.sdk_version }} ./bin/embedding-sdk/release_utils.bash update_package_json_template ${{ needs.determine-sdk-version.outputs.sdk_version }}
- name: Build SDK package - name: Build SDK package
run: yarn run build-embedding-sdk-package run: bun run build-embedding-sdk-package
- name: Generate SDK package.json in the build directory - name: Generate SDK package.json in the build directory
run: yarn run embedding-sdk:generate-package run: bun run embedding-sdk:generate-package
- name: Upload built SDK package as artifact - name: Upload built SDK package as artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

View File

@@ -38,10 +38,14 @@ jobs:
with: with:
ref: master # this only works on master ref: master # this only works on master
fetch-depth: 0 # we want all branches and tags fetch-depth: 0 # we want all branches and tags
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install Dependencies - name: Install Dependencies
run: yarn --cwd release --frozen-lockfile && npm i -g tsx run: bun install --cwd release --frozen-lockfile && npm i -g tsx
- name: Build release scripts - name: Build release scripts
run: yarn --cwd release build run: bun run --cwd release build
- name: Get version number - name: Get version number
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:

View File

@@ -21,8 +21,12 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: release
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Prepare build scripts - name: Prepare build scripts
run: yarn --cwd release --frozen-lockfile && yarn --cwd release build run: bun install --cwd release --frozen-lockfile && bun run --cwd release build
- uses: actions/github-script@v7 - uses: actions/github-script@v7
env: env:
GITHUB_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }} GITHUB_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}

View File

@@ -23,9 +23,11 @@ jobs:
exit 1 exit 1
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Version - name: Get Release Version
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:

View File

@@ -26,8 +26,12 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: release
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Prepare build scripts - name: Prepare build scripts
run: yarn --cwd release --frozen-lockfile && yarn --cwd release build run: bun install --cwd release --frozen-lockfile && bun run --cwd release build
- name: Trigger auto-patch - name: Trigger auto-patch
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:

View File

@@ -14,9 +14,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn --frozen-lockfile && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Check release status and post to Slack - name: Check release status and post to Slack
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
@@ -47,9 +49,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn --frozen-lockfile && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Check backport status and post to Slack - name: Check backport status and post to Slack
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:

View File

@@ -79,9 +79,11 @@ jobs:
exit 1 exit 1
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Version - name: Get Release Version
uses: actions/github-script@v7 uses: actions/github-script@v7
id: canonical_version id: canonical_version
@@ -304,9 +306,11 @@ jobs:
aws-region: ${{ vars.AWS_REGION }} aws-region: ${{ vars.AWS_REGION }}
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Generate new version info - name: Generate new version info
uses: actions/github-script@v7 uses: actions/github-script@v7
id: new_version_info id: new_version_info

View File

@@ -36,10 +36,14 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: "release" sparse-checkout: "release"
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: prepare dependencies in release directory - name: prepare dependencies in release directory
run: yarn --cwd release --frozen-lockfile run: bun install --cwd release --frozen-lockfile
- name: Run frontend type-check - name: Run frontend type-check
run: yarn --cwd release type-check run: bun run --cwd release type-check
release-tests-unit: release-tests-unit:
needs: files-changed needs: files-changed
@@ -50,10 +54,14 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: "release" sparse-checkout: "release"
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: prepare dependencies in release directory - name: prepare dependencies in release directory
run: yarn --cwd release --frozen-lockfile run: bun install --cwd release --frozen-lockfile
- name: Run release unit tests - name: Run release unit tests
run: yarn --cwd release test:unit run: bun run --cwd release test:unit
release-test-build: release-test-build:
needs: files-changed needs: files-changed
@@ -64,9 +72,13 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: "release" sparse-checkout: "release"
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: prepare dependencies in release directory - name: prepare dependencies in release directory
run: yarn --cwd release --frozen-lockfile run: bun install --cwd release --frozen-lockfile
- name: Build release bundle - name: Build release bundle
run: yarn --cwd release build run: bun run --cwd release build
- name: Smoke test release bundle - name: Smoke test release bundle
run: node release/dist/index.cjs run: node release/dist/index.cjs

View File

@@ -63,9 +63,11 @@ jobs:
exit 1 exit 1
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Version - name: Get Release Version
uses: actions/github-script@v7 uses: actions/github-script@v7
id: canonical_version id: canonical_version
@@ -108,9 +110,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Send publish start message - name: Send publish start message
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
@@ -189,9 +193,11 @@ jobs:
aws-region: ${{ vars.AWS_REGION }} aws-region: ${{ vars.AWS_REGION }}
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: prepare release scripts release
run: cd release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- uses: actions/download-artifact@v4 - uses: actions/download-artifact@v4
name: Retrieve uberjar artifact name: Retrieve uberjar artifact
with: with:
@@ -286,9 +292,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: prepare release scripts release
run: cd release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Tag Release - name: Tag Release
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
@@ -318,9 +326,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: prepare release scripts release
run: cd release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get extra tags - name: Get extra tags
id: taglist id: taglist
uses: actions/github-script@v7 uses: actions/github-script@v7
@@ -366,9 +376,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Find milestone - name: Find milestone
id: find-milestone id: find-milestone
uses: actions/github-script@v7 uses: actions/github-script@v7
@@ -444,9 +456,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: prepare release scripts release
run: cd release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Publish draft release notes to github - name: Publish draft release notes to github
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
@@ -523,9 +537,11 @@ jobs:
aws-region: ${{ vars.AWS_REGION }} aws-region: ${{ vars.AWS_REGION }}
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Publish version info - name: Publish version info
uses: actions/github-script@v7 uses: actions/github-script@v7
id: new_version_info id: new_version_info
@@ -580,9 +596,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Send publish complete message - name: Send publish complete message
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
@@ -611,9 +629,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Update milestones - name: Update milestones
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:

View File

@@ -41,16 +41,23 @@ jobs:
strategy: strategy:
matrix: matrix:
project: project:
- name: Main Frontend (yarn) - name: Main Frontend (bun w/ yarn.lock)
file: yarn.lock file: yarn.lock
package-manager: yarn package-manager: yarn
category: main-frontend-yarn category: main-frontend-bun
- name: Release Helper - name: Release Helper
file: release/yarn.lock file: release/yarn.lock
package-manager: yarn package-manager: yarn
category: release-helper category: release-helper
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses:
oven-sh/setup-bun@v2
# snyk doesn't support bun yet so we generate yarn.lock and scan that
- name: Generate yarn.lock for Snyk compatibility
run: |
bun install --yarn
cd release && bun install --yarn
- uses: snyk/actions/setup@0.4.0 - uses: snyk/actions/setup@0.4.0
- name: Run snyk test - name: Run snyk test
env: env:

View File

@@ -23,9 +23,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Send build start message - name: Send build start message
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
@@ -62,9 +64,11 @@ jobs:
exit 1 exit 1
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Version - name: Get Release Version
uses: actions/github-script@v7 uses: actions/github-script@v7
id: canonical_version id: canonical_version
@@ -104,9 +108,11 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 # IMPORTANT! to get all the branches fetch-depth: 0 # IMPORTANT! to get all the branches
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get Release Branch - name: Get Release Branch
uses: actions/github-script@v7 uses: actions/github-script@v7
id: release_branch id: release_branch
@@ -124,6 +130,7 @@ jobs:
git branch --contains ${{ inputs.commit }} | grep -q $RELEASE_BRANCH \ git branch --contains ${{ inputs.commit }} | grep -q $RELEASE_BRANCH \
&& echo "Commit found in correct release branch" \ && echo "Commit found in correct release branch" \
|| (echo "Commit not found in correct release branch" && exit 1) || (echo "Commit not found in correct release branch" && exit 1)
git checkout -
tag-uberjar-for-release: tag-uberjar-for-release:
needs: [check-version, check-commit] needs: [check-version, check-commit]

View File

@@ -46,7 +46,7 @@ jobs:
uses: ./.github/actions/prepare-frontend uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment - name: Prepare back-end environment
uses: ./.github/actions/prepare-backend uses: ./.github/actions/prepare-backend
- run: yarn build-pure:cljs - run: bun run build-pure:cljs
name: Compile CLJS name: Compile CLJS
- name: Run lint-staged - name: Run lint-staged
@@ -67,4 +67,4 @@ jobs:
- name: Check types - name: Check types
if: steps.changes.outputs.frontend_all == 'true' if: steps.changes.outputs.frontend_all == 'true'
run: yarn type-check-pure run: bun run type-check-pure

View File

@@ -91,9 +91,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
sparse-checkout: release sparse-checkout: |
- name: Prepare build scripts release
run: cd ${{ github.workspace }}/release && yarn && yarn build .github
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Get build dependencies - name: Get build dependencies
uses: actions/github-script@v7 uses: actions/github-script@v7
id: dependencies id: dependencies
@@ -175,6 +177,12 @@ jobs:
with: with:
commit: ${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }} commit: ${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}
edition: ${{ matrix.edition }} edition: ${{ matrix.edition }}
- name: Verify license files are present in uberjar
run: |
echo "Checking for license files in uberjar..."
unzip -l ./metabase.jar | grep -q "license-backend-third-party.txt" || (echo "ERROR: license-backend-third-party.txt not found in uberjar" && exit 1)
unzip -l ./metabase.jar | grep -q "license-frontend-third-party.txt" || (echo "ERROR: license-frontend-third-party.txt not found in uberjar" && exit 1)
echo "Both license files found in uberjar"
- name: Launch uberjar - name: Launch uberjar
run: >- run: >-
java --add-opens java.base/java.nio=ALL-UNNAMED -jar ./metabase.jar & java --add-opens java.base/java.nio=ALL-UNNAMED -jar ./metabase.jar &

View File

@@ -31,4 +31,4 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Prepare front-end environment - name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend uses: ./.github/actions/prepare-frontend
- run: yarn run lint-yaml - run: bun run lint-yaml

4
.gitignore vendored
View File

@@ -39,7 +39,7 @@
/cypress /cypress
cypress.env.json cypress.env.json
/deploy/artifacts/* /deploy/artifacts/*
/docs/**/node_modules **/node_modules/
/docs/**/package.json /docs/**/package.json
/docs/**/yarn.lock /docs/**/yarn.lock
/docs/embedding/sdk/api/ /docs/embedding/sdk/api/
@@ -55,7 +55,6 @@ cypress.env.json
/logs /logs
/modules/drivers/*/resources/namespaces.edn /modules/drivers/*/resources/namespaces.edn
/modules/drivers/*/target /modules/drivers/*/target
/node_modules/
/plugins /plugins
/process.yml /process.yml
/reset-password-artifacts /reset-password-artifacts
@@ -86,7 +85,6 @@ cypress.env.json
/temp /temp
**/cli-snippets-tmp/** **/cli-snippets-tmp/**
\#*\# \#*\#
bin/node_modules/
bin/release/aws-eb/metabase-aws-eb.zip bin/release/aws-eb/metabase-aws-eb.zip
coverage-summary.json coverage-summary.json
junit.xml junit.xml

View File

@@ -1,4 +1,4 @@
yarn precommit bun run precommit
# Run the formatter # Run the formatter
# Note that this is stubbed in for now until we can gobally resolve some formatting issues such as what is described # Note that this is stubbed in for now until we can gobally resolve some formatting issues such as what is described

View File

@@ -48,6 +48,10 @@ const config: StorybookConfig = {
...appConfig.resolve.alias, ...appConfig.resolve.alias,
}, },
extensions: appConfig.resolve.extensions, extensions: appConfig.resolve.extensions,
fallback: {
...config.resolve?.fallback,
...appConfig.resolve.fallback,
},
}, },
plugins: [ plugins: [
...(config.plugins ?? []), ...(config.plugins ?? []),

6
.vscode/tasks.json vendored
View File

@@ -6,7 +6,7 @@
{ {
"label": "Run front-end and back-end", "label": "Run front-end and back-end",
"type": "shell", "type": "shell",
"command": "yarn dev", "command": "bun run dev",
"presentation": { "presentation": {
"reveal": "always" "reveal": "always"
}, },
@@ -19,7 +19,7 @@
{ {
"label": "Format front-end code", "label": "Format front-end code",
"type": "shell", "type": "shell",
"command": "yarn prettier", "command": "bun run prettier",
"presentation": { "presentation": {
"reveal": "always", "reveal": "always",
"panel": "dedicated", "panel": "dedicated",
@@ -29,7 +29,7 @@
{ {
"label": "Run front-end linters", "label": "Run front-end linters",
"type": "shell", "type": "shell",
"command": "yarn lint", "command": "bun run lint",
"presentation": { "presentation": {
"reveal": "always", "reveal": "always",
"panel": "dedicated", "panel": "dedicated",

View File

@@ -1 +0,0 @@
network-timeout 600000

View File

@@ -23,8 +23,11 @@ COPY . .
# version is pulled from git, but git doesn't trust the directory due to different owners # version is pulled from git, but git doesn't trust the directory due to different owners
RUN git config --global --add safe.directory /home/node RUN git config --global --add safe.directory /home/node
# install bun for frontend dependencies
RUN npm install -g bun
# install frontend dependencies # install frontend dependencies
RUN yarn --frozen-lockfile RUN bun install --frozen-lockfile
RUN INTERACTIVE=false CI=true MB_EDITION=$MB_EDITION bin/build.sh :version ${VERSION} RUN INTERACTIVE=false CI=true MB_EDITION=$MB_EDITION bin/build.sh :version ${VERSION}

View File

@@ -47,19 +47,19 @@ In order to spin up a development environment, you need to start the front end a
The following command will install the JavaScript dependencies: The following command will install the JavaScript dependencies:
```bash ```bash
yarn install bun install
``` ```
To build and run without watching changes: To build and run without watching changes:
```bash ```bash
yarn build bun run build
``` ```
To build and run with hot-reload: To build and run with hot-reload:
```bash ```bash
yarn build-hot bun run build-hot
``` ```
### Backend quick setup ### Backend quick setup

View File

@@ -28,22 +28,22 @@
:oss "oss")] :oss "oss")]
(u/step (format "Build frontend with MB_EDITION=%s" mb-edition) (u/step (format "Build frontend with MB_EDITION=%s" mb-edition)
(when-not (env/env :ci) (when-not (env/env :ci)
(u/step "Run 'yarn' to download JavaScript dependencies" (u/step "Run 'bun install' to download JavaScript dependencies"
(u/sh {:dir u/project-root-directory} "yarn"))) (u/sh {:dir u/project-root-directory} "bun" "install")))
(u/step "Build frontend" (u/step "Build frontend"
(u/sh {:dir u/project-root-directory (u/sh {:dir u/project-root-directory
:env {"PATH" (env/env :path) :env {"PATH" (env/env :path)
"HOME" (env/env :user-home) "HOME" (env/env :user-home)
"WEBPACK_BUNDLE" "production" "WEBPACK_BUNDLE" "production"
"MB_EDITION" mb-edition}} "MB_EDITION" mb-edition}}
"yarn" "build-release")) "bun" "run" "build-release"))
(u/step "Build static viz" (u/step "Build static viz"
(u/sh {:dir u/project-root-directory (u/sh {:dir u/project-root-directory
:env {"PATH" (env/env :path) :env {"PATH" (env/env :path)
"HOME" (env/env :user-home) "HOME" (env/env :user-home)
"WEBPACK_BUNDLE" "production" "WEBPACK_BUNDLE" "production"
"MB_EDITION" mb-edition}} "MB_EDITION" mb-edition}}
"yarn" "build-release:static-viz")) "bun" "run" "build-release:static-viz"))
(u/announce "Frontend built successfully.")))) (u/announce "Frontend built successfully."))))
(defn- build-licenses! (defn- build-licenses!
@@ -65,14 +65,9 @@
without-license)) without-license))
(u/announce "License information generated at %s" output-filename))) (u/announce "License information generated at %s" output-filename)))
(u/step "Run `yarn licenses generate-disclaimer`" (u/step "Run `bun run generate-license-disclaimer`"
(let [license-text (str/join \newline (u/sh {:dir u/project-root-directory}
(u/sh {:dir u/project-root-directory "bun" "run" "generate-license-disclaimer"))))
:quiet? true}
"yarn" "licenses" "generate-disclaimer"))]
(spit (u/filename u/project-root-directory
"resources"
"license-frontend-third-party.txt") license-text)))))
(defn- build-uberjar! [edition] (defn- build-uberjar! [edition]
{:pre [(#{:oss :ee} edition)]} {:pre [(#{:oss :ee} edition)]}

View File

@@ -8,4 +8,4 @@ fi
set -o xtrace set -o xtrace
claude --print "$(printf "%q " "$@")" --allowedTools "Bash(./bin/mage:*)" "Bash(clj-kondo:*)" "Bash(clojure:*)", "Bash(grep:*)" "Bash(ls:*)" "Bash(yarn lint:*)" "Bash(yarn test-unit:*)" "WebFetchTool(domain:github.com)" Edit claude --print "$(printf "%q " "$@")" --allowedTools "Bash(./bin/mage:*)" "Bash(clj-kondo:*)" "Bash(clojure:*)", "Bash(grep:*)" "Bash(ls:*)" "Bash(bun run lint:*)" "Bash(bun run test-unit:*)" "WebFetchTool(domain:github.com)" Edit

View File

@@ -35,8 +35,8 @@ check_required_tools() {
missing+=("node") missing+=("node")
fi fi
if ! has_tool yarn; then if ! has_tool bun; then
missing+=("yarn") missing+=("bun")
fi fi
if ! has_tool java; then if ! has_tool java; then
@@ -60,7 +60,7 @@ check_required_tools() {
install_frontend_deps() { install_frontend_deps() {
print_step "Installing frontend dependencies" print_step "Installing frontend dependencies"
if yarn install --frozen-lockfile --prefer-offline; then if bun install --frozen-lockfile; then
print_success "Frontend dependencies installed" print_success "Frontend dependencies installed"
else else
print_error "Failed to install frontend dependencies" print_error "Failed to install frontend dependencies"

View File

@@ -433,7 +433,7 @@ main() {
echo " 3. Configure shell integration (with your permission)" echo " 3. Configure shell integration (with your permission)"
echo -e "${DIM} - Puts everything you need on your path when you cd into the project${NC}" echo -e "${DIM} - Puts everything you need on your path when you cd into the project${NC}"
echo " 4. Install all required development tools" echo " 4. Install all required development tools"
echo -e "${DIM} - Installs Node.js, Yarn, Clojure, etc.${NC}" echo -e "${DIM} - Installs Node.js, Bun, Clojure, etc.${NC}"
echo " 5. Run dev-deps to download project dependencies" echo " 5. Run dev-deps to download project dependencies"
echo -e "${DIM} - Downloads and caches JavaScript and Clojure libraries${NC}" echo -e "${DIM} - Downloads and caches JavaScript and Clojure libraries${NC}"
echo -e "${DIM} and optionally builds a jar${NC}" echo -e "${DIM} and optionally builds a jar${NC}"
@@ -560,7 +560,7 @@ main() {
echo " java --add-opens java.base/java.nio=ALL-UNNAMED -jar target/uberjar/metabase.jar" echo " java --add-opens java.base/java.nio=ALL-UNNAMED -jar target/uberjar/metabase.jar"
echo "" echo ""
echo "Frontend in another terminal:" echo "Frontend in another terminal:"
echo " yarn build-hot" echo " bun run build-hot"
echo "" echo ""
} }

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
function restore_package_files() { function restore_package_files() {
git checkout -- yarn.lock package.json git checkout -- bun.lock package.json
} }
function install_packages() { function install_packages() {
@@ -16,7 +16,7 @@ function install_packages() {
# Install React and Cypress React test harness # Install React and Cypress React test harness
echo "Installing $dependencies" echo "Installing $dependencies"
yarn add $dependencies bun add $dependencies
} }
function print_usage() { function print_usage() {

View File

@@ -0,0 +1,321 @@
{
"lockfileVersion": 1,
"configVersion": 1,
"workspaces": {
"": {
"name": "embedding-snippets",
"devDependencies": {
"@types/cors": "^2.8.17",
"@types/express-session": "^1.18.1",
"cors": "^2.8.5",
"express": "^5.0.1",
"express-session": "^1.18.1",
"jsonwebtoken": "^9.0.3",
"next": "^15.5.9",
},
},
},
"packages": {
"@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
"@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
"@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
"@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
"@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
"@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
"@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
"@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
"@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
"@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
"@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
"@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
"@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
"@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
"@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
"@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
"@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
"@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
"@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
"@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
"@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
"@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
"@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
"@next/env": ["@next/env@15.5.9", "", {}, "sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg=="],
"@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.5.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw=="],
"@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.5.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg=="],
"@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.5.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA=="],
"@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.5.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw=="],
"@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.5.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw=="],
"@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.5.7", "", { "os": "linux", "cpu": "x64" }, "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA=="],
"@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.5.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ=="],
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.5.7", "", { "os": "win32", "cpu": "x64" }, "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw=="],
"@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
"@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="],
"@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
"@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="],
"@types/express": ["@types/express@5.0.6", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "^2" } }, "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA=="],
"@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.1", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A=="],
"@types/express-session": ["@types/express-session@1.18.2", "", { "dependencies": { "@types/express": "*" } }, "sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg=="],
"@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],
"@types/node": ["@types/node@25.0.8", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg=="],
"@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="],
"@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="],
"@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="],
"@types/serve-static": ["@types/serve-static@2.2.0", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*" } }, "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ=="],
"accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
"body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
"buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
"bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
"caniuse-lite": ["caniuse-lite@1.0.30001764", "", {}, "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g=="],
"client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
"content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
"content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
"cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
"cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
"cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
"ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
"etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
"express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
"express-session": ["express-session@1.18.2", "", { "dependencies": { "cookie": "0.7.2", "cookie-signature": "1.0.7", "debug": "2.6.9", "depd": "~2.0.0", "on-headers": "~1.1.0", "parseurl": "~1.3.3", "safe-buffer": "5.2.1", "uid-safe": "~2.1.5" } }, "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A=="],
"finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
"fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
"http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
"ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
"is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
"jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="],
"jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
"jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
"lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="],
"lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="],
"lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="],
"lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="],
"lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="],
"lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="],
"lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="],
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
"merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
"mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
"mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
"next": ["next@15.5.9", "", { "dependencies": { "@next/env": "15.5.9", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.7", "@next/swc-darwin-x64": "15.5.7", "@next/swc-linux-arm64-gnu": "15.5.7", "@next/swc-linux-arm64-musl": "15.5.7", "@next/swc-linux-x64-gnu": "15.5.7", "@next/swc-linux-x64-musl": "15.5.7", "@next/swc-win32-arm64-msvc": "15.5.7", "@next/swc-win32-x64-msvc": "15.5.7", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg=="],
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
"object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
"on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
"on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="],
"once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
"parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
"path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
"qs": ["qs@6.14.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ=="],
"random-bytes": ["random-bytes@1.0.0", "", {}, "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ=="],
"range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
"raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
"react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="],
"react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="],
"router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
"semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
"send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
"serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
"setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
"sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
"side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
"side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
"side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
"styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
"uid-safe": ["uid-safe@2.1.5", "", { "dependencies": { "random-bytes": "~1.0.0" } }, "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA=="],
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
"vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
"express-session/cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="],
"express-session/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"express-session/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@ function prepare_files() {
} }
function install_dependencies() { function install_dependencies() {
yarn --cwd ./enterprise/frontend/src/embedding-sdk-package/cli-snippets-tmp/express-server install --frozen-lockfile bun install --cwd ./enterprise/frontend/src/embedding-sdk-package/cli-snippets-tmp/express-server --frozen-lockfile
} }
function type_check() { function type_check() {

View File

@@ -2,11 +2,11 @@
function prepare_files() { function prepare_files() {
cp ./bin/embedding-sdk/templates/package.json docs/embedding/ cp ./bin/embedding-sdk/templates/package.json docs/embedding/
cp ./bin/embedding-sdk/templates/yarn.lock docs/embedding/ cp ./bin/embedding-sdk/templates/bun.lock docs/embedding/
} }
function install_dependencies() { function install_dependencies() {
yarn --cwd ./docs/embedding install --frozen-lockfile bun install --cwd ./docs/embedding --frozen-lockfile
} }
function type_check() { function type_check() {
@@ -15,7 +15,7 @@ function type_check() {
function cleanup_files() { function cleanup_files() {
rm -f ./docs/embedding/package.json rm -f ./docs/embedding/package.json
rm -f ./docs/embedding/yarn.lock rm -f ./docs/embedding/bun.lock
} }
cleanup_files cleanup_files

View File

@@ -0,0 +1,226 @@
#!/usr/bin/env node
// Usage: node bin/generate-license-disclaimer.js [output-path]
// If output-path is not provided, writes to resources/license-frontend-third-party.txt
const fs = require("fs");
const path = require("path");
const OUTPUT_FILE = path.join(
__dirname,
"..",
"resources",
"license-frontend-third-party.txt",
);
const BUN_MODULES_DIR = path.join(__dirname, "..", "node_modules", ".bun");
const LICENSE_FILE_NAMES = [
"LICENSE",
"LICENSE.md",
"LICENSE.txt",
"license",
"license.md",
"license.txt",
"LICENCE",
"LICENCE.md",
"LICENCE.txt",
"COPYING",
"COPYING.md",
"COPYING.txt",
];
function normalizeRepoUrl(url) {
if (!url) {
return undefined;
}
return url
.replace(/^git\+/, "")
.replace(/\.git$/, "")
.replace(/^git:\/\//, "https://");
}
/**
* Parse a bun package folder name like "@scope+pkg@1.0.0" or "lodash@4.17.21"
* Returns { name, version } or undefined if invalid.
*/
function parseBunFolderName(folderName) {
const lastAtIndex = folderName.lastIndexOf("@");
if (lastAtIndex <= 0) {
return undefined;
}
const name = folderName.slice(0, lastAtIndex).replace(/\+/g, "/");
const version = folderName.slice(lastAtIndex + 1);
return { name, version };
}
/**
* Scan node_modules/.bun/ and return array of packages with their paths.
*/
function scanBunPackages(bunModulesDir) {
if (!fs.existsSync(bunModulesDir)) {
throw new Error(`Bun modules directory not found: ${bunModulesDir}`);
}
const folders = fs.readdirSync(bunModulesDir);
const packages = [];
for (const folder of folders) {
const parsed = parseBunFolderName(folder);
if (!parsed) {
continue;
}
const packagePath = path.join(
bunModulesDir,
folder,
"node_modules",
parsed.name,
);
if (!fs.existsSync(packagePath)) {
continue;
}
packages.push({
name: parsed.name,
version: parsed.version,
path: packagePath,
});
}
return packages;
}
function findLicenseFile(packagePath) {
for (const name of LICENSE_FILE_NAMES) {
const licensePath = path.join(packagePath, name);
if (fs.existsSync(licensePath)) {
return fs.readFileSync(licensePath, "utf-8").trim();
}
}
return undefined;
}
function getPackageInfo(packagePath) {
const pkgJsonPath = path.join(packagePath, "package.json");
if (!fs.existsSync(pkgJsonPath)) {
return undefined;
}
try {
return JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
} catch {
return undefined;
}
}
/**
* Generate disclaimer text from package list.
*
* @param {Array} packages - Array of {name, version, path}
* @param {function} getPackageDetails - Callback (pkg) => {licenseText, repoUrl, homepage}
* @returns {string} The disclaimer text
*/
function generateDisclaimerText(packages, getPackageDetails) {
const enriched = packages.map((pkg) => {
const details = getPackageDetails(pkg);
return {
...pkg,
licenseText:
details.licenseText ||
`License: See ${details.homepage || pkg.name} package`,
repoUrl: details.repoUrl,
};
});
const groups = new Map();
for (const pkg of enriched) {
const normalizedRepo = normalizeRepoUrl(pkg.repoUrl);
const key = `${normalizedRepo || pkg.name}|||${pkg.licenseText}`;
if (!groups.has(key)) {
groups.set(key, {
packages: [],
licenseText: pkg.licenseText,
repoUrl: pkg.repoUrl,
});
}
groups.get(key).packages.push(pkg);
}
const sortedGroups = Array.from(groups.values()).sort((a, b) => {
const aName = a.packages[0].name.toLowerCase();
const bName = b.packages[0].name.toLowerCase();
return aName.localeCompare(bName);
});
const lines = [
"THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN PORTIONS OF THE METABASE PRODUCT.",
"",
];
for (const group of sortedGroups) {
group.packages.sort((a, b) => a.name.localeCompare(b.name));
const uniqueNames = [...new Set(group.packages.map((p) => p.name))];
const packageList = uniqueNames.join(", ");
let sourceInfo = "";
if (group.repoUrl) {
if (uniqueNames.length > 1) {
const urlParts = uniqueNames.map(
(name) => `${group.repoUrl} (${name})`,
);
sourceInfo = `A copy of the source code may be downloaded from ${urlParts.join(", ")}.`;
} else {
sourceInfo = `A copy of the source code may be downloaded from ${group.repoUrl}.`;
}
}
lines.push("-----");
lines.push("");
lines.push(
`The following software may be included in this product: ${packageList}.${sourceInfo ? " " + sourceInfo : ""} This software contains the following license and notice below:`,
);
lines.push("");
lines.push(group.licenseText);
lines.push("");
}
return lines.join("\n");
}
if (require.main === module) {
// Allow overriding output path via command line argument (useful for tests)
const outputPath = process.argv[2] || OUTPUT_FILE;
console.log("Scanning bun packages...");
const packages = scanBunPackages(BUN_MODULES_DIR);
console.log(`Found ${packages.length} packages`);
const output = generateDisclaimerText(packages, (pkg) => {
const pkgJson = getPackageInfo(pkg.path) || {};
const licenseFile = findLicenseFile(pkg.path);
// Fall back to license field from package.json if no LICENSE file found
const licenseText = licenseFile || pkgJson.license || undefined;
const repo = pkgJson.repository;
const repoUrl =
(typeof repo === "string" ? repo : repo?.url) ||
pkgJson.homepage ||
undefined;
return {
licenseText,
repoUrl: repoUrl,
homepage: pkgJson.homepage,
};
});
fs.writeFileSync(outputPath, output);
console.log(`Generated ${outputPath}`);
}
module.exports = {
generateDisclaimerText,
parseBunFolderName,
scanBunPackages,
};

View File

@@ -0,0 +1,292 @@
const {
generateDisclaimerText,
parseBunFolderName,
scanBunPackages,
} = require("./generate-license-disclaimer");
const fs = require("fs");
const path = require("path");
const os = require("os");
describe("parseBunFolderName", () => {
it("parses simple package names", () => {
expect(parseBunFolderName("lodash@4.17.21")).toEqual({
name: "lodash",
version: "4.17.21",
});
});
it("parses scoped package names", () => {
expect(parseBunFolderName("@babel+core@7.28.4")).toEqual({
name: "@babel/core",
version: "7.28.4",
});
});
it("parses deeply scoped package names", () => {
expect(parseBunFolderName("@emotion+react@11.11.0")).toEqual({
name: "@emotion/react",
version: "11.11.0",
});
});
it("returns undefined for invalid names", () => {
expect(parseBunFolderName("invalid")).toBeUndefined();
expect(parseBunFolderName("")).toBeUndefined();
});
});
describe("scanBunPackages", () => {
let tempDir;
beforeEach(() => {
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "bun-test-"));
});
afterEach(() => {
fs.rmSync(tempDir, { recursive: true });
});
it("scans packages from .bun directory", () => {
const pkgDir = path.join(
tempDir,
"lodash@4.17.21",
"node_modules",
"lodash",
);
fs.mkdirSync(pkgDir, { recursive: true });
fs.writeFileSync(path.join(pkgDir, "package.json"), "{}");
const packages = scanBunPackages(tempDir);
expect(packages).toHaveLength(1);
expect(packages[0].name).toBe("lodash");
expect(packages[0].version).toBe("4.17.21");
});
it("scans scoped packages", () => {
const pkgDir = path.join(
tempDir,
"@babel+core@7.28.4",
"node_modules",
"@babel/core",
);
fs.mkdirSync(pkgDir, { recursive: true });
fs.writeFileSync(path.join(pkgDir, "package.json"), "{}");
const packages = scanBunPackages(tempDir);
expect(packages).toHaveLength(1);
expect(packages[0].name).toBe("@babel/core");
expect(packages[0].version).toBe("7.28.4");
});
it("skips folders that don't match expected structure", () => {
fs.mkdirSync(path.join(tempDir, "invalid-folder"));
fs.mkdirSync(path.join(tempDir, "also-invalid@1.0.0"));
const packages = scanBunPackages(tempDir);
expect(packages).toHaveLength(0);
});
it("throws if directory doesn't exist", () => {
expect(() => scanBunPackages("/nonexistent")).toThrow();
});
});
describe("generateDisclaimerText", () => {
const mockGetPackageDetails = (licenseText, repoUrl) => () => ({
licenseText,
repoUrl,
homepage: "https://example.com",
});
it("generates header", () => {
const result = generateDisclaimerText(
[],
mockGetPackageDetails("MIT", null),
);
expect(result).toMatch(
/^THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE/,
);
});
it("generates entry for a single package", () => {
const packages = [
{ name: "test-package", version: "1.0.0", path: "/path" },
];
const result = generateDisclaimerText(packages, () => ({
licenseText: "MIT License text here",
repoUrl: "https://github.com/test/test-package",
homepage: null,
}));
expect(result).toContain("-----");
expect(result).toContain(
"The following software may be included in this product: test-package.",
);
expect(result).toContain(
"A copy of the source code may be downloaded from https://github.com/test/test-package.",
);
expect(result).toContain("MIT License text here");
});
it("groups packages with same repo and license", () => {
const packages = [
{ name: "@scope/pkg-a", version: "1.0.0", path: "/path/a" },
{ name: "@scope/pkg-b", version: "1.0.0", path: "/path/b" },
];
const result = generateDisclaimerText(packages, () => ({
licenseText: "MIT License",
repoUrl: "https://github.com/scope/monorepo",
homepage: null,
}));
expect(result).toContain("@scope/pkg-a, @scope/pkg-b");
const licenseMatches = result.match(/MIT License/g);
expect(licenseMatches.length).toBe(1);
});
it("does not group packages with different licenses", () => {
const packages = [
{ name: "pkg-a", version: "1.0.0", path: "/path/a" },
{ name: "pkg-b", version: "1.0.0", path: "/path/b" },
];
const result = generateDisclaimerText(packages, (pkg) => ({
licenseText: pkg.name === "pkg-a" ? "MIT License" : "Apache License",
repoUrl: "https://github.com/test/repo",
homepage: null,
}));
expect(result).toContain(
"The following software may be included in this product: pkg-a.",
);
expect(result).toContain(
"The following software may be included in this product: pkg-b.",
);
});
it("normalizes git URLs for grouping", () => {
const packages = [
{ name: "pkg-a", version: "1.0.0", path: "/path/a" },
{ name: "pkg-b", version: "1.0.0", path: "/path/b" },
];
const result = generateDisclaimerText(packages, (pkg) => ({
licenseText: "MIT",
repoUrl:
pkg.name === "pkg-a"
? "git+https://github.com/test/repo.git"
: "https://github.com/test/repo",
homepage: null,
}));
expect(result).toContain("pkg-a, pkg-b");
});
it("handles packages without repo URL", () => {
const packages = [
{ name: "no-repo-package", version: "1.0.0", path: "/path" },
];
const result = generateDisclaimerText(packages, () => ({
licenseText: "Some License",
repoUrl: null,
homepage: null,
}));
expect(result).toContain(
"The following software may be included in this product: no-repo-package. This software contains the following license",
);
expect(result).not.toContain("A copy of the source code may be downloaded");
});
it("uses fallback when no license text found", () => {
const packages = [{ name: "no-license", version: "1.0.0", path: "/path" }];
const result = generateDisclaimerText(packages, () => ({
licenseText: null,
repoUrl: null,
homepage: "https://example.com",
}));
expect(result).toContain("License: See https://example.com package");
});
it("sorts groups alphabetically", () => {
const packages = [
{ name: "zebra", version: "1.0.0", path: "/z" },
{ name: "alpha", version: "1.0.0", path: "/a" },
{ name: "middle", version: "1.0.0", path: "/m" },
];
const result = generateDisclaimerText(packages, (pkg) => ({
licenseText: `License for ${pkg.name}`,
repoUrl: null,
homepage: null,
}));
const alphaIndex = result.indexOf("alpha");
const middleIndex = result.indexOf("middle");
const zebraIndex = result.indexOf("zebra");
expect(alphaIndex).toBeLessThan(middleIndex);
expect(middleIndex).toBeLessThan(zebraIndex);
});
it("dedupes multiple versions of same package", () => {
const packages = [
{ name: "lodash", version: "4.0.0", path: "/path/v1" },
{ name: "lodash", version: "4.1.0", path: "/path/v2" },
];
const result = generateDisclaimerText(packages, () => ({
licenseText: "MIT",
repoUrl: "https://github.com/lodash/lodash",
homepage: null,
}));
const matches = result.match(
/The following software may be included in this product: lodash\./g,
);
expect(matches.length).toBe(1);
});
});
describe("integration", () => {
let tempDir;
let tempOutputFile;
beforeEach(() => {
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "license-test-"));
tempOutputFile = path.join(tempDir, "license-output.txt");
});
afterEach(() => {
if (fs.existsSync(tempDir)) {
fs.rmSync(tempDir, { recursive: true });
}
});
it("runs successfully and generates valid output", () => {
const { execFileSync } = require("child_process");
const scriptPath = path.join(__dirname, "generate-license-disclaimer.js");
const result = execFileSync("node", [scriptPath, tempOutputFile], {
encoding: "utf-8",
});
expect(result).toMatch(/Found \d+ packages/);
const packageCount = parseInt(result.match(/Found (\d+) packages/)[1], 10);
expect(packageCount).toBeGreaterThan(1000); // ensure transitive deps are included
const content = fs.readFileSync(tempOutputFile, "utf-8");
expect(content).toMatch(/^THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES/);
expect(content).toContain("-----");
expect(content).toContain("This software contains the following license");
});
});

View File

@@ -35,7 +35,7 @@ mkdir -p "locales"
# NOTE: about twice as fast to call babel directly rather than a full webpack build # NOTE: about twice as fast to call babel directly rather than a full webpack build
BABEL_ENV=extract ./node_modules/.bin/babel --quiet -x .js,.jsx,.ts,.tsx -o /dev/null {enterprise/,}frontend/src BABEL_ENV=extract ./node_modules/.bin/babel --quiet -x .js,.jsx,.ts,.tsx -o /dev/null {enterprise/,}frontend/src
# BABEL_ENV=extract BABEL_DISABLE_CACHE=1 yarn run build # BABEL_ENV=extract BABEL_DISABLE_CACHE=1 bun run build
# NOTE: replace ttag's "${ 0 }" style references with xgettext "{0}" style references for consistency # NOTE: replace ttag's "${ 0 }" style references with xgettext "{0}" style references for consistency
sed -i".bak" -E 's/\$\{ *([0-9]+) *\}/{\1}/g' "$POT_FRONTEND_NAME" sed -i".bak" -E 's/\$\{ *([0-9]+) *\}/{\1}/g' "$POT_FRONTEND_NAME"

View File

@@ -14,7 +14,7 @@ fi
# Generate the current OpenAPI spec from Malli schemas using write-openapi-spec-to-file! # Generate the current OpenAPI spec from Malli schemas using write-openapi-spec-to-file!
# This creates $OPENAPI_SPEC directly # This creates $OPENAPI_SPEC directly
# Using the generate-openapi-spec command from metabase.cmd.core # Using the generate-openapi-spec command from metabase.cmd.core
yarn generate-openapi bun run generate-openapi
ret=$? ret=$?
if [[ $ret -ne 0 ]]; then if [[ $ret -ne 0 ]]; then
@@ -82,7 +82,7 @@ if ! git diff --exit-code "$OPENAPI_SPEC" >/dev/null 2>&1; then
echo "" echo ""
echo "To fix this:" echo "To fix this:"
echo " 1. Pull the latest changes from master: git pull origin master" echo " 1. Pull the latest changes from master: git pull origin master"
echo " 2. Run 'yarn generate-openapi' to update $OPENAPI_SPEC" echo " 2. Run 'bun run generate-openapi' to update $OPENAPI_SPEC"
echo " 3. Commit the updated openapi.json file" echo " 3. Commit the updated openapi.json file"
echo "" echo ""
echo "Differences:" echo "Differences:"

View File

@@ -5,7 +5,7 @@
1. Install Clojure CLI -- see [https://clojure.org/guides/getting_started]. Don't use `apt install clojure` as this 1. Install Clojure CLI -- see [https://clojure.org/guides/getting_started]. Don't use `apt install clojure` as this
installs a version that doesn't understand `deps.edn`. installs a version that doesn't understand `deps.edn`.
1. Install `git`, `node`, `yarn`, `awscli`, `docker`, `java`, and `wget`` 1. Install `git`, `node`, `bun`, `awscli`, `docker`, `java`, and `wget``
1. For installing Docker on macOS you should use [Docker Desktop](https://docs.docker.com/docker-for-mac/install/). 1. For installing Docker on macOS you should use [Docker Desktop](https://docs.docker.com/docker-for-mac/install/).
Make sure `docker ps` works from the terminal Make sure `docker ps` works from the terminal

View File

@@ -37,28 +37,17 @@ get_node_version() {
} }
# ============================================================================= # =============================================================================
# Yarn # Bun
# ============================================================================= # =============================================================================
get_yarn_version() { get_bun_version() {
if has_tool yarn; then if has_tool bun; then
yarn --version bun --version
else else
echo "" echo ""
fi fi
} }
check_yarn_classic() {
local version=$1
if [ -n "$version" ]; then
local major_version=$(echo "$version" | cut -d. -f1)
if [ "$major_version" = "1" ]; then
return 0
fi
fi
return 1
}
# ============================================================================= # =============================================================================
# Java # Java
# ============================================================================= # =============================================================================

9227
bun.lock Normal file

File diff suppressed because it is too large Load Diff

8
bunfig.toml Normal file
View File

@@ -0,0 +1,8 @@
[install]
linker = "isolated"
timeout = 600000
# Only install package versions published at least 3 days ago
minimumReleaseAge = 259200

View File

@@ -20,7 +20,7 @@ version: '3.1'
# ;; when you connect to data warehouses, you'll use docker networking to # ;; when you connect to data warehouses, you'll use docker networking to
# ;; connect (e.g. metabasedb_postgres_14_data:5432 vs. localhost:15432). # ;; connect (e.g. metabasedb_postgres_14_data:5432 vs. localhost:15432).
# COMPOSE_PROFILES=postgresappdb,postgres14data,mysql57data,dev-app docker-compose --file dev/docker-compose.yml up # COMPOSE_PROFILES=postgresappdb,postgres14data,mysql57data,dev-app docker-compose --file dev/docker-compose.yml up
# ;; All of the above, and builds the frontend, too. No need for `yarn build-hot` locally. # ;; All of the above, and builds the frontend, too. No need for `bun run build-hot` locally.
# ;; NOTE: See comment below on fe-builder service. This isn't quite ready yet. # ;; NOTE: See comment below on fe-builder service. This isn't quite ready yet.
# COMPOSE_PROFILES=postgresappdb,postgres14data,mysql57data,fe-builder,dev-app docker-compose --file dev/docker-compose.yml up # COMPOSE_PROFILES=postgresappdb,postgres14data,mysql57data,fe-builder,dev-app docker-compose --file dev/docker-compose.yml up
# #
@@ -80,13 +80,14 @@ services:
volumes: volumes:
- ../:/dev/metabase - ../:/dev/metabase
- ~/.npm:/root/.npm - ~/.npm:/root/.npm
- ~/Library/Caches/Yarn/v6:/usr/local/share/.cache/yarn/v6 - ~/.bun/install/cache:/root/.bun/install/cache
command: command:
- /bin/sh - /bin/sh
- -c - -c
- | - |
yarn install npm install -g bun
yarn build-hot bun install
bun run build-hot
profiles: profiles:
- fe-builder - fe-builder

View File

@@ -6,7 +6,7 @@ In this namespace, you can run `(help)` to get a bit of help. It's principle usa
### NOTE! ### NOTE!
You must build the js bundle used to create the svgs with visx. Run `yarn build-static-viz` to ensure that this bundle is created and the file `resources/frontend_client/app/dist/lib-static-viz.bundle.js` exists You must build the js bundle used to create the svgs with visx. Run `bun run build-static-viz` to ensure that this bundle is created and the file `resources/frontend_client/app/dist/lib-static-viz.bundle.js` exists
Example usage below: Example usage below:

View File

@@ -22,16 +22,16 @@ To complete any build of the Metabase code, you'll need to install the following
3. [Node.js (https://nodejs.org/)](https://nodejs.org/) - latest LTS release 3. [Node.js (https://nodejs.org/)](https://nodejs.org/) - latest LTS release
4. [Yarn package manager for Node.js](https://yarnpkg.com/) - latest release of version 1.x - you can install it in any OS by running: 4. [Bun package manager](https://bun.sh/) - you can install it by running:
``` ```
npm install --global yarn curl -fsSL https://bun.sh/install | bash
``` ```
On a most recent stable Ubuntu/Debian, all the tools above, with the exception of Clojure, can be installed by using: On a most recent stable Ubuntu/Debian, all the tools above, with the exception of Clojure and Bun, can be installed by using:
``` ```
sudo apt install openjdk-21-jdk nodejs && sudo npm install --global yarn sudo apt install openjdk-21-jdk nodejs
``` ```
If you have multiple JDK versions installed in your machine, be sure to switch your JDK before building with: If you have multiple JDK versions installed in your machine, be sure to switch your JDK before building with:
@@ -138,7 +138,7 @@ When it’s done, you should see a message that says something like “Metabase
10. Open up another tab or window of your terminal app, and then “build” the frontend (all the UI) with this command: 10. Open up another tab or window of your terminal app, and then “build” the frontend (all the UI) with this command:
``` ```
yarn build-hot bun run build-hot
``` ```
If you're having trouble with this step, make sure you are using the LTS version of [Node.js (https://nodejs.org/)](https://nodejs.org/). If you're having trouble with this step, make sure you are using the LTS version of [Node.js (https://nodejs.org/)](https://nodejs.org/).

View File

@@ -19,14 +19,14 @@ Both components are built and assembled together into a single JAR file. In the
./bin/dev-install ./bin/dev-install
``` ```
This installs [mise](https://mise.jdx.dev) (a tool version manager), sets up your shell, and installs all required tools (Node.js, Java, Clojure, Yarn, Babashka) at the correct versions. Follow the prompts, then open a new terminal. This installs [mise](https://mise.jdx.dev) (a tool version manager), sets up your shell, and installs all required tools (Node.js, Java, Clojure, Bun, Babashka) at the correct versions. Follow the prompts, then open a new terminal.
**Already have your own setup?** You can check that it meets the requirements with `./bin/mage doctor`. **Already have your own setup?** You can check that it meets the requirements with `./bin/mage doctor`.
To spin up a development environment, run: To spin up a development environment, run:
``` ```
yarn dev bun run dev
``` ```
This runs both the [frontend](#frontend) and [backend](#backend). Alternatively, you can run them separately in two terminal sessions below. This runs both the [frontend](#frontend) and [backend](#backend). Alternatively, you can run them separately in two terminal sessions below.
@@ -41,13 +41,13 @@ Metabase depends on third-party libraries to run, so you'll need to keep those u
```sh ```sh
# javascript dependencies # javascript dependencies
$ yarn $ bun install
``` ```
Start the frontend build process with Start the frontend build process with
``` ```
yarn build-hot bun run build-hot
``` ```
See [Frontend development](#frontend-development). See [Frontend development](#frontend-development).
@@ -121,18 +121,18 @@ We use these technologies for our FE build process to allow us to use modules, e
- babel - babel
- cssnext - cssnext
Frontend tasks are executed using `yarn`. All available tasks can be found in `package.json` under _scripts_. Frontend tasks are executed using `bun`. All available tasks can be found in `package.json` under _scripts_.
To build the frontend client without watching for changes, you can use: To build the frontend client without watching for changes, you can use:
```sh ```sh
$ yarn build $ bun run build
``` ```
If you're working on the frontend directly, you'll most likely want to reload changes on save, and in the case of React components, do so while maintaining state. To start a build with hot reloading, use: If you're working on the frontend directly, you'll most likely want to reload changes on save, and in the case of React components, do so while maintaining state. To start a build with hot reloading, use:
```sh ```sh
$ yarn build-hot $ bun run build-hot
``` ```
Note that at this time if you change CSS variables, those changes will only be picked up when a build is restarted. Note that at this time if you change CSS variables, those changes will only be picked up when a build is restarted.
@@ -140,7 +140,7 @@ Note that at this time if you change CSS variables, those changes will only be p
There is also an option to reload changes on save without hot reloading if you prefer that. There is also an option to reload changes on save without hot reloading if you prefer that.
```sh ```sh
$ yarn build-watch $ bun run build-watch
``` ```
Some systems may have trouble detecting changes to frontend files. You can enable filesystem polling by uncommenting the `watchOptions` clause in `rspack.main.config.js`. If you do this it may be worth making git ignore changes to webpack config, using `git update-index --assume-unchanged rspack.main.config.js` Some systems may have trouble detecting changes to frontend files. You can enable filesystem polling by uncommenting the `watchOptions` clause in `rspack.main.config.js`. If you do this it may be worth making git ignore changes to webpack config, using `git update-index --assume-unchanged rspack.main.config.js`
@@ -148,7 +148,7 @@ Some systems may have trouble detecting changes to frontend files. You can enabl
We exclude ESLint loader in dev mode for seven times quicker initial builds by default. You can enable it by exporting an environment variable: We exclude ESLint loader in dev mode for seven times quicker initial builds by default. You can enable it by exporting an environment variable:
```sh ```sh
$ USE_ESLINT=true yarn build-hot $ USE_ESLINT=true bun run build-hot
``` ```
### Frontend testing ### Frontend testing
@@ -156,7 +156,7 @@ $ USE_ESLINT=true yarn build-hot
Run all unit and Cypress end-to-end tests with Run all unit and Cypress end-to-end tests with
``` ```
yarn test bun run test
``` ```
Cypress tests and some unit tests are located in `frontend/test` directory. New unit test files are added next to the files they test. Cypress tests and some unit tests are located in `frontend/test` directory. New unit test files are added next to the files they test.
@@ -170,7 +170,7 @@ If you run into issues with breakpoints, especially inside jsx, please set env v
Example: Example:
``` ```
BETTER_SOURCE_MAPS=true yarn dev BETTER_SOURCE_MAPS=true bun run dev
``` ```
### Cypress end-to-end tests ### Cypress end-to-end tests
@@ -186,8 +186,8 @@ Unit tests are focused around isolated parts of business logic.
Unit tests use an enforced file naming convention `<test-suite-name>.unit.spec.js` to separate them from end-to-end tests. Unit tests use an enforced file naming convention `<test-suite-name>.unit.spec.js` to separate them from end-to-end tests.
``` ```
yarn test-unit # Run all tests at once bun run test-unit # Run all tests at once
yarn test-unit-watch # Watch for file changes bun run test-unit-watch # Watch for file changes
``` ```
## Backend development ## Backend development
@@ -207,7 +207,7 @@ You can also start a REPL another way (e.g., through your editor) and then call:
``` ```
To start the server (at `localhost:3000`). This will also set up or migrate your application database. To actually To start the server (at `localhost:3000`). This will also set up or migrate your application database. To actually
use Metabase, don't forget to start the frontend as well (e.g. with `yarn build-hot`). use Metabase, don't forget to start the frontend as well (e.g. with `bun run build-hot`).
### Multiple Instances ### Multiple Instances
@@ -215,8 +215,8 @@ By default Rspack runs the development server on port `8088`. You can run multip
Frontend: Frontend:
- If you are running the frontend with `yarn build-hot`, set the `MB_FRONTEND_DEV_PORT` environment variable: `MB_FRONTEND_DEV_PORT=8089 MB_EDITION=ee yarn build-hot` - If you are running the frontend with `bun run build-hot`, set the `MB_FRONTEND_DEV_PORT` environment variable: `MB_FRONTEND_DEV_PORT=8089 MB_EDITION=ee bun run build-hot`
- If you are building the frontend statically with `yarn build`, there is nothing different to do - If you are building the frontend statically with `bun run build`, there is nothing different to do
Backend: Backend:
@@ -464,12 +464,12 @@ clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:namespace-checker
All frontend and backend linters and tests can be executed with All frontend and backend linters and tests can be executed with
```sh ```sh
$ yarn ci $ bun run ci
``` ```
It is also possible to execute front-end and back-end checks separately It is also possible to execute front-end and back-end checks separately
```sh ```sh
$ yarn ci-frontend $ bun run ci-frontend
$ yarn ci-backend $ bun run ci-backend
``` ```

View File

@@ -11,19 +11,19 @@ Notes on writing docs for Metabase.
You can check for broken links in the [docs](../) directory by running: You can check for broken links in the [docs](../) directory by running:
``` ```
yarn run docs-lint-links bun run docs-lint-links
``` ```
This command uses [Markdown link check](https://github.com/tcort/markdown-link-check) to vet links in all of the markdown files in the [docs](../) directory. We recommend writing the command's output to a file. E.links., This command uses [Markdown link check](https://github.com/tcort/markdown-link-check) to vet links in all of the markdown files in the [docs](../) directory. We recommend writing the command's output to a file. E.links.,
``` ```
touch ~/links-to-fix.txt && yarn run docs-lint-links > ~/links-to-fix.txt touch ~/links-to-fix.txt && bun run docs-lint-links > ~/links-to-fix.txt
``` ```
Alternatively, if you just want to check the in-product links to make sure they link to actual documents: Alternatively, if you just want to check the in-product links to make sure they link to actual documents:
``` ```
yarn run lint-docs-links bun run lint-docs-links
``` ```
You can view both commands in the [package.json](https://github.com/metabase/metabase/blob/master/package.json) file under `scripts`. You can view both commands in the [package.json](https://github.com/metabase/metabase/blob/master/package.json) file under `scripts`.

View File

@@ -18,25 +18,25 @@ Our custom Cypress runner builds its own backend and creates a temporary H2 app
1. Continuously build the frontend 1. Continuously build the frontend
a. If you need only the frontend, run `yarn build-hot` a. If you need only the frontend, run `bun run build-hot`
b. If you want to run a local Metabase instance alongside Cypress, the easiest way to achieve this is by using `yarn dev` or `yarn dev-ee` (both rely on frontend hot reloading under the hood) b. If you want to run a local Metabase instance alongside Cypress, the easiest way to achieve this is by using `bun run dev` or `bun run dev-ee` (both rely on frontend hot reloading under the hood)
2. In a separate terminal session (without killing the previous one) run `yarn test-cypress`. This will open a Cypress GUI that will let you choose which tests to run. Alternatively, take a look at `run_cypress_local.js` and `e2e/test/scenarios/docker-compose.yml` for all possible options. 2. In a separate terminal session (without killing the previous one) run `bun run test-cypress`. This will open a Cypress GUI that will let you choose which tests to run. Alternatively, take a look at `run_cypress_local.js` and `e2e/test/scenarios/docker-compose.yml` for all possible options.
### Running Options ### Running Options
To run all Cypress tests headlessly in the terminal: To run all Cypress tests headlessly in the terminal:
```sh ```sh
CYPRESS_GUI=false yarn run test-cypress CYPRESS_GUI=false bun run test-cypress
``` ```
You can quickly test a single file only by using the official `--spec` flag. You can quickly test a single file only by using the official `--spec` flag.
This flag can be used to run all specs within a folder, or to run multiple assorted specs. Consult [the official documentation](https://docs.cypress.io/app/references/command-line#cypress-run-spec-lt-spec-gt) for instructions. This flag can be used to run all specs within a folder, or to run multiple assorted specs. Consult [the official documentation](https://docs.cypress.io/app/references/command-line#cypress-run-spec-lt-spec-gt) for instructions.
```sh ```sh
CYPRESS_GUI=false yarn test-cypress --spec e2e/test/scenarios/question/new.cy.spec.js CYPRESS_GUI=false bun run test-cypress --spec e2e/test/scenarios/question/new.cy.spec.js
``` ```
You can specify a browser to execute Cypress tests in using the `--browser` flag. For more details, please consult [the official documentation](https://docs.cypress.io/guides/guides/launching-browsers). You can specify a browser to execute Cypress tests in using the `--browser` flag. For more details, please consult [the official documentation](https://docs.cypress.io/guides/guides/launching-browsers).
@@ -112,7 +112,7 @@ it("bar", { viewportWidth: 1600, viewportHeight: 1200 }, () => {});
### Code reloading vs test reloading ### Code reloading vs test reloading
When you edit a Cypress test file, the tests will refresh and run again. However, when you edit a code file, Cypress won’t detect that change. If you’re running `yarn build-hot`, the code will rebuild and update within Cypress. You’ll have to manually click rerun after the new code has loaded. When you edit a Cypress test file, the tests will refresh and run again. However, when you edit a code file, Cypress won’t detect that change. If you’re running `bun run build-hot`, the code will rebuild and update within Cypress. You’ll have to manually click rerun after the new code has loaded.
### Inspecting while the “contains helper” is open ### Inspecting while the “contains helper” is open
@@ -120,7 +120,7 @@ One great feature of Cypress is that you can use the Chrome inspector after each
### Putting the wrong HTML template in the Uberjar ### Putting the wrong HTML template in the Uberjar
`yarn build` and `yarn build-hot` each overwrite an HTML template to reference the correct JavaScript files. If you run `yarn build` before building an Uberjar for Cypress tests, you won’t see changes to your JavaScript reflected even if you then start `yarn build-hot`. `bun run build` and `bun run build-hot` each overwrite an HTML template to reference the correct JavaScript files. If you run `bun run build` before building an Uberjar for Cypress tests, you won’t see changes to your JavaScript reflected even if you then start `bun run build-hot`.
### Running Cypress on Apple Silicon ### Running Cypress on Apple Silicon
@@ -238,7 +238,7 @@ If you navigate to the `/admin/settings/license` page, the license input field s
## Tags ## Tags
Cypress allows us to [tag](https://github.com/cypress-io/cypress/tree/develop/npm/grep#tags-in-the-test-config-object) tests, to easily find certain categories of tags. For example, we can tag all tests that require an external database with `@external` and then run only those tests with `yarn test-cypress --env grepTags="@external"`. Tags should start with `@` just to make it easier to distinguish them from other strings in searches. Cypress allows us to [tag](https://github.com/cypress-io/cypress/tree/develop/npm/grep#tags-in-the-test-config-object) tests, to easily find certain categories of tags. For example, we can tag all tests that require an external database with `@external` and then run only those tests with `bun run test-cypress --env grepTags="@external"`. Tags should start with `@` just to make it easier to distinguish them from other strings in searches.
These are the tags currently in use: These are the tags currently in use:
@@ -281,4 +281,4 @@ Individual Mocha reports are automatically generated per spec. They are stored i
When tests run _in CI_ we do some extra steps by merging these individual reports (using `mochawesome-merge`), formatting them, and then generating customized GitHub Actions job summaries. When tests run _in CI_ we do some extra steps by merging these individual reports (using `mochawesome-merge`), formatting them, and then generating customized GitHub Actions job summaries.
On an off chance that you need a unified test report _while running tests locally_, you can achieve that by invoking `yarn generate-cypress-html-report`. On an off chance that you need a unified test report _while running tests locally_, you can achieve that by invoking `bun run generate-cypress-html-report`.

View File

@@ -180,9 +180,9 @@ The first rule of frontend style, is we want to avoid talking about frontend sty
### Prettier + Eslint ### Prettier + Eslint
We use [Prettier](https://prettier.io/) to format our JavaScript code, and it is enforced by CI. We recommend setting your editor to "format on save". You can also format code using `yarn prettier`, and verify it has been formatted correctly using `yarn lint-prettier`. We use [Prettier](https://prettier.io/) to format our JavaScript code, and it is enforced by CI. We recommend setting your editor to "format on save". You can also format code using `bun run prettier`, and verify it has been formatted correctly using `bun run lint-prettier`.
We use ESLint to enforce additional rules. It is integrated into the Webpack build, or you can manually run `yarn lint-eslint` to check. Nitpicky things like import order, spacing, etc. are all enforced by eslint. We use ESLint to enforce additional rules. It is integrated into the Webpack build, or you can manually run `bun run lint-eslint` to check. Nitpicky things like import order, spacing, etc. are all enforced by eslint.
### Miscellaneous notes on coding style ### Miscellaneous notes on coding style

View File

@@ -12,11 +12,11 @@ Before running Loki tests locally, ensure that both Storybook and Docker are run
### Commands ### Commands
- Run Visual Tests: `yarn test-visual:loki` (Note: do not commit screenshots from this, use the CI variant below, they will be more consistent) - Run Visual Tests: `bun run test-visual:loki` (Note: do not commit screenshots from this, use the CI variant below, they will be more consistent)
- Run Visual Tests in CI: `yarn test-visual:loki:ci` - Run Visual Tests in CI: `bun run test-visual:loki:ci`
- Update failing snapshots: `yarn test-visual:loki-approve-diff` - Update failing snapshots: `bun run test-visual:loki-approve-diff`
- Generate an HTML Report: `yarn test-visual:loki-report` - Generate an HTML Report: `bun run test-visual:loki-report`
- Generate and Open Report: `yarn test-visual:loki-report-open` - Generate and Open Report: `bun run test-visual:loki-report-open`
## CI ## CI

View File

@@ -7,13 +7,13 @@ Scripts for generating docs.
From this directory, run: From this directory, run:
```bash ```bash
yarn install bun install
``` ```
Then: Then:
```bash ```bash
yarn generate-shortcuts bun run generate-shortcuts
``` ```
Docs will be written to: Docs will be written to:

View File

@@ -13,24 +13,21 @@
"react-dom": "^18" "react-dom": "^18"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20",
"@types/react": "^18", "@types/react": "^18",
"@types/react-dom": "^18" "@types/react-dom": "^18"
} }
}, },
"node_modules/@emnapi/runtime": { "node_modules/@img/colour": {
"version": "1.5.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
"integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "engines": {
"tslib": "^2.4.0" "node": ">=18"
} }
}, },
"node_modules/@img/sharp-darwin-arm64": { "node_modules/@img/sharp-darwin-arm64": {
"version": "0.34.3", "version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",
"integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -46,35 +43,11 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
}, },
"optionalDependencies": { "optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.2.0" "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
"integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.2.0"
} }
}, },
"node_modules/@img/sharp-libvips-darwin-arm64": { "node_modules/@img/sharp-libvips-darwin-arm64": {
"version": "1.2.0", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz",
"integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -87,364 +60,6 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
} }
}, },
"node_modules/@img/sharp-libvips-darwin-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz",
"integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
"integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
"cpu": [
"arm"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
"integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-ppc64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
"integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
"cpu": [
"ppc64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
"integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
"cpu": [
"s390x"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
"integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
"integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
"integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-linux-arm": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
"integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
"cpu": [
"arm"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.2.0"
}
},
"node_modules/@img/sharp-linux-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
"integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.2.0"
}
},
"node_modules/@img/sharp-linux-ppc64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
"integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
"cpu": [
"ppc64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-ppc64": "1.2.0"
}
},
"node_modules/@img/sharp-linux-s390x": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
"integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
"cpu": [
"s390x"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.2.0"
}
},
"node_modules/@img/sharp-linux-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
"integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.2.0"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
"integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.2.0"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
"integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.2.0"
}
},
"node_modules/@img/sharp-wasm32": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
"integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
"@emnapi/runtime": "^1.4.4"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
"integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
"cpu": [
"arm64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-ia32": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
"integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
"cpu": [
"ia32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
"integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
"cpu": [
"x64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "15.5.9", "version": "15.5.9",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz",
@@ -581,45 +196,45 @@
}, },
"node_modules/@swc/helpers": { "node_modules/@swc/helpers": {
"version": "0.5.15", "version": "0.5.15",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
"integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"tslib": "^2.8.0" "tslib": "^2.8.0"
} }
}, },
"node_modules/@types/node": {
"version": "20.19.29",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.29.tgz",
"integrity": "sha512-YrT9ArrGaHForBaCNwFjoqJWmn8G1Pr7+BH/vwyLHciA9qT/wSiuOhxGCT50JA5xLvFBd6PIiGkE3afxcPE1nw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.13", "version": "15.7.15",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
"integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "18.3.12", "version": "18.3.27",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
"integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/prop-types": "*", "@types/prop-types": "*",
"csstype": "^3.0.2" "csstype": "^3.2.2"
} }
}, },
"node_modules/@types/react-dom": { "node_modules/@types/react-dom": {
"version": "18.3.1", "version": "18.3.7",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "peerDependencies": {
"@types/react": "*" "@types/react": "^18.0.0"
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001680", "version": "1.0.30001760",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
"integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -638,89 +253,27 @@
}, },
"node_modules/client-only": { "node_modules/client-only": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-convert": "^2.0.1",
"color-string": "^1.9.0"
},
"engines": {
"node": ">=12.5.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT",
"optional": true
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/csstype": { "node_modules/csstype": {
"version": "3.1.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/detect-libc": { "node_modules/detect-libc": {
"version": "2.0.4", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
"license": "MIT",
"optional": true
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0" "js-tokens": "^3.0.0 || ^4.0.0"
@@ -731,8 +284,6 @@
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.11", "version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -799,10 +350,12 @@
} }
} }
}, },
"node_modules/next/node_modules/postcss": { "node_modules/picocolors": {
"version": "1.1.1",
"license": "ISC"
},
"node_modules/postcss": {
"version": "8.4.31", "version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -827,16 +380,8 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/react": { "node_modules/react": {
"version": "18.3.1", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
@@ -847,8 +392,6 @@
}, },
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "18.3.1", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0", "loose-envify": "^1.1.0",
@@ -860,17 +403,13 @@
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.23.2", "version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.2", "version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC", "license": "ISC",
"optional": true, "optional": true,
"bin": { "bin": {
@@ -881,16 +420,14 @@
} }
}, },
"node_modules/sharp": { "node_modules/sharp": {
"version": "0.34.3", "version": "0.34.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz",
"integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"color": "^4.2.3", "@img/colour": "^1.0.0",
"detect-libc": "^2.0.4", "detect-libc": "^2.1.2",
"semver": "^7.7.2" "semver": "^7.7.3"
}, },
"engines": { "engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0" "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -899,44 +436,34 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
}, },
"optionalDependencies": { "optionalDependencies": {
"@img/sharp-darwin-arm64": "0.34.3", "@img/sharp-darwin-arm64": "0.34.5",
"@img/sharp-darwin-x64": "0.34.3", "@img/sharp-darwin-x64": "0.34.5",
"@img/sharp-libvips-darwin-arm64": "1.2.0", "@img/sharp-libvips-darwin-arm64": "1.2.4",
"@img/sharp-libvips-darwin-x64": "1.2.0", "@img/sharp-libvips-darwin-x64": "1.2.4",
"@img/sharp-libvips-linux-arm": "1.2.0", "@img/sharp-libvips-linux-arm": "1.2.4",
"@img/sharp-libvips-linux-arm64": "1.2.0", "@img/sharp-libvips-linux-arm64": "1.2.4",
"@img/sharp-libvips-linux-ppc64": "1.2.0", "@img/sharp-libvips-linux-ppc64": "1.2.4",
"@img/sharp-libvips-linux-s390x": "1.2.0", "@img/sharp-libvips-linux-riscv64": "1.2.4",
"@img/sharp-libvips-linux-x64": "1.2.0", "@img/sharp-libvips-linux-s390x": "1.2.4",
"@img/sharp-libvips-linuxmusl-arm64": "1.2.0", "@img/sharp-libvips-linux-x64": "1.2.4",
"@img/sharp-libvips-linuxmusl-x64": "1.2.0", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
"@img/sharp-linux-arm": "0.34.3", "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
"@img/sharp-linux-arm64": "0.34.3", "@img/sharp-linux-arm": "0.34.5",
"@img/sharp-linux-ppc64": "0.34.3", "@img/sharp-linux-arm64": "0.34.5",
"@img/sharp-linux-s390x": "0.34.3", "@img/sharp-linux-ppc64": "0.34.5",
"@img/sharp-linux-x64": "0.34.3", "@img/sharp-linux-riscv64": "0.34.5",
"@img/sharp-linuxmusl-arm64": "0.34.3", "@img/sharp-linux-s390x": "0.34.5",
"@img/sharp-linuxmusl-x64": "0.34.3", "@img/sharp-linux-x64": "0.34.5",
"@img/sharp-wasm32": "0.34.3", "@img/sharp-linuxmusl-arm64": "0.34.5",
"@img/sharp-win32-arm64": "0.34.3", "@img/sharp-linuxmusl-x64": "0.34.5",
"@img/sharp-win32-ia32": "0.34.3", "@img/sharp-wasm32": "0.34.5",
"@img/sharp-win32-x64": "0.34.3" "@img/sharp-win32-arm64": "0.34.5",
} "@img/sharp-win32-ia32": "0.34.5",
}, "@img/sharp-win32-x64": "0.34.5"
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"license": "MIT",
"optional": true,
"dependencies": {
"is-arrayish": "^0.3.1"
} }
}, },
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
@@ -944,8 +471,6 @@
}, },
"node_modules/styled-jsx": { "node_modules/styled-jsx": {
"version": "5.1.6", "version": "5.1.6",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
"integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"client-only": "0.0.1" "client-only": "0.0.1"
@@ -967,9 +492,14 @@
}, },
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD" "license": "0BSD"
},
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT"
} }
} }
} }

View File

@@ -14,6 +14,7 @@
"react-dom": "^18" "react-dom": "^18"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20",
"@types/react": "^18", "@types/react": "^18",
"@types/react-dom": "^18" "@types/react-dom": "^18"
} }

View File

@@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"baseUrl": ".",
"lib": [ "lib": [
"dom", "dom",
"dom.iterable", "dom.iterable",
@@ -24,6 +25,9 @@
"paths": { "paths": {
"@/*": [ "@/*": [
"./src/*" "./src/*"
],
"@metabase/embedding-sdk-react": [
"./node_modules/@metabase/embedding-sdk-react"
] ]
}, },
"target": "ES2017" "target": "ES2017"

View File

@@ -8,29 +8,27 @@
"name": "next-15-pages-router-host-app", "name": "next-15-pages-router-host-app",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@metabase/embedding-sdk-react": "^0.58.0",
"next": "15.5.9", "next": "15.5.9",
"react": "^18", "react": "^18",
"react-dom": "^18" "react-dom": "^18"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20",
"@types/react": "^18", "@types/react": "^18",
"@types/react-dom": "^18" "@types/react-dom": "^18"
} }
}, },
"node_modules/@emnapi/runtime": { "node_modules/@img/colour": {
"version": "1.5.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
"integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "engines": {
"tslib": "^2.4.0" "node": ">=18"
} }
}, },
"node_modules/@img/sharp-darwin-arm64": { "node_modules/@img/sharp-darwin-arm64": {
"version": "0.34.3", "version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",
"integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -46,35 +44,11 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
}, },
"optionalDependencies": { "optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.2.0" "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
"integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.2.0"
} }
}, },
"node_modules/@img/sharp-libvips-darwin-arm64": { "node_modules/@img/sharp-libvips-darwin-arm64": {
"version": "1.2.0", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz",
"integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -87,362 +61,17 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
} }
}, },
"node_modules/@img/sharp-libvips-darwin-x64": { "node_modules/@metabase/embedding-sdk-react": {
"version": "1.2.0", "version": "0.58.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@metabase/embedding-sdk-react/-/embedding-sdk-react-0.58.0.tgz",
"integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", "integrity": "sha512-JqXsx7OLa4u0gV/k2fOSEK9CgfFkAs1BbmYx1utVqQ0a1OUpq1T27OPuatdJa2pxB8Tz8jM4juGWPsoyQCezJA==",
"cpu": [ "license": "SEE LICENSE IN LICENSE.txt",
"x64" "bin": {
], "embedding-sdk-react": "dist/cli.js"
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
"integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
"cpu": [
"arm"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
"integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-ppc64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
"integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
"cpu": [
"ppc64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
"integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
"cpu": [
"s390x"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
"integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
"integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
"integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-linux-arm": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
"integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
"cpu": [
"arm"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
}, },
"funding": { "peerDependencies": {
"url": "https://opencollective.com/libvips" "react": ">=18 <=19",
}, "react-dom": ">=18 <=19"
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.2.0"
}
},
"node_modules/@img/sharp-linux-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
"integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.2.0"
}
},
"node_modules/@img/sharp-linux-ppc64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
"integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
"cpu": [
"ppc64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-ppc64": "1.2.0"
}
},
"node_modules/@img/sharp-linux-s390x": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
"integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
"cpu": [
"s390x"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.2.0"
}
},
"node_modules/@img/sharp-linux-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
"integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.2.0"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
"integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.2.0"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
"integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.2.0"
}
},
"node_modules/@img/sharp-wasm32": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
"integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
"@emnapi/runtime": "^1.4.4"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
"integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
"cpu": [
"arm64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-ia32": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
"integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
"cpu": [
"ia32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
"integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
"cpu": [
"x64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
} }
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
@@ -581,45 +210,45 @@
}, },
"node_modules/@swc/helpers": { "node_modules/@swc/helpers": {
"version": "0.5.15", "version": "0.5.15",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
"integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"tslib": "^2.8.0" "tslib": "^2.8.0"
} }
}, },
"node_modules/@types/node": {
"version": "20.19.29",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.29.tgz",
"integrity": "sha512-YrT9ArrGaHForBaCNwFjoqJWmn8G1Pr7+BH/vwyLHciA9qT/wSiuOhxGCT50JA5xLvFBd6PIiGkE3afxcPE1nw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.13", "version": "15.7.15",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
"integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "18.3.12", "version": "18.3.27",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
"integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/prop-types": "*", "@types/prop-types": "*",
"csstype": "^3.0.2" "csstype": "^3.2.2"
} }
}, },
"node_modules/@types/react-dom": { "node_modules/@types/react-dom": {
"version": "18.3.1", "version": "18.3.7",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "peerDependencies": {
"@types/react": "*" "@types/react": "^18.0.0"
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001680", "version": "1.0.30001760",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
"integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -638,89 +267,27 @@
}, },
"node_modules/client-only": { "node_modules/client-only": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-convert": "^2.0.1",
"color-string": "^1.9.0"
},
"engines": {
"node": ">=12.5.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT",
"optional": true
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/csstype": { "node_modules/csstype": {
"version": "3.1.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/detect-libc": { "node_modules/detect-libc": {
"version": "2.0.4", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
"license": "MIT",
"optional": true
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0" "js-tokens": "^3.0.0 || ^4.0.0"
@@ -731,8 +298,6 @@
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.11", "version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -799,10 +364,12 @@
} }
} }
}, },
"node_modules/next/node_modules/postcss": { "node_modules/picocolors": {
"version": "1.1.1",
"license": "ISC"
},
"node_modules/postcss": {
"version": "8.4.31", "version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -827,16 +394,8 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/react": { "node_modules/react": {
"version": "18.3.1", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
@@ -847,8 +406,6 @@
}, },
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "18.3.1", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0", "loose-envify": "^1.1.0",
@@ -860,17 +417,13 @@
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.23.2", "version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.2", "version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC", "license": "ISC",
"optional": true, "optional": true,
"bin": { "bin": {
@@ -881,16 +434,14 @@
} }
}, },
"node_modules/sharp": { "node_modules/sharp": {
"version": "0.34.3", "version": "0.34.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz",
"integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"color": "^4.2.3", "@img/colour": "^1.0.0",
"detect-libc": "^2.0.4", "detect-libc": "^2.1.2",
"semver": "^7.7.2" "semver": "^7.7.3"
}, },
"engines": { "engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0" "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -899,44 +450,34 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
}, },
"optionalDependencies": { "optionalDependencies": {
"@img/sharp-darwin-arm64": "0.34.3", "@img/sharp-darwin-arm64": "0.34.5",
"@img/sharp-darwin-x64": "0.34.3", "@img/sharp-darwin-x64": "0.34.5",
"@img/sharp-libvips-darwin-arm64": "1.2.0", "@img/sharp-libvips-darwin-arm64": "1.2.4",
"@img/sharp-libvips-darwin-x64": "1.2.0", "@img/sharp-libvips-darwin-x64": "1.2.4",
"@img/sharp-libvips-linux-arm": "1.2.0", "@img/sharp-libvips-linux-arm": "1.2.4",
"@img/sharp-libvips-linux-arm64": "1.2.0", "@img/sharp-libvips-linux-arm64": "1.2.4",
"@img/sharp-libvips-linux-ppc64": "1.2.0", "@img/sharp-libvips-linux-ppc64": "1.2.4",
"@img/sharp-libvips-linux-s390x": "1.2.0", "@img/sharp-libvips-linux-riscv64": "1.2.4",
"@img/sharp-libvips-linux-x64": "1.2.0", "@img/sharp-libvips-linux-s390x": "1.2.4",
"@img/sharp-libvips-linuxmusl-arm64": "1.2.0", "@img/sharp-libvips-linux-x64": "1.2.4",
"@img/sharp-libvips-linuxmusl-x64": "1.2.0", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
"@img/sharp-linux-arm": "0.34.3", "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
"@img/sharp-linux-arm64": "0.34.3", "@img/sharp-linux-arm": "0.34.5",
"@img/sharp-linux-ppc64": "0.34.3", "@img/sharp-linux-arm64": "0.34.5",
"@img/sharp-linux-s390x": "0.34.3", "@img/sharp-linux-ppc64": "0.34.5",
"@img/sharp-linux-x64": "0.34.3", "@img/sharp-linux-riscv64": "0.34.5",
"@img/sharp-linuxmusl-arm64": "0.34.3", "@img/sharp-linux-s390x": "0.34.5",
"@img/sharp-linuxmusl-x64": "0.34.3", "@img/sharp-linux-x64": "0.34.5",
"@img/sharp-wasm32": "0.34.3", "@img/sharp-linuxmusl-arm64": "0.34.5",
"@img/sharp-win32-arm64": "0.34.3", "@img/sharp-linuxmusl-x64": "0.34.5",
"@img/sharp-win32-ia32": "0.34.3", "@img/sharp-wasm32": "0.34.5",
"@img/sharp-win32-x64": "0.34.3" "@img/sharp-win32-arm64": "0.34.5",
} "@img/sharp-win32-ia32": "0.34.5",
}, "@img/sharp-win32-x64": "0.34.5"
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"license": "MIT",
"optional": true,
"dependencies": {
"is-arrayish": "^0.3.1"
} }
}, },
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
@@ -944,8 +485,6 @@
}, },
"node_modules/styled-jsx": { "node_modules/styled-jsx": {
"version": "5.1.6", "version": "5.1.6",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
"integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"client-only": "0.0.1" "client-only": "0.0.1"
@@ -967,9 +506,14 @@
}, },
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD" "license": "0BSD"
},
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT"
} }
} }
} }

View File

@@ -9,11 +9,13 @@
"preview": "next start" "preview": "next start"
}, },
"dependencies": { "dependencies": {
"@metabase/embedding-sdk-react": "^0.58.0",
"next": "15.5.9", "next": "15.5.9",
"react": "^18", "react": "^18",
"react-dom": "^18" "react-dom": "^18"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20",
"@types/react": "^18", "@types/react": "^18",
"@types/react-dom": "^18" "@types/react-dom": "^18"
} }

View File

@@ -1,5 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"baseUrl": ".",
"lib": [ "lib": [
"dom", "dom",
"dom.iterable", "dom.iterable",
@@ -24,6 +25,9 @@
"paths": { "paths": {
"@/*": [ "@/*": [
"./src/*" "./src/*"
],
"@metabase/embedding-sdk-react": [
"./node_modules/@metabase/embedding-sdk-react"
] ]
}, },
"target": "ES2017" "target": "ES2017"

View File

@@ -7,7 +7,7 @@ const BASE_ENV = {
}; };
const BASE_SETUP_CONFIG = { const BASE_SETUP_CONFIG = {
"app-run-command": "yarn start", "app-run-command": "bun start",
"app-down-command": `kill -9 $(lsof -ti:"${BASE_ENV.CLIENT_PORT}");`, "app-down-command": `kill -9 $(lsof -ti:"${BASE_ENV.CLIENT_PORT}");`,
env: BASE_ENV, env: BASE_ENV,
cypressEnv: { cypressEnv: {

View File

@@ -23,8 +23,8 @@ if (!BASE_ENV.PREMIUM_EMBEDDING_TOKEN) {
} }
const BASE_SETUP_CONFIG = { const BASE_SETUP_CONFIG = {
"docker-up-command": "yarn docker:local-dist:up", "docker-up-command": "bun run docker:local-dist:up",
"docker-down-command": "yarn docker:rm", "docker-down-command": "bun run docker:rm",
"docker-env-example-path": ".env.docker.example", "docker-env-example-path": ".env.docker.example",
"docker-env-path": ".env.docker", "docker-env-path": ".env.docker",
defaultBranch: BRANCH_NAME, defaultBranch: BRANCH_NAME,

View File

@@ -76,7 +76,7 @@ const init = async () => {
printBold("⚠️ Your backend is already running"); printBold("⚠️ Your backend is already running");
console.log(`If tests fail or if something doesn't work: console.log(`If tests fail or if something doesn't work:
- Kill the pid ${backendPid} - Kill the pid ${backendPid}
- Run *yarn test-cypress* again - Run *bun run test-cypress* again
- This will spin up the live backend with the correct settings for e2e tests - This will spin up the live backend with the correct settings for e2e tests
`); `);
} else { } else {
@@ -113,7 +113,7 @@ const init = async () => {
!runningFromJar !runningFromJar
) { ) {
printBold( printBold(
`⚠️⚠️ You don't have your frontend running on port ${frontendPort}. You should probably run yarn build-hot ⚠️⚠️`, `⚠️⚠️ You don't have your frontend running on port ${frontendPort}. You should probably run bun run build-hot ⚠️⚠️`,
); );
} }

View File

@@ -28,7 +28,11 @@ module.exports = {
...mainConfig.resolve.alias, ...mainConfig.resolve.alias,
...(embeddingSdkPath ? { [SDK_PACKAGE_NAME]: embeddingSdkPath } : null), ...(embeddingSdkPath ? { [SDK_PACKAGE_NAME]: embeddingSdkPath } : null),
}, },
fallback: { path: false, fs: false }, // FIXME: this might break file download tests, we might need to implement this properly fallback: {
path: false,
fs: false,
querystring: require.resolve("querystring-es3"),
}, // FIXME: this might break file download tests, we might need to implement this properly
}, },
entry: [path.join(__dirname, "src", "index.js")], entry: [path.join(__dirname, "src", "index.js")],
output: { output: {

View File

@@ -88,10 +88,10 @@ describe("scenarios > embedding-sdk > interactive-question", () => {
); );
getSdkRoot().within(() => { getSdkRoot().within(() => {
cy.findByTestId("native-query-editor").should("be.visible"); cy.findByTestId("native-query-editor")
cy.findByLabelText("placeholder SELECT * FROM TABLE_NAME").should( .should("be.visible")
"be.visible", .find(".cm-placeholder")
); .should("be.visible");
cy.wait("@schema"); cy.wait("@schema");

View File

@@ -1338,7 +1338,7 @@ describe("issue 50373", () => {
url: /^\/app\/dist\/(.*)\.js$/, url: /^\/app\/dist\/(.*)\.js$/,
}, },
(req) => { (req) => {
// When running in development (e.g. with `yarn dev`), // When running in development (e.g. with `bun run dev`),
// the *.hot.bundle.js hot-reloaded file is served by the dev server. // the *.hot.bundle.js hot-reloaded file is served by the dev server.
if (req.url.includes("hot.bundle.js")) { if (req.url.includes("hot.bundle.js")) {
return; return;

View File

@@ -12,7 +12,9 @@
], ],
"paths": { "paths": {
"e2e/*": ["./*"], "e2e/*": ["./*"],
"@metabase/embedding-sdk-react": ["../enterprise/frontend/src/embedding-sdk-package/index.ts"], "@metabase/embedding-sdk-react": [
"../enterprise/frontend/src/embedding-sdk-package/index.ts"
],
"*": ["../frontend/src/*"] "*": ["../frontend/src/*"]
} }
}, },

View File

@@ -14,10 +14,10 @@ Unless otherwise noted, all files Copyright © 2024 Metabase, Inc.
### Front-end ### Front-end
```sh ```sh
MB_EDITION=ee yarn build-hot MB_EDITION=ee bun run build-hot
``` ```
Clear the Webpack cache using `yarn remove-webpack-cache` if you previously ran OSS edition in dev mode to avoid unexpected application behavior. Clear the Webpack cache using `bun run remove-webpack-cache` if you previously ran OSS edition in dev mode to avoid unexpected application behavior.
### Back-end ### Back-end

View File

@@ -8,8 +8,8 @@ Code in this directory should carefully reference external code, including code
## Build ## Build
You can build the SDK NPM package with `yarn build-embedding-sdk-package`. You can build the SDK NPM package with `bun run build-embedding-sdk-package`.
You can build the SDK bundle with `yarn build-release:embedding-sdk-bundle` You can build the SDK bundle with `bun run build-release:embedding-sdk-bundle`
#### embedding-sdk:dev #### embedding-sdk:dev
@@ -36,7 +36,7 @@ Storybook expects an instance running on `localhost:3000` with some configuratio
- on [/admin/embedding/modular](http://localhost:3000/admin/embedding/modular) - on [/admin/embedding/modular](http://localhost:3000/admin/embedding/modular)
- Enable the "SDK for React" card - Enable the "SDK for React" card
Then you can run `yarn storybook-embedding-sdk` to start storybook. Then you can run `bun run storybook-embedding-sdk` to start storybook.
Storybook will use the source files and not the built package. Storybook will use the source files and not the built package.
@@ -62,10 +62,10 @@ We recommend running either the dev or the watch command to have shorter a feedb
To start the cypress for the e2e tests: To start the cypress for the e2e tests:
```bash ```bash
CYPRESS_TESTING_TYPE="component" yarn test-cypress CYPRESS_TESTING_TYPE="component" bun run test-cypress
``` ```
Then in a separate terminal run `yarn embedding-sdk:dev` to build SDK NPM package and SDK bundle in the `watch` mode. Then in a separate terminal run `bun run embedding-sdk:dev` to build SDK NPM package and SDK bundle in the `watch` mode.
### Sample Apps compatibility with Embedding SDK tests ### Sample Apps compatibility with Embedding SDK tests
@@ -78,13 +78,13 @@ Define one of the following environment variables with enterprise token: `CYPRES
To run these tests locally, run: To run these tests locally, run:
``` ```
SDK_TEST_SUITE=<sample_app_repo_name>-e2e yarn test-cypress-host-sample-apps SDK_TEST_SUITE=<sample_app_repo_name>-e2e bun run test-cypress-host-sample-apps
``` ```
For example for the `metabase-nodejs-react-sdk-embedding-sample`, run: For example for the `metabase-nodejs-react-sdk-embedding-sample`, run:
``` ```
SDK_TEST_SUITE=metabase-nodejs-react-sdk-embedding-sample-e2e yarn test-cypress-host-sample-apps SDK_TEST_SUITE=metabase-nodejs-react-sdk-embedding-sample-e2e bun run test-cypress-host-sample-apps
``` ```
##### :warning: Obtaining the Shoppy's Metabase App DB Dump locally ##### :warning: Obtaining the Shoppy's Metabase App DB Dump locally
@@ -130,13 +130,13 @@ Tests a bit similar to Sample App tests, but:
To run these tests locally, run: To run these tests locally, run:
``` ```
ENTERPRISE_TOKEN=<token> SDK_TEST_SUITE=<host_app_name>-e2e HOST_APP_ENVIRONMENT=production yarn test-cypress-host-sample-apps ENTERPRISE_TOKEN=<token> SDK_TEST_SUITE=<host_app_name>-e2e HOST_APP_ENVIRONMENT=production bun run test-cypress-host-sample-apps
``` ```
For example for the `vite-6-host-app` Host App, run: For example for the `vite-6-host-app` Host App, run:
``` ```
ENTERPRISE_TOKEN=<token> SDK_TEST_SUITE=vite-6-host-app-e2e HOST_APP_ENVIRONMENT=production yarn test-cypress-host-sample-apps ENTERPRISE_TOKEN=<token> SDK_TEST_SUITE=vite-6-host-app-e2e HOST_APP_ENVIRONMENT=production bun run test-cypress-host-sample-apps
``` ```
#### CI runs #### CI runs

View File

@@ -0,0 +1,82 @@
// @ts-check
/* eslint-env node */
const path = require("path");
const { IS_DEV_MODE } = require("../constants");
const ROOT_PATH = path.resolve(__dirname, "../../../..");
const ASSETS_PATH = ROOT_PATH + "/resources/frontend_client/app/assets";
const FONTS_PATH = ROOT_PATH + "/resources/frontend_client/app/fonts";
const IMAGES_PATH = ROOT_PATH + "/resources/frontend_client/app/img";
const DOCS_PATH = ROOT_PATH + "/docs";
const FRONTEND_BUILD_CONFIGS_PATH = ROOT_PATH + "/frontend/build";
const SRC_PATH = ROOT_PATH + "/frontend/src/metabase";
const LIB_SRC_PATH = ROOT_PATH + "/frontend/src/metabase-lib";
const ENTERPRISE_SRC_PATH =
ROOT_PATH + "/enterprise/frontend/src/metabase-enterprise";
const EMBEDDING_SRC_PATH = ROOT_PATH + "/enterprise/frontend/src/embedding";
const SDK_PACKAGE_SRC_PATH =
ROOT_PATH + "/enterprise/frontend/src/embedding-sdk-package";
const SDK_BUNDLE_SRC_PATH = ROOT_PATH + "/frontend/src/embedding-sdk-bundle";
const SDK_SHARED_SRC_PATH = ROOT_PATH + "/frontend/src/embedding-sdk-shared";
const TYPES_SRC_PATH = ROOT_PATH + "/frontend/src/metabase-types";
const CLJS_SRC_PATH = ROOT_PATH + "/target/cljs_release";
const CLJS_SRC_PATH_DEV = ROOT_PATH + "/target/cljs_dev";
const TEST_SUPPORT_PATH = ROOT_PATH + "/frontend/test/__support__";
const E2E_PATH = ROOT_PATH + "/e2e";
const isDevMode = IS_DEV_MODE;
const resolveEnterprisePathOrNoop = (subpath) =>
process.env.MB_EDITION === "ee"
? ENTERPRISE_SRC_PATH + subpath
: SRC_PATH + "/lib/noop";
/**
* Shared resolve aliases used by both rspack.main.config.js and
* e2e/support/component-webpack.config.js
*/
const RESOLVE_ALIASES = {
"build-configs": FRONTEND_BUILD_CONFIGS_PATH,
assets: ASSETS_PATH,
img: IMAGES_PATH,
fonts: FONTS_PATH,
docs: DOCS_PATH,
metabase: SRC_PATH,
"metabase-lib": LIB_SRC_PATH,
"metabase-enterprise": ENTERPRISE_SRC_PATH,
"metabase-types": TYPES_SRC_PATH,
"metabase-dev": `${SRC_PATH}/dev${isDevMode ? "" : "-noop"}.ts`,
cljs: isDevMode ? CLJS_SRC_PATH_DEV : CLJS_SRC_PATH,
__support__: TEST_SUPPORT_PATH,
e2e: E2E_PATH,
style: SRC_PATH + "/css/core/index",
// NOTE @kdoh - 7/24/18
// icepick 2.x is es6 by default, to maintain backwards compatibility
// with ie11 point to the minified version
icepick: ROOT_PATH + "/node_modules/icepick/icepick.min",
// conditionally load either the EE plugins file or a empty file in the CE code tree
"ee-plugins":
process.env.MB_EDITION === "ee"
? ENTERPRISE_SRC_PATH + "/plugins"
: SRC_PATH + "/plugins/noop",
"ee-overrides": resolveEnterprisePathOrNoop("/overrides"),
embedding: EMBEDDING_SRC_PATH,
"embedding-sdk-package": SDK_PACKAGE_SRC_PATH,
"embedding-sdk-bundle": SDK_BUNDLE_SRC_PATH,
"embedding-sdk-shared": SDK_SHARED_SRC_PATH,
"sdk-iframe-embedding-ee-plugins": resolveEnterprisePathOrNoop(
"/sdk-iframe-embedding-plugins",
),
"sdk-iframe-embedding-script-ee-plugins": resolveEnterprisePathOrNoop(
"/sdk-iframe-embedding-script-plugins",
),
"sdk-ee-plugins":
process.env.MB_EDITION === "ee"
? ENTERPRISE_SRC_PATH + "/sdk-plugins"
: SRC_PATH + "/plugins/noop",
"sdk-specific-imports": SRC_PATH + "/lib/noop",
};
module.exports = { RESOLVE_ALIASES };

View File

@@ -90,6 +90,10 @@ module.exports = {
}), }),
}, },
extensions: appConfig.resolve.extensions, extensions: appConfig.resolve.extensions,
fallback: {
...storybookConfig.resolve?.fallback,
...appConfig.resolve?.fallback,
},
}, },
}), }),
}; };

View File

@@ -1,6 +1,6 @@
// This runs in the Nashorn JavaScript engine and there are some limitations // This runs in the Nashorn JavaScript engine and there are some limitations
// //
// 1. This is not currently automatically built with the rest of the application, please run `yarn build-shared` after modifying // 1. This is not currently automatically built with the rest of the application, please run `bun run build-shared` after modifying
// 2. Avoid including unnecessary libraries as the JS engine takes a long time to parse and execute them // 2. Avoid including unnecessary libraries as the JS engine takes a long time to parse and execute them
// 3. Related to #2, we aren't currently including `core-js` so don't use features that require it, e.x. iterables / for-of // 3. Related to #2, we aren't currently including `core-js` so don't use features that require it, e.x. iterables / for-of

View File

@@ -1,7 +1,7 @@
.Container { .Container {
/* /*
Because this variable is defined dynamically in `PreviewPane.tsx`, we need to define Because this variable is defined dynamically in `PreviewPane.tsx`, we need to define
this variable here otherwise `yarn find-never-defined-css-variables` would fail. this variable here otherwise `bun run find-never-defined-css-variables` would fail.
*/ */
--background-url: ; --background-url: ;

View File

@@ -22,11 +22,12 @@ export const CustomCodeBlock = CodeBlock.extend({
language: { language: {
default: this.options.defaultLanguage, default: this.options.defaultLanguage,
parseHTML: (element: HTMLElement) => { parseHTML: (element: HTMLElement) => {
const { languageClassPrefix } = this.options; const prefix =
this.options.languageClassPrefix ?? languageClassPrefix;
const classNames = [...(element.firstElementChild?.classList || [])]; const classNames = [...(element.firstElementChild?.classList || [])];
const languages = classNames const languages = classNames
.filter((className) => className.startsWith(languageClassPrefix)) .filter((className) => className.startsWith(prefix))
.map((className) => className.replace(languageClassPrefix, "")); .map((className) => className.replace(prefix, ""));
const language = languages[0]; const language = languages[0];
if (!language) { if (!language) {

Some files were not shown because too many files have changed in this diff Show More