diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..f685d9b --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,3 @@ +# Changesets + +Run `pnpm changeset` to describe a change. See https://github.com/changesets/changesets. diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..319f163 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@4.0.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.changeset/solid-2-support.md b/.changeset/solid-2-support.md new file mode 100644 index 0000000..600988d --- /dev/null +++ b/.changeset/solid-2-support.md @@ -0,0 +1,9 @@ +--- +'@solidjs/ogp': minor +--- + +- Support Solid 2.0. `solid-js` and `@solidjs/web` 2.0 are peer dependencies, and `@solidjs/meta` is no longer one. +- `DynamicImage` compiles to Solid 2.0 server functions (`@solidjs/vite-plugin` with `serverFunctions` on). The `runtime` value `SolidStart` is now `Solid`. +- `OpenGraph` adds its `og:image` tag with `useHead` from `@solidjs/web`. +- `parseSolidJSX` reads Solid 2.0 server-rendered templates and removes every hydration key. +- Node 22 or later is required. diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..7314c64 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,46 @@ +name: Check + +on: + pull_request: + # ready_for_review runs the check when a draft is marked ready. + types: [opened, synchronize, reopened, ready_for_review] + # Roadmaps, debates, proposals and decisions are not build inputs. + paths-ignore: ['docs/**'] + push: + branches: [main] + paths-ignore: ['docs/**'] + +# A new push cancels the older run of the same pull request. Runs on main are never cancelled. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +permissions: + contents: read + +jobs: + check: + name: Check (Node ${{ matrix.node }}) + # Drafts are still in review. Skip them so review fixes do not use CI minutes. + if: ${{ !github.event.pull_request.draft }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node: [22, 24] + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: ${{ matrix.node }} + package-manager-cache: false + - run: pnpm install --frozen-lockfile + # Type-aware lint and the typecheck read the built declarations of workspace packages. + - run: pnpm build + - run: pnpm lint + - run: pnpm format:check + - run: pnpm typecheck + - run: pnpm test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..fde9dde --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,105 @@ +name: Release + +on: + push: + branches: + - main + # docs/ holds no build inputs and no changesets. + paths-ignore: ['docs/**'] + +# Only one release runs at a time. +concurrency: ${{ github.workflow }}-${{ github.ref }} + +# Each job asks for the permissions it needs. +permissions: {} + +jobs: + select-mode: + name: Select mode + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + mode: ${{ steps.select.outputs.mode }} + publish-plan-artifact-id: ${{ steps.select.outputs.publish-plan-artifact-id }} + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: 24 + package-manager-cache: false + - run: pnpm install --frozen-lockfile + - id: select + uses: changesets/action/select-mode@v2 + + version: + name: Create the version pull request + needs: select-mode + if: needs.select-mode.outputs.mode == 'version' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: 24 + package-manager-cache: false + - run: pnpm install --frozen-lockfile + - uses: changesets/action/version@v2 + + pack: + name: Build and pack + needs: select-mode + if: needs.select-mode.outputs.mode == 'publish' + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + pack-dir-artifact-id: ${{ steps.pack.outputs.pack-dir-artifact-id }} + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: 24 + package-manager-cache: false + - run: pnpm install --frozen-lockfile + - run: pnpm build + - run: pnpm test + - id: pack + uses: changesets/action/pack@v2 + with: + publish-plan-artifact-id: ${{ needs.select-mode.outputs.publish-plan-artifact-id }} + + publish: + name: Publish to npm + needs: pack + runs-on: ubuntu-latest + permissions: + contents: write + # Trusted publishing to npm. + id-token: write + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: 24 + package-manager-cache: false + - run: pnpm install --frozen-lockfile + - uses: changesets/action/publish@v2 + with: + pack-dir-artifact-id: ${{ needs.pack.outputs.pack-dir-artifact-id }} + create-github-releases: true diff --git a/.gitignore b/.gitignore index 1170717..6333e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,136 +1,9 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul +node_modules +dist coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' +*.log +.DS_Store +.vercel +.claude/ +.env* *.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index b2095be..0000000 --- a/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "semi": false, - "singleQuote": true -} diff --git a/README.md b/README.md index e54668b..fc08119 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,13 @@ pnpm install @solidjs/ogp ### Usage ```tsx -import { Title } from '@solidjs/meta' -import Counter from '~/components/Counter' -import { DynamicImage, Image } from '@solidjs/ogp' -import { createSignal } from 'solid-js' +import { Title } from '@solidjs/meta'; +import Counter from '~/components/Counter'; +import { DynamicImage, Image } from '@solidjs/ogp'; +import { createSignal } from 'solid-js'; export default function Home() { - const [count, setCount] = createSignal(0) + const [count, setCount] = createSignal(0); return ( Hello World @@ -41,6 +41,6 @@ export default function Home() { - ) + ); } -``` \ No newline at end of file +``` diff --git a/oxfmt.config.ts b/oxfmt.config.ts new file mode 100644 index 0000000..afa5699 --- /dev/null +++ b/oxfmt.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'oxfmt'; + +export default defineConfig({ + singleQuote: true, + // Compiler fixtures are test data: their outputs must match the compiler byte for byte. + ignorePatterns: ['**/tests/fixtures/**'], +}); diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000..b9109f8 --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,9 @@ +import config from '@lxsmnsyc/oxlint-config'; +import { defineConfig } from 'oxlint'; + +export default defineConfig({ + extends: [config], + // Compiler fixtures are test data: their outputs must match the compiler byte for byte. + // Agent worktrees under .claude/ hold other branches' work in progress. + ignorePatterns: ['dist/**', '**/tests/fixtures/**', '.claude/**'], +}); diff --git a/package.json b/package.json index d8758dc..0c7b2f0 100644 --- a/package.json +++ b/package.json @@ -1,130 +1,28 @@ { - "name": "@solidjs/ogp", - "version": "0.0.0", - "description": "An Open Graph / Dynamic image utility library for Solid.", + "name": "root", + "private": true, "type": "module", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/solidjs/solid-ogp.git" - }, - "bugs": { - "url": "https://github.com/solidjs/solid-ogp/issues" - }, - "homepage": "https://github.com/solidjs/solid-ogp#readme", - "publishConfig": { - "access": "public" - }, - "files": [ - "dist" - ], - "types": "./dist/index.d.ts", - "engines": { - "node": ">=20" - }, - "exports": { - ".": { - "development": { - "types": "./dist/dev/index.d.ts", - "default": "./dist/dev/index.jsx" - }, - "types": "./dist/index.d.ts", - "default": "./dist/index.jsx" - }, - "./server": { - "development": { - "import": { - "types": "./dist/dev/server.d.ts", - "default": "./dist/dev/server.js" - }, - "require": { - "types": "./dist/dev/server.d.cts", - "default": "./dist/dev/server.cjs" - } - }, - "import": { - "types": "./dist/server.d.ts", - "default": "./dist/server.js" - }, - "require": { - "types": "./dist/server.d.cts", - "default": "./dist/server.cjs" - } - }, - "./unplugin": { - "development": { - "import": { - "types": "./dist/dev/unplugin.d.ts", - "default": "./dist/dev/unplugin.js" - }, - "require": { - "types": "./dist/dev/unplugin.d.cts", - "default": "./dist/dev/unplugin.cjs" - } - }, - "import": { - "types": "./dist/unplugin.d.ts", - "default": "./dist/unplugin.js" - }, - "require": { - "types": "./dist/unplugin.d.cts", - "default": "./dist/unplugin.cjs" - } - }, - "./package.json": "./package.json" - }, - "typesVersions": { - "*": { - "server": [ - "./dist/server.d.ts" - ], - "unplugin": [ - "./dist/unplugin.d.ts" - ] - } - }, "scripts": { - "build": "tsdown", - "watch": "tsdown --watch", - "typecheck": "tsc --noEmit", - "lint:pkg": "tsdown --publint --attw", - "test": "vitest run", - "cs:ver": "changeset version", - "cs:pub": "changeset publish", - "cs:add": "changeset add" + "build": "pnpm -r --filter=./packages/* build", + "test": "pnpm -r --filter=./packages/* test", + "typecheck": "pnpm -r typecheck", + "lint": "oxlint --type-aware", + "lint:fix": "oxlint --type-aware --fix", + "format": "oxfmt", + "format:check": "oxfmt --check", + "changeset": "changeset", + "version": "changeset version" }, - "keywords": [ - "solid", - "solid-js", - "open-graph", - "og-image", - "satori" - ], - "author": "", "devDependencies": { - "@arethetypeswrong/core": "^0.18.5", - "@babel/preset-typescript": "^7.27.0", - "@changesets/cli": "^2.31.1", - "@solidjs/meta": "^0.29.4", - "@types/babel__core": "^7.20.5", - "@types/node": "^26.2.0", - "babel-plugin-tester": "^12.0.0", - "publint": "^0.3.23", - "solid-js": "^1.9.14", - "tsdown": "^0.22.14", - "tslib": "^2.8.1", - "typescript": "^7.0.2", - "vitest": "^4.1.10" + "@changesets/cli": "^3.0.3", + "@lxsmnsyc/oxlint-config": "^0.1.3", + "oxfmt": "^0.78.0", + "oxlint": "^1.93.0", + "oxlint-tsgolint": "^7.0.2006", + "typescript": "^7.0.2" }, - "dependencies": { - "@babel/core": "^7.28.0", - "@solid-mediakit/shared": "^0.0.6", - "@vercel/og": "^1.0.1", - "satori-html": "^0.3.2", - "unplugin": "^3.3.0" + "engines": { + "node": ">=22" }, - "peerDependencies": { - "@solidjs/meta": "^0.29.4", - "solid-js": "^1" - } + "packageManager": "pnpm@12.18.0" } diff --git a/packages/ogp/README.md b/packages/ogp/README.md new file mode 100644 index 0000000..fc08119 --- /dev/null +++ b/packages/ogp/README.md @@ -0,0 +1,46 @@ +# @solidjs/ogp + +An Open Graph / Dynamic image utility library for Solid. + +### Installation + +``` +pnpm install @solidjs/ogp +``` + +### Usage + +```tsx +import { Title } from '@solidjs/meta'; +import Counter from '~/components/Counter'; +import { DynamicImage, Image } from '@solidjs/ogp'; +import { createSignal } from 'solid-js'; + +export default function Home() { + const [count, setCount] = createSignal(0); + return ( + + Hello World + Hello world! + + + + + {`Hello ${count() * 2}!`} + + + + + ); +} +``` diff --git a/packages/ogp/package.json b/packages/ogp/package.json new file mode 100644 index 0000000..369fd93 --- /dev/null +++ b/packages/ogp/package.json @@ -0,0 +1,127 @@ +{ + "name": "@solidjs/ogp", + "version": "0.0.0", + "description": "An Open Graph / Dynamic image utility library for Solid.", + "keywords": [ + "og-image", + "open-graph", + "satori", + "solid", + "solid-js" + ], + "homepage": "https://github.com/solidjs/solid-ogp/tree/main/packages/ogp#readme", + "bugs": { + "url": "https://github.com/solidjs/solid-ogp/issues" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/solidjs/solid-ogp.git", + "directory": "packages/ogp" + }, + "files": [ + "dist" + ], + "type": "module", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "server": [ + "./dist/server.d.ts" + ], + "unplugin": [ + "./dist/unplugin.d.ts" + ] + } + }, + "exports": { + ".": { + "development": { + "types": "./dist/dev/index.d.ts", + "default": "./dist/dev/index.jsx" + }, + "types": "./dist/index.d.ts", + "default": "./dist/index.jsx" + }, + "./server": { + "development": { + "import": { + "types": "./dist/dev/server.d.ts", + "default": "./dist/dev/server.js" + }, + "require": { + "types": "./dist/dev/server.d.cts", + "default": "./dist/dev/server.cjs" + } + }, + "import": { + "types": "./dist/server.d.ts", + "default": "./dist/server.js" + }, + "require": { + "types": "./dist/server.d.cts", + "default": "./dist/server.cjs" + } + }, + "./unplugin": { + "development": { + "import": { + "types": "./dist/dev/unplugin.d.ts", + "default": "./dist/dev/unplugin.js" + }, + "require": { + "types": "./dist/dev/unplugin.d.cts", + "default": "./dist/dev/unplugin.cjs" + } + }, + "import": { + "types": "./dist/unplugin.d.ts", + "default": "./dist/unplugin.js" + }, + "require": { + "types": "./dist/unplugin.d.cts", + "default": "./dist/unplugin.cjs" + } + }, + "./package.json": "./package.json" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsdown", + "watch": "tsdown --watch", + "typecheck": "tsc --noEmit", + "lint:pkg": "tsdown --publint --attw", + "test": "vitest run" + }, + "dependencies": { + "@babel/core": "^7.28.0", + "@solid-mediakit/shared": "^0.0.6", + "@vercel/og": "^1.0.1", + "satori-html": "^0.3.2", + "unplugin": "^3.3.0" + }, + "devDependencies": { + "@arethetypeswrong/core": "^0.18.5", + "@babel/preset-typescript": "^7.27.0", + "@solidjs/vite-plugin": "3.0.0-next.27", + "@solidjs/web": "2.0.0-rc.21", + "@types/babel__core": "^7.20.5", + "@types/node": "^26.2.0", + "babel-plugin-tester": "^12.0.0", + "publint": "^0.3.23", + "solid-js": "2.0.0-rc.21", + "tsdown": "^0.22.14", + "tslib": "^2.8.1", + "typescript": "^7.0.2", + "vitest": "^4.1.10" + }, + "peerDependencies": { + "@solidjs/web": "^2.0.0-rc.21", + "solid-js": "^2.0.0-rc.21" + }, + "engines": { + "node": ">=22" + } +} diff --git a/packages/ogp/src/compiler/index.ts b/packages/ogp/src/compiler/index.ts new file mode 100644 index 0000000..9caf6ac --- /dev/null +++ b/packages/ogp/src/compiler/index.ts @@ -0,0 +1,36 @@ +import type babel from '@babel/core'; +import type { PluginObj } from '@babel/core'; +import { babel as babelUtils } from '@solid-mediakit/shared'; +import { addDynamicImages, addDynamicImagesTanstack, replaceDynamicImages } from './utils'; + +/** + * Which server function runtime the compiled output targets. `Solid` is Solid + * 2.0's own, compiled by @solidjs/vite-plugin with `serverFunctions` on. + */ +export type Runtime = 'Solid' | 'TanstackStart'; + +type PluginFactory = (api: { types: typeof babel.types }) => PluginObj; + +export function transformOG(runtime?: Runtime): PluginFactory { + return ({ types: t }) => ({ + visitor: { + Program(path) { + const dynamicImages = replaceDynamicImages(t, path); + if (dynamicImages.length === 0) { + return; + } + babelUtils.importIfNotThere(path, t, 'createMemo', 'solid-js'); + babelUtils.importIfNotThere(path, t, 'createOpenGraphImage', '@solidjs/ogp/server'); + if (runtime === 'TanstackStart') { + addDynamicImagesTanstack(dynamicImages, t, path); + return; + } + // Solid 2.0 server functions: GET declares a read with a url, + // and serverFunctionUrl builds that url with the arguments. + babelUtils.importIfNotThere(path, t, 'GET', '@solidjs/web/server-functions'); + babelUtils.importIfNotThere(path, t, 'serverFunctionUrl', '@solidjs/web/server-functions'); + addDynamicImages(dynamicImages, t, path); + }, + }, + }); +} diff --git a/packages/ogp/src/compiler/utils.ts b/packages/ogp/src/compiler/utils.ts new file mode 100644 index 0000000..f0ca09e --- /dev/null +++ b/packages/ogp/src/compiler/utils.ts @@ -0,0 +1,226 @@ +import * as babel from '@babel/core'; +import { babel as babelUtils } from '@solid-mediakit/shared'; + +type Types = typeof babel.types; + +export interface DynamicImage { + element: babel.types.JSXElement; + reactives: number; + imageOptions?: babel.types.ObjectExpression; +} + +function extractChild(t: Types, element: babel.types.JSXElement): babel.types.JSXElement | null { + const elementChildren: babel.types.JSXElement[] = []; + for (const child of element.children) { + if (t.isJSXElement(child)) { + elementChildren.push(child); + } + } + if (elementChildren.length === 0) { + return null; + } + if (elementChildren.length === 1) { + return elementChildren[0]; + } + // Satori needs one root, so wrap several children in a div. + return t.jsxElement( + t.jsxOpeningElement(t.jsxIdentifier('div'), []), + t.jsxClosingElement(t.jsxIdentifier('div')), + elementChildren, + false, + ); +} + +function extractImageOptions( + element: babel.types.JSXElement, +): babel.types.ObjectExpression | undefined { + const attributes = element.openingElement.attributes; + for (let index = 0; index < attributes.length; index++) { + const attr = attributes[index]; + if (attr.type !== 'JSXAttribute' || attr.name.name !== 'imageOptions') { + continue; + } + // Only an inline object literal can move to the server function. + if ( + attr.value?.type !== 'JSXExpressionContainer' || + attr.value.expression.type !== 'ObjectExpression' + ) { + return undefined; + } + attributes.splice(index, 1); + return attr.value.expression; + } + return undefined; +} + +/** + * Replaces each expression that may change between renders with `r`, and + * returns the replaced expressions in order. They become the server function's + * arguments. + */ +export function extractAndReplaceReactives( + t: Types, + elementPath: babel.NodePath, +): babel.types.Expression[] { + const reactives: babel.types.Expression[] = []; + + function replaceExpression( + path: babel.NodePath< + babel.types.CallExpression | babel.types.MemberExpression | babel.types.Identifier + >, + ): void { + const expr = path.node; + path.replaceWith(t.identifier(`r${reactives.length}`)); + reactives.push(t.cloneNode(expr)); + path.skip(); + } + + elementPath.traverse({ + Property(path) { + if (path.node.type === 'ClassPrivateProperty') { + return; + } + // A computed key is an expression. A plain key is a static name. + const key = path.node.key; + if (path.node.computed && key.type !== 'PrivateName') { + path.node.key = t.identifier(`r${reactives.length}`); + reactives.push(t.cloneNode(key)); + } + path.skip(); + }, + // Any call could return a different value. + CallExpression: replaceExpression, + // Replace the whole access rather than descending into it, otherwise the + // property names of `a.b.c` are each extracted as their own reactive. + MemberExpression: replaceExpression, + Identifier: replaceExpression, + }); + return reactives; +} + +export function replaceDynamicImages( + t: Types, + programPath: babel.NodePath, +): DynamicImage[] { + const images: DynamicImage[] = []; + programPath.traverse({ + JSXElement(elementPath) { + const name = elementPath.node.openingElement.name; + if (!t.isJSXIdentifier(name) || name.name !== 'DynamicImage') { + return; + } + const imageOptions = extractImageOptions(elementPath.node); + const reactives = extractAndReplaceReactives(t, elementPath); + const child = extractChild(t, elementPath.node); + if (!child) { + throw new Error('DynamicImage must have a child element'); + } + images.push({ + reactives: reactives.length, + element: t.cloneNode(child), + imageOptions, + }); + + // Call the generated component with the reactive values. + const call = t.callExpression(t.identifier(`DynamicImage${images.length}`), [ + t.objectExpression([ + t.objectProperty(t.identifier('values'), t.arrayExpression(reactives)), + ]), + ]); + const parent = elementPath.parentPath; + elementPath.replaceWith( + parent.isJSXElement() || parent.isJSXFragment() + ? t.jsxExpressionContainer(call) + : t.expressionStatement(call), + ); + }, + }); + return images; +} + +/** Creates `const [r0, r1, ...] = args`, or null when there are no arguments. */ +export function createArgumentDeclaration( + t: Types, + image: DynamicImage, +): babel.types.VariableDeclaration | null { + if (image.reactives === 0) { + return null; + } + const args: babel.types.Identifier[] = []; + for (let i = 0; i < image.reactives; i++) { + args.push(t.identifier(`r${i}`)); + } + return t.variableDeclaration('const', [ + t.variableDeclarator(t.arrayPattern(args), t.identifier('args')), + ]); +} + +function pushDynamicImages( + images: DynamicImage[], + t: Types, + programPath: babel.NodePath, + template: ( + replacements: Record, + ) => babel.types.Statement | babel.types.Statement[], +): void { + for (let i = 0; i < images.length; i++) { + const image = images[i]; + babelUtils.pushStmts( + template({ + compName: `DynamicImage${i + 1}`, + serverFnName: `DynamicImage${i + 1}ServerFunction`, + jsx: image.element, + args: createArgumentDeclaration(t, image), + imageOptions: image.imageOptions, + }), + programPath, + true, + ); + } +} + +/** Adds the server functions and url components for Solid 2.0 server functions. */ +export function addDynamicImages( + images: DynamicImage[], + t: Types, + programPath: babel.NodePath, +): void { + const template = babel.template( + `const %%serverFnName%% = GET((...args)=>{ + 'use server'; + %%args%% + return createOpenGraphImage(%%jsx%%, %%imageOptions%%); + }); + const %%compName%% = (props)=>{ + const url = createMemo(()=>serverFunctionUrl(%%serverFnName%%, ...props.values)); + return url; + };`, + { plugins: ['jsx'] }, + ); + pushDynamicImages(images, t, programPath, template); +} + +/** Adds the server functions and url components for TanStack Start. */ +export function addDynamicImagesTanstack( + images: DynamicImage[], + t: Types, + programPath: babel.NodePath, +): void { + const template = babel.template( + `const %%serverFnName%% = createServerFn({ + method: "GET", + response: "raw", + }).handler((ctx) => { + const args = ctx.data.values; + %%args%% + return createOpenGraphImage(%%jsx%%, %%imageOptions%%); + }) + const %%compName%% = (props) => { + const payload = () => ({"data":{"values":props.values},"context":{}}) + const url = createMemo(() => \`\${%%serverFnName%%.url}?payload=\${encodeURIComponent(JSON.stringify(payload()))}&createServerFn&raw\`) + return url + } + `, + ); + pushDynamicImages(images, t, programPath, template); +} diff --git a/packages/ogp/src/index.tsx b/packages/ogp/src/index.tsx new file mode 100644 index 0000000..b364b21 --- /dev/null +++ b/packages/ogp/src/index.tsx @@ -0,0 +1,46 @@ +import type { JSX } from '@solidjs/web'; +import { useHead } from '@solidjs/web'; +import type { ImageResponseOptions } from '@vercel/og'; +import type { ParentProps } from 'solid-js'; +import { children, createMemo, flatten } from 'solid-js'; + +export interface DynamicImageProps { + children: JSX.Element | (() => JSX.Element | Promise); + imageOptions?: ImageResponseOptions; +} + +export function DynamicImage(_props: DynamicImageProps): JSX.Element { + throw new Error('This should be compiled away'); +} + +/** The compiled `DynamicImage` resolves to the url of its image. */ +function readUrl(value: unknown): string { + return typeof value === 'string' ? value : ''; +} + +export function Image(props: ParentProps): JSX.Element { + const child = children(() => props.children); + const url = createMemo(() => readUrl(child())); + return ; +} + +export function OpenGraph(props: ParentProps<{ origin: string }>): JSX.Element { + const child = children(() => props.children); + const url = createMemo(() => readUrl(child())); + // The head registry reads the getter, so the tag follows the url. + useHead({ + tag: 'meta', + props: { + property: 'og:image', + get content(): string { + return props.origin + url(); + }, + }, + }); + return null; +} + +export function urlFromImage(comp: JSX.Element): () => string { + // The compiler turns `DynamicImage` into an accessor of its url. + return () => readUrl(flatten(comp)); +} diff --git a/packages/ogp/src/server/index.ts b/packages/ogp/src/server/index.ts new file mode 100644 index 0000000..25957e9 --- /dev/null +++ b/packages/ogp/src/server/index.ts @@ -0,0 +1,84 @@ +import type { JSX } from '@solidjs/web'; +import { ImageResponse } from '@vercel/og'; +import type { ImageResponseOptions } from '@vercel/og'; +import { html } from 'satori-html'; + +/** + * The object Solid's SSR compiler returns for a template. `t` is a string, or + * a list of strings when the template has holes, with `h` holding the holes + * that still have to resolve. + */ +export interface SSRTemplate { + t: string | string[]; + h?: unknown[]; +} + +export type OpenGraphSource = + | string + | JSX.Element + | SSRTemplate + | (() => string | JSX.Element | SSRTemplate | Promise); + +export type SatoriNode = ReturnType; + +// Solid 2.0 marks hydrated elements with `_hk=`. satori does not need it. +const HYDRATION_KEY = /\s_hk=[^\s>]*/g; + +function isSSRTemplate(value: unknown): value is SSRTemplate { + return typeof value === 'object' && value !== null && Object.hasOwn(value, 't'); +} + +function readTemplate(template: SSRTemplate): string { + if (typeof template.t === 'string') { + return template.t; + } + if (template.h && template.h.length > 0) { + throw new Error('DynamicImage content must render synchronously'); + } + return template.t.join(''); +} + +export async function parseSolidJSX(jsx?: OpenGraphSource): Promise { + // Unwrap the function form, then read the markup off the SSR template. + let value: unknown = typeof jsx === 'function' ? await jsx() : jsx; + if (isSSRTemplate(value)) { + value = readTemplate(value).replace(HYDRATION_KEY, ''); + } + if (typeof value !== 'string' || value === '') { + return undefined; + } + return html(value); +} + +/** + * Renders JSX, or a function that returns JSX, to an image response. + * Only works on the server. + */ +export async function createOpenGraphImage( + jsx?: OpenGraphSource, + opts?: ImageResponseOptions, +): Promise { + const converted = await parseSolidJSX(jsx); + // ImageResponse is typed for React elements, but satori reads the vnode tree as is. + return new ImageResponse(converted, { + ...opts, + // Tells the server function handler to send the response as is. + headers: { 'X-Content-Raw': '' }, + }); +} + +export async function createBase64Image(jsx?: OpenGraphSource): Promise { + const img = await createOpenGraphImage(jsx); + const buf = await new Response(img.body).arrayBuffer(); + return `data:image/png;base64,${Buffer.from(buf).toString('base64')}`; +} + +/** Reads the server function arguments from the `args` search parameter of a url. */ +export function getArguments(url: string): unknown[] { + const argsStr = new URL(url).searchParams.get('args'); + if (!argsStr) { + return []; + } + const args: unknown = JSON.parse(argsStr); + return Array.isArray(args) ? args : []; +} diff --git a/packages/ogp/src/unplugin/index.ts b/packages/ogp/src/unplugin/index.ts new file mode 100644 index 0000000..00f7c0a --- /dev/null +++ b/packages/ogp/src/unplugin/index.ts @@ -0,0 +1,49 @@ +import babel from '@babel/core'; +import { babel as babelUtils } from '@solid-mediakit/shared'; +import type { FilterPattern } from 'unplugin'; +import { createUnplugin } from 'unplugin'; +import type { Runtime } from '../compiler'; +import { transformOG } from '../compiler'; + +export type Options = { + filter?: { + include?: FilterPattern; + exclude?: FilterPattern; + }; + log?: boolean | RegExp; + runtime?: Runtime; +}; + +export const unplugin = createUnplugin((opts?: Options) => { + const filter = babelUtils.getFilter(opts?.filter); + const log = opts?.log; + return { + enforce: 'pre', + name: 'unplugin-dynamic-image', + async transform(code, id) { + if (!filter(id)) { + return null; + } + const plugins: babel.ParserOptions['plugins'] = ['typescript', 'jsx']; + + const res = await babel.transformAsync(code, { + plugins: [[transformOG(opts?.runtime)]], + parserOpts: { plugins }, + }); + if (!res?.code) { + return null; + } + // The log option prints the compiled output for debugging. + if (log === true || (log instanceof RegExp && log.test(id))) { + // oxlint-disable-next-line no-console + console.log(id, res.code); + } + return { code: res.code, map: res.map }; + }, + }; +}); +export const vitePlugin = unplugin.vite; +export const rollupPlugin = unplugin.rollup; +export const webpackPlugin = unplugin.webpack; +export const rspackPlugin = unplugin.rspack; +export const esbuildPlugin = unplugin.esbuild; diff --git a/packages/ogp/tests/compiler.test.ts b/packages/ogp/tests/compiler.test.ts new file mode 100644 index 0000000..d626fe1 --- /dev/null +++ b/packages/ogp/tests/compiler.test.ts @@ -0,0 +1,39 @@ +import type babel from '@babel/core'; +import type { ResultFormatter } from 'babel-plugin-tester'; +import { pluginTester, prettierFormatter } from 'babel-plugin-tester'; +import { join } from 'node:path'; +import { transformOG } from '../src/compiler'; + +const plugins: babel.ParserOptions['plugins'] = ['typescript', 'jsx']; + +// The fixture outputs are stored in this prettier style. Pinning it here keeps +// the outputs stable whatever formatter config the repo uses. +const prettierOptions = { semi: false, singleQuote: true }; + +const formatResult: ResultFormatter = async (code, options) => + prettierFormatter(code, { ...options, prettierOptions }); + +pluginTester({ + pluginName: 'OGPlugin', + formatResult, + plugin: transformOG('Solid'), + babelOptions: { + presets: [['@babel/preset-typescript']], + parserOpts: { + plugins, + }, + }, + fixtures: join(import.meta.dirname, 'fixtures/solid'), +}); +pluginTester({ + pluginName: 'OGPlugin', + formatResult, + plugin: transformOG('TanstackStart'), + babelOptions: { + presets: [['@babel/preset-typescript']], + parserOpts: { + plugins, + }, + }, + fixtures: join(import.meta.dirname, 'fixtures/tanstack-start'), +}); diff --git a/tests/fixtures/solid-start/basic/code.js b/packages/ogp/tests/fixtures/solid/basic/code.js similarity index 100% rename from tests/fixtures/solid-start/basic/code.js rename to packages/ogp/tests/fixtures/solid/basic/code.js diff --git a/tests/fixtures/solid-start/basic/output.js b/packages/ogp/tests/fixtures/solid/basic/output.js similarity index 56% rename from tests/fixtures/solid-start/basic/output.js rename to packages/ogp/tests/fixtures/solid/basic/output.js index a5b613f..90551e2 100644 --- a/tests/fixtures/solid-start/basic/output.js +++ b/packages/ogp/tests/fixtures/solid/basic/output.js @@ -1,22 +1,21 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' import { createSignal } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' const [r0] = args return createOpenGraphImage({r0}) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const [signal] = createSignal('') const coolVar = DynamicImage1({ values: [signal()], -}) +}) \ No newline at end of file diff --git a/tests/fixtures/solid-start/custom-image-options/code.js b/packages/ogp/tests/fixtures/solid/custom-image-options/code.js similarity index 100% rename from tests/fixtures/solid-start/custom-image-options/code.js rename to packages/ogp/tests/fixtures/solid/custom-image-options/code.js diff --git a/packages/ogp/tests/fixtures/solid/custom-image-options/output.js b/packages/ogp/tests/fixtures/solid/custom-image-options/output.js new file mode 100644 index 0000000..18cda32 --- /dev/null +++ b/packages/ogp/tests/fixtures/solid/custom-image-options/output.js @@ -0,0 +1,20 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' +import { createOpenGraphImage } from '@solidjs/ogp/server' +import { createMemo } from 'solid-js' +const DynamicImage1ServerFunction = GET((...args) => { + 'use server' + + return createOpenGraphImage(Hi!, { + emoji: 'openmoji', + }) +}) +const DynamicImage1 = (props) => { + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) + return url +} +DynamicImage1({ + values: [], +}) \ No newline at end of file diff --git a/tests/fixtures/solid-start/exclude-static/code.js b/packages/ogp/tests/fixtures/solid/exclude-static/code.js similarity index 100% rename from tests/fixtures/solid-start/exclude-static/code.js rename to packages/ogp/tests/fixtures/solid/exclude-static/code.js diff --git a/tests/fixtures/solid-start/exclude-static/output.js b/packages/ogp/tests/fixtures/solid/exclude-static/output.js similarity index 54% rename from tests/fixtures/solid-start/exclude-static/output.js rename to packages/ogp/tests/fixtures/solid/exclude-static/output.js index 41c765c..cecff3c 100644 --- a/tests/fixtures/solid-start/exclude-static/output.js +++ b/packages/ogp/tests/fixtures/solid/exclude-static/output.js @@ -1,6 +1,8 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' return createOpenGraphImage( @@ -12,14 +14,11 @@ const DynamicImage1ServerFunction = (...args) => { Hello , ) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const coolVar = DynamicImage1({ diff --git a/tests/fixtures/solid-start/missing-child/code.js b/packages/ogp/tests/fixtures/solid/missing-child/code.js similarity index 100% rename from tests/fixtures/solid-start/missing-child/code.js rename to packages/ogp/tests/fixtures/solid/missing-child/code.js diff --git a/tests/fixtures/solid-start/missing-child/options.json b/packages/ogp/tests/fixtures/solid/missing-child/options.json similarity index 100% rename from tests/fixtures/solid-start/missing-child/options.json rename to packages/ogp/tests/fixtures/solid/missing-child/options.json diff --git a/tests/fixtures/solid-start/multiple-children/code.js b/packages/ogp/tests/fixtures/solid/multiple-children/code.js similarity index 100% rename from tests/fixtures/solid-start/multiple-children/code.js rename to packages/ogp/tests/fixtures/solid/multiple-children/code.js diff --git a/tests/fixtures/solid-start/multiple-children/output.js b/packages/ogp/tests/fixtures/solid/multiple-children/output.js similarity index 52% rename from tests/fixtures/solid-start/multiple-children/output.js rename to packages/ogp/tests/fixtures/solid/multiple-children/output.js index 10d71c2..85cdf90 100644 --- a/tests/fixtures/solid-start/multiple-children/output.js +++ b/packages/ogp/tests/fixtures/solid/multiple-children/output.js @@ -1,6 +1,8 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' return createOpenGraphImage( @@ -9,14 +11,11 @@ const DynamicImage1ServerFunction = (...args) => { , ) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const coolVar = DynamicImage1({ diff --git a/tests/fixtures/solid-start/multiple-images/code.js b/packages/ogp/tests/fixtures/solid/multiple-images/code.js similarity index 100% rename from tests/fixtures/solid-start/multiple-images/code.js rename to packages/ogp/tests/fixtures/solid/multiple-images/code.js diff --git a/packages/ogp/tests/fixtures/solid/multiple-images/output.js b/packages/ogp/tests/fixtures/solid/multiple-images/output.js new file mode 100644 index 0000000..200270e --- /dev/null +++ b/packages/ogp/tests/fixtures/solid/multiple-images/output.js @@ -0,0 +1,36 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' +import { createOpenGraphImage } from '@solidjs/ogp/server' +import { createMemo } from 'solid-js' +const DynamicImage2ServerFunction = GET((...args) => { + 'use server' + + const [r0] = args + return createOpenGraphImage({r0}, { + width: 800, + }) +}) +const DynamicImage2 = (props) => { + const url = createMemo(() => + serverFunctionUrl(DynamicImage2ServerFunction, ...props.values), + ) + return url +} +const DynamicImage1ServerFunction = GET((...args) => { + 'use server' + + const [r0] = args + return createOpenGraphImage({r0}) +}) +const DynamicImage1 = (props) => { + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) + return url +} +const first = DynamicImage1({ + values: [a()], +}) +const second = DynamicImage2({ + values: [b()], +}) \ No newline at end of file diff --git a/tests/fixtures/solid-start/nested-expressions/code.js b/packages/ogp/tests/fixtures/solid/nested-expressions/code.js similarity index 100% rename from tests/fixtures/solid-start/nested-expressions/code.js rename to packages/ogp/tests/fixtures/solid/nested-expressions/code.js diff --git a/tests/fixtures/solid-start/nested-expressions/output.js b/packages/ogp/tests/fixtures/solid/nested-expressions/output.js similarity index 56% rename from tests/fixtures/solid-start/nested-expressions/output.js rename to packages/ogp/tests/fixtures/solid/nested-expressions/output.js index ea6857f..268ee46 100644 --- a/tests/fixtures/solid-start/nested-expressions/output.js +++ b/packages/ogp/tests/fixtures/solid/nested-expressions/output.js @@ -1,18 +1,17 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' const [r0, r1] = args return createOpenGraphImage({r1}) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const coolVar = DynamicImage1({ diff --git a/tests/fixtures/solid-start/nested-in-jsx/code.js b/packages/ogp/tests/fixtures/solid/nested-in-jsx/code.js similarity index 100% rename from tests/fixtures/solid-start/nested-in-jsx/code.js rename to packages/ogp/tests/fixtures/solid/nested-in-jsx/code.js diff --git a/tests/fixtures/solid-start/nested-in-jsx/output.js b/packages/ogp/tests/fixtures/solid/nested-in-jsx/output.js similarity index 65% rename from tests/fixtures/solid-start/nested-in-jsx/output.js rename to packages/ogp/tests/fixtures/solid/nested-in-jsx/output.js index 5f435a4..5fecf02 100644 --- a/tests/fixtures/solid-start/nested-in-jsx/output.js +++ b/packages/ogp/tests/fixtures/solid/nested-in-jsx/output.js @@ -1,20 +1,19 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' import { Image } from '@solidjs/ogp' import { createSignal } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' const [r0] = args return createOpenGraphImage({`Hello ${r0 * 2}!`}) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } export default function Home() { diff --git a/tests/fixtures/solid-start/no-dynamic-image/code.js b/packages/ogp/tests/fixtures/solid/no-dynamic-image/code.js similarity index 100% rename from tests/fixtures/solid-start/no-dynamic-image/code.js rename to packages/ogp/tests/fixtures/solid/no-dynamic-image/code.js diff --git a/tests/fixtures/solid-start/no-dynamic-image/output.js b/packages/ogp/tests/fixtures/solid/no-dynamic-image/output.js similarity index 100% rename from tests/fixtures/solid-start/no-dynamic-image/output.js rename to packages/ogp/tests/fixtures/solid/no-dynamic-image/output.js diff --git a/tests/fixtures/solid-start/partially-dynamic-object/code.js b/packages/ogp/tests/fixtures/solid/partially-dynamic-object/code.js similarity index 100% rename from tests/fixtures/solid-start/partially-dynamic-object/code.js rename to packages/ogp/tests/fixtures/solid/partially-dynamic-object/code.js diff --git a/tests/fixtures/solid-start/partially-dynamic-object/output.js b/packages/ogp/tests/fixtures/solid/partially-dynamic-object/output.js similarity index 62% rename from tests/fixtures/solid-start/partially-dynamic-object/output.js rename to packages/ogp/tests/fixtures/solid/partially-dynamic-object/output.js index 63e4737..b692e47 100644 --- a/tests/fixtures/solid-start/partially-dynamic-object/output.js +++ b/packages/ogp/tests/fixtures/solid/partially-dynamic-object/output.js @@ -1,7 +1,9 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' import { createSignal } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' const [r0] = args @@ -15,14 +17,11 @@ const DynamicImage1ServerFunction = (...args) => { {} , ) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const [signal] = createSignal('hello') diff --git a/tests/fixtures/solid-start/realistic-styles/code.js b/packages/ogp/tests/fixtures/solid/realistic-styles/code.js similarity index 100% rename from tests/fixtures/solid-start/realistic-styles/code.js rename to packages/ogp/tests/fixtures/solid/realistic-styles/code.js diff --git a/tests/fixtures/solid-start/realistic-styles/output.js b/packages/ogp/tests/fixtures/solid/realistic-styles/output.js similarity index 66% rename from tests/fixtures/solid-start/realistic-styles/output.js rename to packages/ogp/tests/fixtures/solid/realistic-styles/output.js index cd0b77b..5a190b5 100644 --- a/tests/fixtures/solid-start/realistic-styles/output.js +++ b/packages/ogp/tests/fixtures/solid/realistic-styles/output.js @@ -1,6 +1,8 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' const [r0] = args @@ -19,14 +21,11 @@ const DynamicImage1ServerFunction = (...args) => { {`👋 Hello, ${r0 * 2}!`} , ) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const coolVar = DynamicImage1({ diff --git a/tests/fixtures/solid-start/variables/code.js b/packages/ogp/tests/fixtures/solid/variables/code.js similarity index 100% rename from tests/fixtures/solid-start/variables/code.js rename to packages/ogp/tests/fixtures/solid/variables/code.js diff --git a/tests/fixtures/solid-start/variables/output.js b/packages/ogp/tests/fixtures/solid/variables/output.js similarity index 50% rename from tests/fixtures/solid-start/variables/output.js rename to packages/ogp/tests/fixtures/solid/variables/output.js index 13b9720..44d315c 100644 --- a/tests/fixtures/solid-start/variables/output.js +++ b/packages/ogp/tests/fixtures/solid/variables/output.js @@ -1,18 +1,17 @@ +import { serverFunctionUrl } from '@solidjs/web/server-functions' +import { GET } from '@solidjs/web/server-functions' import { createOpenGraphImage } from '@solidjs/ogp/server' import { createMemo } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { +const DynamicImage1ServerFunction = GET((...args) => { 'use server' const [r0] = args return createOpenGraphImage({r0}) -} +}) const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) + const url = createMemo(() => + serverFunctionUrl(DynamicImage1ServerFunction, ...props.values), + ) return url } const coolVar = DynamicImage1({ diff --git a/tests/fixtures/tanstack-start/basic/code.js b/packages/ogp/tests/fixtures/tanstack-start/basic/code.js similarity index 100% rename from tests/fixtures/tanstack-start/basic/code.js rename to packages/ogp/tests/fixtures/tanstack-start/basic/code.js diff --git a/tests/fixtures/tanstack-start/basic/output.js b/packages/ogp/tests/fixtures/tanstack-start/basic/output.js similarity index 100% rename from tests/fixtures/tanstack-start/basic/output.js rename to packages/ogp/tests/fixtures/tanstack-start/basic/output.js diff --git a/tests/fixtures/tanstack-start/custom-image-options/code.js b/packages/ogp/tests/fixtures/tanstack-start/custom-image-options/code.js similarity index 100% rename from tests/fixtures/tanstack-start/custom-image-options/code.js rename to packages/ogp/tests/fixtures/tanstack-start/custom-image-options/code.js diff --git a/tests/fixtures/tanstack-start/custom-image-options/output.js b/packages/ogp/tests/fixtures/tanstack-start/custom-image-options/output.js similarity index 100% rename from tests/fixtures/tanstack-start/custom-image-options/output.js rename to packages/ogp/tests/fixtures/tanstack-start/custom-image-options/output.js diff --git a/tests/fixtures/tanstack-start/multiple-images/code.js b/packages/ogp/tests/fixtures/tanstack-start/multiple-images/code.js similarity index 100% rename from tests/fixtures/tanstack-start/multiple-images/code.js rename to packages/ogp/tests/fixtures/tanstack-start/multiple-images/code.js diff --git a/tests/fixtures/tanstack-start/multiple-images/output.js b/packages/ogp/tests/fixtures/tanstack-start/multiple-images/output.js similarity index 100% rename from tests/fixtures/tanstack-start/multiple-images/output.js rename to packages/ogp/tests/fixtures/tanstack-start/multiple-images/output.js diff --git a/tests/fixtures/tanstack-start/nested-in-jsx/code.js b/packages/ogp/tests/fixtures/tanstack-start/nested-in-jsx/code.js similarity index 100% rename from tests/fixtures/tanstack-start/nested-in-jsx/code.js rename to packages/ogp/tests/fixtures/tanstack-start/nested-in-jsx/code.js diff --git a/tests/fixtures/tanstack-start/nested-in-jsx/output.js b/packages/ogp/tests/fixtures/tanstack-start/nested-in-jsx/output.js similarity index 100% rename from tests/fixtures/tanstack-start/nested-in-jsx/output.js rename to packages/ogp/tests/fixtures/tanstack-start/nested-in-jsx/output.js diff --git a/tests/fixtures/tanstack-start/no-dynamic-image/code.js b/packages/ogp/tests/fixtures/tanstack-start/no-dynamic-image/code.js similarity index 100% rename from tests/fixtures/tanstack-start/no-dynamic-image/code.js rename to packages/ogp/tests/fixtures/tanstack-start/no-dynamic-image/code.js diff --git a/tests/fixtures/tanstack-start/no-dynamic-image/output.js b/packages/ogp/tests/fixtures/tanstack-start/no-dynamic-image/output.js similarity index 100% rename from tests/fixtures/tanstack-start/no-dynamic-image/output.js rename to packages/ogp/tests/fixtures/tanstack-start/no-dynamic-image/output.js diff --git a/tests/fixtures/tanstack-start/variables/code.js b/packages/ogp/tests/fixtures/tanstack-start/variables/code.js similarity index 100% rename from tests/fixtures/tanstack-start/variables/code.js rename to packages/ogp/tests/fixtures/tanstack-start/variables/code.js diff --git a/tests/fixtures/tanstack-start/variables/output.js b/packages/ogp/tests/fixtures/tanstack-start/variables/output.js similarity index 100% rename from tests/fixtures/tanstack-start/variables/output.js rename to packages/ogp/tests/fixtures/tanstack-start/variables/output.js diff --git a/packages/ogp/tests/open-graph.test.ts b/packages/ogp/tests/open-graph.test.ts new file mode 100644 index 0000000..4d6ef48 --- /dev/null +++ b/packages/ogp/tests/open-graph.test.ts @@ -0,0 +1,31 @@ +import type { JSX } from '@solidjs/web'; +import { renderToString } from '@solidjs/web'; +import { createComponent } from 'solid-js'; +import { describe, expect, it } from 'vitest'; +import { OpenGraph } from '../src/index'; + +// The compiled DynamicImage is an accessor of the image url, which the JSX +// types do not describe. +// oxlint-disable-next-line no-unsafe-type-assertion +const compiledImage = (() => '/_server/image?args=%5B1%5D') as unknown as JSX.Element; + +describe('OpenGraph', () => { + it('adds an og:image meta tag with the origin and the image url', () => { + let head = ''; + renderToString( + () => + createComponent(OpenGraph, { + origin: 'https://example.com', + children: compiledImage, + }), + // The output has no , so the head tags arrive here. + { + onHead(value) { + head = value; + }, + }, + ); + expect(head).toContain('property="og:image"'); + expect(head).toContain('content="https://example.com/_server/image?args=%5B1%5D"'); + }); +}); diff --git a/packages/ogp/tests/server.test.ts b/packages/ogp/tests/server.test.ts new file mode 100644 index 0000000..ac1fdf5 --- /dev/null +++ b/packages/ogp/tests/server.test.ts @@ -0,0 +1,84 @@ +import { describe, expect, it } from 'vitest'; +import { getArguments, parseSolidJSX } from '../src/server'; + +describe('parseSolidJSX', () => { + it('returns undefined when given nothing', async () => { + await expect(parseSolidJSX()).resolves.toBeUndefined(); + await expect(parseSolidJSX(undefined)).resolves.toBeUndefined(); + }); + + it('converts an HTML string into a satori vnode tree', async () => { + const vnode = await parseSolidJSX('hi'); + expect(vnode).toMatchObject({ + type: 'div', + props: { children: [{ type: 'div', props: { children: 'hi' } }] }, + }); + }); + + it('unwraps a function that returns markup', async () => { + const vnode = await parseSolidJSX(() => 'sync'); + expect(vnode).toMatchObject({ + props: { children: [{ type: 'span', props: { children: 'sync' } }] }, + }); + }); + + it('awaits a function that returns a promise', async () => { + const vnode = await parseSolidJSX(async () => await Promise.resolve('async')); + expect(vnode).toMatchObject({ + props: { children: [{ type: 'span', props: { children: 'async' } }] }, + }); + }); + + it("reads markup off Solid's `{ t }` server-rendered template object", async () => { + const vnode = await parseSolidJSX({ t: 'from template' }); + expect(vnode).toMatchObject({ + props: { children: [{ props: { children: 'from template' } }] }, + }); + }); + + it('strips every hydration key so none reaches satori', async () => { + const vnode = await parseSolidJSX({ + t: 'hix', + }); + const serialized = JSON.stringify(vnode); + expect(serialized).not.toContain('_hk'); + expect(serialized).toContain('keep'); + }); + + it('joins the strings of a template that had holes', async () => { + const vnode = await parseSolidJSX({ t: ['', 'joined', ''], h: [] }); + expect(vnode).toMatchObject({ + props: { children: [{ type: 'div', props: { children: 'joined' } }] }, + }); + }); + + it('rejects a template with holes that have not resolved', async () => { + await expect(parseSolidJSX({ t: ['', ''], h: [() => 'later'] })).rejects.toThrow( + 'DynamicImage content must render synchronously', + ); + }); + + it('returns undefined for values it cannot turn into markup', async () => { + await expect(parseSolidJSX(123)).resolves.toBeUndefined(); + const unknownObject: object = { nope: true }; + await expect(parseSolidJSX(unknownObject)).resolves.toBeUndefined(); + await expect(parseSolidJSX(() => 42)).resolves.toBeUndefined(); + }); +}); + +describe('getArguments', () => { + it('returns an empty list when the url carries no args', () => { + expect(getArguments('https://example.com/_server/')).toEqual([]); + expect(getArguments('https://example.com/_server/?other=1')).toEqual([]); + }); + + it('round-trips the values encoded by the compiled component', () => { + const values = ['hello', 42, { nested: true }, null]; + const url = `https://example.com/_server/?args=${encodeURIComponent(JSON.stringify(values))}`; + expect(getArguments(url)).toEqual(values); + }); + + it('throws on an args param that is not valid JSON', () => { + expect(() => getArguments('https://example.com/_server/?args=not-json')).toThrow(); + }); +}); diff --git a/tests/unplugin.test.ts b/packages/ogp/tests/unplugin.test.ts similarity index 54% rename from tests/unplugin.test.ts rename to packages/ogp/tests/unplugin.test.ts index 72dd339..2a03a46 100644 --- a/tests/unplugin.test.ts +++ b/packages/ogp/tests/unplugin.test.ts @@ -1,93 +1,99 @@ -import { join } from 'node:path' -import { describe, expect, it, vi } from 'vitest' -import type { Options } from '../src/unplugin' -import { unplugin } from '../src/unplugin' +import { join } from 'node:path'; +import { describe, expect, it, vi } from 'vitest'; +import type { Options } from '../src/unplugin'; +import { unplugin } from '../src/unplugin'; /** * The plugin's `transform` never touches `this`, so the raw rollup form can be * driven directly instead of standing up a real bundler. */ -const transform = (code: string, id: string, opts?: Options) => { - const plugin = unplugin.raw(opts, { framework: 'rollup' }) as { - transform: (code: string, id: string) => Promise<{ code: string } | null> +type TransformResult = { code: string } | null; + +async function transform(code: string, id: string, opts?: Options): Promise { + const plugin = unplugin.raw(opts, { framework: 'rollup' }); + if (Array.isArray(plugin) || typeof plugin.transform !== 'function') { + throw new TypeError('expected a single plugin with a transform hook'); } - return plugin.transform(code, id) + // oxlint-disable-next-line no-unsafe-type-assertion + const run = plugin.transform as (code: string, id: string) => Promise; + return run(code, id); } -const src = (file: string) => join(process.cwd(), 'src', file) +function src(file: string): string { + return join(process.cwd(), 'src', file); +} -const SOURCE = `const coolVar = {signal()}` +const SOURCE = `const coolVar = {signal()}`; describe('filtering', () => { it('transforms files under src by default', async () => { - const res = await transform(SOURCE, src('routes/index.tsx')) - expect(res?.code).toBeTypeOf('string') - }) + const res = await transform(SOURCE, src('routes/index.tsx')); + expect(res?.code).toBeTypeOf('string'); + }); it('skips files outside the default include', async () => { - expect(await transform(SOURCE, join(process.cwd(), 'other/index.tsx'))).toBeNull() - expect(await transform(SOURCE, src('styles.css'))).toBeNull() - }) + expect(await transform(SOURCE, join(process.cwd(), 'other/index.tsx'))).toBeNull(); + expect(await transform(SOURCE, src('styles.css'))).toBeNull(); + }); it('honours a custom exclude', async () => { - const filter = { exclude: '**/skipped.tsx' } - expect(await transform(SOURCE, src('skipped.tsx'), { filter })).toBeNull() - expect(await transform(SOURCE, src('kept.tsx'), { filter })).not.toBeNull() - }) -}) + const filter = { exclude: '**/skipped.tsx' }; + expect(await transform(SOURCE, src('skipped.tsx'), { filter })).toBeNull(); + expect(await transform(SOURCE, src('kept.tsx'), { filter })).not.toBeNull(); + }); +}); describe('transform', () => { it('replaces DynamicImage with a generated component and server function', async () => { - const res = await transform(SOURCE, src('routes/index.tsx')) - expect(res!.code).toContain('DynamicImage1ServerFunction') - expect(res!.code).toContain("'use server'") - expect(res!.code).toContain('import { createOpenGraphImage } from "@solidjs/ogp/server"') - expect(res!.code).toContain('DynamicImage1({') - }) + const res = await transform(SOURCE, src('routes/index.tsx')); + expect(res!.code).toContain('DynamicImage1ServerFunction'); + expect(res!.code).toContain("'use server'"); + expect(res!.code).toContain('import { createOpenGraphImage } from "@solidjs/ogp/server"'); + expect(res!.code).toContain('DynamicImage1({'); + }); it('emits a TanStack server function when that runtime is selected', async () => { const res = await transform(SOURCE, src('routes/index.tsx'), { runtime: 'TanstackStart', - }) - expect(res!.code).toContain('createServerFn(') - expect(res!.code).toContain('response: "raw"') - expect(res!.code).not.toContain("'use server'") - }) + }); + expect(res!.code).toContain('createServerFn('); + expect(res!.code).toContain('response: "raw"'); + expect(res!.code).not.toContain("'use server'"); + }); it('leaves files without a DynamicImage alone', async () => { - const res = await transform(`const x = {signal()}`, src('plain.tsx')) - expect(res!.code).not.toContain('ServerFunction') - expect(res!.code).not.toContain('createOpenGraphImage') - }) + const res = await transform(`const x = {signal()}`, src('plain.tsx')); + expect(res!.code).not.toContain('ServerFunction'); + expect(res!.code).not.toContain('createOpenGraphImage'); + }); it('surfaces a DynamicImage that has no element child', async () => { await expect( transform(`const x = text only`, src('bad.tsx')), - ).rejects.toThrow('DynamicImage must have a child element') - }) - -}) + ).rejects.toThrow('DynamicImage must have a child element'); + }); +}); describe('log option', () => { it('logs every transformed file when log is true', async () => { - const spy = vi.spyOn(console, 'log').mockImplementation(() => {}) - await transform(SOURCE, src('routes/index.tsx'), { log: true }) - expect(spy).toHaveBeenCalledOnce() - spy.mockRestore() - }) + const spy = vi.spyOn(console, 'log').mockImplementation(() => {}); + await transform(SOURCE, src('routes/index.tsx'), { log: true }); + expect(spy).toHaveBeenCalledOnce(); + spy.mockRestore(); + }); it('logs nothing when log is false', async () => { - const spy = vi.spyOn(console, 'log').mockImplementation(() => {}) - await transform(SOURCE, src('routes/index.tsx'), { log: false }) - expect(spy).not.toHaveBeenCalled() - spy.mockRestore() - }) + const spy = vi.spyOn(console, 'log').mockImplementation(() => {}); + await transform(SOURCE, src('routes/index.tsx'), { log: false }); + expect(spy).not.toHaveBeenCalled(); + spy.mockRestore(); + }); it('logs only ids matching a RegExp log filter', async () => { - const spy = vi.spyOn(console, 'log').mockImplementation(() => {}) - await transform(SOURCE, src('routes/index.tsx'), { log: /routes/ }) - await transform(SOURCE, src('other.tsx'), { log: /routes/ }) - expect(spy).toHaveBeenCalledOnce() - spy.mockRestore() - }) -}) + const spy = vi.spyOn(console, 'log').mockImplementation(() => {}); + await transform(SOURCE, src('routes/index.tsx'), { log: /routes/ }); + await transform(SOURCE, src('other.tsx'), { log: /routes/ }); + expect(spy).toHaveBeenCalledOnce(); + spy.mockRestore(); + }); +}); diff --git a/tsconfig.json b/packages/ogp/tsconfig.json similarity index 68% rename from tsconfig.json rename to packages/ogp/tsconfig.json index d3c059b..2876e4a 100644 --- a/tsconfig.json +++ b/packages/ogp/tsconfig.json @@ -1,19 +1,9 @@ { - "exclude": [ - "node_modules", - "dist" - ], - "include": [ - "src", - "tests", - "tsdown.config.ts" - ], + "exclude": ["node_modules", "dist"], + "include": ["src", "tests", "tsdown.config.ts"], "compilerOptions": { "module": "ESNext", - "lib": [ - "ESNext", - "DOM" - ], + "lib": ["ESNext", "DOM"], "importHelpers": true, "declaration": true, "sourceMap": true, @@ -27,12 +17,10 @@ "noFallthroughCasesInSwitch": true, "moduleResolution": "bundler", "jsx": "preserve", - "jsxImportSource": "solid-js", + "jsxImportSource": "@solidjs/web", "esModuleInterop": true, "target": "ESNext", - "types": [ - "node" - ], + "types": ["node"], "useDefineForClassFields": false, "declarationMap": true } diff --git a/tsdown.config.ts b/packages/ogp/tsdown.config.ts similarity index 89% rename from tsdown.config.ts rename to packages/ogp/tsdown.config.ts index 018843a..66185ad 100644 --- a/tsdown.config.ts +++ b/packages/ogp/tsdown.config.ts @@ -22,8 +22,9 @@ const entry = { * map in package.json stays accurate. The package is ESM (`"type": "module"`), * so ESM keeps `.js` and only CJS needs a distinct extension. */ -const outExtensions = ({ format }: { format: string }) => - format === 'cjs' ? { js: '.cjs', dts: '.d.cts' } : { js: '.js', dts: '.d.ts' }; +function outExtensions({ format }: { format: string }): { js: string; dts: string } { + return format === 'cjs' ? { js: '.cjs', dts: '.d.cts' } : { js: '.js', dts: '.d.ts' }; +} // JSX is left preserved (via `jsx: "preserve"` in tsconfig.json) so that the // consuming app's own Solid compiler decides between DOM and SSR output. diff --git a/packages/ogp/vitest.config.ts b/packages/ogp/vitest.config.ts new file mode 100644 index 0000000..a469994 --- /dev/null +++ b/packages/ogp/vitest.config.ts @@ -0,0 +1,13 @@ +import solid from '@solidjs/vite-plugin'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + // Compiles the runtime's JSX. Tests run on the server, so the output is SSR. + plugins: [solid({ ssr: true })], + test: { + // The plugin sets a browser environment. These tests run on the server. + environment: 'node', + // babel-plugin-tester calls `describe`/`it` off the global scope. + globals: true, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e6d287..de176f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.18.0 + version: 12.18.0 + +packages: + + '@pnpm/exe.android-arm64@12.18.0': + resolution: {integrity: sha512-fOF6IwgvnUKEmVedGqiAsNPfN2Ry8GvaqzSQOiF3RJFbpBfPKO/6YT54s1GjToyYinRxw9preHHPe4y2N3SzhA==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.18.0': + resolution: {integrity: sha512-6OiolnaCsB3/GcJ9XNrenbUH3zFHRJ+5QynrMUUEyThbgnnCzWxa199hpQlOmxN4rAXuYQ0IYgWFNUZxyzg31Q==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.18.0': + resolution: {integrity: sha512-zkq+4YzVIX39ETYLyC3W7LY7MpHEU/J3nRhHl4i2yPld2Cf2+rEKRh3ejJ4AmaQ77HHJLCktY4Z3jq0fpcxFXg==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.18.0': + resolution: {integrity: sha512-qMsL9qx92unOTa6hgkfiTJv8ceZaTx0IQg7InhYDVX2ZrTECujaVEEVypnJK5m3eGUsP1KD7Y4qIgleCwfRsYw==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.18.0': + resolution: {integrity: sha512-/9vy/4ms52cU4MjZ5NhHd6N2d9L9W0kARf5/ff2tweAHu0VeUzs/0qp/7ZHFuddm2Wa/m0AKQoPum9AVUCqKsw==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.18.0': + resolution: {integrity: sha512-Vp+TIMPPyackVCXkOdEKH/RmAn/r07EcIyrgZYQK7VrkksqZOie0GnWIx+85mPqeFEYCRtXIZAFJ9L4ceTndDg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.18.0': + resolution: {integrity: sha512-2dpyVBCHT+FfpuQh9i+7MXAqNWYLCvD5vYr5p6Eimxoga8USLnjbUgyj72AOrO0hjc5ri3TEFP3jiyBHjkSZpQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.18.0': + resolution: {integrity: sha512-BBOOOfNJ2QwIIya3eKqOjiN4WNTszfRz7HCvw9XggcT7+ftMjNP8XJ/GfW+ltCBeUFR9d8WBVsr2m/NLjX2CZQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.18.0': + resolution: {integrity: sha512-7kMN77xSOYJX8GPSH5RbNAc5oM61LMmcSUukDDUwllnZPXm8GRPskCNsTWy8SCw01Kr1FB+5SwGNMiTdiziLNQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.18.0': + resolution: {integrity: sha512-htuSCpEcmDzhKoJqXbPkvfr176dBHU0QIF5mWcRiqxRXAB/1JoYiMYotfjWpk+ztgpB9qlx4XnWlLFAf7gzc6g==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.18.0': + resolution: {integrity: sha512-Uj+vzfIQ62kDP10x36yHZIXVs5ohdNtiPYwn5FhCLlNScHPo0OAI+ShGDtLofiBXKE7umu71Jmjm7N8a8zVcDw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.18.0': + resolution: {integrity: sha512-OJ+X2wcraldCwj75pCIerWARQSRpdfj0eBTs/2ODyhfeW46ylOnjTIE/GKra6Mn6E72/gBmXS8igrUioa+F9fQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.18.0': + resolution: {integrity: sha512-wEY6jiACGcbhhi5yD59doHqNTndS7AaujaPmtWAu1DKkHru2hy5fJ9yUGecW72Ypaw2/I3BEprfMOopap2NQtw==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.18.0': + resolution: {integrity: sha512-5FJkghO7RLRkQpWxeVEygW9XsmnNuxzPfXbgwFWCHsFyFhpDn/vOdL88ToQEM0Kt5igdW5s6U0/IDH8Dvkt3pg==} + cpu: [x64] + os: [win32] + + pnpm@12.18.0: + resolution: {integrity: sha512-nXiC1dyCFH7PxOBiqjSDTgrQKWcQoYN6ERWuASEn02txCeMhrBWYod0KZVl2gbHpmRfhLtDXSerpEYeUM2O+sw==} + engines: {node: '>=18'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.18.0': + optional: true + + '@pnpm/exe.android-x64@12.18.0': + optional: true + + '@pnpm/exe.darwin-arm64@12.18.0': + optional: true + + '@pnpm/exe.darwin-x64@12.18.0': + optional: true + + '@pnpm/exe.freebsd-x64@12.18.0': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.18.0': + optional: true + + '@pnpm/exe.linux-arm64@12.18.0': + optional: true + + '@pnpm/exe.linux-ppc64@12.18.0': + optional: true + + '@pnpm/exe.linux-riscv64@12.18.0': + optional: true + + '@pnpm/exe.linux-s390x@12.18.0': + optional: true + + '@pnpm/exe.linux-x64-musl@12.18.0': + optional: true + + '@pnpm/exe.linux-x64@12.18.0': + optional: true + + '@pnpm/exe.win32-arm64@12.18.0': + optional: true + + '@pnpm/exe.win32-x64@12.18.0': + optional: true + + pnpm@12.18.0: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.18.0 + '@pnpm/exe.android-x64': 12.18.0 + '@pnpm/exe.darwin-arm64': 12.18.0 + '@pnpm/exe.darwin-x64': 12.18.0 + '@pnpm/exe.freebsd-x64': 12.18.0 + '@pnpm/exe.linux-arm64': 12.18.0 + '@pnpm/exe.linux-arm64-musl': 12.18.0 + '@pnpm/exe.linux-ppc64': 12.18.0 + '@pnpm/exe.linux-riscv64': 12.18.0 + '@pnpm/exe.linux-s390x': 12.18.0 + '@pnpm/exe.linux-x64': 12.18.0 + '@pnpm/exe.linux-x64-musl': 12.18.0 + '@pnpm/exe.win32-arm64': 12.18.0 + '@pnpm/exe.win32-x64': 12.18.0 + +--- lockfileVersion: '9.0' settings: @@ -7,13 +165,34 @@ settings: importers: .: + devDependencies: + '@changesets/cli': + specifier: ^3.0.3 + version: 3.0.3 + '@lxsmnsyc/oxlint-config': + specifier: ^0.1.3 + version: 0.1.3(oxlint@1.93.0(oxlint-tsgolint@7.0.2006)) + oxfmt: + specifier: ^0.78.0 + version: 0.78.0 + oxlint: + specifier: ^1.93.0 + version: 1.93.0(oxlint-tsgolint@7.0.2006) + oxlint-tsgolint: + specifier: ^7.0.2006 + version: 7.0.2006 + typescript: + specifier: ^7.0.2 + version: 7.0.2 + + packages/ogp: dependencies: '@babel/core': specifier: ^7.28.0 - version: 7.29.7 + version: 7.29.7(supports-color@8.1.1) '@solid-mediakit/shared': specifier: ^0.0.6 - version: 0.0.6 + version: 0.0.6(supports-color@8.1.1) '@vercel/og': specifier: ^1.0.1 version: 1.0.1(@types/node@26.2.0) @@ -22,20 +201,20 @@ importers: version: 0.3.2 unplugin: specifier: ^3.3.0 - version: 3.3.0(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)) + version: 3.3.0(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)) devDependencies: '@arethetypeswrong/core': specifier: ^0.18.5 version: 0.18.5 '@babel/preset-typescript': specifier: ^7.27.0 - version: 7.29.7(@babel/core@7.29.7) - '@changesets/cli': - specifier: ^2.31.1 - version: 2.31.1(@types/node@26.2.0) - '@solidjs/meta': - specifier: ^0.29.4 - version: 0.29.4(solid-js@1.9.14) + version: 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@solidjs/vite-plugin': + specifier: 3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.21(solid-js@2.0.0-rc.21))(solid-js@2.0.0-rc.21)(supports-color@8.1.1)(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)) + '@solidjs/web': + specifier: 2.0.0-rc.21 + version: 2.0.0-rc.21(solid-js@2.0.0-rc.21) '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 @@ -44,13 +223,13 @@ importers: version: 26.2.0 babel-plugin-tester: specifier: ^12.0.0 - version: 12.0.0(@babel/core@7.29.7) + version: 12.0.0(@babel/core@7.29.7(supports-color@8.1.1)) publint: specifier: ^0.3.23 version: 0.3.23 solid-js: - specifier: ^1.9.14 - version: 1.9.14 + specifier: 2.0.0-rc.21 + version: 2.0.0-rc.21 tsdown: specifier: ^0.22.14 version: 0.22.14(@arethetypeswrong/core@0.18.5)(publint@0.3.23)(typescript@7.0.2) @@ -62,7 +241,7 @@ importers: version: 7.0.2 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)) + version: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)) packages: @@ -127,6 +306,10 @@ packages: resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} @@ -206,10 +389,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} - engines: {node: '>=6.9.0'} - '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -225,64 +404,126 @@ packages: '@braidai/lang@1.1.2': resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} - '@changesets/apply-release-plan@7.1.1': - resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + '@changesets/apply-release-plan@8.1.1': + resolution: {integrity: sha512-nk2Hbq3M9NeHMdaIRBDvawKrQJzXB9sGyBUE5yWnIKtvdcNCPj75zBekJYr0gTT2ecJH3eFeTrc8eisPImcv0Q==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/assemble-release-plan@6.0.10': - resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + '@changesets/assemble-release-plan@7.0.0': + resolution: {integrity: sha512-oEW8BxdA604kGGtDSCiHr5w9Tv4UWe9I2k61IBNZzCOE1kbYaJj4v+lFQNgcEZFkUc2pV/+hASErGDvpJOZCTg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + '@changesets/changelog-git@1.0.0': + resolution: {integrity: sha512-3Dst2Ime2Op5nd4XmWJLPIgp11ZFqJqSkVug9izK6TDcIV4YlhPS4ECbEVR+eGI0bk0r1ItogD4j2Oli87bJrA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/cli@2.31.1': - resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} + '@changesets/cli@3.0.3': + resolution: {integrity: sha512-L1i67bMfkK6iC/kDejuNO4pFgTRcWIObsD6Qof2woP1I4M8tj17DGlcpRaTzTv1DYSP5EMwWdEtR8X0Pj5Jg3Q==} + engines: {node: ^22.11 || ^24 || >=26, npm: '>=10.9.0', pnpm: '>=10.0.0', yarn: '>=4.5.2'} hasBin: true - '@changesets/config@3.1.4': - resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + '@changesets/config@4.0.1': + resolution: {integrity: sha512-PxpxSQLQSLDjceAgRq+4FWlU+HflDIw03mmPVipxoQx9xrXFUjmqTy3SE+n/2t+DqPdpPiLWVr5NRiLZvjyLwg==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/errors@1.0.0': + resolution: {integrity: sha512-ElN/mEzn6zmETgjwf5MclCMa9ef59sAR0lfO8VSYIsiRvbC2FbLB/92EoYw10Sl0kGixxHFiJZUSv7dA+YpR8g==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/format@0.1.3': + resolution: {integrity: sha512-zTZrJbfY81+/MsXsey6i3jQjpApz4PqRQ+nouHGDJhCa5sKCExwR9mZFQ/67lMsqZDNy2G2v3wTbzOmZ56EtaQ==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/get-dependents-graph@3.0.0': + resolution: {integrity: sha512-ji/t5wFA1zREKXRUePE6Qi+Qu2UgxCeSSGQrphezwvQZrp49B7sJ+8+wvM0tA7zPeSxYKCojDy3WWgrl+s+awg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-dependents-graph@2.1.4': - resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + '@changesets/git@4.0.1': + resolution: {integrity: sha512-6vWpIAC4LkpmlqaIu37ViT5enyd9+uBwAiGqCGhASvkSHBgx4PrtTGXWTMFYpDmZbjgyonyVgMciPrW4MqtJsA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-release-plan@4.0.16': - resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + '@changesets/parse@1.0.0': + resolution: {integrity: sha512-P0iaMb9p9CRYZiTgAllEIF9AUMQHIy1G72tKlcIqJp61icZSsKQNiOPdxAMZG8m/DvZwt/oz5xEbTpike//dWg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + '@changesets/pre@3.0.0': + resolution: {integrity: sha512-Zm/6YliV/a2oeWTqHJf6KxLrQwgcK1i/BRDl2m0EKZvbnxV5fG9QRhwJJGshjsZTUTS6dkfURQ2K6aAvgNw/3Q==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + '@changesets/read@1.0.1': + resolution: {integrity: sha512-nzvSC6RcTiWf/dsuwZFXpLzGGsRHYCL68U3uHV7srsulU93aVWY7u2GEJiDZ+4GIIElfaW5EqtKC0UHroY+LTQ==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + '@changesets/should-skip-package@1.0.0': + resolution: {integrity: sha512-pwqoJmbONn1XgXmZXPEExgAaT+HdZLjALFTDgIm+PnS5KeO2nLtzA2/Q+4aMFY14kFMuXKG30MObhvDzWgzDgg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/parse@0.4.3': - resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + '@changesets/types@7.0.0': + resolution: {integrity: sha512-c5GoiQyt3pxiXjrWSNoP8/GRf4kG+VnKzovx1OQM8dYYALlSwgedmkPmJ+ZqGxqwg9D3Bkj85Uo4KLd5BN3A0w==} + engines: {node: ^22.11 || ^24 || >=26} + + '@changesets/write@1.0.1': + resolution: {integrity: sha512-q/ThtP9gcnEP6xlv7LrY26C2mHqdGBti/MmOVngt/M/oIGYkssmQGxPK9WzBNt2juVcH/vml2WQ+ra8LXYOTaA==} + engines: {node: ^22.11 || ^24 || >=26} + + '@clack/core@1.6.0': + resolution: {integrity: sha512-4GZynIB2IIe431odxesswvWTCP6orvqd6e2b07b3VFWBQRqUqIHc/EPIZwFoKS692QBp+ooPuXKaJV8g4kXuYA==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.9.0': + resolution: {integrity: sha512-tEj8X2No2A1c9NDnZECxiiJ8TP3vmFlN9tLlLeSaMqVW4tUmVG2R4qpv/eP4zymWxnymYLkLcIYVV0VcWj3RCQ==} + engines: {node: '>= 20.12.0'} + + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42': + resolution: {integrity: sha512-ol24x9RW8loPyOTzC/mQzh/zAsrsPxyTG4WRxxRlwzNK2uBWIBftWN5IwmSV51zDQa7JcT6sE6kkXFCLUvsYIQ==} + peerDependencies: + '@babel/core': ^7.20.12 + + '@dom-expressions/compiler-darwin-arm64@0.50.0-next.40': + resolution: {integrity: sha512-+3aXdhw4SVt08fvgAsEM56ky/wdCVPXT0Wtxo164Cchgg7sapPsRqo8Gwwn0UU5AhVcEp3CIhdB5+pMoUicKFg==} + cpu: [arm64] + os: [darwin] + + '@dom-expressions/compiler-darwin-x64@0.50.0-next.40': + resolution: {integrity: sha512-Tbjg6ZQEIhKLKGd/Ep6MKqD76arPdV6SE2d3fkrP4qooIv2gYvAkvUw90qNdZxVHcuyjutrbJE0WpXYY9nSIIQ==} + cpu: [x64] + os: [darwin] + + '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.40': + resolution: {integrity: sha512-tIJMY8dPyjiYNSL5uc4JA5l88Sw0WoMwoAilqTTHpGYdCL5GwzGq6ZOV1bndw8XKEYFYfnTr276FDHyYpLtRYQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.40': + resolution: {integrity: sha512-H/K/3Ykk8aCSNuKDlv/sgbPdSks+zqFxZ4mzqaGJmlDqEfeaWYXan5fsvwQbACdNDJeKoKLO4GhnlnKlKWjiJg==} + cpu: [x64] + os: [linux] + libc: [glibc] - '@changesets/read@0.6.7': - resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.40': + resolution: {integrity: sha512-2SAfc35FEvvxkUz2yeh/4aNx0s9waZnce4KS64oUMlVpYEFtNBdfnZKCB/bgzJFvTxXjMs+HcU6OInGltH5jHA==} + engines: {node: '>=14.0.0'} - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': + resolution: {integrity: sha512-bBdHMxdfUHtIrS5xrt9udqdGRnGKdYQgKxJNIts+Il3Fs8QGyNwaZpi0tjnlRjYa0+GdWEC3Gw1Pmq/HFXzFeQ==} + cpu: [x64] + os: [win32] - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + '@dom-expressions/compiler@0.50.0-next.40': + resolution: {integrity: sha512-RI/kHU+QkLOHo4CQyqLTn9c7sAfl/GEULMsOpS1YqkPJgy7R8MCPWXFN4sI0QDBbM6ePtEyuW+2bsdsXqyxkzQ==} - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -445,15 +686,6 @@ packages: cpu: [x64] os: [win32] - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@jest/schemas@30.4.1': resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -477,27 +709,311 @@ packages: '@loaderkit/resolve@1.0.6': resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==} - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@lxsmnsyc/oxlint-config@0.1.3': + resolution: {integrity: sha512-m262vO8X3wXAFrObKFs2mKggp4TKT6TYDGM/LyGSxnkaPc7G8y6SHW/M09xkn/4ce0I33LubSS/N1Q1PyXcpNg==} + peerDependencies: + oxlint: ^1 - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/find-root@3.1.0': + resolution: {integrity: sha512-BcSqCyKhBVZ5YkSzOiheMCV41kqAFptW6xGqYSTjkVTl9XQpr+pqHhwgGCOHQtjDCv7Is6EFyA14Sm5GVbVABA==} + engines: {node: '>=20.0.0'} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@manypkg/get-packages@3.1.0': + resolution: {integrity: sha512-0TbBVyvPrP7xGYBI/cP8UP+yl/z+HtbTttAD7FMAJgn/kXOTwh5/60TsqP9ZYY710forNfyV0N8P/IE/ujGZJg==} + engines: {node: '>=20.0.0'} - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@manypkg/tools@2.1.2': + resolution: {integrity: sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==} + engines: {node: '>=20.0.0'} - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@napi-rs/wasm-runtime@1.2.7': + resolution: {integrity: sha512-zJccwplOAbgfZju95IUHazLnx9RAPtPN2YGJXI6UbrgeaR9QfPjGrQL6ERkSAtnVCA4Q+83ApGyaX5zdpCaKkQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 '@oxc-project/types@0.143.0': resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + '@oxfmt/binding-android-arm-eabi@0.78.0': + resolution: {integrity: sha512-1x9NPGQG5WMOOT8spRP4hPbeqwB/P9ayxFo4EUDSle6mLmtYRqE6suXgHr93/S2nnszy77LlIa8klkKdWtHbMw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.78.0': + resolution: {integrity: sha512-1muYaW9SiPEq8NIPGX0B20oUwCx6HWiCsZem/2jU7UsOzoXLT4YxWq6ybdhwKSKl0PyAfvyMyPF7FsI1To7AdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.78.0': + resolution: {integrity: sha512-jl4KJdo8HrVpLmcSYS/7oDXPH8Hzd6VrzgUFRAbY0j6cSRjcDkUnpuAStuNLoqvMtZEi7Rdy68BBriCgWJcy2g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.78.0': + resolution: {integrity: sha512-RwOhQgAQi1qV3TeuTfrgGkCWEL3eDFIql/lo4rt2xpGHqyolKa+W5cFbb+M9IvwMwQbplii5Gbv1ZQQPTJlNug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.78.0': + resolution: {integrity: sha512-MAXydj01mLjMUlnmo7sYVm+7kdBdU9Nwaux2Q1f9oLNqt3CCdego1oMoZ30qDyZQGQXfVJZEU1yRV7mSzwKDVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.78.0': + resolution: {integrity: sha512-rz6FVZRiWsq3O2YQgCoqZRwaQQaPQ70NBks4+KINjjPJOjBTd8g/iq6ynS97ode+qKGlhXtpc/xCl8LHzfOjyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.78.0': + resolution: {integrity: sha512-lIK0XJi4JP1FnhuLjR/JWhQHGghZc+ghFNnbZTQC8kxsmrkW3ex8CeF7fp0FT+rEP0Nm6voCYkasL8poVWA9sQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.78.0': + resolution: {integrity: sha512-o2LJIHfW3ZADOjDVk5c7MM1M8CiAG43GTc4mlJAK23fOHgru4CvnqWedCoCXpIsKokoRdEa7XdQywPGZv1BAiA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.78.0': + resolution: {integrity: sha512-G+lUaQk94Vo+4byyd8X2+pPXtd7wObpdbvBC8xyozZD0ROSVBI3XpNNR6HECkJq4Q51AwLuJG81f4x+4eqvSrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.78.0': + resolution: {integrity: sha512-r76PAZf9/ZgF/iDRaIf8nLsr4x6ZHe/j2QLmWUjoQ46Sa11qMO68a5u5iux3y8vLzqYTS/xtKO9PjjMfyk5png==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.78.0': + resolution: {integrity: sha512-SQiXTt/c4aVoRXkJvhf4Y/sA1XYe3XjSMDbdX5PiAssBuHERoGtncQXz0KKWkXPejWTKlAL4mZSQZdHOCiw7TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.78.0': + resolution: {integrity: sha512-VNB3wFUx/rAqwVNW+uyXxb+c0HUrmcS51UPkFMDWJY95c6Tck6u6HOyVLsqiYoC8kh2mGlwanYmjb/R2McvN0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.78.0': + resolution: {integrity: sha512-1nbI0Y7SXwx2f4mJmKt58MaDdjAcoaYM90pBMGdcZCsTW2taFW1/MUi3uQGRPAN2n+3PldCdO9m+D6x+gU/heg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.78.0': + resolution: {integrity: sha512-I2z2ISPjrl3CSRF5fmQkNnoh46UVU1GjM1V0+COJyNZcj0SDNM4DrPP2/gXCX38YJ1P2BL6sF2VdsJ+pEYEbJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.78.0': + resolution: {integrity: sha512-YHt5nKKFxT4SruI57FHnEhGRSDuoFqNoAM3moYCClg70mjjS39gBBbdzaZv+N0otdzvQVuHTPu3jFu5tpqC3XQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.78.0': + resolution: {integrity: sha512-WH21lBMU+LYzF7aMeozTZlyc44oa2F+I5OtQ7RwuidCDoAxgTyN1s34rx0PBYrio56+2G88U9VOnYJsyV7VMHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.78.0': + resolution: {integrity: sha512-uNQqHJrtHIiSl8pMbhDktmGpA1hqwldWNO8kbNpNFhVt+BYk4C3Ge8nlJgkRtGjtMam0+542G5UQJJG6lLePbg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.78.0': + resolution: {integrity: sha512-W6omURRT39EHBPH4Z8sUPIOzWVjMbhCCCWcfT0sa6aeC+vOXNyBAJmpQRh5//KfPDX96jJlNith9i4N65wxB+Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.78.0': + resolution: {integrity: sha512-r9rWKeDVc7lIrj0Us9kP08W7FudYAoWyEdO40qnKk20bHiTbW/z2v4LoIxxUENQyFfApbeV2Gl9XsEgY/tY1dA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@7.0.2006': + resolution: {integrity: sha512-uc0MEHXZUDW23Zmo5X28eSNeSnP17jKnh9GiehpVZqhfy99ks8spyXT5Llar3tjDN7ppnQN0Qd9FK6WNkdD+fQ==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@7.0.2006': + resolution: {integrity: sha512-+x1/pa3S3VMC9cif8XKTOCQUuqRT+wu1Ix+FK5svXa2xbXCuE7+4S0SfmuSnK/mk9AI5+xBxZFhILxmCPUZ1hA==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@7.0.2006': + resolution: {integrity: sha512-90v7HX8m54kHXn5DpjNEN18Fb7xwJMREe/wji3USyAf9pTMv7a3qZ3cPoLViIcIzxPLmkcYZIs1j1H3Z2gbVLA==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@7.0.2006': + resolution: {integrity: sha512-/k0wsEqHiA5dWBJYuld3Vecv6bIhKCasxpho/aFkvh870Qox33MuTkKUGWIVm/njAxw7W4pu1a/Xfa3jwuKuPQ==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@7.0.2006': + resolution: {integrity: sha512-CQT5sqcLZLNZSWLzUUEjQmp74UX8h1agp3ZJ8pfRktHbx6gfBa8a7CjrnRrZ9VXlwnXVkpw7m5KBO6y+S5MQRA==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@7.0.2006': + resolution: {integrity: sha512-VZsGowXcp3vQNkjoGeVCOTf4aGrRpRk6bBJWhefnJVPr6z+dX+LKqqHfwaqnFvg66Q2iJpXqklRW38YO21ee+Q==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.93.0': + resolution: {integrity: sha512-KKw70pbD5Pvq3G2lJ+WQ71XPMjCmg37rkSe2+mDqCRP3PoTSdDMuEi4UOnE8JBtyNM7bek61EC2s0Jt7S7u+Sg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.93.0': + resolution: {integrity: sha512-fvr1fTUZGelwRxKDt64pf28aL1WaWgviwz3X+E/FcRYvrlEahH0NECRz/c1SY+K+KWmZk5uAf6h1kQnyBkp/2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.93.0': + resolution: {integrity: sha512-VdvSN9JRf4Es6ZzoAdvEeh8tgKdw8L4H82WmA8MMPVfPdZGCwE/nI27Z1HrRHYQhPxOh4kmnxQEioSUFrOvDaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.93.0': + resolution: {integrity: sha512-QR1V890Ml0YGRG0F/iV0K9igG+pOhe+VWd+aZnxY849rRHZf3F2gEoQks5+GVHf105X9Mh/6HdShTP5juekG2g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.93.0': + resolution: {integrity: sha512-jDfIbi30zZaKi+rTvig3sge+Xhi8pFFSgHxb0jzovc4qh8ETm/irKV9c7N/JsuwnYc5sbvf4IC8w1vQQ0IL+BA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.93.0': + resolution: {integrity: sha512-qtxZ714ND/koFgVH00QgxlzZiIbRPmguaPhnHRU5DFFtrtEdOrSnZD4U/H2AzXrXkZ59eQbMBnJwbum5XohrIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.93.0': + resolution: {integrity: sha512-5pJ9NjMvH7WMUqXB6bTTOSemBm39w2cod27Hu3+Yom/GhbTeNXlYcpDx1o4CgBP6fhp0YHG66TNdVaUm6sHjsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.93.0': + resolution: {integrity: sha512-pRf+7jtbt2fHE23SX7qBxRgnBZicUgsoCK1PVIjnOk+t3a6UBkpt/GrKI99WlxsKUxftz/5nv/kfKvScmYywkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.93.0': + resolution: {integrity: sha512-zM8Fd/K8sqGvsBcJBZ3oVZ3ctGWbszA08IaGt5gFFF5RcunppAI/ZnAXbouABvnWeJ//S44KKlfPZnDDbeiphg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.93.0': + resolution: {integrity: sha512-7qKCnvhZKDXJG2pdbLazd2hw4FxjJHbZOFrrbzyy5PdHfPLH9vnNUa1le01A8uItZuYKPBPncH+HCoEiFT4SgA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.93.0': + resolution: {integrity: sha512-2pgulxC6G8V5wE750NJE/fRkf9aO6i6yoj10wyaR2EdiNtan4OemsOtsQ0ZTXGdY8Q3IoTmlND3GYvjJsvikYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.93.0': + resolution: {integrity: sha512-yWsn6Gg2PnGG5jlyDz5+pHGiMTMiy4adaa4WRMzDgzB8efaShk1JMmTHIBSVLQMh0tYXRs4CN5uJCO79r4Mi4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.93.0': + resolution: {integrity: sha512-WCn5plwp/ezS2RDPQKp0/EXEVRr9/dDexUdRKmsMFqzNM5xBSZ1wbsi3PuMk1VfkMRnI5BuazCsziCWMXRDOlw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.93.0': + resolution: {integrity: sha512-F2CGjb9LAkzH+IYTZSzd1klQ1vk5z6Utjax64WeLByCkYXbVDbsun+Oy2hLfW2MDSKCvW+jwy/9ld0EPgdeu+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.93.0': + resolution: {integrity: sha512-plf5DE2objcG8Tf7mXRuRa8tT8rzDkpjqXQtKoGsKHWkpgsialbON1+cCtoSEUTVbQUjXvuAm8vV9+3rR0yCBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.93.0': + resolution: {integrity: sha512-Kp2yJrKvoTe9FfKdO/xwLNUbs2bYTMKx0+aoQD1s0h/Tx0kSgtHSdGmrk8tTKdluosjFbo88qYRIaNIX43AfFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.93.0': + resolution: {integrity: sha512-vigjcHCFsR6KjnWTEVfaCxcMYapEuaK9FZa1MpewwQ1S+Xud3v0okfkj1RySsD6RF1NRHIjSlQSalTnKIaj3nA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.93.0': + resolution: {integrity: sha512-0Ot3BEe/AAr2/uQhe55r8CmPlperYk2mQmxdutOru7oU0kir6IiEVHb1TG3GORRlfra97lPHVDLhgmihiKzLrg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.93.0': + resolution: {integrity: sha512-ZzzIIVs/Qkm8trUWYKF0OYub5ALlv50/3gsEZbKAvWgz+yNJX6uRmQ8ySPXU2Q0/Y9m4JCOjhpmC8XUYbPHX5Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@pnpm/deps.graph-sequencer@1100.0.1': + resolution: {integrity: sha512-pOr5+q1fLYKwFN3LAJuGZEnfXDcQ73zqgDHMtGy+K+uIoUqyY+6MeDCWFwfu+4EFuq76I5EPFofoNAI+Bmmq4A==} + engines: {node: '>=22.13'} + '@publint/pack@0.1.6': resolution: {integrity: sha512-3uVNyGcVplhPZSLVyeIpL7+cIRn1YCSNHLG/rUIlBQMVH8YuN9++YF+5+UDIIO9RW98dujiUoTltO7RDB5bFJA==} engines: {node: '>=18'} @@ -622,14 +1138,33 @@ packages: '@solid-mediakit/shared@0.0.6': resolution: {integrity: sha512-OFy6QAS9fXQicV4+FmLtOzgWAjYuO1FjQlta09qBjgpRENr+xZqiPP8gUlRT0nph/dr7NP18b1cWiCzThZWqkw==} - '@solidjs/meta@0.29.4': - resolution: {integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==} + '@solidjs/signals@2.0.0-rc.21': + resolution: {integrity: sha512-F1TUMO/nd1XC//+tcaWxibOOgXBHQGmNQnAeiDnpLh+1smnlwIgKF6pc20evlyfQwqf0gP6rH4sNEqCPBNcpgg==} + engines: {node: '>=22.12.0'} + + '@solidjs/vite-plugin@3.0.0-next.27': + resolution: {integrity: sha512-wytjSKLe1YkUhi/TXr1yNOxZUjoajn3SILCF6TCHk7QJckrNRxddnsIIuzVbPbCm1icpkow75iIuF7EENBB7fQ==} peerDependencies: - solid-js: '>=1.8.4' + '@solidjs/web': '>=2.0.0-beta.32 <2.0.0-experimental.0' + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: '>=2.0.0-beta.32 <2.0.0-experimental.0' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + '@solidjs/web@2.0.0-rc.21': + resolution: {integrity: sha512-1E9dvR3/+5fQTI3oxxACBX2Rg4rezXgrljerhWDHR5uQZ04p5Z8qXROI7dIDJKyANtsnLKYbM2OyI/p/FmjGUA==} + engines: {node: '>=22.12.0'} + peerDependencies: + solid-js: ^2.0.0-rc.21 '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -657,9 +1192,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@26.2.0': resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} @@ -820,145 +1352,161 @@ packages: resolution: {integrity: sha512-rsYkGl2kOkDRsh1mxriYnk1qBS78vjlBJ3+T2XwtwKwqOliy2n+2Ae0EDxJ/uX1DZLm3KkBZarGO5isEnmHchA==} cpu: [arm64] os: [android] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-darwin-arm64@0.8.4': resolution: {integrity: sha512-tNLKzPF3FYmEcHSYvWp/LEpjHHAtDR13hwo6/gdCkYMi9x59CWn2obczKzWNe7kDor4/1AMZuJDEVRpFkTSefw==} cpu: [arm64] os: [darwin] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-darwin-x64@0.8.4': resolution: {integrity: sha512-tK7LWzXNb5JbZpnoCNHB0nEhPFss/LwwehM6m/f0oYDan+iZgFZXzdoy80JdE7dVxjTZDIhUNPx8X8xbIdaoxA==} cpu: [x64] os: [darwin] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-freebsd-x64@0.8.4': resolution: {integrity: sha512-5MUV4d7g2p5Hd8GiXW6ynTRgYjm4Dw4eM2gaWRZ4crkGetzNx+HlPxcEfGtVNPqH5Qaa4Z2REtzdsdgvaE6/Ng==} cpu: [x64] os: [freebsd] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-linux-arm-gnu@0.8.4': resolution: {integrity: sha512-g6LnHrR0Rfqq5cXs7olwR2+LlVDc876pw7Hh7YXbukVSiBxQkaxqsEO/trO25z2g99zWzgXwoYvQZ1TnwA2wEw==} cpu: [arm] os: [linux] libc: [glibc] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-linux-arm-musl@0.8.4': resolution: {integrity: sha512-7XAPHrROPEFuJWXEGZeLZQN4xR8ENQ65+HSCtCHjSzCwGgnX53GUjM9ExVcHopV0a5g4vu57v2wwtyWIM5iNOQ==} cpu: [arm] os: [linux] libc: [musl] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-linux-arm64-gnu@0.8.4': resolution: {integrity: sha512-fnBm7NLuuwFXy7F1vRIuyOc+RW9ADUjuCKVGY87Dj8jtr9XgESNrwb+B9VLSFY7nZ0rCdK/Sm1fBqJpI7eLdKQ==} cpu: [arm64] os: [linux] libc: [glibc] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-linux-arm64-musl@0.8.4': resolution: {integrity: sha512-6vTw4ZHO9nm4SUkw36uG+UE6/qifZ0E8HIef7Mx/U/c2Zxu3JLBfXtU7U/NN2GMkDmcJkgwjXfpQoYw4Ch5Y1w==} cpu: [arm64] os: [linux] libc: [musl] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-linux-x64-gnu@0.8.4': resolution: {integrity: sha512-+vuC3V3Lw+DB4oJgHV9pVDfQZlsZJnxmbdods7HzxgEALU3P5+czwdAcw3wfh7Ebabt0Ny8eLUb1k9RV5OB/+w==} cpu: [x64] os: [linux] libc: [glibc] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-linux-x64-musl@0.8.4': resolution: {integrity: sha512-QH60PE4eZecmgNGa1/T1cKPhrfxt6ANtu4lrQ1FZ50F9b0GS9WjGmIjrfdSUeQa+f2Iqk3oEFSJdgVHBg1KPNg==} cpu: [x64] os: [linux] libc: [musl] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-win32-arm64@0.8.4': resolution: {integrity: sha512-6r68c0nKZPIBRXZIBiD7zjlEukBR+xRxpTOVj4n1Fsjcdh4YbbJfjFfmIzdbo9jXR1xL+dPueDVdsRGOUH5MoQ==} cpu: [arm64] os: [win32] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-codegen/binding-win32-x64@0.8.4': resolution: {integrity: sha512-i+BW77LPjNqe7Apq50J3OeEaVfga3G+eT2bKjb6bj4yO99fil/jnKb4ZDH4JLvby/Q7hRa6VicL2EZ7iS+ifzA==} cpu: [x64] os: [win32] + deprecated: yuku-codegen is pure JavaScript since 0.14 '@yuku-parser/binding-android-arm64@0.8.4': resolution: {integrity: sha512-+HIMmv08Zrh9ugIAEMnKBMMePOl7CDxrjc8Vui1+GG2TJHM1yI1+3wo1pnXB6Nj2IiHugDkQw8ycUI6SA2EUkQ==} cpu: [arm64] os: [android] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-darwin-arm64@0.8.4': resolution: {integrity: sha512-Elf/B/2m3OsyvxoQnBk8Dtu+9csHkzBNs5Yv9GbHjT3x0kVKNWjFusyZgm41VwxcPDqdpRi8tWxNX7OqXkmf/A==} cpu: [arm64] os: [darwin] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-darwin-x64@0.8.4': resolution: {integrity: sha512-CjZuMoXnL5XUkVpDqh4WDPwpAw8CwmtHHnTerGkS45So/sNuwkXdyIAEqqIZfaLopi5W/V9NApAT2md9XizjsQ==} cpu: [x64] os: [darwin] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-freebsd-x64@0.8.4': resolution: {integrity: sha512-ibLKORdz71iI4Vs+fyFgvwQ51P5XcxJIyQLa8cSEWqwptRdo+BTcZHIQEcZnFDPUuvmJ19RRH9CoiJdfhr7pZw==} cpu: [x64] os: [freebsd] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-linux-arm-gnu@0.8.4': resolution: {integrity: sha512-Fo3r5fYhGDcFnl+KN+L9PgtiQPS4AIE1n1mG1o5jZ11p7g5yZ/1EjLFmSHAUsoXreun8KjTsFjEL7P1Sb93PZQ==} cpu: [arm] os: [linux] libc: [glibc] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-linux-arm-musl@0.8.4': resolution: {integrity: sha512-BEB31vUEgXPWf7WkoMPSzzJhpC/wWCBXyysRCCPsw47BJ/OtbQsvJbxX9fFDuSRLy3kbyIV/WbdUTgbQ9COxiw==} cpu: [arm] os: [linux] libc: [musl] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-linux-arm64-gnu@0.8.4': resolution: {integrity: sha512-xGLCRcHn9xVz7JVNyyKtiNJSf503qtUmih9XVSsghgzOmiKUMnHObs69OMMwXN3788tg1jsl11fNjjQlB8idMA==} cpu: [arm64] os: [linux] libc: [glibc] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-linux-arm64-musl@0.8.4': resolution: {integrity: sha512-3kNRi8NJT2q6FQRVCUFHIQ99+kXdi8cVJEEUi6+xtFqpMgNrZNnbgAj28ILsDC7zmclaU+v47eUCeJoKLSCbww==} cpu: [arm64] os: [linux] libc: [musl] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-linux-x64-gnu@0.8.4': resolution: {integrity: sha512-isi62oMy94Z3OXwGs2l2rkqRiRyqLmfHeTRHpA/uWZbsNhnm7IdVvkF7e7wHNKAtd5jwGzOqYSroxKv2fOm7Cw==} cpu: [x64] os: [linux] libc: [glibc] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-linux-x64-musl@0.8.4': resolution: {integrity: sha512-9RsEw2xYHqU/pjSRBTOupWN3sF8uz9stjJdARfz6o0llvF+yfrj5QHmTiocGGBeAI80fvKmDtr2RIQClUzAPcA==} cpu: [x64] os: [linux] libc: [musl] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-win32-arm64@0.8.4': resolution: {integrity: sha512-VEZHo9rEGOBKR20sA3vCO00aQvwWND5aLu7YxeX+YupMZJh9hd1f17AbClJN37Q2iL1PCHht+wDTOKX6tZYqXg==} cpu: [arm64] os: [win32] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-parser/binding-win32-x64@0.8.4': resolution: {integrity: sha512-PeH3VzN1feGjPtDpVEAqf000fPT+nxtw/696LKp/5Z9RJi/MaXpB636QC+5QtrAPSoEnIkyEe+c+mq2QLZPWBA==} cpu: [x64] os: [win32] + deprecated: yuku-parser runs on yuku-core since 0.14 '@yuku-toolchain/types@0.8.4': resolution: {integrity: sha512-p7JE8flrj7ijZ/qLjHi4UwKqMarMD6zumbKXhrjp2I2iLJOuTYiQyci2U36VlXcUlNyzsY7E/mLnKCHotbzJVw==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} @@ -967,16 +1515,6 @@ packages: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -987,6 +1525,15 @@ packages: peerDependencies: '@babel/core': '>=7.22.0' + babel-preset-solid@2.0.0-beta.34: + resolution: {integrity: sha512-r06URXFAiHtT9dIKG4sF2mgqxh6rpd6KOYtPNX4HFxC5nZLsNSybLZcuZ30cONUl//n/Tav6IzZQiSwxqCkLfg==} + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^2.0.0-beta.34 + peerDependenciesMeta: + solid-js: + optional: true + base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} @@ -996,14 +1543,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - browserslist@4.28.8: resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1027,9 +1566,6 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chardet@2.2.0: - resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -1042,10 +1578,6 @@ packages: core-js@3.50.0: resolution: {integrity: sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} @@ -1078,18 +1610,10 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dts-resolver@3.0.0: resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} engines: {node: ^22.18.0 || >=24.0.0} @@ -1110,9 +1634,9 @@ packages: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} @@ -1124,11 +1648,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -1143,15 +1662,14 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -1168,22 +1686,6 @@ packages: fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1197,17 +1699,6 @@ packages: resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} engines: {node: '>=20.20.0'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1219,56 +1710,30 @@ packages: hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + human-id@4.2.0: resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} hasBin: true - iconv-lite@0.7.3: - resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} import-without-cache@0.4.0: resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==} engines: {node: ^22.18.0 || >=24.0.0} - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.15.1: - resolution: {integrity: sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==} - hasBin: true - - js-yaml@4.3.1: - resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -1279,8 +1744,11 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + launch-editor@2.14.2: + resolution: {integrity: sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==} lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} @@ -1359,16 +1827,9 @@ packages: linebreak@1.1.0: resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} @@ -1379,13 +1840,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} @@ -1411,31 +1868,38 @@ packages: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + oxfmt@0.78.0: + resolution: {integrity: sha512-uagX+70mKqh/YqxB6ON/lkxVPH6E1Z7pfP2x6XVRPPyiDCZtX6o1xIEeXAIXJ/2wA5ViX4RFuW+IAQn85yJdWg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@astrojs/compiler-rs': ^0.5.0 + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + '@astrojs/compiler-rs': + optional: true + svelte: + optional: true + vite-plus: + optional: true - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + oxlint-tsgolint@7.0.2006: + resolution: {integrity: sha512-5B3UtH71kycPHUC1kFEIffivEAs49SUmkJuHZOZnTY0NPj4legp0bcsCQucuLVNCoJzDucS68P2C4WIhP+LypQ==} + hasBin: true - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + oxlint@1.93.0: + resolution: {integrity: sha512-19JMsQFX+YvEbcUTFQxjTwhvs0Ibg0D6CFneSLgpwnACWcY/6LjhpGpkPodh0T5aIT1pjMTLlYaeBFzaVgugTA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2005' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -1446,17 +1910,8 @@ packages: parse-css-color@0.2.1: resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1464,17 +1919,13 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - picomatch@4.0.5: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -1483,11 +1934,6 @@ packages: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - prettier@3.9.6: resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} @@ -1502,40 +1948,22 @@ packages: engines: {node: '>=18'} hasBin: true - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} react-is@19.2.8: resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - rejoinder@2.1.0: resolution: {integrity: sha512-dLN0+SBPutC6bVFCH2+1o2VrHrvAj/PX6MzTemeaEKlCL10JKPMRlqszkitLQnHVgm90QQ94wxoBJRgfIEkstg==} engines: {node: ^20.18.0 || ^22.12.0 || >=23.3.0} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown-plugin-dts@0.27.14: resolution: {integrity: sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==} engines: {node: ^22.18.0 || >=24.11.0} @@ -1560,16 +1988,10 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - satori-html@0.3.2: resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} @@ -1586,15 +2008,15 @@ packages: engines: {node: '>=10'} hasBin: true - seroval-plugins@1.5.6: - resolution: {integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==} - engines: {node: '>=10'} + seroval-plugins@1.7.0: + resolution: {integrity: sha512-WM4rArfPtLZriTuxC5DBvNulEwAaRcjNe/dkMOEesOcuvXf5nEwKf5Bw3AT92WHohqcc45+57GdtsCuBTI0mjw==} + engines: {node: '>=20'} peerDependencies: seroval: ^1.0 - seroval@1.5.6: - resolution: {integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==} - engines: {node: '>=10'} + seroval@1.7.0: + resolution: {integrity: sha512-FU+LUkmDzWNsJ6oubZFN3dGPKny53DRhPJG6nftEaXDL8MIn19+kEE1Gvc+63Go+qPOwVUlKIdKhsu2HN6tksw==} + engines: {node: '>=20'} sharp@0.35.3: resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} @@ -1605,38 +2027,25 @@ packages: '@types/node': optional: true - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shell-quote@1.12.0: + resolution: {integrity: sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==} + engines: {node: '>= 0.4'} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + sisteransi@2.0.0: + resolution: {integrity: sha512-2WCqLdt12eN6ehLI50S2/ZxoowXU3DD1KVPRyVP0WEsFahrGZZmCdq1K59qjJljMRIDTwx1D9YaRK+hDneBUMg==} + engines: {node: '>=20'} - solid-js@1.9.14: - resolution: {integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==} + solid-js@2.0.0-rc.21: + resolution: {integrity: sha512-0Z8/qiJKnK6A2g8QspGthwxR0W8WauMOD2/LQtNmxBT8gpZkKaXmo/fdek/+cB+84w4HYejWJixSAn4fcAI0Uw==} + engines: {node: '>=22.12.0'} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1646,14 +2055,6 @@ packages: string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1662,10 +2063,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -1676,18 +2073,22 @@ packages: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.1.1: resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -1755,10 +2156,6 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - unplugin@3.3.0: resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1798,6 +2195,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + validate-html-nesting@1.2.4: + resolution: {integrity: sha512-doQi7e8EJ2OWneSG1aZpJluS6A49aZM0+EICXWKm1i6WvqTLmq0tpUcImc4KTWG50mORO0C4YDBtOCSYvElftw==} + validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1849,6 +2249,14 @@ packages: yaml: optional: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@4.1.10: resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1893,11 +2301,6 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -1906,6 +2309,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} @@ -1957,17 +2365,17 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.25.2': + '@babel/core@7.25.2(supports-color@8.1.1)': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.25.2) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -1977,16 +2385,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 @@ -2017,50 +2425,54 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.29.7': + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.25.2)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -2070,18 +2482,18 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -2101,55 +2513,53 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/runtime@7.29.7': {} - '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - '@babel/traverse@7.29.8': + '@babel/traverse@7.29.8(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 @@ -2168,154 +2578,185 @@ snapshots: '@braidai/lang@1.1.2': {} - '@changesets/apply-release-plan@7.1.1': - dependencies: - '@changesets/config': 3.1.4 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 + '@changesets/apply-release-plan@8.1.1': + dependencies: + '@changesets/config': 4.0.1 + '@changesets/format': 0.1.3 + '@changesets/git': 4.0.1 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + import-meta-resolve: 4.2.0 + jsonc-parser: 3.3.1 semver: 7.8.5 - '@changesets/assemble-release-plan@6.0.10': + '@changesets/assemble-release-plan@7.0.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 semver: 7.8.5 - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/cli@2.31.1(@types/node@26.2.0)': - dependencies: - '@changesets/apply-release-plan': 7.1.1 - '@changesets/assemble-release-plan': 6.0.10 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.4 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.4 - '@changesets/get-release-plan': 4.0.16 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.7 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@26.2.0) - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - enquirer: 2.4.1 - fs-extra: 7.0.1 - mri: 1.2.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 + '@changesets/changelog-git@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + + '@changesets/cli@3.0.3': + dependencies: + '@changesets/apply-release-plan': 8.1.1 + '@changesets/assemble-release-plan': 7.0.0 + '@changesets/changelog-git': 1.0.0 + '@changesets/config': 4.0.1 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/git': 4.0.1 + '@changesets/pre': 3.0.0 + '@changesets/read': 1.0.1 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@changesets/write': 1.0.1 + '@clack/prompts': 1.9.0 + '@manypkg/get-packages': 3.1.0 + '@pnpm/deps.graph-sequencer': 1100.0.1 + cac: 7.0.0 + import-meta-resolve: 4.2.0 + launch-editor: 2.14.2 + package-manager-detector: 1.8.0 semver: 7.8.5 - spawndamnit: 3.0.1 - term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' + tinyexec: 1.3.1 - '@changesets/config@3.1.4': + '@changesets/config@4.0.1': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.4 - '@changesets/logger': 0.1.1 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.7 + + '@changesets/errors@1.0.0': {} - '@changesets/errors@0.2.0': + '@changesets/format@0.1.3': dependencies: - extendable-error: 0.1.7 + package-manager-detector: 1.8.0 + tinyexec: 1.3.1 - '@changesets/get-dependents-graph@2.1.4': + '@changesets/get-dependents-graph@3.0.0': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 + '@changesets/types': 7.0.0 semver: 7.8.5 - '@changesets/get-release-plan@4.0.16': + '@changesets/git@4.0.1': dependencies: - '@changesets/assemble-release-plan': 6.0.10 - '@changesets/config': 3.1.4 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.7 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.5 + tinyexec: 1.3.1 - '@changesets/get-version-range-type@0.4.0': {} + '@changesets/parse@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + yaml: 2.9.1 - '@changesets/git@3.0.4': + '@changesets/pre@3.0.0': dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 - '@changesets/logger@0.1.1': + '@changesets/read@1.0.1': dependencies: - picocolors: 1.1.1 + '@changesets/git': 4.0.1 + '@changesets/parse': 1.0.0 + '@changesets/types': 7.0.0 + + '@changesets/should-skip-package@1.0.0': + dependencies: + '@changesets/types': 7.0.0 + + '@changesets/types@7.0.0': {} - '@changesets/parse@0.4.3': + '@changesets/write@1.0.1': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 4.3.1 + '@changesets/format': 0.1.3 + '@changesets/types': 7.0.0 + human-id: 4.2.0 - '@changesets/pre@2.0.2': + '@clack/core@1.6.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 2.0.0 - '@changesets/read@0.6.7': + '@clack/prompts@1.9.0': dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.3 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@clack/core': 1.6.0 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 2.0.0 - '@changesets/should-skip-package@0.1.2': + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/types': 7.29.8 + html-entities: 2.3.3 + parse5: 7.3.0 + validate-html-nesting: 1.2.4 + + '@dom-expressions/compiler-darwin-arm64@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler-darwin-x64@0.50.0-next.40': + optional: true - '@changesets/types@4.1.0': {} + '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.40': + optional: true - '@changesets/types@6.1.0': {} + '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.40': + optional: true - '@changesets/write@0.4.0': + '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.40': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.2.0 - prettier: 2.8.8 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': + optional: true + + '@dom-expressions/compiler@0.50.0-next.40': + optionalDependencies: + '@dom-expressions/compiler-darwin-arm64': 0.50.0-next.40 + '@dom-expressions/compiler-darwin-x64': 0.50.0-next.40 + '@dom-expressions/compiler-linux-arm64-gnu': 0.50.0-next.40 + '@dom-expressions/compiler-linux-x64-gnu': 0.50.0-next.40 + '@dom-expressions/compiler-wasm32-wasi': 0.50.0-next.40 + '@dom-expressions/compiler-win32-x64-msvc': 0.50.0-next.40 + + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@img/colour@1.1.0': optional: true @@ -2423,13 +2864,6 @@ snapshots: '@img/sharp-win32-x64@0.35.3': optional: true - '@inquirer/external-editor@1.0.3(@types/node@26.2.0)': - dependencies: - chardet: 2.2.0 - iconv-lite: 0.7.3 - optionalDependencies: - '@types/node': 26.2.0 - '@jest/schemas@30.4.1': dependencies: '@sinclair/typebox': 0.34.52 @@ -2457,36 +2891,168 @@ snapshots: dependencies: '@braidai/lang': 1.1.2 - '@manypkg/find-root@1.1.0': + '@lxsmnsyc/oxlint-config@0.1.3(oxlint@1.93.0(oxlint-tsgolint@7.0.2006))': dependencies: - '@babel/runtime': 7.29.7 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + oxlint: 1.93.0(oxlint-tsgolint@7.0.2006) - '@manypkg/get-packages@1.1.3': + '@manypkg/find-root@3.1.0': dependencies: - '@babel/runtime': 7.29.7 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + '@manypkg/tools': 2.1.2 - '@nodelib/fs.scandir@2.1.5': + '@manypkg/get-packages@3.1.0': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@manypkg/find-root': 3.1.0 + '@manypkg/tools': 2.1.2 - '@nodelib/fs.stat@2.0.5': {} + '@manypkg/tools@2.1.2': + dependencies: + jju: 1.4.0 + tinyglobby: 0.2.17 + yaml: 2.9.1 - '@nodelib/fs.walk@1.2.8': + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.4 + optional: true '@oxc-project/types@0.143.0': {} + '@oxfmt/binding-android-arm-eabi@0.78.0': + optional: true + + '@oxfmt/binding-android-arm64@0.78.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.78.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.78.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.78.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.78.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.78.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.78.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.78.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.78.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.78.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.78.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.78.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.78.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.78.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.78.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.78.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.78.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.78.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@7.0.2006': + optional: true + + '@oxlint-tsgolint/darwin-x64@7.0.2006': + optional: true + + '@oxlint-tsgolint/linux-arm64@7.0.2006': + optional: true + + '@oxlint-tsgolint/linux-x64@7.0.2006': + optional: true + + '@oxlint-tsgolint/win32-arm64@7.0.2006': + optional: true + + '@oxlint-tsgolint/win32-x64@7.0.2006': + optional: true + + '@oxlint/binding-android-arm-eabi@1.93.0': + optional: true + + '@oxlint/binding-android-arm64@1.93.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.93.0': + optional: true + + '@oxlint/binding-darwin-x64@1.93.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.93.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.93.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.93.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.93.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.93.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.93.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.93.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.93.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.93.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.93.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.93.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.93.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.93.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.93.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.93.0': + optional: true + + '@pnpm/deps.graph-sequencer@1100.0.1': {} + '@publint/pack@0.1.6': dependencies: tinyexec: 1.3.0 @@ -2554,20 +3120,44 @@ snapshots: '@sinclair/typebox@0.34.52': {} - '@solid-mediakit/shared@0.0.6': + '@solid-mediakit/shared@0.0.6(supports-color@8.1.1)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.25.2(supports-color@8.1.1) '@rollup/pluginutils': 5.4.0 transitivePeerDependencies: - rollup - supports-color - '@solidjs/meta@0.29.4(solid-js@1.9.14)': + '@solidjs/signals@2.0.0-rc.21': {} + + '@solidjs/vite-plugin@3.0.0-next.27(@solidjs/web@2.0.0-rc.21(solid-js@2.0.0-rc.21))(solid-js@2.0.0-rc.21)(supports-color@8.1.1)(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@dom-expressions/compiler': 0.50.0-next.40 + '@solidjs/web': 2.0.0-rc.21(solid-js@2.0.0-rc.21) + '@types/babel__core': 7.20.5 + babel-preset-solid: 2.0.0-beta.34(@babel/core@7.29.7(supports-color@8.1.1))(solid-js@2.0.0-rc.21) + merge-anything: 5.1.7 + solid-js: 2.0.0-rc.21 + vite: 8.2.1(@types/node@26.2.0)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)) + transitivePeerDependencies: + - supports-color + + '@solidjs/web@2.0.0-rc.21(solid-js@2.0.0-rc.21)': dependencies: - solid-js: 1.9.14 + seroval: 1.7.0 + seroval-plugins: 1.7.0(seroval@1.7.0) + solid-js: 2.0.0-rc.21 '@standard-schema/spec@1.1.0': {} + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.8 @@ -2604,8 +3194,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@12.20.55': {} - '@types/node@26.2.0': dependencies: undici-types: 8.3.0 @@ -2688,13 +3276,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0))': + '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.1(@types/node@26.2.0) + vite: 8.2.1(@types/node@26.2.0)(yaml@2.9.1) '@vitest/pretty-format@4.1.10': dependencies: @@ -2794,28 +3382,16 @@ snapshots: '@yuku-toolchain/types@0.8.4': {} - ansi-colors@4.1.3: {} - - ansi-regex@5.0.1: {} - ansi-styles@5.2.0: {} ansis@4.3.1: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-union@2.1.0: {} - assertion-error@2.0.1: {} - babel-plugin-tester@12.0.0(@babel/core@7.29.7): + babel-plugin-tester@12.0.0(@babel/core@7.29.7(supports-color@8.1.1)): dependencies: '@-xun/fs': 2.0.0 - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) core-js: 3.50.0 lodash.mergewith: 4.6.2 prettier: 3.9.6 @@ -2824,18 +3400,17 @@ snapshots: strip-indent~3: strip-indent@3.0.0 type-fest: 4.41.0 + babel-preset-solid@2.0.0-beta.34(@babel/core@7.29.7(supports-color@8.1.1))(solid-js@2.0.0-rc.21): + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.42(@babel/core@7.29.7(supports-color@8.1.1)) + optionalDependencies: + solid-js: 2.0.0-rc.21 + base64-js@0.0.8: {} baseline-browser-mapping@2.11.13: {} - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - browserslist@4.28.8: dependencies: baseline-browser-mapping: 2.11.13 @@ -2854,8 +3429,6 @@ snapshots: chalk@5.6.2: {} - chardet@2.2.0: {} - cjs-module-lexer@1.4.3: {} color-name@1.1.4: {} @@ -2864,12 +3437,6 @@ snapshots: core-js@3.50.0: {} - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - css-background-parser@0.1.0: {} css-box-shadow@1.0.0-3: {} @@ -2894,14 +3461,8 @@ snapshots: defu@6.1.7: {} - detect-indent@6.1.0: {} - detect-libc@2.1.2: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dts-resolver@3.0.0: {} electron-to-chromium@1.5.403: {} @@ -2910,10 +3471,7 @@ snapshots: empathic@2.0.1: {} - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 + entities@6.0.1: {} es-module-lexer@2.3.1: {} @@ -2921,8 +3479,6 @@ snapshots: escape-html@1.0.3: {} - esprima@4.0.1: {} - estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -2933,19 +3489,15 @@ snapshots: expect-type@1.4.0: {} - extendable-error@0.1.7: {} + fast-string-truncated-width@3.0.3: {} - fast-glob@3.3.3: + fast-string-width@3.0.2: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + fast-string-truncated-width: 3.0.3 - fastq@1.20.1: + fast-wrap-ansi@0.2.2: dependencies: - reusify: 1.1.0 + fast-string-width: 3.0.2 fdir@6.5.0(picomatch@4.0.5): optionalDependencies: @@ -2955,27 +3507,6 @@ snapshots: fflate@0.8.3: {} - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fsevents@2.3.3: optional: true @@ -2985,71 +3516,36 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - graceful-fs@4.2.11: {} - has-flag@4.0.0: {} hex-rgb@4.3.0: {} hookable@6.1.1: {} - human-id@4.2.0: {} + html-entities@2.3.3: {} - iconv-lite@0.7.3: - dependencies: - safer-buffer: 2.1.2 + human-id@4.2.0: {} - ignore@5.3.2: {} + import-meta-resolve@4.2.0: {} import-without-cache@0.4.0: {} - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - - is-windows@1.0.2: {} + is-what@4.1.16: {} - isexe@2.0.0: {} + jju@1.4.0: {} js-tokens@4.0.0: {} - js-yaml@3.15.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.3.1: - dependencies: - argparse: 2.0.1 - jsesc@3.1.0: {} json5@2.2.3: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 + jsonc-parser@3.3.1: {} + + launch-editor@2.14.2: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.12.0 lightningcss-android-arm64@1.33.0: optional: true @@ -3105,14 +3601,8 @@ snapshots: base64-js: 0.0.8 unicode-trie: 2.0.0 - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - lodash.mergewith@4.6.2: {} - lodash.startcase@4.4.0: {} - lru-cache@11.5.2: {} lru-cache@5.1.1: @@ -3123,12 +3613,9 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - merge2@1.4.1: {} - - micromatch@4.0.8: + merge-anything@5.1.7: dependencies: - braces: 3.0.3 - picomatch: 2.3.2 + is-what: 4.1.16 min-indent@1.0.1: {} @@ -3142,27 +3629,61 @@ snapshots: obug@2.1.4: {} - outdent@0.5.0: {} - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-map@2.1.0: {} - - p-try@2.2.0: {} - - package-manager-detector@0.2.11: + oxfmt@0.78.0: dependencies: - quansync: 0.2.11 + tinypool: 2.2.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.78.0 + '@oxfmt/binding-android-arm64': 0.78.0 + '@oxfmt/binding-darwin-arm64': 0.78.0 + '@oxfmt/binding-darwin-x64': 0.78.0 + '@oxfmt/binding-freebsd-x64': 0.78.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.78.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.78.0 + '@oxfmt/binding-linux-arm64-gnu': 0.78.0 + '@oxfmt/binding-linux-arm64-musl': 0.78.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.78.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.78.0 + '@oxfmt/binding-linux-riscv64-musl': 0.78.0 + '@oxfmt/binding-linux-s390x-gnu': 0.78.0 + '@oxfmt/binding-linux-x64-gnu': 0.78.0 + '@oxfmt/binding-linux-x64-musl': 0.78.0 + '@oxfmt/binding-openharmony-arm64': 0.78.0 + '@oxfmt/binding-win32-arm64-msvc': 0.78.0 + '@oxfmt/binding-win32-ia32-msvc': 0.78.0 + '@oxfmt/binding-win32-x64-msvc': 0.78.0 + + oxlint-tsgolint@7.0.2006: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 7.0.2006 + '@oxlint-tsgolint/darwin-x64': 7.0.2006 + '@oxlint-tsgolint/linux-arm64': 7.0.2006 + '@oxlint-tsgolint/linux-x64': 7.0.2006 + '@oxlint-tsgolint/win32-arm64': 7.0.2006 + '@oxlint-tsgolint/win32-x64': 7.0.2006 + + oxlint@1.93.0(oxlint-tsgolint@7.0.2006): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.93.0 + '@oxlint/binding-android-arm64': 1.93.0 + '@oxlint/binding-darwin-arm64': 1.93.0 + '@oxlint/binding-darwin-x64': 1.93.0 + '@oxlint/binding-freebsd-x64': 1.93.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.93.0 + '@oxlint/binding-linux-arm-musleabihf': 1.93.0 + '@oxlint/binding-linux-arm64-gnu': 1.93.0 + '@oxlint/binding-linux-arm64-musl': 1.93.0 + '@oxlint/binding-linux-ppc64-gnu': 1.93.0 + '@oxlint/binding-linux-riscv64-gnu': 1.93.0 + '@oxlint/binding-linux-riscv64-musl': 1.93.0 + '@oxlint/binding-linux-s390x-gnu': 1.93.0 + '@oxlint/binding-linux-x64-gnu': 1.93.0 + '@oxlint/binding-linux-x64-musl': 1.93.0 + '@oxlint/binding-openharmony-arm64': 1.93.0 + '@oxlint/binding-win32-arm64-msvc': 1.93.0 + '@oxlint/binding-win32-ia32-msvc': 1.93.0 + '@oxlint/binding-win32-x64-msvc': 1.93.0 + oxlint-tsgolint: 7.0.2006 package-manager-detector@1.8.0: {} @@ -3173,21 +3694,17 @@ snapshots: color-name: 1.1.4 hex-rgb: 4.3.0 - path-exists@4.0.0: {} - - path-key@3.1.1: {} - - path-type@4.0.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 pathe@2.0.3: {} picocolors@1.1.1: {} - picomatch@2.3.2: {} - picomatch@4.0.5: {} - pify@4.0.1: {} + picomatch@4.0.7: {} postcss-value-parser@4.2.0: {} @@ -3197,8 +3714,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@2.8.8: {} - prettier@3.9.6: {} pretty-format@30.4.1: @@ -3215,23 +3730,12 @@ snapshots: picocolors: 1.1.1 sade: 1.8.1 - quansync@0.2.11: {} - quansync@1.0.0: {} - queue-microtask@1.2.3: {} - react-is@18.3.1: {} react-is@19.2.8: {} - read-yaml-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.15.1 - pify: 4.0.1 - strip-bom: 3.0.0 - rejoinder@2.1.0: dependencies: '@-xun/debug': 2.0.2 @@ -3239,12 +3743,8 @@ snapshots: core-js: 3.50.0 exit-hook: 4.0.0 - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - reusify@1.1.0: {} - rolldown-plugin-dts@0.27.14(rolldown@1.2.3)(typescript@7.0.2): dependencies: dts-resolver: 3.0.0 @@ -3279,16 +3779,10 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.3 '@rolldown/binding-win32-x64-msvc': 1.2.3 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - sade@1.8.1: dependencies: mri: 1.2.0 - safer-buffer@2.1.2: {} - satori-html@0.3.2: dependencies: ultrahtml: 1.7.0 @@ -3311,11 +3805,11 @@ snapshots: semver@7.8.5: {} - seroval-plugins@1.5.6(seroval@1.5.6): + seroval-plugins@1.7.0(seroval@1.7.0): dependencies: - seroval: 1.5.6 + seroval: 1.7.0 - seroval@1.5.6: {} + seroval@1.7.0: {} sharp@0.35.3(@types/node@26.2.0): dependencies: @@ -3351,45 +3845,27 @@ snapshots: '@types/node': 26.2.0 optional: true - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} + shell-quote@1.12.0: {} siginfo@2.0.0: {} - signal-exit@4.1.0: {} + sisteransi@2.0.0: {} - slash@3.0.0: {} - - solid-js@1.9.14: + solid-js@2.0.0-rc.21: dependencies: + '@solidjs/signals': 2.0.0-rc.21 csstype: 3.2.3 - seroval: 1.5.6 - seroval-plugins: 1.5.6(seroval@1.5.6) + seroval: 1.7.0 + seroval-plugins: 1.7.0(seroval@1.7.0) source-map-js@1.2.1: {} - spawndamnit@3.0.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - sprintf-js@1.0.3: {} - stackback@0.0.2: {} std-env@4.2.0: {} string.prototype.codepointat@0.2.1: {} - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -3398,24 +3874,22 @@ snapshots: dependencies: has-flag: 4.0.0 - term-size@2.2.1: {} - tiny-inflate@1.0.3: {} tinybench@2.9.0: {} tinyexec@1.3.0: {} + tinyexec@1.3.1: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 - tinyrainbow@3.1.1: {} + tinypool@2.2.0: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 + tinyrainbow@3.1.1: {} tree-kill@1.2.2: {} @@ -3489,16 +3963,14 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 - universalify@0.1.2: {} - - unplugin@3.3.0(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)): + unplugin@3.3.0(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 optionalDependencies: rolldown: 1.2.3 - vite: 8.2.1(@types/node@26.2.0) + vite: 8.2.1(@types/node@26.2.0)(yaml@2.9.1) update-browserslist-db@1.3.0(browserslist@4.28.8): dependencies: @@ -3506,25 +3978,32 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + validate-html-nesting@1.2.4: {} + validate-npm-package-name@5.0.1: {} verkit@0.3.2: {} - vite@8.2.1(@types/node@26.2.0): + vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.26 rolldown: 1.2.3 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.2.0 fsevents: 2.3.3 + yaml: 2.9.1 + + vitefu@1.1.3(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)): + optionalDependencies: + vite: 8.2.1(@types/node@26.2.0)(yaml@2.9.1) - vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)): + vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(yaml@2.9.1)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -3541,7 +4020,7 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.2.1(@types/node@26.2.0) + vite: 8.2.1(@types/node@26.2.0)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.2.0 @@ -3550,10 +4029,6 @@ snapshots: webpack-virtual-modules@0.6.2: {} - which@2.0.2: - dependencies: - isexe: 2.0.0 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -3561,6 +4036,8 @@ snapshots: yallist@3.1.1: {} + yaml@2.9.1: {} + yoga-layout@3.2.1: {} yuku-ast@0.8.4: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..d7b42c4 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: + - packages/* +linkWorkspacePackages: true +preferWorkspacePackages: true +allowBuilds: + core-js: false diff --git a/src/compiler/index.ts b/src/compiler/index.ts deleted file mode 100644 index bf18ce4..0000000 --- a/src/compiler/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type babel from '@babel/core'; -import type { PluginObj } from '@babel/core'; -import { babel as babelUtils } from '@solid-mediakit/shared'; -import { addDynamicImages, addDynamicImagesTanstack, replaceDynamicImages } from './utils'; -export type Runtime = "SolidStart" | "TanstackStart" -export const transformOG = (runtime?: Runtime) => ({ - types: t, -}: { - types: typeof babel.types -}): PluginObj => { - return { - visitor: { - Program(path) { - const dynamicImages = replaceDynamicImages(t, path) - if (dynamicImages.length) { - babelUtils.importIfNotThere(path, t, 'createMemo', 'solid-js') - babelUtils.importIfNotThere( - path, - t, - 'createOpenGraphImage', - '@solidjs/ogp/server' - ) - if (runtime == "TanstackStart") { - addDynamicImagesTanstack(dynamicImages, t, path) - } - else { - addDynamicImages(dynamicImages, t, path) - } - } - return path - }, - }, - } -} \ No newline at end of file diff --git a/src/compiler/utils.ts b/src/compiler/utils.ts deleted file mode 100644 index eda5381..0000000 --- a/src/compiler/utils.ts +++ /dev/null @@ -1,225 +0,0 @@ -import * as babel from '@babel/core'; -import { babel as babelUtils } from '@solid-mediakit/shared'; - -type DynamicImage = { - element: babel.types.JSXElement - reactives: number - imageOptions?: babel.types.ObjectExpression -} - -const extractChild = ( - t: typeof babel.types, - element: babel.types.JSXElement, -) => { - const elementChildren = element.children.filter((ch) => - t.isJSXElement(ch), - ) as babel.types.JSXElement[] - if (!elementChildren.length) return null - return elementChildren.length === 1 - ? elementChildren[0] - : t.jsxElement( - t.jsxOpeningElement(t.jsxIdentifier('div'), []), - t.jsxClosingElement(t.jsxIdentifier('div')), - elementChildren, - false, - ) -} - -const extractImageOptions = (element: babel.types.JSXElement) => { - const index = element.openingElement.attributes.findIndex( - (a) => 'name' in a && a.name.name === 'imageOptions', - ) - if (index === -1) return - const attr = element.openingElement.attributes[index] - if ( - attr.type === 'JSXSpreadAttribute' || - attr.value?.type !== 'JSXExpressionContainer' || - attr.value.expression.type !== 'ObjectExpression' - ) - return - element.openingElement.attributes.splice(index, 1) - return attr.value.expression -} - -export const replaceDynamicImages = ( - t: typeof babel.types, - path: babel.NodePath, -) => { - const DynamicImages: DynamicImage[] = [] - const replaceDynamicImageVisitor: babel.Visitor = { - JSXElement(elementPath) { - const name = elementPath.node.openingElement.name - if (t.isJSXIdentifier(name) && name.name === 'DynamicImage') { - const imageOptions = extractImageOptions(elementPath.node) - const reactives = extractAndReplaceReactives(t, elementPath) - const child = extractChild(t, elementPath.node) - if (!child) throw new Error('DynamicImage must have a child element') - DynamicImages.push({ - reactives: reactives.length, - element: t.cloneNode(child), - imageOptions, - }) - elementPath.node.openingElement.selfClosing = true - elementPath.node.closingElement = null - name.name = `DynamicImage${DynamicImages.length}` - - const parent = elementPath.parentPath - const isJsx = parent.isJSXElement() || parent.isJSXFragment() - elementPath.replaceWith( - (isJsx ? t.jsxExpressionContainer : t.expressionStatement)( - t.callExpression(t.identifier(name.name), [ - t.objectExpression([ - t.objectProperty( - t.identifier('values'), - t.arrayExpression(reactives), - ), - ]), - ]), - ), - ) - } - }, - } - - path.traverse(replaceDynamicImageVisitor) - return DynamicImages -} -export const extractAndReplaceReactives = ( - t: typeof babel.types, - path: babel.NodePath, -) => { - const Reactives: babel.types.Expression[] = [] - const replaceReactivesVisitor: babel.Visitor = { - Property(path) { - if (path.node.type !== "ClassPrivateProperty") { - const expr = path.node.key; - if (path.node.computed && expr.type !== "PrivateName") { - path.node.key = t.identifier(`r${Reactives.length}`) - Reactives.push(t.cloneNode(expr)); - } - path.skip(); - } - }, - // Any call expression could be dynamic so replace - CallExpression(path) { - const expr = path.node; - path.replaceWith(t.identifier(`r${Reactives.length}`)) - Reactives.push(t.cloneNode(expr)); - path.skip(); - }, - // Replace the whole access rather than descending into it, otherwise the - // property names of `a.b.c` are each extracted as their own reactive. - MemberExpression(path) { - const expr = path.node; - path.replaceWith(t.identifier(`r${Reactives.length}`)) - Reactives.push(t.cloneNode(expr)); - path.skip(); - }, - Identifier(path) { - const expr = path.node; - path.replaceWith(t.identifier(`r${Reactives.length}`)) - Reactives.push(t.cloneNode(expr)); - path.skip(); - } - // JSXExpressionContainer(path) { - // const expr = path.node.expression - // if (t.isJSXEmptyExpression(expr)) return - // if (!isDynamic(t, path)) return - // path.node.expression = t.identifier(`r${Reactives.length}`) - // Reactives.push(t.cloneNode(expr)) - // }, - } - path.traverse(replaceReactivesVisitor) - return Reactives -} - -/**Generates the expression that destructures the arguments from the request*/ -export const argumentDeclaration = (t: typeof babel.types, image: DynamicImage) => { - const args: babel.types.Identifier[] = [] - for (let i = 0; i < image.reactives; i++) { - args.push(t.identifier(`r${i}`)) - } - const argsDecl = - args.length === 0 - ? null - : t.variableDeclaration('const', [ - t.variableDeclarator(t.arrayPattern(args), t.identifier('args')), - ]) - return argsDecl -} -/**Add dynamic image server functions for Solid Start */ -export const addDynamicImages = ( - images: DynamicImage[], - t: typeof babel.types, - path: babel.NodePath, -) => { - for (let i = 0; i < images.length; i++) { - const image = images[i] - const template = babel.template( - `const %%serverFnName%% = (...args)=>{ - 'use server'; - %%args%% - return createOpenGraphImage(%%jsx%%, %%imageOptions%%); - }; - const %%compName%% = (props)=>{ - const url = createMemo(()=>{ - return %%serverFnName%%.url.replace("_server", "_server/") + \`&args=\${encodeURIComponent(JSON.stringify(props.values))}\` - }); - return url; - };`, - { plugins: ['jsx'] }, - ) - - const argsDecl = argumentDeclaration(t, image) - - babelUtils.pushStmts( - template({ - compName: `DynamicImage${i + 1}`, - serverFnName: `DynamicImage${i + 1}ServerFunction`, - jsx: image.element, - args: argsDecl, - imageOptions: image.imageOptions, - }) as any, - path, - true, - ) - } -} - -export const addDynamicImagesTanstack = ( - images: DynamicImage[], - t: typeof babel.types, - path: babel.NodePath, -) => { - for (let i = 0; i < images.length; i++) { - const image = images[i] - const template = babel.template( - `const %%serverFnName%% = createServerFn({ - method: "GET", - response: "raw", - }).handler((ctx) => { - const args = ctx.data.values; - %%args%% - return createOpenGraphImage(%%jsx%%, %%imageOptions%%); - }) - const %%compName%% = (props) => { - const payload = () => ({"data":{"values":props.values},"context":{}}) - const url = createMemo(() => \`\${%%serverFnName%%.url}?payload=\${encodeURIComponent(JSON.stringify(payload()))}&createServerFn&raw\`) - return url - } - ` - ) - const argsDecl = argumentDeclaration(t, image) - babelUtils.pushStmts( - template({ - compName: `DynamicImage${i + 1}`, - serverFnName: `DynamicImage${i + 1}ServerFunction`, - jsx: image.element, - args: argsDecl, - imageOptions: image.imageOptions, - }) as any, - path, - true, - ) - } -} \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx deleted file mode 100644 index 4ad601c..0000000 --- a/src/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Meta } from '@solidjs/meta'; -import type { ImageResponseOptions } from '@vercel/og'; -import type { JSX, JSXElement, ParentProps } from 'solid-js'; -import { children, createMemo } from 'solid-js'; - -export const DynamicImage = (_props: { - children: JSX.Element | (() => JSX.Element | Promise) - imageOptions?: ImageResponseOptions -}): JSX.Element => { - throw new Error('This should be compiled away') -} - -export const Image = (props: ParentProps) => { - const child = children(() => props.children) - const url = createMemo(() => child()?.toString()) - return -} - -export const OpenGraph = (props: ParentProps & { origin: string }) => { - const child = children(() => props.children) - const url = createMemo(() => child()?.toString()) - return -} - -export const urlFromImage = (comp: JSXElement): (() => string) => { - return comp as any -} diff --git a/src/server/index.ts b/src/server/index.ts deleted file mode 100644 index e43dd03..0000000 --- a/src/server/index.ts +++ /dev/null @@ -1,62 +0,0 @@ - -import { ImageResponse } from '@vercel/og'; -import type { ImageResponseOptions } from '@vercel/og'; -import { html } from 'satori-html'; -import type { JSX } from 'solid-js'; -export const parseSolidJSX = async (jsx?: - | string - | JSX.Element - | (() => (string | JSX.Element) | Promise) - | { t: string }): Promise | undefined> => { - if (!jsx) return - if (typeof jsx === 'function') { - jsx = await jsx() - } - if (jsx && typeof jsx === 'object' && Object.hasOwn(jsx, 't')) { - jsx = (jsx as any).t.replace(/data-hk=\S+?((?=>)|\s)/, "") as string - } - if (typeof jsx !== 'string') { - return - } - const converted = html(jsx) - return converted -} -/** - * Given, JSX, or a function that returns JSX, returns an image response. - * Note: This can only be used on the server - */ -export async function createOpenGraphImage( - jsx?: - | string - | JSX.Element - | (() => (string | JSX.Element) | Promise) - | { t: string }, - opts?: ImageResponseOptions, -) { - const converted = await parseSolidJSX(jsx) - const img = new ImageResponse(converted as any, { - ...(opts ?? {}), - headers: { 'X-Content-Raw': '' }, - }) - return img -} - -export async function createBase64Image(jsx?: string | JSX.Element) { - const img = (await createOpenGraphImage(jsx)) as { body: ReadableStream } - const buf = await new Response(img.body).arrayBuffer() - const url = 'data:image/png;base64,' + Buffer.from(buf).toString('base64') - return url -} -// - -/** - * Parses the function arguments from the given URL - * @param url - * @returns - */ -export const getArguments = (url: string) => { - const argsStr = new URL(url).searchParams.get('args') - if (!argsStr) return [] - const args = JSON.parse(argsStr) - return args -} diff --git a/src/unplugin/index.ts b/src/unplugin/index.ts deleted file mode 100644 index 911e121..0000000 --- a/src/unplugin/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -import babel from '@babel/core'; -import { babel as babelUtils } from '@solid-mediakit/shared'; -import type { FilterPattern } from 'unplugin'; -import { createUnplugin } from 'unplugin'; -import { Runtime, transformOG } from '../compiler'; - -export type Options = { - filter?: { - include?: FilterPattern - exclude?: FilterPattern - } - log?: boolean | RegExp, - runtime?: Runtime, -} - -export const unplugin = createUnplugin((opts?: Options) => { - const filter = babelUtils.getFilter(opts?.filter) - const log = opts?.log - return { - enforce: 'pre', - name: 'unplugin-dynamic-image', - async transform(code, id) { - if (!filter(id)) { - return null - } - const plugins: babel.ParserOptions['plugins'] = ['typescript', 'jsx'] - - const res = await babel.transformAsync(code, { - plugins: [[transformOG(opts?.runtime)]], - parserOpts: { plugins }, - }) - if (!res?.code) return null - if (typeof log === "boolean") { - if (log == true) console.log(id, res.code); - } - else if (log && log.test(id)) { - // console.log("LOGGING!!", id, log.test(id)) - console.log(id, res.code); - } - return { code: res.code, map: res.map } - }, - } -}) -export const vitePlugin = unplugin.vite -export const rollupPlugin = unplugin.rollup -export const webpackPlugin = unplugin.webpack -export const rspackPlugin = unplugin.rspack -export const esbuildPlugin = unplugin.esbuild diff --git a/tests/compiler.test.ts b/tests/compiler.test.ts deleted file mode 100644 index 5505221..0000000 --- a/tests/compiler.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type babel from '@babel/core'; -import { pluginTester } from 'babel-plugin-tester'; -import { join } from 'node:path'; -import { transformOG } from '../src/compiler'; - -const plugins: babel.ParserOptions['plugins'] = ['typescript', 'jsx'] - -pluginTester({ - pluginName: "OGPlugin", - plugin: transformOG("SolidStart"), - babelOptions: { - presets: [['@babel/preset-typescript']], - parserOpts: { - plugins, - }, - }, - // snapshot: true, - fixtures: join(import.meta.dirname, 'fixtures/solid-start'), -}) -pluginTester({ - pluginName: "OGPlugin", - plugin: transformOG("TanstackStart"), - babelOptions: { - presets: [['@babel/preset-typescript']], - parserOpts: { - plugins, - }, - }, - // snapshot: true, - fixtures: join(import.meta.dirname, 'fixtures/tanstack-start'), -}) diff --git a/tests/fixtures/solid-start/custom-image-options/output.js b/tests/fixtures/solid-start/custom-image-options/output.js deleted file mode 100644 index 5801dfd..0000000 --- a/tests/fixtures/solid-start/custom-image-options/output.js +++ /dev/null @@ -1,21 +0,0 @@ -import { createOpenGraphImage } from '@solidjs/ogp/server' -import { createMemo } from 'solid-js' -const DynamicImage1ServerFunction = (...args) => { - 'use server' - - return createOpenGraphImage(Hi!, { - emoji: 'openmoji', - }) -} -const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) - return url -} -DynamicImage1({ - values: [], -}) \ No newline at end of file diff --git a/tests/fixtures/solid-start/multiple-images/output.js b/tests/fixtures/solid-start/multiple-images/output.js deleted file mode 100644 index 212c7ed..0000000 --- a/tests/fixtures/solid-start/multiple-images/output.js +++ /dev/null @@ -1,40 +0,0 @@ -import { createOpenGraphImage } from '@solidjs/ogp/server' -import { createMemo } from 'solid-js' -const DynamicImage2ServerFunction = (...args) => { - 'use server' - - const [r0] = args - return createOpenGraphImage({r0}, { - width: 800, - }) -} -const DynamicImage2 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage2ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) - return url -} -const DynamicImage1ServerFunction = (...args) => { - 'use server' - - const [r0] = args - return createOpenGraphImage({r0}) -} -const DynamicImage1 = (props) => { - const url = createMemo(() => { - return ( - DynamicImage1ServerFunction.url.replace('_server', '_server/') + - `&args=${encodeURIComponent(JSON.stringify(props.values))}` - ) - }) - return url -} -const first = DynamicImage1({ - values: [a()], -}) -const second = DynamicImage2({ - values: [b()], -}) \ No newline at end of file diff --git a/tests/server.test.ts b/tests/server.test.ts deleted file mode 100644 index 1dc15db..0000000 --- a/tests/server.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { getArguments, parseSolidJSX } from '../src/server' - -describe('parseSolidJSX', () => { - it('returns undefined when given nothing', async () => { - await expect(parseSolidJSX()).resolves.toBeUndefined() - await expect(parseSolidJSX(undefined)).resolves.toBeUndefined() - }) - - it('converts an HTML string into a satori vnode tree', async () => { - const vnode = await parseSolidJSX('hi') - expect(vnode).toMatchObject({ - type: 'div', - props: { children: [{ type: 'div', props: { children: 'hi' } }] }, - }) - }) - - it('unwraps a function that returns markup', async () => { - const vnode = await parseSolidJSX(() => 'sync') - expect(vnode).toMatchObject({ - props: { children: [{ type: 'span', props: { children: 'sync' } }] }, - }) - }) - - it('awaits a function that returns a promise', async () => { - const vnode = await parseSolidJSX(async () => 'async') - expect(vnode).toMatchObject({ - props: { children: [{ type: 'span', props: { children: 'async' } }] }, - }) - }) - - it("reads markup off Solid's `{ t }` server-rendered template object", async () => { - const vnode = await parseSolidJSX({ t: 'from template' }) - expect(vnode).toMatchObject({ - props: { children: [{ props: { children: 'from template' } }] }, - }) - }) - - it('strips the hydration key so it does not reach satori', async () => { - const vnode = await parseSolidJSX({ t: 'hi' }) - const serialized = JSON.stringify(vnode) - expect(serialized).not.toContain('data-hk') - expect(serialized).toContain('keep') - }) - - it('returns undefined for values it cannot turn into markup', async () => { - await expect(parseSolidJSX(123 as never)).resolves.toBeUndefined() - await expect(parseSolidJSX({ nope: true } as never)).resolves.toBeUndefined() - await expect(parseSolidJSX(() => 42 as never)).resolves.toBeUndefined() - }) -}) - -describe('getArguments', () => { - it('returns an empty list when the url carries no args', () => { - expect(getArguments('https://example.com/_server/')).toEqual([]) - expect(getArguments('https://example.com/_server/?other=1')).toEqual([]) - }) - - it('round-trips the values encoded by the compiled component', () => { - const values = ['hello', 42, { nested: true }, null] - const url = `https://example.com/_server/?args=${encodeURIComponent(JSON.stringify(values))}` - expect(getArguments(url)).toEqual(values) - }) - - it('throws on an args param that is not valid JSON', () => { - expect(() => getArguments('https://example.com/_server/?args=not-json')).toThrow() - }) -}) diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index 0a4e9a2..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - // babel-plugin-tester calls `describe`/`it` off the global scope. - globals: true, - }, -});