feat: complete MDX migration, stabilize routing and lead capture

Former-commit-id: ab5cc38c97e5f73d6e821465b90d199fb6e6edc9
This commit is contained in:
2026-05-03 21:06:47 +02:00
parent b13f628b55
commit f2fdea96ec
7175 changed files with 371649 additions and 1078689 deletions

6
node_modules/.bin/esbuild generated vendored
View File

@@ -10,9 +10,9 @@ case `uname` in
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.25.12/node_modules/esbuild/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.25.12/node_modules/esbuild/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.25.12/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.27.4/node_modules/esbuild/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.27.4/node_modules/esbuild/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.27.4/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.25.12/node_modules/esbuild/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.25.12/node_modules/esbuild/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.25.12/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.27.4/node_modules/esbuild/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.27.4/node_modules/esbuild/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/esbuild@0.27.4/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
"$basedir/../.pnpm/esbuild@0.25.12/node_modules/esbuild/bin/esbuild" "$@"
"$basedir/../.pnpm/esbuild@0.27.4/node_modules/esbuild/bin/esbuild" "$@"
exit $?

21
node_modules/.bin/payload generated vendored
View File

@@ -1,21 +0,0 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*)
if command -v cygpath > /dev/null 2>&1; then
basedir=`cygpath -w "$basedir"`
fi
;;
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/payload@3.81.0_graphql@16.13.2_typescript@5.9.3/node_modules/payload/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/payload@3.81.0_graphql@16.13.2_typescript@5.9.3/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/payload@3.81.0_graphql@16.13.2_typescript@5.9.3/node_modules/payload/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/payload@3.81.0_graphql@16.13.2_typescript@5.9.3/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../.pnpm/payload@3.81.0_graphql@16.13.2_typescript@5.9.3/node_modules/payload/bin.js" "$@"
else
exec node "$basedir/../.pnpm/payload@3.81.0_graphql@16.13.2_typescript@5.9.3/node_modules/payload/bin.js" "$@"
fi

8
node_modules/.bin/vite generated vendored
View File

@@ -10,12 +10,12 @@ case `uname` in
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules/vite/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules/vite/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules/vite/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules/vite/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules/vite/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules/vite/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules/vite/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules/vite/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules/vite/bin/vite.js" "$@"
exec "$basedir/node" "$basedir/../.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules/vite/bin/vite.js" "$@"
else
exec node "$basedir/../.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.25.1_0d8086fc635f99f3c602efe6e23374c1/node_modules/vite/bin/vite.js" "$@"
exec node "$basedir/../.pnpm/vite@8.0.3_@emnapi+core@1.9.1_@emnapi+runtime@1.9.1_@types+node@22.19.15_esbuild@0.27.4_ecb72a03752bdbedbbd7c67264d95609/node_modules/vite/bin/vite.js" "$@"
fi

8
node_modules/.bin/vitest generated vendored
View File

@@ -10,12 +10,12 @@ case `uname` in
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_a4b1431d4282ab99b79c0cb989b143d5/node_modules/vitest/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_a4b1431d4282ab99b79c0cb989b143d5/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_19bab7c39606080f97249e5e6c2814fa/node_modules/vitest/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_19bab7c39606080f97249e5e6c2814fa/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_a4b1431d4282ab99b79c0cb989b143d5/node_modules/vitest/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_a4b1431d4282ab99b79c0cb989b143d5/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_19bab7c39606080f97249e5e6c2814fa/node_modules/vitest/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_19bab7c39606080f97249e5e6c2814fa/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_a4b1431d4282ab99b79c0cb989b143d5/node_modules/vitest/vitest.mjs" "$@"
exec "$basedir/node" "$basedir/../.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_19bab7c39606080f97249e5e6c2814fa/node_modules/vitest/vitest.mjs" "$@"
else
exec node "$basedir/../.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_a4b1431d4282ab99b79c0cb989b143d5/node_modules/vitest/vitest.mjs" "$@"
exec node "$basedir/../.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.1_@types+node@22.19.15_@vitest+ui@4.1.2_happy-dom@2_19bab7c39606080f97249e5e6c2814fa/node_modules/vitest/vitest.mjs" "$@"
fi

8
node_modules/.bin/webpack generated vendored
View File

@@ -10,12 +10,12 @@ case `uname` in
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules/webpack/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules/webpack/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules/webpack/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules/webpack/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules/webpack/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules/webpack/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules/webpack/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules/webpack/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules/webpack/bin/webpack.js" "$@"
exec "$basedir/node" "$basedir/../.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules/webpack/bin/webpack.js" "$@"
else
exec node "$basedir/../.pnpm/webpack@5.105.4_esbuild@0.25.12/node_modules/webpack/bin/webpack.js" "$@"
exec node "$basedir/../.pnpm/webpack@5.105.4_esbuild@0.27.4/node_modules/webpack/bin/webpack.js" "$@"
fi

372
node_modules/.modules.yaml generated vendored
View File

@@ -5,8 +5,6 @@ hoistedDependencies:
'@acemir/cssom': private
'@alloc/quick-lru@5.2.0':
'@alloc/quick-lru': private
'@apidevtools/json-schema-ref-parser@11.9.3':
'@apidevtools/json-schema-ref-parser': private
'@asamuzakjp/css-color@4.1.2':
'@asamuzakjp/css-color': private
'@asamuzakjp/dom-selector@6.8.1':
@@ -53,8 +51,6 @@ hoistedDependencies:
'@babel/traverse': private
'@babel/types@7.29.0':
'@babel/types': private
'@borewit/text-codec@0.2.2':
'@borewit/text-codec': private
'@commitlint/config-validator@20.5.0':
'@commitlint/config-validator': private
'@commitlint/ensure@20.5.0':
@@ -243,50 +239,10 @@ hoistedDependencies:
'@csstools/css-syntax-patches-for-csstree': private
'@csstools/css-tokenizer@4.0.0':
'@csstools/css-tokenizer': private
'@date-fns/tz@1.2.0':
'@date-fns/tz': private
'@dimforge/rapier3d-compat@0.12.0':
'@dimforge/rapier3d-compat': private
'@discoveryjs/json-ext@0.5.7':
'@discoveryjs/json-ext': private
'@dnd-kit/accessibility@3.1.1(react@19.2.4)':
'@dnd-kit/accessibility': private
'@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@dnd-kit/core': private
'@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)':
'@dnd-kit/modifiers': private
'@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)':
'@dnd-kit/sortable': private
'@dnd-kit/utilities@3.2.2(react@19.2.4)':
'@dnd-kit/utilities': private
'@drizzle-team/brocli@0.10.2':
'@drizzle-team/brocli': private
'@emotion/babel-plugin@11.13.5':
'@emotion/babel-plugin': private
'@emotion/cache@11.14.0':
'@emotion/cache': private
'@emotion/hash@0.9.2':
'@emotion/hash': private
'@emotion/memoize@0.9.0':
'@emotion/memoize': private
'@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4)':
'@emotion/react': private
'@emotion/serialize@1.3.3':
'@emotion/serialize': private
'@emotion/sheet@1.4.0':
'@emotion/sheet': private
'@emotion/unitless@0.10.0':
'@emotion/unitless': private
'@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.4)':
'@emotion/use-insertion-effect-with-fallbacks': private
'@emotion/utils@1.4.2':
'@emotion/utils': private
'@emotion/weak-memoize@0.4.0':
'@emotion/weak-memoize': private
'@esbuild-kit/core-utils@3.3.2':
'@esbuild-kit/core-utils': private
'@esbuild-kit/esm-loader@2.6.5':
'@esbuild-kit/esm-loader': private
'@esbuild/darwin-arm64@0.27.3':
'@esbuild/darwin-arm64': private
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))':
@@ -309,24 +265,8 @@ hoistedDependencies:
'@eslint/plugin-kit': private
'@exodus/bytes@1.15.0(@noble/hashes@1.8.0)':
'@exodus/bytes': private
'@faceless-ui/modal@3.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@faceless-ui/modal': private
'@faceless-ui/scroll-info@2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@faceless-ui/scroll-info': private
'@faceless-ui/window-info@3.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@faceless-ui/window-info': private
'@fastify/otel@0.18.0(@opentelemetry/api@1.9.1)':
'@fastify/otel': private
'@floating-ui/core@1.7.5':
'@floating-ui/core': private
'@floating-ui/dom@1.7.6':
'@floating-ui/dom': private
'@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@floating-ui/react-dom': private
'@floating-ui/react@0.27.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@floating-ui/react': private
'@floating-ui/utils@0.2.11':
'@floating-ui/utils': private
'@formatjs/bigdecimal@0.2.0':
'@formatjs/bigdecimal': private
'@formatjs/ecma402-abstract@3.2.0':
@@ -383,64 +323,16 @@ hoistedDependencies:
'@jridgewell/sourcemap-codec': private
'@jridgewell/trace-mapping@0.3.31':
'@jridgewell/trace-mapping': private
'@jsdevtools/ono@7.1.3':
'@jsdevtools/ono': private
'@lexical/clipboard@0.41.0':
'@lexical/clipboard': private
'@lexical/code@0.41.0':
'@lexical/code': private
'@lexical/devtools-core@0.41.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@lexical/devtools-core': private
'@lexical/dragon@0.41.0':
'@lexical/dragon': private
'@lexical/extension@0.41.0':
'@lexical/extension': private
'@lexical/hashtag@0.41.0':
'@lexical/hashtag': private
'@lexical/headless@0.41.0':
'@lexical/headless': private
'@lexical/history@0.41.0':
'@lexical/history': private
'@lexical/html@0.41.0':
'@lexical/html': private
'@lexical/link@0.41.0':
'@lexical/link': private
'@lexical/list@0.41.0':
'@lexical/list': private
'@lexical/mark@0.41.0':
'@lexical/mark': private
'@lexical/markdown@0.41.0':
'@lexical/markdown': private
'@lexical/offset@0.41.0':
'@lexical/offset': private
'@lexical/overflow@0.41.0':
'@lexical/overflow': private
'@lexical/plain-text@0.41.0':
'@lexical/plain-text': private
'@lexical/react@0.41.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(yjs@13.6.30)':
'@lexical/react': private
'@lexical/rich-text@0.41.0':
'@lexical/rich-text': private
'@lexical/selection@0.41.0':
'@lexical/selection': private
'@lexical/table@0.41.0':
'@lexical/table': private
'@lexical/text@0.41.0':
'@lexical/text': private
'@lexical/utils@0.41.0':
'@lexical/utils': private
'@lexical/yjs@0.41.0(yjs@13.6.30)':
'@lexical/yjs': private
'@lhci/utils@0.15.1':
'@lhci/utils': private
'@mdx-js/mdx@3.1.1':
'@mdx-js/mdx': private
'@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.4)':
'@mdx-js/react': private
'@mediapipe/tasks-vision@0.10.17':
'@mediapipe/tasks-vision': private
'@medv/finder@4.0.2':
'@medv/finder': private
'@monaco-editor/loader@1.7.0':
'@monaco-editor/loader': private
'@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
'@monaco-editor/react': private
'@monogrid/gainmap-js@3.4.0(three@0.183.2)':
'@monogrid/gainmap-js': private
'@napi-rs/canvas-darwin-arm64@0.1.80':
@@ -541,12 +433,6 @@ hoistedDependencies:
'@parcel/watcher': private
'@paulirish/trace_engine@0.0.53':
'@paulirish/trace_engine': private
'@payloadcms/drizzle@3.81.0(@opentelemetry/api@1.9.1)(@types/pg@8.10.2)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(pg@8.16.3)':
'@payloadcms/drizzle': private
'@payloadcms/graphql@3.81.0(graphql@16.13.2)(payload@3.81.0(graphql@16.13.2)(typescript@5.9.3))(typescript@5.9.3)':
'@payloadcms/graphql': private
'@payloadcms/translations@3.81.0':
'@payloadcms/translations': private
'@pdf-lib/standard-fonts@1.0.0':
'@pdf-lib/standard-fonts': private
'@pdf-lib/upng@1.0.1':
@@ -557,8 +443,6 @@ hoistedDependencies:
'@pkgjs/parseargs': private
'@polka/url@1.0.0-next.29':
'@polka/url': private
'@preact/signals-core@1.14.1':
'@preact/signals-core': private
'@prisma/instrumentation@7.6.0(@opentelemetry/api@1.9.1)':
'@prisma/instrumentation': private
'@puppeteer/browsers@2.13.0':
@@ -685,7 +569,7 @@ hoistedDependencies:
'@sentry/utils': private
'@sentry/vercel-edge@10.47.0':
'@sentry/vercel-edge': private
'@sentry/webpack-plugin@5.1.1(webpack@5.105.4(esbuild@0.25.12))':
'@sentry/webpack-plugin@5.1.1(webpack@5.105.4(esbuild@0.27.4))':
'@sentry/webpack-plugin': private
'@sidvind/better-ajv-errors@4.0.1(ajv@8.18.0)':
'@sidvind/better-ajv-errors': private
@@ -715,10 +599,6 @@ hoistedDependencies:
'@tailwindcss/oxide-darwin-arm64': private
'@tailwindcss/oxide@4.2.2':
'@tailwindcss/oxide': private
'@tokenizer/inflate@0.4.1':
'@tokenizer/inflate': private
'@tokenizer/token@0.3.0':
'@tokenizer/token': private
'@tootallnate/quickjs-emscripten@0.23.0':
'@tootallnate/quickjs-emscripten': private
'@turbo/darwin-arm64@2.9.3':
@@ -735,8 +615,6 @@ hoistedDependencies:
'@types/babel__template': private
'@types/babel__traverse@7.28.0':
'@types/babel__traverse': private
'@types/busboy@1.5.4':
'@types/busboy': private
'@types/chai@5.2.3':
'@types/chai': private
'@types/connect@3.4.38':
@@ -783,38 +661,30 @@ hoistedDependencies:
'@types/json-schema': private
'@types/json5@0.0.29':
'@types/json5': private
'@types/lodash@4.17.24':
'@types/lodash': private
'@types/mdast@4.0.4':
'@types/mdast': private
'@types/mdx@2.0.13':
'@types/mdx': private
'@types/ms@2.1.0':
'@types/ms': private
'@types/mysql@2.15.27':
'@types/mysql': private
'@types/offscreencanvas@2019.7.3':
'@types/offscreencanvas': private
'@types/parse-json@4.0.2':
'@types/parse-json': private
'@types/pg-pool@2.0.7':
'@types/pg-pool': private
'@types/pg@8.10.2':
'@types/pg@8.15.6':
'@types/pg': private
'@types/react-reconciler@0.28.9(@types/react@19.2.14)':
'@types/react-reconciler': private
'@types/react-transition-group@4.4.12(@types/react@19.2.14)':
'@types/react-transition-group': private
'@types/stats.js@0.17.4':
'@types/stats.js': private
'@types/tedious@4.0.14':
'@types/tedious': private
'@types/trusted-types@2.0.7':
'@types/trusted-types': private
'@types/unist@3.0.3':
'@types/unist': private
'@types/use-sync-external-store@0.0.6':
'@types/use-sync-external-store': private
'@types/uuid@10.0.0':
'@types/uuid': private
'@types/webxr@0.5.24':
'@types/webxr': private
'@types/whatwg-mimetype@3.0.2':
@@ -853,7 +723,7 @@ hoistedDependencies:
'@use-gesture/react': private
'@vitest/expect@4.1.2':
'@vitest/expect': private
'@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@22.19.15)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
'@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@22.19.15)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
'@vitest/mocker': private
'@vitest/pretty-format@4.1.2':
'@vitest/pretty-format': private
@@ -933,8 +803,6 @@ hoistedDependencies:
ansi-regex: private
ansi-styles@4.3.0:
ansi-styles: private
anymatch@3.1.3:
anymatch: private
arg@5.0.2:
arg: private
argparse@1.0.10:
@@ -973,6 +841,8 @@ hoistedDependencies:
ast-types-flow: private
ast-types@0.13.4:
ast-types: private
astring@1.9.0:
astring: private
async-function@1.0.0:
async-function: private
async@3.2.6:
@@ -991,8 +861,6 @@ hoistedDependencies:
axobject-query: private
b4a@1.8.0:
b4a: private
babel-plugin-macros@3.1.0:
babel-plugin-macros: private
bail@2.0.2:
bail: private
balanced-match@4.0.4:
@@ -1023,14 +891,10 @@ hoistedDependencies:
bfj: private
bidi-js@1.0.3:
bidi-js: private
binary-extensions@2.3.0:
binary-extensions: private
bluebird@3.7.2:
bluebird: private
body-parser@1.20.4:
body-parser: private
body-scroll-lock@4.0.0-beta.0:
body-scroll-lock: private
boolbase@1.0.0:
boolbase: private
brace-expansion@5.0.5:
@@ -1043,16 +907,12 @@ hoistedDependencies:
browserify-zlib: private
browserslist@4.28.2:
browserslist: private
bson-objectid@2.0.4:
bson-objectid: private
buffer-crc32@0.2.13:
buffer-crc32: private
buffer-from@1.1.2:
buffer-from: private
buffer@6.0.3:
buffer: private
busboy@1.6.0:
busboy: private
bytes@3.1.2:
bytes: private
call-bind-apply-helpers@1.0.2:
@@ -1087,8 +947,6 @@ hoistedDependencies:
character-reference-invalid: private
chardet@0.7.0:
chardet: private
charenc@0.0.2:
charenc: private
check-more-types@2.24.0:
check-more-types: private
check-types@11.2.3:
@@ -1103,8 +961,6 @@ hoistedDependencies:
chrome-trace-event: private
chromium-bidi@14.0.0(devtools-protocol@0.0.1581282):
chromium-bidi: private
ci-info@4.4.0:
ci-info: private
citty@0.1.6:
citty: private
cjs-module-lexer@1.4.3:
@@ -1127,6 +983,8 @@ hoistedDependencies:
clone: private
cluster-key-slot@1.1.2:
cluster-key-slot: private
collapse-white-space@2.1.0:
collapse-white-space: private
color-convert@1.9.3:
color-convert: private
color-name@1.1.4:
@@ -1161,8 +1019,6 @@ hoistedDependencies:
configstore: private
consola@3.4.2:
consola: private
console-table-printer@2.12.1:
console-table-printer: private
content-disposition@0.5.4:
content-disposition: private
content-type@1.0.5:
@@ -1187,14 +1043,10 @@ hoistedDependencies:
cosmiconfig-typescript-loader: private
cosmiconfig@9.0.1(typescript@5.9.3):
cosmiconfig: private
croner@9.1.0:
croner: private
cross-env@7.0.3:
cross-env: private
cross-spawn@7.0.6:
cross-spawn: private
crypt@0.0.2:
crypt: private
crypto-js@4.2.0:
crypto-js: private
crypto-random-string@2.0.0:
@@ -1225,11 +1077,9 @@ hoistedDependencies:
css-tree: private
css-what@6.2.2:
css-what: private
cssfilter@0.0.10:
cssfilter: private
cssstyle@5.3.7:
cssstyle: private
csstype@3.1.3:
csstype@3.2.3:
csstype: private
d3-array@3.2.4:
d3-array: private
@@ -1265,10 +1115,6 @@ hoistedDependencies:
data-view-byte-length: private
data-view-byte-offset@1.0.1:
data-view-byte-offset: private
dataloader@2.2.3:
dataloader: private
date-fns@4.1.0:
date-fns: private
dateformat@4.6.3:
dateformat: private
debounce-fn@6.0.0:
@@ -1319,26 +1165,18 @@ hoistedDependencies:
dfa: private
doctrine@2.1.0:
doctrine: private
dom-helpers@5.2.1:
dom-helpers: private
dom-serializer@2.0.0:
dom-serializer: private
domelementtype@2.3.0:
domelementtype: private
domhandler@5.0.3:
domhandler: private
dompurify@3.2.7:
dompurify: private
domutils@3.2.2:
domutils: private
dot-prop@10.1.0:
dot-prop: private
draco3d@1.5.7:
draco3d: private
drizzle-kit@0.31.7:
drizzle-kit: private
drizzle-orm@0.44.7(@opentelemetry/api@1.9.1)(@types/pg@8.10.2)(pg@8.16.3):
drizzle-orm: private
dunder-proto@1.0.1:
dunder-proto: private
duplexer@0.1.2:
@@ -1399,8 +1237,10 @@ hoistedDependencies:
es-to-primitive: private
es-toolkit@1.45.1:
es-toolkit: private
esbuild-register@3.6.0(esbuild@0.25.12):
esbuild-register: private
esast-util-from-estree@2.0.0:
esast-util-from-estree: private
esast-util-from-js@2.0.1:
esast-util-from-js: private
esbuild@0.27.3:
esbuild: private
escalade@3.2.0:
@@ -1441,12 +1281,22 @@ hoistedDependencies:
esrecurse: private
estraverse@5.3.0:
estraverse: private
estree-util-attach-comments@3.0.0:
estree-util-attach-comments: private
estree-util-build-jsx@3.0.1:
estree-util-build-jsx: private
estree-util-is-identifier-name@3.0.0:
estree-util-is-identifier-name: private
estree-util-scope@1.0.0:
estree-util-scope: private
estree-util-to-js@2.0.0:
estree-util-to-js: private
estree-util-visit@2.0.0:
estree-util-visit: private
estree-walker@2.0.2:
estree-walker: private
estree-walker@3.0.3:
estree-walker: private
esutils@2.0.3:
esutils: private
etag@1.8.1:
@@ -1507,24 +1357,18 @@ hoistedDependencies:
figures: private
file-entry-cache@8.0.0:
file-entry-cache: private
file-type@21.3.4:
file-type: private
file-url@3.0.0:
file-url: private
fill-range@7.1.1:
fill-range: private
finalhandler@1.3.2:
finalhandler: private
find-root@1.1.0:
find-root: private
find-up@5.0.0:
find-up: private
flat-cache@4.0.1:
flat-cache: private
flatted@3.4.2:
flatted: private
focus-trap@7.5.4:
focus-trap: private
follow-redirects@1.15.11(debug@4.4.3):
follow-redirects: private
fontkit@2.0.4:
@@ -1573,7 +1417,7 @@ hoistedDependencies:
get-stream: private
get-symbol-description@1.1.0:
get-symbol-description: private
get-tsconfig@4.8.1:
get-tsconfig@4.13.7:
get-tsconfig: private
get-uri@6.0.5:
get-uri: private
@@ -1599,12 +1443,6 @@ hoistedDependencies:
gopd: private
graceful-fs@4.2.11:
graceful-fs: private
graphql-http@1.22.4(graphql@16.13.2):
graphql-http: private
graphql-playground-html@1.6.30:
graphql-playground-html: private
graphql-scalars@1.22.2(graphql@16.13.2):
graphql-scalars: private
gzip-size@6.0.0:
gzip-size: private
has-bigints@1.1.0:
@@ -1627,6 +1465,8 @@ hoistedDependencies:
hast-util-parse-selector: private
hast-util-raw@9.1.0:
hast-util-raw: private
hast-util-to-estree@3.1.3:
hast-util-to-estree: private
hast-util-to-jsx-runtime@2.3.6:
hast-util-to-jsx-runtime: private
hast-util-to-parse5@8.0.1:
@@ -1673,8 +1513,6 @@ hoistedDependencies:
http-link-header: private
http-proxy-agent@7.0.2:
http-proxy-agent: private
http-status@2.1.0:
http-status: private
https-proxy-agent@7.0.6:
https-proxy-agent: private
human-signals@2.1.0:
@@ -1691,8 +1529,6 @@ hoistedDependencies:
ieee754: private
ignore@5.3.2:
ignore: private
image-size@2.0.2:
image-size: private
image-ssim@0.2.0:
image-ssim: private
immediate@3.0.6:
@@ -1725,7 +1561,7 @@ hoistedDependencies:
intl-messageformat: private
ip-address@10.1.0:
ip-address: private
ipaddr.js@2.2.0:
ipaddr.js@1.9.1:
ipaddr.js: private
is-alphabetical@2.0.1:
is-alphabetical: private
@@ -1739,12 +1575,8 @@ hoistedDependencies:
is-async-function: private
is-bigint@1.1.0:
is-bigint: private
is-binary-path@2.1.0:
is-binary-path: private
is-boolean-object@1.2.2:
is-boolean-object: private
is-buffer@1.1.6:
is-buffer: private
is-bun-module@2.0.0:
is-bun-module: private
is-callable@1.2.7:
@@ -1833,8 +1665,6 @@ hoistedDependencies:
isexe: private
isomorphic-fetch@3.0.0:
isomorphic-fetch: private
isomorphic.js@0.2.5:
isomorphic.js: private
iterator.prototype@1.1.5:
iterator.prototype: private
its-fine@2.0.0(@types/react@19.2.14)(react@19.2.4):
@@ -1849,8 +1679,6 @@ hoistedDependencies:
jiti: private
joi@18.1.2:
joi: private
jose@5.10.0:
jose: private
joycon@3.1.1:
joycon: private
jpeg-js@0.4.4:
@@ -1873,8 +1701,6 @@ hoistedDependencies:
json-buffer: private
json-parse-even-better-errors@2.3.1:
json-parse-even-better-errors: private
json-schema-to-typescript@15.0.3:
json-schema-to-typescript: private
json-schema-traverse@0.4.1:
json-schema-traverse: private
json-schema-typed@8.0.2:
@@ -1883,8 +1709,6 @@ hoistedDependencies:
json-stable-stringify-without-jsonify: private
json5@2.2.3:
json5: private
jsox@1.2.121:
jsox: private
jsx-ast-utils@3.3.5:
jsx-ast-utils: private
keyv@4.5.4:
@@ -1905,10 +1729,6 @@ hoistedDependencies:
legacy-javascript: private
levn@0.4.1:
levn: private
lexical@0.41.0:
lexical: private
lib0@0.2.117:
lib0: private
lie@3.3.0:
lie: private
lighthouse-logger@1.2.0:
@@ -1975,6 +1795,8 @@ hoistedDependencies:
make-dir: private
map-stream@0.1.0:
map-stream: private
markdown-extensions@2.0.0:
markdown-extensions: private
markdown-table@3.0.4:
markdown-table: private
marked@15.0.12:
@@ -1985,11 +1807,9 @@ hoistedDependencies:
math-intrinsics: private
md-to-react-email@5.0.5(react@19.2.4):
md-to-react-email: private
md5@2.3.0:
md5: private
mdast-util-find-and-replace@3.0.2:
mdast-util-find-and-replace: private
mdast-util-from-markdown@2.0.2:
mdast-util-from-markdown@2.0.3:
mdast-util-from-markdown: private
mdast-util-gfm-autolink-literal@2.0.1:
mdast-util-gfm-autolink-literal: private
@@ -2005,8 +1825,10 @@ hoistedDependencies:
mdast-util-gfm: private
mdast-util-mdx-expression@2.0.1:
mdast-util-mdx-expression: private
mdast-util-mdx-jsx@3.1.3:
mdast-util-mdx-jsx@3.2.0:
mdast-util-mdx-jsx: private
mdast-util-mdx@3.0.0:
mdast-util-mdx: private
mdast-util-mdxjs-esm@2.0.1:
mdast-util-mdxjs-esm: private
mdast-util-phrasing@4.1.0:
@@ -2023,8 +1845,6 @@ hoistedDependencies:
media-engine: private
media-typer@0.3.0:
media-typer: private
memoize-one@6.0.0:
memoize-one: private
meow@13.2.0:
meow: private
merge-descriptors@1.0.3:
@@ -2057,8 +1877,16 @@ hoistedDependencies:
micromark-extension-gfm-task-list-item: private
micromark-extension-gfm@3.0.0:
micromark-extension-gfm: private
micromark-extension-mdx-expression@3.0.1:
micromark-extension-mdx-expression: private
micromark-extension-mdx-jsx@3.0.1:
micromark-extension-mdx-jsx: private
micromark-extension-mdx-md@2.0.0:
micromark-extension-mdx-md: private
micromark-extension-mdxjs-esm@3.0.0:
micromark-extension-mdxjs-esm: private
micromark-extension-mdxjs@3.0.0:
micromark-extension-mdxjs: private
micromark-factory-destination@2.0.1:
micromark-factory-destination: private
micromark-factory-label@2.0.1:
@@ -2127,8 +1955,6 @@ hoistedDependencies:
mkdirp: private
module-details-from-path@1.0.4:
module-details-from-path: private
monaco-editor@0.55.1:
monaco-editor: private
motion-dom@12.38.0:
motion-dom: private
motion-utils@12.36.0:
@@ -2185,8 +2011,6 @@ hoistedDependencies:
object-inspect: private
object-keys@1.1.1:
object-keys: private
object-to-formdata@4.5.1:
object-to-formdata: private
object.assign@4.1.7:
object.assign: private
object.entries@1.1.9:
@@ -2197,8 +2021,6 @@ hoistedDependencies:
object.groupby: private
object.values@1.2.1:
object.values: private
obuf@1.1.2:
obuf: private
obug@2.1.1:
obug: private
on-exit-leak-free@2.1.2:
@@ -2269,10 +2091,8 @@ hoistedDependencies:
path-parse: private
path-scurry@2.0.2:
path-scurry: private
path-to-regexp@6.3.0:
path-to-regexp@0.1.13:
path-to-regexp: private
path-type@4.0.0:
path-type: private
pathe@2.0.3:
pathe: private
pause-stream@0.0.11:
@@ -2285,24 +2105,12 @@ hoistedDependencies:
peberminta: private
pend@1.2.0:
pend: private
pg-cloudflare@1.3.0:
pg-cloudflare: private
pg-connection-string@2.12.0:
pg-connection-string: private
pg-int8@1.0.1:
pg-int8: private
pg-numeric@1.0.2:
pg-numeric: private
pg-pool@3.13.0(pg@8.16.3):
pg-pool: private
pg-protocol@1.13.0:
pg-protocol: private
pg-types@4.1.0:
pg-types@2.2.0:
pg-types: private
pg@8.16.3:
pg: private
pgpass@1.0.5:
pgpass: private
picocolors@1.1.1:
picocolors: private
picomatch@4.0.4:
@@ -2319,8 +2127,6 @@ hoistedDependencies:
pino-std-serializers: private
pkg-types@2.3.0:
pkg-types: private
pluralize@8.0.0:
pluralize: private
png-js@1.0.0:
png-js: private
po-parser@2.1.1:
@@ -2339,8 +2145,6 @@ hoistedDependencies:
postgres-date: private
postgres-interval@1.2.0:
postgres-interval: private
postgres-range@1.1.4:
postgres-range: private
potpack@1.0.2:
potpack: private
prelude-ls@1.2.1:
@@ -2379,8 +2183,6 @@ hoistedDependencies:
punycode: private
puppeteer-core@24.40.0:
puppeteer-core: private
qs-esm@8.0.1:
qs-esm: private
qs@6.14.2:
qs: private
queue-microtask@1.2.3:
@@ -2393,14 +2195,8 @@ hoistedDependencies:
range-parser: private
raw-body@2.5.3:
raw-body: private
react-datepicker@7.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
react-datepicker: private
react-error-boundary@4.1.2(react@19.2.4):
react-error-boundary: private
react-i18next@17.0.2(i18next@25.10.10(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
react-i18next: private
react-image-crop@10.1.8(react@19.2.4):
react-image-crop: private
react-is@16.13.1:
react-is: private
react-promise-suspense@0.3.4:
@@ -2409,16 +2205,20 @@ hoistedDependencies:
react-redux: private
react-refresh@0.18.0:
react-refresh: private
react-select@5.9.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
react-select: private
react-transition-group@4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
react-transition-group: private
react-use-measure@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
react-use-measure: private
readdirp@4.1.2:
readdirp: private
real-require@0.2.0:
real-require: private
recma-build-jsx@1.0.0:
recma-build-jsx: private
recma-jsx@1.0.1(acorn@8.16.0):
recma-jsx: private
recma-parse@1.0.0:
recma-parse: private
recma-stringify@1.0.0:
recma-stringify: private
redis-errors@1.2.0:
redis-errors: private
redis-parser@3.0.0:
@@ -2431,6 +2231,10 @@ hoistedDependencies:
reflect.getprototypeof: private
regexp.prototype.flags@1.5.4:
regexp.prototype.flags: private
rehype-recma@1.0.0:
rehype-recma: private
remark-mdx@3.1.1:
remark-mdx: private
remark-parse@11.0.0:
remark-parse: private
remark-rehype@11.1.2:
@@ -2485,11 +2289,9 @@ hoistedDependencies:
safe-stable-stringify: private
safer-buffer@2.1.2:
safer-buffer: private
sanitize-filename@1.6.3:
sanitize-filename: private
saxes@6.0.0:
saxes: private
scheduler@0.25.0:
scheduler@0.27.0:
scheduler: private
schema-utils@4.3.3:
schema-utils: private
@@ -2533,8 +2335,6 @@ hoistedDependencies:
signal-exit: private
simple-swizzle@0.2.4:
simple-swizzle: private
simple-wcswidth@1.1.2:
simple-wcswidth: private
sirv@3.0.2:
sirv: private
sisteransi@1.0.5:
@@ -2557,13 +2357,11 @@ hoistedDependencies:
socks: private
sonic-boom@4.2.1:
sonic-boom: private
sonner@1.7.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
sonner: private
source-map-js@1.2.1:
source-map-js: private
source-map-support@0.5.21:
source-map-support: private
source-map@0.5.7:
source-map@0.7.6:
source-map: private
space-separated-tokens@2.0.2:
space-separated-tokens: private
@@ -2583,8 +2381,6 @@ hoistedDependencies:
stacktrace-parser: private
standard-as-callback@2.1.0:
standard-as-callback: private
state-local@1.0.7:
state-local: private
stats-gl@2.4.2(@types/three@0.183.1)(three@0.183.2):
stats-gl: private
stats.js@0.17.0:
@@ -2599,8 +2395,6 @@ hoistedDependencies:
stop-iteration-iterator: private
stream-combiner@0.0.4:
stream-combiner: private
streamsearch@1.1.0:
streamsearch: private
streamx@2.25.0:
streamx: private
string-argv@0.3.2:
@@ -2637,8 +2431,6 @@ hoistedDependencies:
strip-final-newline: private
strip-json-comments@5.0.3:
strip-json-comments: private
strtok3@10.3.5:
strtok3: private
stubborn-fs@2.0.0:
stubborn-fs: private
stubborn-utils@1.0.2:
@@ -2649,8 +2441,6 @@ hoistedDependencies:
style-to-object: private
styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4):
styled-jsx: private
stylis@4.2.0:
stylis: private
supports-color@7.2.0:
supports-color: private
supports-preserve-symlinks-flag@1.0.0:
@@ -2661,8 +2451,6 @@ hoistedDependencies:
svg-arc-to-cubic-bezier: private
symbol-tree@3.2.4:
symbol-tree: private
tabbable@6.4.0:
tabbable: private
tagged-tag@1.0.0:
tagged-tag: private
tapable@2.3.2:
@@ -2673,7 +2461,7 @@ hoistedDependencies:
tar-stream: private
teex@1.0.1:
teex: private
terser-webpack-plugin@5.4.0(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)):
terser-webpack-plugin@5.4.0(esbuild@0.27.4)(webpack@5.105.4(esbuild@0.27.4)):
terser-webpack-plugin: private
terser@5.46.1:
terser: private
@@ -2711,18 +2499,10 @@ hoistedDependencies:
tldts: private
tmp@0.1.0:
tmp: private
to-no-case@1.0.2:
to-no-case: private
to-regex-range@5.0.1:
to-regex-range: private
to-snake-case@1.0.0:
to-snake-case: private
to-space-case@1.0.0:
to-space-case: private
toidentifier@1.0.1:
toidentifier: private
token-types@6.1.2:
token-types: private
totalist@3.0.1:
totalist: private
tough-cookie@6.0.1:
@@ -2741,14 +2521,10 @@ hoistedDependencies:
troika-worker-utils: private
trough@2.2.0:
trough: private
truncate-utf8-bytes@1.0.2:
truncate-utf8-bytes: private
tryer@1.0.1:
tryer: private
ts-api-utils@2.5.0(typescript@5.9.3):
ts-api-utils: private
ts-essentials@10.0.3(typescript@5.9.3):
ts-essentials: private
tsconfig-paths@4.2.0:
tsconfig-paths: private
tslib@2.8.1:
@@ -2791,14 +2567,20 @@ hoistedDependencies:
unified: private
unique-string@2.0.0:
unique-string: private
unist-util-is@5.2.1:
unist-util-is: private
unist-util-is@6.0.1:
unist-util-is: private
unist-util-position-from-estree@2.0.0:
unist-util-position-from-estree: private
unist-util-position@5.0.0:
unist-util-position: private
unist-util-remove@3.1.1:
unist-util-remove: private
unist-util-stringify-position@4.0.0:
unist-util-stringify-position: private
unist-util-visit-parents@5.1.3:
unist-util-visit-parents: private
unist-util-visit-parents@6.0.2:
unist-util-visit-parents: private
unist-util-visit@5.1.0:
@@ -2811,16 +2593,10 @@ hoistedDependencies:
update-browserslist-db: private
uri-js@4.4.1:
uri-js: private
use-context-selector@2.0.0(react@19.2.4)(scheduler@0.25.0):
use-context-selector: private
use-intl@4.9.0(react@19.2.4):
use-intl: private
use-isomorphic-layout-effect@1.2.1(@types/react@19.2.14)(react@19.2.4):
use-isomorphic-layout-effect: private
use-sync-external-store@1.6.0(react@19.2.4):
use-sync-external-store: private
utf8-byte-length@1.0.5:
utf8-byte-length: private
util-deprecate@1.0.2:
util-deprecate: private
utility-types@3.11.0:
@@ -2835,6 +2611,8 @@ hoistedDependencies:
vary: private
vfile-location@5.0.3:
vfile-location: private
vfile-matter@5.0.1:
vfile-matter: private
vfile-message@4.0.3:
vfile-message: private
vfile@6.0.3:
@@ -2843,7 +2621,7 @@ hoistedDependencies:
victory-vendor: private
vite-compatible-readable-stream@3.6.1:
vite-compatible-readable-stream: private
vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@22.19.15)(esbuild@0.25.12)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3):
vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@22.19.15)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3):
vite: private
void-elements@3.1.0:
void-elements: private
@@ -2871,7 +2649,7 @@ hoistedDependencies:
webpack-bundle-analyzer: private
webpack-sources@3.3.4:
webpack-sources: private
webpack@5.105.4(esbuild@0.25.12):
webpack@5.105.4(esbuild@0.27.4):
webpack: private
whatwg-encoding@3.1.1:
whatwg-encoding: private
@@ -2917,8 +2695,6 @@ hoistedDependencies:
xml-name-validator: private
xmlchars@2.2.0:
xmlchars: private
xss@1.0.15:
xss: private
xtend@4.0.2:
xtend: private
y18n@4.0.3:
@@ -2933,8 +2709,6 @@ hoistedDependencies:
yargs: private
yauzl@2.10.0:
yauzl: private
yjs@13.6.30:
yjs: private
yocto-queue@0.1.0:
yocto-queue: private
yoctocolors@2.1.2:

View File

@@ -1,5 +1,5 @@
{
"lastValidatedTimestamp": 1777396186867,
"lastValidatedTimestamp": 1777834770125,
"projects": {},
"pnpmfiles": [],
"settings": {

View File

@@ -0,0 +1,14 @@
export { createProcessor } from "./lib/core.js";
export { nodeTypes } from "./lib/node-types.js";
export type Fragment = import("hast-util-to-jsx-runtime").Fragment;
export type Jsx = import("hast-util-to-jsx-runtime").Jsx;
export type JsxDev = import("hast-util-to-jsx-runtime").JsxDev;
export type UseMdxComponents = import("./lib/util/resolve-evaluate-options.js").UseMdxComponents;
export type CompileOptions = import("./lib/compile.js").CompileOptions;
export type ProcessorOptions = import("./lib/core.js").ProcessorOptions;
export type EvaluateOptions = import("./lib/util/resolve-evaluate-options.js").EvaluateOptions;
export type RunOptions = import("./lib/util/resolve-evaluate-options.js").RunOptions;
export { compile, compileSync } from "./lib/compile.js";
export { evaluate, evaluateSync } from "./lib/evaluate.js";
export { run, runSync } from "./lib/run.js";
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.js"],"names":[],"mappings":";;uBACa,OAAO,0BAA0B,EAAE,QAAQ;kBAC3C,OAAO,0BAA0B,EAAE,GAAG;qBACtC,OAAO,0BAA0B,EAAE,MAAM;+BACzC,OAAO,wCAAwC,EAAE,gBAAgB;6BACjE,OAAO,kBAAkB,EAAE,cAAc;+BACzC,OAAO,eAAe,EAAE,gBAAgB;8BACxC,OAAO,wCAAwC,EAAE,eAAe;yBAChE,OAAO,wCAAwC,EAAE,UAAU"}

View File

@@ -0,0 +1,16 @@
/**
* @typedef {import('hast-util-to-jsx-runtime').Fragment} Fragment
* @typedef {import('hast-util-to-jsx-runtime').Jsx} Jsx
* @typedef {import('hast-util-to-jsx-runtime').JsxDev} JsxDev
* @typedef {import('./lib/util/resolve-evaluate-options.js').UseMdxComponents} UseMdxComponents
* @typedef {import('./lib/compile.js').CompileOptions} CompileOptions
* @typedef {import('./lib/core.js').ProcessorOptions} ProcessorOptions
* @typedef {import('./lib/util/resolve-evaluate-options.js').EvaluateOptions} EvaluateOptions
* @typedef {import('./lib/util/resolve-evaluate-options.js').RunOptions} RunOptions
*/
export {compile, compileSync} from './lib/compile.js'
export {createProcessor} from './lib/core.js'
export {evaluate, evaluateSync} from './lib/evaluate.js'
export {nodeTypes} from './lib/node-types.js'
export {run, runSync} from './lib/run.js'

View File

@@ -0,0 +1,50 @@
/**
* Compile MDX to JS.
*
* @param {Readonly<Compatible>} vfileCompatible
* MDX document to parse.
* @param {Readonly<CompileOptions> | null | undefined} [compileOptions]
* Compile configuration (optional).
* @return {Promise<VFile>}
* Promise to compiled file.
*/
export function compile(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): Promise<VFile>;
/**
* Synchronously compile MDX to JS.
*
* When possible please use the async `compile`.
*
* @param {Readonly<Compatible>} vfileCompatible
* MDX document to parse.
* @param {Readonly<CompileOptions> | null | undefined} [compileOptions]
* Compile configuration (optional).
* @return {VFile}
* Compiled file.
*/
export function compileSync(vfileCompatible: Readonly<Compatible>, compileOptions?: Readonly<CompileOptions> | null | undefined): VFile;
/**
* Core configuration.
*/
export type CoreProcessorOptions = Omit<ProcessorOptions, "format">;
/**
* Extra configuration.
*/
export type ExtraOptions = {
/**
* Format of `file` (default: `'detect'`).
*/
format?: "detect" | "md" | "mdx" | null | undefined;
};
/**
* Configuration for `compile`.
*
* `CompileOptions` is the same as `ProcessorOptions` with the exception that
* the `format` option supports a `'detect'` value, which is the default.
* The `'detect'` format means to use `'md'` for files with an extension in
* `mdExtensions` and `'mdx'` otherwise.
*/
export type CompileOptions = CoreProcessorOptions & ExtraOptions;
import type { Compatible } from 'vfile';
import type { VFile } from 'vfile';
import type { ProcessorOptions } from './core.js';
//# sourceMappingURL=compile.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["compile.js"],"names":[],"mappings":"AA0BA;;;;;;;;;GASG;AACH,yCAPW,QAAQ,CAAC,UAAU,CAAC,mBAEpB,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,GAAG,SAAS,GAE1C,OAAO,CAAC,KAAK,CAAC,CAMzB;AAED;;;;;;;;;;;GAWG;AACH,6CAPW,QAAQ,CAAC,UAAU,CAAC,mBAEpB,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,GAAG,SAAS,GAE1C,KAAK,CAMhB;;;;mCAlDY,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC;;;;;;;;aAK/B,QAAQ,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;6BAG3C,oBAAoB,GAAG,YAAY;gCAbZ,OAAO;2BAAP,OAAO;sCACR,WAAW"}

View File

@@ -0,0 +1,57 @@
/**
* @import {Compatible, VFile} from 'vfile'
* @import {ProcessorOptions} from './core.js'
*/
/**
* @typedef {Omit<ProcessorOptions, 'format'>} CoreProcessorOptions
* Core configuration.
*
* @typedef ExtraOptions
* Extra configuration.
* @property {'detect' | 'md' | 'mdx' | null | undefined} [format='detect']
* Format of `file` (default: `'detect'`).
*
* @typedef {CoreProcessorOptions & ExtraOptions} CompileOptions
* Configuration for `compile`.
*
* `CompileOptions` is the same as `ProcessorOptions` with the exception that
* the `format` option supports a `'detect'` value, which is the default.
* The `'detect'` format means to use `'md'` for files with an extension in
* `mdExtensions` and `'mdx'` otherwise.
*/
import {resolveFileAndOptions} from './util/resolve-file-and-options.js'
import {createProcessor} from './core.js'
/**
* Compile MDX to JS.
*
* @param {Readonly<Compatible>} vfileCompatible
* MDX document to parse.
* @param {Readonly<CompileOptions> | null | undefined} [compileOptions]
* Compile configuration (optional).
* @return {Promise<VFile>}
* Promise to compiled file.
*/
export function compile(vfileCompatible, compileOptions) {
const {file, options} = resolveFileAndOptions(vfileCompatible, compileOptions)
return createProcessor(options).process(file)
}
/**
* Synchronously compile MDX to JS.
*
* When possible please use the async `compile`.
*
* @param {Readonly<Compatible>} vfileCompatible
* MDX document to parse.
* @param {Readonly<CompileOptions> | null | undefined} [compileOptions]
* Compile configuration (optional).
* @return {VFile}
* Compiled file.
*/
export function compileSync(vfileCompatible, compileOptions) {
const {file, options} = resolveFileAndOptions(vfileCompatible, compileOptions)
return createProcessor(options).processSync(file)
}

View File

@@ -0,0 +1,175 @@
/**
* Create a processor to compile markdown or MDX to JavaScript.
*
* > **Note**: `format: 'detect'` is not allowed in `ProcessorOptions`.
*
* @param {Readonly<ProcessorOptions> | null | undefined} [options]
* Configuration (optional).
* @return {Processor<Root, Program, Program, Program, string>}
* Processor.
*/
export function createProcessor(options?: Readonly<ProcessorOptions> | null | undefined): Processor<Root, Program, Program, Program, string>;
/**
* Configuration for `createProcessor`.
*/
export type ProcessorOptions = {
/**
* Add a source map (object form) as the `map` field on the resulting file
* (optional).
*/
SourceMapGenerator?: typeof SourceMapGenerator | null | undefined;
/**
* Use this URL as `import.meta.url` and resolve `import` and `export … from`
* relative to it (optional, example: `import.meta.url`).
*/
baseUrl?: URL | string | null | undefined;
/**
* Whether to add extra info to error messages in generated code and use the
* development automatic JSX runtime (`Fragment` and `jsxDEV` from
* `/jsx-dev-runtime`) (default: `false`);
* when using the webpack loader (`@mdx-js/loader`) or the Rollup integration
* (`@mdx-js/rollup`) through Vite, this is automatically inferred from how
* you configure those tools.
*/
development?: boolean | null | undefined;
/**
* Casing to use for attribute names (default: `'react'`);
* HTML casing is for example `class`, `stroke-linecap`, `xml:lang`;
* React casing is for example `className`, `strokeLinecap`, `xmlLang`;
* for JSX components written in MDX, the author has to be aware of which
* framework they use and write code accordingly;
* for AST nodes generated by this project, this option configures it
*/
elementAttributeNameCase?: RehypeRecmaOptions["elementAttributeNameCase"];
/**
* format of the file (default: `'mdx'`);
* `'md'` means treat as markdown and `'mdx'` means treat as MDX.
*/
format?: "md" | "mdx" | null | undefined;
/**
* Whether to keep JSX (default: `false`);
* the default is to compile JSX away so that the resulting file is
* immediately runnable.
*/
jsx?: boolean | null | undefined;
/**
* Place to import automatic JSX runtimes from (default: `'react'`);
* when in the `automatic` runtime, this is used to define an import for
* `Fragment`, `jsx`, `jsxDEV`, and `jsxs`.
*/
jsxImportSource?: string | null | undefined;
/**
* JSX runtime to use (default: `'automatic'`);
* the automatic runtime compiles to `import _jsx from
* '$importSource/jsx-runtime'\n_jsx('p')`;
* the classic runtime compiles to calls such as `h('p')`.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
*/
jsxRuntime?: "automatic" | "classic" | null | undefined;
/**
* List of markdown extensions, with dot (default: `['.md', '.markdown', …]`);
* affects integrations.
*/
mdExtensions?: ReadonlyArray<string> | null | undefined;
/**
* List of MDX extensions, with dot (default: `['.mdx']`);
* affects integrations.
*/
mdxExtensions?: ReadonlyArray<string> | null | undefined;
/**
* Output format to generate (default: `'program'`);
* in most cases `'program'` should be used, it results in a whole program;
* internally `evaluate` uses `'function-body'` to compile to
* code that can be passed to `run`;
* in some cases, you might want what `evaluate` does in separate steps, such
* as when compiling on the server and running on the client.
*/
outputFormat?: "function-body" | "program" | null | undefined;
/**
* Pragma for JSX, used in the classic runtime as an identifier for function
* calls: `<x />` to `React.createElement('x')` (default:
* `'React.createElement'`);
* when changing this, you should also define `pragmaFrag` and
* `pragmaImportSource` too.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
*/
pragma?: string | null | undefined;
/**
* Pragma for fragment symbol, used in the classic runtime as an identifier
* for unnamed calls: `<>` to `React.createElement(React.Fragment)` (default:
* `'React.Fragment'`);
* when changing this, you should also define `pragma` and
* `pragmaImportSource` too.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
*/
pragmaFrag?: string | null | undefined;
/**
* Where to import the identifier of `pragma` from, used in the classic
* runtime (default: `'react'`);
* to illustrate, when `pragma` is `'a.b'` and `pragmaImportSource` is `'c'`
* the following will be generated: `import a from 'c'` and things such as
* `a.b('h1', {})`.
* when changing this, you should also define `pragma` and `pragmaFrag` too.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
*/
pragmaImportSource?: string | null | undefined;
/**
* Place to import a provider from (optional, example: `'@mdx-js/react'`);
* normally its used for runtimes that support context (React, Preact), but
* it can be used to inject components into the compiled code;
* the module must export and identifier `useMDXComponents` which is called
* without arguments to get an object of components (`MDXComponents` from
* `mdx/types.js`).
*/
providerImportSource?: string | null | undefined;
/**
* List of recma plugins (optional).
*/
recmaPlugins?: PluggableList | null | undefined;
/**
* List of remark plugins (optional).
*/
remarkPlugins?: PluggableList | null | undefined;
/**
* List of rehype plugins (optional).
*/
rehypePlugins?: PluggableList | null | undefined;
/**
* Options to pass to `remark-rehype` (optional);
* in particular, you might want to pass configuration for footnotes if your
* content is not in English;
* the option `allowDangerousHtml` will always be set to `true` and the MDX
* nodes (see `nodeTypes`) are passed through.
*/
remarkRehypeOptions?: Readonly<RemarkRehypeOptions> | null | undefined;
/**
* Casing to use for property names in `style` objects (default: `'dom'`);
* CSS casing is for example `background-color` and `-webkit-line-clamp`;
* DOM casing is for example `backgroundColor` and `WebkitLineClamp`;
* for JSX components written in MDX, the author has to be aware of which
* framework they use and write code accordingly;
* for AST nodes generated by this project, this option configures it
*/
stylePropertyNameCase?: RehypeRecmaOptions["stylePropertyNameCase"];
/**
* Turn obsolete `align` properties on `td` and `th` into CSS `style`
* properties (default: `true`).
*/
tableCellAlignToStyle?: boolean | null | undefined;
};
import type { Root } from 'mdast';
import type { Program } from 'estree-jsx';
import type { Processor } from 'unified';
import type { SourceMapGenerator } from 'source-map';
import type { Options as RehypeRecmaOptions } from 'rehype-recma';
import type { PluggableList } from 'unified';
import type { Options as RemarkRehypeOptions } from 'remark-rehype';
//# sourceMappingURL=core.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["core.js"],"names":[],"mappings":"AAsJA;;;;;;;;;GASG;AACH,0CALW,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,SAAS,GAE5C,UAAU,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CA+E7D;;;;;;;;;yBAhOa,yBAAyB,GAAG,IAAI,GAAG,SAAS;;;;;cAG5C,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;;kBAG/B,OAAO,GAAG,IAAI,GAAG,SAAS;;;;;;;;;+BAO1B,kBAAkB,CAAC,0BAA0B,CAAC;;;;;aAO9C,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS;;;;;;UAG/B,OAAO,GAAG,IAAI,GAAG,SAAS;;;;;;sBAI1B,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;iBAIzB,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS;;;;;mBAQ1C,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS;;;;;oBAGxC,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS;;;;;;;;;mBAGxC,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;;aAO9C,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;;iBASzB,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;;;yBASzB,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;;2BAUzB,MAAM,GAAG,IAAI,GAAG,SAAS;;;;mBAOzB,aAAa,GAAG,IAAI,GAAG,SAAS;;;;oBAEhC,aAAa,GAAG,IAAI,GAAG,SAAS;;;;oBAEhC,aAAa,GAAG,IAAI,GAAG,SAAS;;;;;;;;0BAEhC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,GAAG,SAAS;;;;;;;;;4BAMhD,kBAAkB,CAAC,uBAAuB,CAAC;;;;;4BAO3C,OAAO,GAAG,IAAI,GAAG,SAAS;;0BApHjB,OAAO;6BADJ,YAAY;+BAKK,SAAS;wCADf,YAAY;mDAFD,cAAc;mCAGnB,SAAS;oDAFH,eAAe"}

View File

@@ -0,0 +1,237 @@
/**
* @import {Program} from 'estree-jsx'
* @import {Root} from 'mdast'
* @import {Options as RehypeRecmaOptions} from 'rehype-recma'
* @import {Options as RemarkRehypeOptions} from 'remark-rehype'
* @import {SourceMapGenerator} from 'source-map'
* @import {PluggableList, Processor} from 'unified'
*/
/**
* @typedef ProcessorOptions
* Configuration for `createProcessor`.
* @property {typeof SourceMapGenerator | null | undefined} [SourceMapGenerator]
* Add a source map (object form) as the `map` field on the resulting file
* (optional).
* @property {URL | string | null | undefined} [baseUrl]
* Use this URL as `import.meta.url` and resolve `import` and `export … from`
* relative to it (optional, example: `import.meta.url`).
* @property {boolean | null | undefined} [development=false]
* Whether to add extra info to error messages in generated code and use the
* development automatic JSX runtime (`Fragment` and `jsxDEV` from
* `/jsx-dev-runtime`) (default: `false`);
* when using the webpack loader (`@mdx-js/loader`) or the Rollup integration
* (`@mdx-js/rollup`) through Vite, this is automatically inferred from how
* you configure those tools.
* @property {RehypeRecmaOptions['elementAttributeNameCase']} [elementAttributeNameCase='react']
* Casing to use for attribute names (default: `'react'`);
* HTML casing is for example `class`, `stroke-linecap`, `xml:lang`;
* React casing is for example `className`, `strokeLinecap`, `xmlLang`;
* for JSX components written in MDX, the author has to be aware of which
* framework they use and write code accordingly;
* for AST nodes generated by this project, this option configures it
* @property {'md' | 'mdx' | null | undefined} [format='mdx']
* format of the file (default: `'mdx'`);
* `'md'` means treat as markdown and `'mdx'` means treat as MDX.
* @property {boolean | null | undefined} [jsx=false]
* Whether to keep JSX (default: `false`);
* the default is to compile JSX away so that the resulting file is
* immediately runnable.
* @property {string | null | undefined} [jsxImportSource='react']
* Place to import automatic JSX runtimes from (default: `'react'`);
* when in the `automatic` runtime, this is used to define an import for
* `Fragment`, `jsx`, `jsxDEV`, and `jsxs`.
* @property {'automatic' | 'classic' | null | undefined} [jsxRuntime='automatic']
* JSX runtime to use (default: `'automatic'`);
* the automatic runtime compiles to `import _jsx from
* '$importSource/jsx-runtime'\n_jsx('p')`;
* the classic runtime compiles to calls such as `h('p')`.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
* @property {ReadonlyArray<string> | null | undefined} [mdExtensions]
* List of markdown extensions, with dot (default: `['.md', '.markdown', …]`);
* affects integrations.
* @property {ReadonlyArray<string> | null | undefined} [mdxExtensions]
* List of MDX extensions, with dot (default: `['.mdx']`);
* affects integrations.
* @property {'function-body' | 'program' | null | undefined} [outputFormat='program']
* Output format to generate (default: `'program'`);
* in most cases `'program'` should be used, it results in a whole program;
* internally `evaluate` uses `'function-body'` to compile to
* code that can be passed to `run`;
* in some cases, you might want what `evaluate` does in separate steps, such
* as when compiling on the server and running on the client.
* @property {string | null | undefined} [pragma='React.createElement']
* Pragma for JSX, used in the classic runtime as an identifier for function
* calls: `<x />` to `React.createElement('x')` (default:
* `'React.createElement'`);
* when changing this, you should also define `pragmaFrag` and
* `pragmaImportSource` too.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
* @property {string | null | undefined} [pragmaFrag='React.Fragment']
* Pragma for fragment symbol, used in the classic runtime as an identifier
* for unnamed calls: `<>` to `React.createElement(React.Fragment)` (default:
* `'React.Fragment'`);
* when changing this, you should also define `pragma` and
* `pragmaImportSource` too.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
* @property {string | null | undefined} [pragmaImportSource='react']
* Where to import the identifier of `pragma` from, used in the classic
* runtime (default: `'react'`);
* to illustrate, when `pragma` is `'a.b'` and `pragmaImportSource` is `'c'`
* the following will be generated: `import a from 'c'` and things such as
* `a.b('h1', {})`.
* when changing this, you should also define `pragma` and `pragmaFrag` too.
*
* > 👉 **Note**: support for the classic runtime is deprecated and will
* > likely be removed in the next major version.
* @property {string | null | undefined} [providerImportSource]
* Place to import a provider from (optional, example: `'@mdx-js/react'`);
* normally its used for runtimes that support context (React, Preact), but
* it can be used to inject components into the compiled code;
* the module must export and identifier `useMDXComponents` which is called
* without arguments to get an object of components (`MDXComponents` from
* `mdx/types.js`).
* @property {PluggableList | null | undefined} [recmaPlugins]
* List of recma plugins (optional).
* @property {PluggableList | null | undefined} [remarkPlugins]
* List of remark plugins (optional).
* @property {PluggableList | null | undefined} [rehypePlugins]
* List of rehype plugins (optional).
* @property {Readonly<RemarkRehypeOptions> | null | undefined} [remarkRehypeOptions]
* Options to pass to `remark-rehype` (optional);
* in particular, you might want to pass configuration for footnotes if your
* content is not in English;
* the option `allowDangerousHtml` will always be set to `true` and the MDX
* nodes (see `nodeTypes`) are passed through.
* @property {RehypeRecmaOptions['stylePropertyNameCase']} [stylePropertyNameCase='dom']
* Casing to use for property names in `style` objects (default: `'dom'`);
* CSS casing is for example `background-color` and `-webkit-line-clamp`;
* DOM casing is for example `backgroundColor` and `WebkitLineClamp`;
* for JSX components written in MDX, the author has to be aware of which
* framework they use and write code accordingly;
* for AST nodes generated by this project, this option configures it
* @property {boolean | null | undefined} [tableCellAlignToStyle=true]
* Turn obsolete `align` properties on `td` and `th` into CSS `style`
* properties (default: `true`).
*/
import {unreachable} from 'devlop'
import recmaBuildJsx from 'recma-build-jsx'
import recmaJsx from 'recma-jsx'
import recmaStringify from 'recma-stringify'
import rehypeRecma from 'rehype-recma'
import remarkMdx from 'remark-mdx'
import remarkParse from 'remark-parse'
import remarkRehype from 'remark-rehype'
import {unified} from 'unified'
import {recmaBuildJsxTransform} from './plugin/recma-build-jsx-transform.js'
import {recmaDocument} from './plugin/recma-document.js'
import {recmaJsxRewrite} from './plugin/recma-jsx-rewrite.js'
import {rehypeRemoveRaw} from './plugin/rehype-remove-raw.js'
import {remarkMarkAndUnravel} from './plugin/remark-mark-and-unravel.js'
import {nodeTypes} from './node-types.js'
const removedOptions = [
'compilers',
'filepath',
'hastPlugins',
'mdPlugins',
'skipExport',
'wrapExport'
]
let warned = false
/**
* Create a processor to compile markdown or MDX to JavaScript.
*
* > **Note**: `format: 'detect'` is not allowed in `ProcessorOptions`.
*
* @param {Readonly<ProcessorOptions> | null | undefined} [options]
* Configuration (optional).
* @return {Processor<Root, Program, Program, Program, string>}
* Processor.
*/
export function createProcessor(options) {
const settings = options || {}
let index = -1
while (++index < removedOptions.length) {
const key = removedOptions[index]
if (key in settings) {
unreachable(
'Unexpected removed option `' +
key +
'`; see <https://mdxjs.com/migrating/v2/> on how to migrate'
)
}
}
// @ts-expect-error: throw an error for a runtime value which is not allowed
// by the types.
if (settings.format === 'detect') {
unreachable(
"Unexpected `format: 'detect'`, which is not supported by `createProcessor`, expected `'mdx'` or `'md'`"
)
}
if (
(settings.jsxRuntime === 'classic' ||
settings.pragma ||
settings.pragmaFrag ||
settings.pragmaImportSource) &&
!warned
) {
warned = true
console.warn(
"Unexpected deprecated option `jsxRuntime: 'classic'`, `pragma`, `pragmaFrag`, or `pragmaImportSource`; see <https://mdxjs.com/migrating/v3/> on how to migrate"
)
}
const pipeline = unified().use(remarkParse)
if (settings.format !== 'md') {
pipeline.use(remarkMdx)
}
const remarkRehypeOptions = settings.remarkRehypeOptions || {}
pipeline
.use(remarkMarkAndUnravel)
.use(settings.remarkPlugins || [])
.use(remarkRehype, {
...remarkRehypeOptions,
allowDangerousHtml: true,
passThrough: [...(remarkRehypeOptions.passThrough || []), ...nodeTypes]
})
.use(settings.rehypePlugins || [])
if (settings.format === 'md') {
pipeline.use(rehypeRemoveRaw)
}
pipeline
// @ts-expect-error: `Program` is close enough to a `Node`,
// but type inference has trouble with it and bridges.
.use(rehypeRecma, settings)
.use(recmaDocument, settings)
.use(recmaJsxRewrite, settings)
if (!settings.jsx) {
pipeline.use(recmaBuildJsx, settings).use(recmaBuildJsxTransform, settings)
}
pipeline
.use(recmaJsx)
.use(recmaStringify, settings)
.use(settings.recmaPlugins || [])
// @ts-expect-error: TS doesnt get the plugins we added with if-statements.
return pipeline
}

View File

@@ -0,0 +1,56 @@
/**
* Compile and run MDX.
*
* When you trust your content, `evaluate` can work.
* When possible, use `compile`, write to a file, and then run with Node or use
* one of the integrations.
*
* > ☢️ **Danger**: its called **evaluate** because it `eval`s JavaScript.
*
* ###### Notes
*
* Compiling (and running) MDX takes time.
*
* If you are live-rendering a string of MDX that often changes using a virtual
* DOM based framework (such as React), one performance improvement is to call
* the `MDXContent` component yourself.
* The reason is that the `evaluate` creates a new function each time, which
* cannot be diffed:
*
* ```diff
* const {default: MDXContent} = await evaluate('…')
*
* -<MDXContent {...props} />
* +MDXContent(props)
* ```
*
* @param {Readonly<Compatible>} file
* MDX document to parse.
* @param {Readonly<EvaluateOptions>} options
* Configuration (**required**).
* @return {Promise<MDXModule>}
* Promise to a module;
* the result is an object with a `default` field set to the component;
* anything else that was exported is available too.
*/
export function evaluate(file: Readonly<Compatible>, options: Readonly<EvaluateOptions>): Promise<MDXModule>;
/**
* Compile and run MDX, synchronously.
*
* When possible please use the async `evaluate`.
*
* > ☢️ **Danger**: its called **evaluate** because it `eval`s JavaScript.
*
* @param {Readonly<Compatible>} file
* MDX document to parse.
* @param {Readonly<EvaluateOptions>} options
* Configuration (**required**).
* @return {MDXModule}
* Module.
*/
export function evaluateSync(file: Readonly<Compatible>, options: Readonly<EvaluateOptions>): MDXModule;
import type { Compatible } from 'vfile';
import type { EvaluateOptions } from './util/resolve-evaluate-options.js';
import type { MDXModule } from 'mdx/types.js';
//# sourceMappingURL=evaluate.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["evaluate.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,+BAVW,QAAQ,CAAC,UAAU,CAAC,WAEpB,QAAQ,CAAC,eAAe,CAAC,GAExB,OAAO,CAAC,SAAS,CAAC,CAS7B;AAED;;;;;;;;;;;;;GAaG;AACH,mCAPW,QAAQ,CAAC,UAAU,CAAC,WAEpB,QAAQ,CAAC,eAAe,CAAC,GAExB,SAAS,CAMpB;gCAlE4B,OAAO;qCACF,oCAAoC;+BAF1C,cAAc"}

View File

@@ -0,0 +1,69 @@
/**
* @import {MDXModule} from 'mdx/types.js'
* @import {Compatible} from 'vfile'
* @import {EvaluateOptions} from './util/resolve-evaluate-options.js'
*/
import {resolveEvaluateOptions} from './util/resolve-evaluate-options.js'
import {compile, compileSync} from './compile.js'
import {run, runSync} from './run.js'
/**
* Compile and run MDX.
*
* When you trust your content, `evaluate` can work.
* When possible, use `compile`, write to a file, and then run with Node or use
* one of the integrations.
*
* > ☢️ **Danger**: its called **evaluate** because it `eval`s JavaScript.
*
* ###### Notes
*
* Compiling (and running) MDX takes time.
*
* If you are live-rendering a string of MDX that often changes using a virtual
* DOM based framework (such as React), one performance improvement is to call
* the `MDXContent` component yourself.
* The reason is that the `evaluate` creates a new function each time, which
* cannot be diffed:
*
* ```diff
* const {default: MDXContent} = await evaluate('…')
*
* -<MDXContent {...props} />
* +MDXContent(props)
* ```
*
* @param {Readonly<Compatible>} file
* MDX document to parse.
* @param {Readonly<EvaluateOptions>} options
* Configuration (**required**).
* @return {Promise<MDXModule>}
* Promise to a module;
* the result is an object with a `default` field set to the component;
* anything else that was exported is available too.
*/
export async function evaluate(file, options) {
const {compiletime, runtime} = resolveEvaluateOptions(options)
return run(await compile(file, compiletime), runtime)
}
/**
* Compile and run MDX, synchronously.
*
* When possible please use the async `evaluate`.
*
* > ☢️ **Danger**: its called **evaluate** because it `eval`s JavaScript.
*
* @param {Readonly<Compatible>} file
* MDX document to parse.
* @param {Readonly<EvaluateOptions>} options
* Configuration (**required**).
* @return {MDXModule}
* Module.
*/
export function evaluateSync(file, options) {
const {compiletime, runtime} = resolveEvaluateOptions(options)
return runSync(compileSync(file, compiletime), runtime)
}

View File

@@ -0,0 +1,6 @@
/**
* List of node types made by `mdast-util-mdx`, which have to be passed
* through untouched from the mdast tree to the hast tree.
*/
export const nodeTypes: readonly ["mdxFlowExpression", "mdxJsxFlowElement", "mdxJsxTextElement", "mdxTextExpression", "mdxjsEsm"];
//# sourceMappingURL=node-types.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["node-types.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH,kIAME"}

View File

@@ -0,0 +1,11 @@
/**
* List of node types made by `mdast-util-mdx`, which have to be passed
* through untouched from the mdast tree to the hast tree.
*/
export const nodeTypes = /** @type {const} */ ([
'mdxFlowExpression',
'mdxJsxFlowElement',
'mdxJsxTextElement',
'mdxTextExpression',
'mdxjsEsm'
])

View File

@@ -0,0 +1,21 @@
/**
* Plugin to change the tree after compiling JSX away.
*
* @param {Readonly<Options> | null | undefined} [options]
* Configuration (optional).
* @returns
* Transform.
*/
export function recmaBuildJsxTransform(options?: Readonly<Options> | null | undefined): (tree: Program) => undefined;
/**
* Configuration for internal plugin `recma-build-jsx-transform`.
*/
export type Options = {
/**
* Whether to keep the import of the automatic runtime or get it from
* `arguments[0]` instead (default: `'program'`).
*/
outputFormat?: "function-body" | "program" | null | undefined;
};
import type { Program } from 'estree-jsx';
//# sourceMappingURL=recma-build-jsx-transform.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"recma-build-jsx-transform.d.ts","sourceRoot":"","sources":["recma-build-jsx-transform.js"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH,iDALW,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,IAe5B,MALN,OAKU,KAHR,SAAS,CAiDvB;;;;;;;;;mBAxEa,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS;;6BANlC,YAAY"}

View File

@@ -0,0 +1,80 @@
/**
* @import {Program} from 'estree-jsx'
*/
/**
* @typedef Options
* Configuration for internal plugin `recma-build-jsx-transform`.
* @property {'function-body' | 'program' | null | undefined} [outputFormat='program']
* Whether to keep the import of the automatic runtime or get it from
* `arguments[0]` instead (default: `'program'`).
*/
import {specifiersToDeclarations} from '../util/estree-util-specifiers-to-declarations.js'
import {toIdOrMemberExpression} from '../util/estree-util-to-id-or-member-expression.js'
/**
* Plugin to change the tree after compiling JSX away.
*
* @param {Readonly<Options> | null | undefined} [options]
* Configuration (optional).
* @returns
* Transform.
*/
export function recmaBuildJsxTransform(options) {
/* c8 ignore next -- always given in `@mdx-js/mdx` */
const {outputFormat} = options || {}
/**
* @param {Program} tree
* Tree.
* @returns {undefined}
* Nothing.
*/
return function (tree) {
// Remove the pragma comment that we injected ourselves as it is no longer
// needed.
if (tree.comments) {
tree.comments = tree.comments.filter(function (d) {
return !d.data?._mdxIsPragmaComment
})
}
// When compiling to a function body, replace the import that was just
// generated, and get `jsx`, `jsxs`, and `Fragment` from `arguments[0]`
// instead.
if (outputFormat === 'function-body') {
let index = 0
// Skip directives: JS currently only has `use strict`, but Acorn allows
// arbitrary ones.
// Practically things like `use client` could be used?
while (index < tree.body.length) {
const child = tree.body[index]
if ('directive' in child && child.directive) {
index++
} else {
break
}
}
const declaration = tree.body[index]
if (
declaration &&
declaration.type === 'ImportDeclaration' &&
typeof declaration.source.value === 'string' &&
/\/jsx-(dev-)?runtime$/.test(declaration.source.value)
) {
tree.body[index] = {
type: 'VariableDeclaration',
kind: 'const',
declarations: specifiersToDeclarations(
declaration.specifiers,
toIdOrMemberExpression(['arguments', 0])
)
}
}
}
}
}

View File

@@ -0,0 +1,13 @@
/**
* Wrap the estree in `MDXContent`.
*
* @param {Readonly<ProcessorOptions>} options
* Configuration.
* @returns
* Transform.
*/
export function recmaDocument(options: Readonly<ProcessorOptions>): (tree: Program, file: VFile) => undefined;
import type { ProcessorOptions } from '../core.js';
import type { Program } from 'estree-jsx';
import type { VFile } from 'vfile';
//# sourceMappingURL=recma-document.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"recma-document.d.ts","sourceRoot":"","sources":["recma-document.js"],"names":[],"mappings":"AA0CA;;;;;;;GAOG;AACH,uCALW,QAAQ,CAAC,gBAAgB,CAAC,IAyBlB,MAPN,OAOU,EAAE,MALZ,KAKgB,KAHd,SAAS,CAqpBvB;sCA5rBkC,YAAY;6BAFrC,YAAY;2BACE,OAAO"}

View File

@@ -0,0 +1,915 @@
/**
* @import {
CallExpression,
Directive,
ExportAllDeclaration,
ExportDefaultDeclaration,
ExportNamedDeclaration,
ExportSpecifier,
Expression,
FunctionDeclaration,
Identifier,
ImportDeclaration,
ImportDefaultSpecifier,
ImportExpression,
ImportSpecifier,
JSXElement,
JSXFragment,
Literal,
ModuleDeclaration,
Node,
Program,
Property,
SimpleLiteral,
SpreadElement,
Statement,
VariableDeclarator
* } from 'estree-jsx'
* @import {VFile} from 'vfile'
* @import {ProcessorOptions} from '../core.js'
*/
import {ok as assert} from 'devlop'
import {createVisitors} from 'estree-util-scope'
import {walk} from 'estree-walker'
import {positionFromEstree} from 'unist-util-position-from-estree'
import {stringifyPosition} from 'unist-util-stringify-position'
import {create} from '../util/estree-util-create.js'
import {declarationToExpression} from '../util/estree-util-declaration-to-expression.js'
import {isDeclaration} from '../util/estree-util-is-declaration.js'
import {specifiersToDeclarations} from '../util/estree-util-specifiers-to-declarations.js'
import {toIdOrMemberExpression} from '../util/estree-util-to-id-or-member-expression.js'
/**
* Wrap the estree in `MDXContent`.
*
* @param {Readonly<ProcessorOptions>} options
* Configuration.
* @returns
* Transform.
*/
export function recmaDocument(options) {
const baseUrl = options.baseUrl || undefined
const baseHref = typeof baseUrl === 'object' ? baseUrl.href : baseUrl
const outputFormat = options.outputFormat || 'program'
const pragma =
options.pragma === undefined ? 'React.createElement' : options.pragma
const pragmaFrag =
options.pragmaFrag === undefined ? 'React.Fragment' : options.pragmaFrag
const pragmaImportSource = options.pragmaImportSource || 'react'
const jsxImportSource = options.jsxImportSource || 'react'
const jsxRuntime = options.jsxRuntime || 'automatic'
/**
* @param {Program} tree
* Tree.
* @param {VFile} file
* File.
* @returns {undefined}
* Nothing.
*/
return function (tree, file) {
/** @type {Array<[string, string] | string>} */
const exportedValues = []
/** @type {Array<Directive | ModuleDeclaration | Statement>} */
const replacement = []
let exportAllCount = 0
/** @type {ExportDefaultDeclaration | ExportSpecifier | undefined} */
let layout
/** @type {boolean | undefined} */
let content
/** @type {Node} */
let child
if (jsxRuntime === 'classic' && pragmaFrag) {
injectPragma(tree, '@jsxFrag', pragmaFrag)
}
if (jsxRuntime === 'classic' && pragma) {
injectPragma(tree, '@jsx', pragma)
}
if (jsxRuntime === 'automatic' && jsxImportSource) {
injectPragma(tree, '@jsxImportSource', jsxImportSource)
}
if (jsxRuntime) {
injectPragma(tree, '@jsxRuntime', jsxRuntime)
}
if (jsxRuntime === 'classic' && pragmaImportSource) {
if (!pragma) {
throw new Error(
'Missing `pragma` in classic runtime with `pragmaImportSource`'
)
}
handleEsm({
type: 'ImportDeclaration',
specifiers: [
{
type: 'ImportDefaultSpecifier',
local: {type: 'Identifier', name: pragma.split('.')[0]}
}
],
attributes: [],
source: {type: 'Literal', value: pragmaImportSource}
})
}
// Find the `export default`, the JSX expression, and leave the rest
// (import/exports) as they are.
for (child of tree.body) {
// ```tsx
// export default properties => <>{properties.children}</>
// ```
//
// Treat it as an inline layout declaration.
if (child.type === 'ExportDefaultDeclaration') {
if (layout) {
file.fail(
'Unexpected duplicate layout, expected a single layout (previous: ' +
stringifyPosition(positionFromEstree(layout)) +
')',
{
ancestors: [tree, child],
place: positionFromEstree(child),
ruleId: 'duplicate-layout',
source: 'recma-document'
}
)
}
layout = child
replacement.push({
type: 'VariableDeclaration',
kind: 'const',
declarations: [
{
type: 'VariableDeclarator',
id: {type: 'Identifier', name: 'MDXLayout'},
init: isDeclaration(child.declaration)
? declarationToExpression(child.declaration)
: child.declaration
}
]
})
}
// ```tsx
// export {a, b as c} from 'd'
// ```
else if (child.type === 'ExportNamedDeclaration' && child.source) {
// Cast because always simple.
const source = /** @type {SimpleLiteral} */ (child.source)
// Remove `default` or `as default`, but not `default as`, specifier.
child.specifiers = child.specifiers.filter(function (specifier) {
if (
specifier.exported.type === 'Identifier' &&
specifier.exported.name === 'default'
) {
if (layout) {
file.fail(
'Unexpected duplicate layout, expected a single layout (previous: ' +
stringifyPosition(positionFromEstree(layout)) +
')',
{
ancestors: [tree, child, specifier],
place: positionFromEstree(child),
ruleId: 'duplicate-layout',
source: 'recma-document'
}
)
}
layout = specifier
// Make it just an import: `import MDXLayout from '…'`.
/** @type {Array<ImportDefaultSpecifier | ImportSpecifier>} */
const specifiers = []
// Default as default / something else as default.
if (
specifier.local.type === 'Identifier' &&
specifier.local.name === 'default'
) {
specifiers.push({
type: 'ImportDefaultSpecifier',
local: {type: 'Identifier', name: 'MDXLayout'}
})
} else {
/** @type {ImportSpecifier} */
const importSpecifier = {
type: 'ImportSpecifier',
imported: specifier.local,
local: {type: 'Identifier', name: 'MDXLayout'}
}
create(specifier.local, importSpecifier)
specifiers.push(importSpecifier)
}
/** @type {Literal} */
const from = {type: 'Literal', value: source.value}
create(source, from)
/** @type {ImportDeclaration} */
const declaration = {
type: 'ImportDeclaration',
specifiers,
attributes: [],
source: from
}
create(specifier, declaration)
handleEsm(declaration)
return false
}
return true
})
// If there are other things imported, keep it.
if (child.specifiers.length > 0) {
handleExport(child)
}
}
// ```tsx
// export {a, b as c}
// export * from 'a'
// ```
else if (
child.type === 'ExportNamedDeclaration' ||
child.type === 'ExportAllDeclaration'
) {
handleExport(child)
} else if (child.type === 'ImportDeclaration') {
handleEsm(child)
} else if (
child.type === 'ExpressionStatement' &&
(child.expression.type === 'JSXElement' ||
child.expression.type === 'JSXFragment')
) {
content = true
replacement.push(
...createMdxContent(child.expression, outputFormat, Boolean(layout))
)
} else {
// This catch-all branch is because plugins might add other things.
// Normally, we only have import/export/jsx, but just add whatevers
// there.
replacement.push(child)
}
}
// If there was no JSX content at all, add an empty function.
if (!content) {
replacement.push(
...createMdxContent(undefined, outputFormat, Boolean(layout))
)
}
exportedValues.push(['MDXContent', 'default'])
if (outputFormat === 'function-body') {
replacement.push({
type: 'ReturnStatement',
argument: {
type: 'ObjectExpression',
properties: [
...Array.from({length: exportAllCount}).map(
/**
* @param {undefined} _
* Nothing.
* @param {number} index
* Index.
* @returns {SpreadElement}
* Node.
*/
function (_, index) {
return {
type: 'SpreadElement',
argument: {
type: 'Identifier',
name: '_exportAll' + (index + 1)
}
}
}
),
...exportedValues.map(function (d) {
/** @type {Property} */
const property = {
type: 'Property',
kind: 'init',
method: false,
computed: false,
shorthand: typeof d === 'string',
key: {
type: 'Identifier',
name: typeof d === 'string' ? d : d[1]
},
value: {
type: 'Identifier',
name: typeof d === 'string' ? d : d[0]
}
}
return property
})
]
}
})
}
tree.body = replacement
let usesImportMetaUrlVariable = false
let usesResolveDynamicHelper = false
if (baseHref || outputFormat === 'function-body') {
walk(tree, {
enter(node) {
if (
(node.type === 'ExportAllDeclaration' ||
node.type === 'ExportNamedDeclaration' ||
node.type === 'ImportDeclaration') &&
node.source
) {
// We never hit this branch when generating function bodies, as
// statements are already compiled away into import expressions.
assert(baseHref, 'unexpected missing `baseHref` in branch')
let value = node.source.value
// The literal source for statements can only be string.
assert(typeof value === 'string', 'expected string source')
// Resolve a specifier.
// This is the same as `_resolveDynamicMdxSpecifier`, which has to
// be injected to work with expressions at runtime, but as we have
// `baseHref` at compile time here and statements are static
// strings, we can do it now.
try {
// To do: next major: use `URL.canParse`.
// eslint-disable-next-line no-new
new URL(value)
// Fine: a full URL.
} catch {
if (
value.startsWith('/') ||
value.startsWith('./') ||
value.startsWith('../')
) {
value = new URL(value, baseHref).href
} else {
// Fine: are bare specifier.
}
}
/** @type {SimpleLiteral} */
const replacement = {type: 'Literal', value}
create(node.source, replacement)
node.source = replacement
return
}
if (node.type === 'ImportExpression') {
usesResolveDynamicHelper = true
/** @type {CallExpression} */
const replacement = {
type: 'CallExpression',
callee: {type: 'Identifier', name: '_resolveDynamicMdxSpecifier'},
arguments: [node.source],
optional: false
}
node.source = replacement
return
}
// To do: add support for `import.meta.resolve`.
if (
node.type === 'MemberExpression' &&
'object' in node &&
node.object.type === 'MetaProperty' &&
node.property.type === 'Identifier' &&
node.object.meta.name === 'import' &&
node.object.property.name === 'meta' &&
node.property.name === 'url'
) {
usesImportMetaUrlVariable = true
/** @type {Identifier} */
const replacement = {type: 'Identifier', name: '_importMetaUrl'}
create(node, replacement)
this.replace(replacement)
}
}
})
}
if (usesResolveDynamicHelper) {
if (!baseHref) {
usesImportMetaUrlVariable = true
}
tree.body.push(
resolveDynamicMdxSpecifier(
baseHref
? {type: 'Literal', value: baseHref}
: {type: 'Identifier', name: '_importMetaUrl'}
)
)
}
if (usesImportMetaUrlVariable) {
assert(
outputFormat === 'function-body',
'expected `function-body` when using dynamic url injection'
)
tree.body.unshift(...createImportMetaUrlVariable())
}
/**
* @param {ExportAllDeclaration | ExportNamedDeclaration} node
* Export node.
* @returns {undefined}
* Nothing.
*/
function handleExport(node) {
if (node.type === 'ExportNamedDeclaration') {
// ```tsx
// export function a() {}
// export class A {}
// export var a = 1
// ```
if (node.declaration) {
const visitors = createVisitors()
// Walk the top-level scope.
walk(node, {
enter(node) {
visitors.enter(node)
if (
node.type === 'ArrowFunctionExpression' ||
node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression'
) {
this.skip()
visitors.exit(node)
}
},
leave: visitors.exit
})
exportedValues.push(...visitors.scopes[0].defined)
}
// ```tsx
// export {a, b as c}
// export {a, b as c} from 'd'
// ```
for (child of node.specifiers) {
if (child.exported.type === 'Identifier') {
exportedValues.push(child.exported.name)
/* c8 ignore next 5 -- to do: <https://github.com/mdx-js/mdx/issues/2536> */
} else {
// Must be string.
assert(typeof child.exported.value === 'string')
exportedValues.push(child.exported.value)
}
}
}
handleEsm(node)
}
/**
* @param {ExportAllDeclaration | ExportNamedDeclaration | ImportDeclaration} node
* Export or import node.
* @returns {undefined}
* Nothing.
*/
function handleEsm(node) {
/** @type {ModuleDeclaration | Statement | undefined} */
let replace
/** @type {Expression} */
let init
if (outputFormat === 'function-body') {
if (
// Always have a source:
node.type === 'ImportDeclaration' ||
node.type === 'ExportAllDeclaration' ||
// Source optional:
(node.type === 'ExportNamedDeclaration' && node.source)
) {
// We always have a source, but types say they can be missing.
assert(node.source, 'expected `node.source` to be defined')
// ```
// import 'a'
// //=> await import('a')
// import a from 'b'
// //=> const {default: a} = await import('b')
// export {a, b as c} from 'd'
// //=> const {a, c: b} = await import('d')
// export * from 'a'
// //=> const _exportAll0 = await import('a')
// ```
/** @type {ImportExpression} */
const argument = {type: 'ImportExpression', source: node.source}
create(node, argument)
init = {type: 'AwaitExpression', argument}
if (
(node.type === 'ImportDeclaration' ||
node.type === 'ExportNamedDeclaration') &&
node.specifiers.length === 0
) {
replace = {type: 'ExpressionStatement', expression: init}
} else {
replace = {
type: 'VariableDeclaration',
kind: 'const',
declarations:
node.type === 'ExportAllDeclaration'
? [
{
type: 'VariableDeclarator',
id: {
type: 'Identifier',
name: '_exportAll' + ++exportAllCount
},
init
}
]
: specifiersToDeclarations(node.specifiers, init)
}
}
} else if (node.declaration) {
replace = node.declaration
} else {
/** @type {Array<VariableDeclarator>} */
const declarators = []
for (const specifier of node.specifiers) {
// `id` can only be an identifier,
// so we ignore literal.
if (
specifier.exported.type === 'Identifier' &&
specifier.local.type === 'Identifier' &&
specifier.local.name !== specifier.exported.name
) {
declarators.push({
type: 'VariableDeclarator',
id: specifier.exported,
init: specifier.local
})
}
}
if (declarators.length > 0) {
replace = {
type: 'VariableDeclaration',
kind: 'const',
declarations: declarators
}
}
}
} else {
replace = node
}
if (replace) {
replacement.push(replace)
}
}
}
/**
* @param {Readonly<Expression> | undefined} content
* Content.
* @param {'function-body' | 'program'} outputFormat
* Output format.
* @param {boolean | undefined} [hasInternalLayout=false]
* Whether theres an internal layout (default: `false`).
* @returns {Array<ExportDefaultDeclaration | FunctionDeclaration>}
* Functions.
*/
function createMdxContent(content, outputFormat, hasInternalLayout) {
/** @type {JSXElement} */
const element = {
type: 'JSXElement',
openingElement: {
type: 'JSXOpeningElement',
name: {type: 'JSXIdentifier', name: 'MDXLayout'},
attributes: [
{
type: 'JSXSpreadAttribute',
argument: {type: 'Identifier', name: 'props'}
}
],
selfClosing: false
},
closingElement: {
type: 'JSXClosingElement',
name: {type: 'JSXIdentifier', name: 'MDXLayout'}
},
children: [
{
type: 'JSXElement',
openingElement: {
type: 'JSXOpeningElement',
name: {type: 'JSXIdentifier', name: '_createMdxContent'},
attributes: [
{
type: 'JSXSpreadAttribute',
argument: {type: 'Identifier', name: 'props'}
}
],
selfClosing: true
},
closingElement: null,
children: []
}
]
}
let result = /** @type {Expression} */ (element)
if (!hasInternalLayout) {
result = {
type: 'ConditionalExpression',
test: {type: 'Identifier', name: 'MDXLayout'},
consequent: result,
alternate: {
type: 'CallExpression',
callee: {type: 'Identifier', name: '_createMdxContent'},
arguments: [{type: 'Identifier', name: 'props'}],
optional: false
}
}
}
let argument =
// Cast because TS otherwise does not think `JSXFragment`s are expressions.
/** @type {Readonly<Expression> | Readonly<JSXFragment>} */ (
content || {type: 'Identifier', name: 'undefined'}
)
// Unwrap a fragment of a single element.
if (
argument.type === 'JSXFragment' &&
argument.children.length === 1 &&
argument.children[0].type === 'JSXElement'
) {
argument = argument.children[0]
}
let awaitExpression = false
walk(argument, {
enter(node) {
if (
node.type === 'ArrowFunctionExpression' ||
node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression'
) {
return this.skip()
}
if (
node.type === 'AwaitExpression' ||
/* c8 ignore next 2 -- can only occur in a function (which then can
* only be async, so skipped it) */
(node.type === 'ForOfStatement' && node.await)
) {
awaitExpression = true
}
}
})
/** @type {FunctionDeclaration} */
const declaration = {
type: 'FunctionDeclaration',
id: {type: 'Identifier', name: 'MDXContent'},
params: [
{
type: 'AssignmentPattern',
left: {type: 'Identifier', name: 'props'},
right: {type: 'ObjectExpression', properties: []}
}
],
body: {
type: 'BlockStatement',
body: [{type: 'ReturnStatement', argument: result}]
}
}
return [
{
type: 'FunctionDeclaration',
async: awaitExpression,
id: {type: 'Identifier', name: '_createMdxContent'},
params: [{type: 'Identifier', name: 'props'}],
body: {
type: 'BlockStatement',
body: [
{
type: 'ReturnStatement',
// Cast because TS doesnt think `JSXFragment` is an expression.
// eslint-disable-next-line object-shorthand
argument: /** @type {Expression} */ (argument)
}
]
}
},
outputFormat === 'program'
? {type: 'ExportDefaultDeclaration', declaration}
: declaration
]
}
}
/**
* @param {Program} tree
* @param {string} name
* @param {string} value
* @returns {undefined}
*/
function injectPragma(tree, name, value) {
tree.comments?.unshift({
type: 'Block',
value: name + ' ' + value,
data: {_mdxIsPragmaComment: true}
})
}
/**
* @param {Expression} importMetaUrl
* @returns {FunctionDeclaration}
*/
function resolveDynamicMdxSpecifier(importMetaUrl) {
return {
type: 'FunctionDeclaration',
id: {type: 'Identifier', name: '_resolveDynamicMdxSpecifier'},
generator: false,
async: false,
params: [{type: 'Identifier', name: 'd'}],
body: {
type: 'BlockStatement',
body: [
{
type: 'IfStatement',
test: {
type: 'BinaryExpression',
left: {
type: 'UnaryExpression',
operator: 'typeof',
prefix: true,
argument: {type: 'Identifier', name: 'd'}
},
operator: '!==',
right: {type: 'Literal', value: 'string'}
},
consequent: {
type: 'ReturnStatement',
argument: {type: 'Identifier', name: 'd'}
},
alternate: null
},
// To do: use `URL.canParse` when widely supported (see commented
// out code below).
{
type: 'TryStatement',
block: {
type: 'BlockStatement',
body: [
{
type: 'ExpressionStatement',
expression: {
type: 'NewExpression',
callee: {type: 'Identifier', name: 'URL'},
arguments: [{type: 'Identifier', name: 'd'}]
}
},
{
type: 'ReturnStatement',
argument: {type: 'Identifier', name: 'd'}
}
]
},
handler: {
type: 'CatchClause',
param: null,
body: {type: 'BlockStatement', body: []}
},
finalizer: null
},
// To do: use `URL.canParse` when widely supported.
// {
// type: 'IfStatement',
// test: {
// type: 'CallExpression',
// callee: toIdOrMemberExpression(['URL', 'canParse']),
// arguments: [{type: 'Identifier', name: 'd'}],
// optional: false
// },
// consequent: {
// type: 'ReturnStatement',
// argument: {type: 'Identifier', name: 'd'}
// },
// alternate: null
// },
{
type: 'IfStatement',
test: {
type: 'LogicalExpression',
left: {
type: 'LogicalExpression',
left: {
type: 'CallExpression',
callee: toIdOrMemberExpression(['d', 'startsWith']),
arguments: [{type: 'Literal', value: '/'}],
optional: false
},
operator: '||',
right: {
type: 'CallExpression',
callee: toIdOrMemberExpression(['d', 'startsWith']),
arguments: [{type: 'Literal', value: './'}],
optional: false
}
},
operator: '||',
right: {
type: 'CallExpression',
callee: toIdOrMemberExpression(['d', 'startsWith']),
arguments: [{type: 'Literal', value: '../'}],
optional: false
}
},
consequent: {
type: 'ReturnStatement',
argument: {
type: 'MemberExpression',
object: {
type: 'NewExpression',
callee: {type: 'Identifier', name: 'URL'},
arguments: [{type: 'Identifier', name: 'd'}, importMetaUrl]
},
property: {type: 'Identifier', name: 'href'},
computed: false,
optional: false
}
},
alternate: null
},
{
type: 'ReturnStatement',
argument: {type: 'Identifier', name: 'd'}
}
]
}
}
}
/**
* @returns {Array<Statement>}
*/
function createImportMetaUrlVariable() {
return [
{
type: 'VariableDeclaration',
declarations: [
{
type: 'VariableDeclarator',
id: {type: 'Identifier', name: '_importMetaUrl'},
init: toIdOrMemberExpression(['arguments', 0, 'baseUrl'])
}
],
kind: 'const'
},
{
type: 'IfStatement',
test: {
type: 'UnaryExpression',
operator: '!',
prefix: true,
argument: {type: 'Identifier', name: '_importMetaUrl'}
},
consequent: {
type: 'ThrowStatement',
argument: {
type: 'NewExpression',
callee: {type: 'Identifier', name: 'Error'},
arguments: [
{
type: 'Literal',
value:
'Unexpected missing `options.baseUrl` needed to support `export … from`, `import`, or `import.meta.url` when generating `function-body`'
}
]
}
},
alternate: null
}
]
}

View File

@@ -0,0 +1,51 @@
/**
* A plugin that rewrites JSX in functions to accept components as
* `props.components` (when the function is called `_createMdxContent`), or from
* a provider (if there is one).
* It also makes sure that any undefined components are defined: either from
* received components or as a function that throws an error.
*
* @param {Readonly<ProcessorOptions>} options
* Configuration (optional).
* @returns
* Transform.
*/
export function recmaJsxRewrite(options: Readonly<ProcessorOptions>): (tree: Program, file: VFile) => undefined;
/**
* Entry.
*/
export type StackEntry = {
/**
* Used components.
*/
components: Array<string>;
/**
* Map of JSX identifiers which cannot be used as JS identifiers, to valid JS identifiers.
*/
idToInvalidComponentName: Map<string, string>;
/**
* Function.
*/
node: Readonly<EstreeFunction>;
/**
* Identifiers of used objects (such as `x` in `x.y`).
*/
objects: Array<string>;
/**
* Map of JSX identifiers for components and objects, to where they were first used.
*/
references: Record<string, {
node: Readonly<JSXElement>;
component: boolean;
}>;
/**
* Tag names.
*/
tags: Array<string>;
};
import type { ProcessorOptions } from '../core.js';
import type { Program } from 'estree-jsx';
import type { VFile } from 'vfile';
import type { Function as EstreeFunction } from 'estree-jsx';
import type { JSXElement } from 'estree-jsx';
//# sourceMappingURL=recma-jsx-rewrite.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"recma-jsx-rewrite.d.ts","sourceRoot":"","sources":["recma-jsx-rewrite.js"],"names":[],"mappings":"AAiDA;;;;;;;;;;;GAWG;AACH,yCALW,QAAQ,CAAC,gBAAgB,CAAC,IAgBlB,MAPN,OAOU,EAAE,MALZ,KAKgB,KAHd,SAAS,CAievB;;;;;;;;gBA/gBa,KAAK,CAAC,MAAM,CAAC;;;;8BAEb,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;;;;UAEnB,QAAQ,CAAC,cAAc,CAAC;;;;aAExB,KAAK,CAAC,MAAM,CAAC;;;;gBAEb,MAAM,CAAC,MAAM,EAAE;QAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAC,CAAC;;;;UAEhE,KAAK,CAAC,MAAM,CAAC;;sCAhBQ,YAAY;6BAHrC,YAAY;2BAEE,OAAO;gDAFrB,YAAY;gCAAZ,YAAY"}

View File

@@ -0,0 +1,620 @@
/**
* @import {
Expression,
Function as EstreeFunction,
Identifier,
ImportSpecifier,
JSXElement,
ModuleDeclaration,
ObjectPattern,
Program,
Property,
SpreadElement,
Statement,
VariableDeclarator
* } from 'estree-jsx'
* @import {Scope} from 'estree-util-scope'
* @import {VFile} from 'vfile'
* @import {ProcessorOptions} from '../core.js'
*/
/**
* @typedef StackEntry
* Entry.
* @property {Array<string>} components
* Used components.
* @property {Map<string, string>} idToInvalidComponentName
* Map of JSX identifiers which cannot be used as JS identifiers, to valid JS identifiers.
* @property {Readonly<EstreeFunction>} node
* Function.
* @property {Array<string>} objects
* Identifiers of used objects (such as `x` in `x.y`).
* @property {Record<string, {node: Readonly<JSXElement>, component: boolean}>} references
* Map of JSX identifiers for components and objects, to where they were first used.
* @property {Array<string>} tags
* Tag names.
*/
import {name as isIdentifierName} from 'estree-util-is-identifier-name'
import {createVisitors} from 'estree-util-scope'
import {walk} from 'estree-walker'
import {stringifyPosition} from 'unist-util-stringify-position'
import {positionFromEstree} from 'unist-util-position-from-estree'
import {specifiersToDeclarations} from '../util/estree-util-specifiers-to-declarations.js'
import {toBinaryAddition} from '../util/estree-util-to-binary-addition.js'
import {
toIdOrMemberExpression,
toJsxIdOrMemberExpression
} from '../util/estree-util-to-id-or-member-expression.js'
/**
* A plugin that rewrites JSX in functions to accept components as
* `props.components` (when the function is called `_createMdxContent`), or from
* a provider (if there is one).
* It also makes sure that any undefined components are defined: either from
* received components or as a function that throws an error.
*
* @param {Readonly<ProcessorOptions>} options
* Configuration (optional).
* @returns
* Transform.
*/
export function recmaJsxRewrite(options) {
const {development, outputFormat, providerImportSource} = options
/**
* @param {Program} tree
* Tree.
* @param {VFile} file
* File.
* @returns {undefined}
* Nothing.
*/
return function (tree, file) {
const visitors = createVisitors()
/** @type {Array<StackEntry>} */
const functionStack = []
let importProvider = false
let createErrorHelper = false
walk(tree, {
enter(node) {
visitors.enter(node)
if (
node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression' ||
node.type === 'ArrowFunctionExpression'
) {
functionStack.push({
components: [],
idToInvalidComponentName: new Map(),
node,
objects: [],
references: {},
tags: []
})
// `MDXContent` only ever contains `MDXLayout`.
if (
isNamedFunction(node, 'MDXContent') &&
!inScope(visitors.scopes, 'MDXLayout')
) {
functionStack[0].components.push('MDXLayout')
}
}
const functionInfo = functionStack[0]
if (
!functionInfo ||
(!isNamedFunction(functionInfo.node, '_createMdxContent') &&
!providerImportSource)
) {
return
}
if (node.type === 'JSXElement') {
let name = node.openingElement.name
// `<x.y>`, `<Foo.Bar>`, `<x.y.z>`.
if (name.type === 'JSXMemberExpression') {
/** @type {Array<string>} */
const ids = []
// Find the left-most identifier.
while (name.type === 'JSXMemberExpression') {
ids.unshift(name.property.name)
name = name.object
}
ids.unshift(name.name)
const fullId = ids.join('.')
const id = name.name
const isInScope = inScope(visitors.scopes, id)
if (
!Object.hasOwn(functionInfo.references, fullId) &&
(!isInScope ||
// If the parent scope is `_createMdxContent`, then this
// references a component we can add a check statement for.
(functionStack.length === 1 &&
functionStack[0].node.type === 'FunctionDeclaration' &&
isNamedFunction(functionStack[0].node, '_createMdxContent')))
) {
functionInfo.references[fullId] = {component: true, node}
}
if (!functionInfo.objects.includes(id) && !isInScope) {
functionInfo.objects.push(id)
}
}
// `<xml:thing>`.
else if (name.type === 'JSXNamespacedName') {
// Ignore namespaces.
}
// If the name is a valid ES identifier, and it doesnt start with a
// lowercase letter, its a component.
// For example, `$foo`, `_bar`, `Baz` are all component names.
// But `foo` and `b-ar` are tag names.
else if (isIdentifierName(name.name) && !/^[a-z]/.test(name.name)) {
const id = name.name
if (!inScope(visitors.scopes, id)) {
// No need to add an error for an undefined layout — we use an
// `if` later.
if (
id !== 'MDXLayout' &&
!Object.hasOwn(functionInfo.references, id)
) {
functionInfo.references[id] = {component: true, node}
}
if (!functionInfo.components.includes(id)) {
functionInfo.components.push(id)
}
}
} else if (node.data && node.data._mdxExplicitJsx) {
// Do not turn explicit JSX into components from `_components`.
// As in, a given `h1` component is used for `# heading` (next case),
// but not for `<h1>heading</h1>`.
} else {
const id = name.name
if (!functionInfo.tags.includes(id)) {
functionInfo.tags.push(id)
}
/** @type {Array<number | string>} */
let jsxIdExpression = ['_components', id]
if (isIdentifierName(id) === false) {
let invalidComponentName =
functionInfo.idToInvalidComponentName.get(id)
if (invalidComponentName === undefined) {
invalidComponentName = `_component${functionInfo.idToInvalidComponentName.size}`
functionInfo.idToInvalidComponentName.set(
id,
invalidComponentName
)
}
jsxIdExpression = [invalidComponentName]
}
node.openingElement.name =
toJsxIdOrMemberExpression(jsxIdExpression)
if (node.closingElement) {
node.closingElement.name =
toJsxIdOrMemberExpression(jsxIdExpression)
}
}
}
},
leave(node) {
visitors.exit(node)
/** @type {Array<Property | SpreadElement>} */
const defaults = []
/** @type {Array<string>} */
const actual = []
/** @type {Array<Expression>} */
const parameters = []
/** @type {Array<VariableDeclarator>} */
const declarations = []
if (
node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression' ||
node.type === 'ArrowFunctionExpression'
) {
const functionInfo = functionStack[functionStack.length - 1]
/** @type {string} */
let name
for (name of functionInfo.tags.sort()) {
defaults.push({
type: 'Property',
kind: 'init',
key: isIdentifierName(name)
? {type: 'Identifier', name}
: {type: 'Literal', value: name},
value: {type: 'Literal', value: name},
method: false,
shorthand: false,
computed: false
})
}
actual.push(...functionInfo.components)
for (name of functionInfo.objects) {
// In some cases, a component is used directly (`<X>`) but its also
// used as an object (`<X.Y>`).
if (!actual.includes(name)) {
actual.push(name)
}
}
actual.sort()
/** @type {Array<Statement>} */
const statements = []
if (
defaults.length > 0 ||
actual.length > 0 ||
functionInfo.idToInvalidComponentName.size > 0
) {
if (providerImportSource) {
importProvider = true
parameters.push({
type: 'CallExpression',
callee: {type: 'Identifier', name: '_provideComponents'},
arguments: [],
optional: false
})
}
// Accept `components` as a prop if this is the `MDXContent` or
// `_createMdxContent` function.
if (
isNamedFunction(functionInfo.node, 'MDXContent') ||
isNamedFunction(functionInfo.node, '_createMdxContent')
) {
parameters.push(toIdOrMemberExpression(['props', 'components']))
}
if (defaults.length > 0 || parameters.length > 1) {
for (const parameter of parameters) {
defaults.push({type: 'SpreadElement', argument: parameter})
}
}
// If were getting components from several sources, merge them.
/** @type {Expression} */
let componentsInit =
defaults.length > 0
? {type: 'ObjectExpression', properties: defaults}
: // If were only getting components from `props.components`,
// make sure its defined.
{
type: 'LogicalExpression',
operator: '||',
left: parameters[0],
right: {type: 'ObjectExpression', properties: []}
}
/** @type {ObjectPattern | undefined} */
let componentsPattern
// Add components to scope.
// For `['MyComponent', 'MDXLayout']` this generates:
// ```tsx
// const {MyComponent, wrapper: MDXLayout} = _components
// ```
// Note that MDXLayout is special as its taken from
// `_components.wrapper`.
if (actual.length > 0) {
componentsPattern = {
type: 'ObjectPattern',
properties: actual.map(function (name) {
return {
type: 'Property',
kind: 'init',
key: {
type: 'Identifier',
name: name === 'MDXLayout' ? 'wrapper' : name
},
value: {type: 'Identifier', name},
method: false,
shorthand: name !== 'MDXLayout',
computed: false
}
})
}
}
if (functionInfo.tags.length > 0) {
declarations.push({
type: 'VariableDeclarator',
id: {type: 'Identifier', name: '_components'},
init: componentsInit
})
componentsInit = {type: 'Identifier', name: '_components'}
}
if (isNamedFunction(functionInfo.node, '_createMdxContent')) {
for (const [id, componentName] of [
...functionInfo.idToInvalidComponentName
].sort(function ([a], [b]) {
return a.localeCompare(b)
})) {
// For JSX IDs that cant be represented as JavaScript IDs (as in,
// those with dashes, such as `custom-element`), generate a
// separate variable that is a valid JS ID (such as `_component0`),
// and takes it from components:
// `const _component0 = _components['custom-element']`
declarations.push({
type: 'VariableDeclarator',
id: {
type: 'Identifier',
name: componentName
},
init: {
type: 'MemberExpression',
object: {type: 'Identifier', name: '_components'},
property: {type: 'Literal', value: id},
computed: true,
optional: false
}
})
}
}
if (componentsPattern) {
declarations.push({
type: 'VariableDeclarator',
id: componentsPattern,
init: componentsInit
})
}
if (declarations.length > 0) {
statements.push({
type: 'VariableDeclaration',
kind: 'const',
declarations
})
}
}
/** @type {string} */
let key
// Add partials (so for `x.y.z` itd generate `x` and `x.y` too).
for (key in functionInfo.references) {
if (Object.hasOwn(functionInfo.references, key)) {
const parts = key.split('.')
let index = 0
while (++index < parts.length) {
const partial = parts.slice(0, index).join('.')
if (!Object.hasOwn(functionInfo.references, partial)) {
functionInfo.references[partial] = {
component: false,
node: functionInfo.references[key].node
}
}
}
}
}
const references = Object.keys(functionInfo.references).sort()
let index = -1
while (++index < references.length) {
const id = references[index]
const info = functionInfo.references[id]
const place = stringifyPosition(positionFromEstree(info.node))
/** @type {Array<Expression>} */
const parameters = [
{type: 'Literal', value: id},
{type: 'Literal', value: info.component}
]
createErrorHelper = true
if (development && place) {
parameters.push({type: 'Literal', value: place})
}
statements.push({
type: 'IfStatement',
test: {
type: 'UnaryExpression',
operator: '!',
prefix: true,
argument: toIdOrMemberExpression(id.split('.'))
},
consequent: {
type: 'ExpressionStatement',
expression: {
type: 'CallExpression',
callee: {type: 'Identifier', name: '_missingMdxReference'},
arguments: parameters,
optional: false
}
},
alternate: undefined
})
}
if (statements.length > 0) {
// Arrow functions with an implied return:
if (node.body.type !== 'BlockStatement') {
node.body = {
type: 'BlockStatement',
body: [{type: 'ReturnStatement', argument: node.body}]
}
}
node.body.body.unshift(...statements)
}
functionStack.pop()
}
}
})
// If a provider is used (and can be used), import it.
if (importProvider && providerImportSource) {
tree.body.unshift(
createImportProvider(providerImportSource, outputFormat)
)
}
// If potentially missing components are used.
if (createErrorHelper) {
/** @type {Array<Expression>} */
const message = [
{type: 'Literal', value: 'Expected '},
{
type: 'ConditionalExpression',
test: {type: 'Identifier', name: 'component'},
consequent: {type: 'Literal', value: 'component'},
alternate: {type: 'Literal', value: 'object'}
},
{type: 'Literal', value: ' `'},
{type: 'Identifier', name: 'id'},
{
type: 'Literal',
value:
'` to be defined: you likely forgot to import, pass, or provide it.'
}
]
/** @type {Array<Identifier>} */
const parameters = [
{type: 'Identifier', name: 'id'},
{type: 'Identifier', name: 'component'}
]
if (development) {
message.push({
type: 'ConditionalExpression',
test: {type: 'Identifier', name: 'place'},
consequent: toBinaryAddition([
{type: 'Literal', value: '\nIts referenced in your code at `'},
{type: 'Identifier', name: 'place'},
{
type: 'Literal',
value: (file.path ? '` in `' + file.path : '') + '`'
}
]),
alternate: {type: 'Literal', value: ''}
})
parameters.push({type: 'Identifier', name: 'place'})
}
tree.body.push({
type: 'FunctionDeclaration',
id: {type: 'Identifier', name: '_missingMdxReference'},
generator: false,
async: false,
params: parameters,
body: {
type: 'BlockStatement',
body: [
{
type: 'ThrowStatement',
argument: {
type: 'NewExpression',
callee: {type: 'Identifier', name: 'Error'},
arguments: [toBinaryAddition(message)]
}
}
]
}
})
}
if (outputFormat === 'function-body') {
tree.body.unshift({
type: 'ExpressionStatement',
expression: {type: 'Literal', value: 'use strict'},
directive: 'use strict'
})
}
}
}
/**
* @param {string} providerImportSource
* Provider source.
* @param {'function-body' | 'program' | null | undefined} outputFormat
* Format.
* @returns {ModuleDeclaration | Statement}
* Node.
*/
function createImportProvider(providerImportSource, outputFormat) {
/** @type {Array<ImportSpecifier>} */
const specifiers = [
{
type: 'ImportSpecifier',
imported: {type: 'Identifier', name: 'useMDXComponents'},
local: {type: 'Identifier', name: '_provideComponents'}
}
]
return outputFormat === 'function-body'
? {
type: 'VariableDeclaration',
kind: 'const',
declarations: specifiersToDeclarations(
specifiers,
toIdOrMemberExpression(['arguments', 0])
)
}
: {
type: 'ImportDeclaration',
specifiers,
attributes: [],
source: {type: 'Literal', value: providerImportSource}
}
}
/**
* @param {Readonly<EstreeFunction>} node
* Node.
* @param {string} name
* Name.
* @returns {boolean}
* Whether `node` is a named function with `name`.
*/
function isNamedFunction(node, name) {
return Boolean(node && 'id' in node && node.id && node.id.name === name)
}
/**
* @param {Array<Scope>} scopes
* Scope.
* @param {string} id
* Identifier.
* @returns {boolean}
* Whether `id` is in `scope`.
*/
function inScope(scopes, id) {
let index = scopes.length
while (index--) {
const scope = scopes[index]
if (scope.defined.includes(id)) {
return true
}
}
return false
}

View File

@@ -0,0 +1,12 @@
/**
* A tiny plugin that removes raw HTML.
*
* This is needed if the format is `md` and `rehype-raw` was not used to parse
* dangerous HTML into nodes.
*
* @returns
* Transform.
*/
export function rehypeRemoveRaw(): (tree: Root) => undefined;
import type { Root } from 'hast';
//# sourceMappingURL=rehype-remove-raw.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"rehype-remove-raw.d.ts","sourceRoot":"","sources":["rehype-remove-raw.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,oCAOmB,MALN,IAKU,KAHR,SAAS,CAWvB;0BA7BsB,MAAM"}

View File

@@ -0,0 +1,31 @@
/**
* @import {Root} from 'hast'
*/
import {visit} from 'unist-util-visit'
/**
* A tiny plugin that removes raw HTML.
*
* This is needed if the format is `md` and `rehype-raw` was not used to parse
* dangerous HTML into nodes.
*
* @returns
* Transform.
*/
export function rehypeRemoveRaw() {
/**
* @param {Root} tree
* Tree.
* @returns {undefined}
* Nothing.
*/
return function (tree) {
visit(tree, 'raw', function (_, index, parent) {
if (parent && typeof index === 'number') {
parent.children.splice(index, 1)
return index
}
})
}
}

View File

@@ -0,0 +1,13 @@
/**
* A tiny plugin that unravels `<p><h1>x</h1></p>` but also
* `<p><Component /></p>` (so it has no knowledge of “HTML”).
*
* It also marks JSX as being explicitly JSX, so when a user passes a `h1`
* component, it is used for `# heading` but not for `<h1>heading</h1>`.
*
* @returns
* Transform.
*/
export function remarkMarkAndUnravel(): (tree: Root) => undefined;
import type { Root } from 'mdast';
//# sourceMappingURL=remark-mark-and-unravel.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"remark-mark-and-unravel.d.ts","sourceRoot":"","sources":["remark-mark-and-unravel.js"],"names":[],"mappings":"AAQA;;;;;;;;;GASG;AACH,yCAOmB,MALN,IAKU,KAHR,SAAS,CA2FvB;0BAhHmC,OAAO"}

View File

@@ -0,0 +1,114 @@
/**
* @import {Root, RootContent} from 'mdast'
*/
import {collapseWhiteSpace} from 'collapse-white-space'
import {walk} from 'estree-walker'
import {visit} from 'unist-util-visit'
/**
* A tiny plugin that unravels `<p><h1>x</h1></p>` but also
* `<p><Component /></p>` (so it has no knowledge of “HTML”).
*
* It also marks JSX as being explicitly JSX, so when a user passes a `h1`
* component, it is used for `# heading` but not for `<h1>heading</h1>`.
*
* @returns
* Transform.
*/
export function remarkMarkAndUnravel() {
/**
* @param {Root} tree
* Tree.
* @returns {undefined}
* Nothing.
*/
return function (tree) {
visit(tree, function (node, index, parent) {
let offset = -1
let all = true
let oneOrMore = false
if (parent && typeof index === 'number' && node.type === 'paragraph') {
const children = node.children
while (++offset < children.length) {
const child = children[offset]
if (
child.type === 'mdxJsxTextElement' ||
child.type === 'mdxTextExpression'
) {
oneOrMore = true
} else if (
child.type === 'text' &&
collapseWhiteSpace(child.value, {style: 'html', trim: true}) === ''
) {
// Empty.
} else {
all = false
break
}
}
if (all && oneOrMore) {
offset = -1
/** @type {Array<RootContent>} */
const newChildren = []
while (++offset < children.length) {
const child = children[offset]
if (child.type === 'mdxJsxTextElement') {
// @ts-expect-error: mutate because it is faster; content model is fine.
child.type = 'mdxJsxFlowElement'
}
if (child.type === 'mdxTextExpression') {
// @ts-expect-error: mutate because it is faster; content model is fine.
child.type = 'mdxFlowExpression'
}
if (
child.type === 'text' &&
/^[\t\r\n ]+$/.test(String(child.value))
) {
// Empty.
} else {
newChildren.push(child)
}
}
parent.children.splice(index, 1, ...newChildren)
return index
}
}
if (
node.type === 'mdxJsxFlowElement' ||
node.type === 'mdxJsxTextElement'
) {
const data = node.data || (node.data = {})
data._mdxExplicitJsx = true
}
if (
(node.type === 'mdxFlowExpression' ||
node.type === 'mdxTextExpression' ||
node.type === 'mdxjsEsm') &&
node.data &&
node.data.estree
) {
walk(node.data.estree, {
enter(node) {
if (node.type === 'JSXElement') {
const data = node.data || (node.data = {})
data._mdxExplicitJsx = true
}
}
})
}
})
}
}

View File

@@ -0,0 +1,37 @@
/**
* Run code compiled with `outputFormat: 'function-body'`.
*
* > ☢️ **Danger**: this `eval`s JavaScript.
*
* @param {{toString(): string}} code
* JavaScript function body to run.
* @param {RunOptions} options
* Configuration (**required**).
* @return {Promise<MDXModule>}
* Promise to a module;
* the result is an object with a `default` field set to the component;
* anything else that was exported is available too.
*/
export function run(code: {
toString(): string;
}, options: RunOptions): Promise<MDXModule>;
/**
* Run code, synchronously.
*
* When possible please use the async `run`.
*
* > ☢️ **Danger**: this `eval`s JavaScript.
*
* @param {{toString(): string}} code
* JavaScript function body to run.
* @param {RunOptions} options
* Configuration (**required**).
* @return {MDXModule}
* Module.
*/
export function runSync(code: {
toString(): string;
}, options: RunOptions): MDXModule;
import type { RunOptions } from './util/resolve-evaluate-options.js';
import type { MDXModule } from 'mdx/types.js';
//# sourceMappingURL=run.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["run.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;GAaG;AACH,0BATW;IAAC,QAAQ,IAAI,MAAM,CAAA;CAAC,WAEpB,UAAU,GAET,OAAO,CAAC,SAAS,CAAC,CAO7B;AAED;;;;;;;;;;;;;GAaG;AACH,8BAPW;IAAC,QAAQ,IAAI,MAAM,CAAA;CAAC,WAEpB,UAAU,GAET,SAAS,CAMpB;gCAzC4B,oCAAoC;+BADrC,cAAc"}

View File

@@ -0,0 +1,44 @@
/**
* @import {MDXModule} from 'mdx/types.js'
* @import {RunOptions} from './util/resolve-evaluate-options.js'
*/
/** @type {new (code: string, ...args: Array<unknown>) => Function} **/
const AsyncFunction = Object.getPrototypeOf(run).constructor
/**
* Run code compiled with `outputFormat: 'function-body'`.
*
* > ☢️ **Danger**: this `eval`s JavaScript.
*
* @param {{toString(): string}} code
* JavaScript function body to run.
* @param {RunOptions} options
* Configuration (**required**).
* @return {Promise<MDXModule>}
* Promise to a module;
* the result is an object with a `default` field set to the component;
* anything else that was exported is available too.
*/
export async function run(code, options) {
return new AsyncFunction(String(code))(options)
}
/**
* Run code, synchronously.
*
* When possible please use the async `run`.
*
* > ☢️ **Danger**: this `eval`s JavaScript.
*
* @param {{toString(): string}} code
* JavaScript function body to run.
* @param {RunOptions} options
* Configuration (**required**).
* @return {MDXModule}
* Module.
*/
export function runSync(code, options) {
// eslint-disable-next-line no-new-func
return new Function(String(code))(options)
}

View File

@@ -0,0 +1,72 @@
import type {Program as EstreeProgram} from 'estree'
import type {Data as UnistData} from 'unist'
interface EsastData extends UnistData {
/**
* Whether a node was authored as explicit JSX (`<h1>`) or as implicitly
* turned into JSX (`# hi`).
*
* Registered by `@mdx-js/mdx/lib/types.d.ts`.
*/
_mdxExplicitJsx?: boolean | null | undefined
}
interface EsastCommentData extends EsastData {
/**
* Whether a node (only used on comments) was generated by us to include the
* JSX pragmas, so that when we compile JSX away, we can remove it.
*
* Registered by `@mdx-js/mdx/lib/types.d.ts`.
*/
_mdxIsPragmaComment?: boolean | null | undefined
}
// Register data on `estree`.
declare module 'estree' {
interface BaseNode {
/**
* Extra unist data passed through from mdast through hast to esast.
*
* Registered by `@mdx-js/mdx/lib/types.d.ts`.
*/
data?: EsastData | undefined
}
interface Comment {
/**
* Extra unist data added by `recma-document`.
*
* Registered by `@mdx-js/mdx/lib/types.d.ts`.
*/
data?: EsastCommentData | undefined
}
}
// Register data on `mdast`.
declare module 'mdast-util-mdx-jsx' {
interface MdxJsxFlowElementData {
/**
* Whether a node was authored as explicit JSX (`<h1>`) or as implicitly
* turned into JSX (`# hi`).
*
* Registered by `@mdx-js/mdx/lib/types.d.ts`.
*/
_mdxExplicitJsx?: boolean | null | undefined
}
interface MdxJsxTextElementData {
/**
* Whether a node was authored as explicit JSX (`<h1>`) or as implicitly
* turned into JSX (`# hi`).
*
* Registered by `@mdx-js/mdx/lib/types.d.ts`.
*/
_mdxExplicitJsx?: boolean | null | undefined
}
}
declare module 'unified' {
interface CompileResultMap {
EstreeProgram: EstreeProgram
}
}

View File

@@ -0,0 +1,30 @@
/**
* Create smart processors to handle different formats.
*
* @param {Readonly<CompileOptions> | null | undefined} [compileOptions]
* Configuration (optional).
* @return {FormatAwareProcessors}
* Smart processor.
*/
export function createFormatAwareProcessors(compileOptions?: Readonly<CompileOptions> | null | undefined): FormatAwareProcessors;
/**
* Result.
*/
export type FormatAwareProcessors = {
/**
* Extensions to use.
*/
extnames: ReadonlyArray<string>;
/**
* Smart processor, async.
*/
process: Process;
};
/**
* Smart processor.
*/
export type Process = (vfileCompatible: Compatible) => Promise<VFile>;
import type { CompileOptions } from '../compile.js';
import type { Compatible } from 'vfile';
import type { VFile } from 'vfile';
//# sourceMappingURL=create-format-aware-processors.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"create-format-aware-processors.d.ts","sourceRoot":"","sources":["create-format-aware-processors.js"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,6DALW,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,GAAG,SAAS,GAE1C,qBAAqB,CAsDhC;;;;;;;;cA5Ea,aAAa,CAAC,MAAM,CAAC;;;;aAErB,OAAO;;;;;wCAKV,UAAU,KAET,OAAO,CAAC,KAAK,CAAC;oCAfO,eAAe;gCADZ,OAAO;2BAAP,OAAO"}

View File

@@ -0,0 +1,88 @@
/**
* @import {Program} from 'estree-jsx'
* @import {Root} from 'mdast'
* @import {Processor} from 'unified'
* @import {Compatible, VFile} from 'vfile'
* @import {CompileOptions} from '../compile.js'
*/
/**
* @typedef FormatAwareProcessors
* Result.
* @property {ReadonlyArray<string>} extnames
* Extensions to use.
* @property {Process} process
* Smart processor, async.
*
* @callback Process
* Smart processor.
* @param {Compatible} vfileCompatible
* MDX or markdown document.
* @return {Promise<VFile>}
* File.
*/
import {createProcessor} from '../core.js'
import {md, mdx} from './extnames.js'
import {resolveFileAndOptions} from './resolve-file-and-options.js'
/**
* Create smart processors to handle different formats.
*
* @param {Readonly<CompileOptions> | null | undefined} [compileOptions]
* Configuration (optional).
* @return {FormatAwareProcessors}
* Smart processor.
*/
export function createFormatAwareProcessors(compileOptions) {
const compileOptions_ = compileOptions || {}
const mdExtensions = compileOptions_.mdExtensions || md
const mdxExtensions = compileOptions_.mdxExtensions || mdx
/** @type {Processor<Root, Program, Program, Program, string>} */
let cachedMarkdown
/** @type {Processor<Root, Program, Program, Program, string>} */
let cachedMdx
return {
extnames:
compileOptions_.format === 'md'
? mdExtensions
: compileOptions_.format === 'mdx'
? mdxExtensions
: [...mdExtensions, ...mdxExtensions],
process
}
/**
* Smart processor.
*
* @type {Process}
*/
function process(vfileCompatible) {
const {file, processor} = split(vfileCompatible)
return processor.process(file)
}
/**
* Make a full vfile from whats given, and figure out which processor
* should be used for it.
* This caches processors (one for markdown and one for MDX) so that they do
* not have to be reconstructed for each file.
*
* @param {Compatible} vfileCompatible
* MDX or markdown document.
* @return {{file: VFile, processor: Processor<Root, Program, Program, Program, string>}}
* File and corresponding processor.
*/
function split(vfileCompatible) {
const {file, options} = resolveFileAndOptions(
vfileCompatible,
compileOptions_
)
const processor =
options.format === 'md'
? cachedMarkdown || (cachedMarkdown = createProcessor(options))
: cachedMdx || (cachedMdx = createProcessor(options))
return {file, processor}
}
}

View File

@@ -0,0 +1,11 @@
/**
* @param {Readonly<Node>} from
* Node to take from.
* @param {Node} to
* Node to add to.
* @returns {undefined}
* Nothing.
*/
export function create(from: Readonly<Node>, to: Node): undefined;
import type { Node } from 'estree-jsx';
//# sourceMappingURL=estree-util-create.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estree-util-create.d.ts","sourceRoot":"","sources":["estree-util-create.js"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,6BAPW,QAAQ,CAAC,IAAI,CAAC,MAEd,IAAI,GAEF,SAAS,CAgBrB;0BA3BsB,YAAY"}

View File

@@ -0,0 +1,29 @@
/**
* @import {Node} from 'estree-jsx'
*/
// Fix to show references to above types in VS Code.
''
/**
* @param {Readonly<Node>} from
* Node to take from.
* @param {Node} to
* Node to add to.
* @returns {undefined}
* Nothing.
*/
export function create(from, to) {
/** @type {Array<keyof Node>} */
const fields = ['start', 'end', 'loc', 'range']
let index = -1
while (++index < fields.length) {
const field = fields[index]
if (field in from) {
// @ts-expect-error: assume theyre settable.
to[field] = from[field]
}
}
}

View File

@@ -0,0 +1,18 @@
/**
* Turn a declaration into an expression.
*
* Doesnt work for variable declarations, but thats fine for our use case
* because currently were using this utility for export default declarations,
* which cant contain variable declarations.
*
* @param {Readonly<Declaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration>} declaration
* Declaration.
* @returns {Expression}
* Expression.
*/
export function declarationToExpression(declaration: Readonly<Declaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration>): Expression;
import type { Declaration } from 'estree-jsx';
import type { MaybeNamedClassDeclaration } from 'estree-jsx';
import type { MaybeNamedFunctionDeclaration } from 'estree-jsx';
import type { Expression } from 'estree-jsx';
//# sourceMappingURL=estree-util-declaration-to-expression.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estree-util-declaration-to-expression.d.ts","sourceRoot":"","sources":["estree-util-declaration-to-expression.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;AACH,qDALW,QAAQ,CAAC,WAAW,GAAG,0BAA0B,GAAG,6BAA6B,CAAC,GAEhF,UAAU,CAYtB;iCA1BS,YAAY;gDAAZ,YAAY;mDAAZ,YAAY;gCAAZ,YAAY"}

View File

@@ -0,0 +1,33 @@
/**
* @import {
Declaration,
Expression,
MaybeNamedClassDeclaration,
MaybeNamedFunctionDeclaration
* } from 'estree-jsx'
*/
import {ok as assert} from 'devlop'
/**
* Turn a declaration into an expression.
*
* Doesnt work for variable declarations, but thats fine for our use case
* because currently were using this utility for export default declarations,
* which cant contain variable declarations.
*
* @param {Readonly<Declaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration>} declaration
* Declaration.
* @returns {Expression}
* Expression.
*/
export function declarationToExpression(declaration) {
if (declaration.type === 'FunctionDeclaration') {
return {...declaration, type: 'FunctionExpression'}
}
// This is currently an internal utility so the next shouldnt happen or a
// maintainer is making a mistake.
assert(declaration.type === 'ClassDeclaration', 'unexpected node type')
return {...declaration, type: 'ClassExpression'}
}

View File

@@ -0,0 +1,14 @@
/**
* Check if `node` is a declaration.
*
* @param {Readonly<MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration | Node>} node
* Node to check.
* @returns {node is Declaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration}
* Whether `node` is a declaration.
*/
export function isDeclaration(node: Readonly<MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration | Node>): node is Declaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration;
import type { MaybeNamedClassDeclaration } from 'estree-jsx';
import type { MaybeNamedFunctionDeclaration } from 'estree-jsx';
import type { Node } from 'estree-jsx';
import type { Declaration } from 'estree-jsx';
//# sourceMappingURL=estree-util-is-declaration.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estree-util-is-declaration.d.ts","sourceRoot":"","sources":["estree-util-is-declaration.js"],"names":[],"mappings":"AAYA;;;;;;;GAOG;AACH,oCALW,QAAQ,CAAC,0BAA0B,GAAG,6BAA6B,GAAG,IAAI,CAAC,GAEzE,IAAI,IAAI,WAAW,GAAG,0BAA0B,GAAG,6BAA6B,CAS5F;gDApBS,YAAY;mDAAZ,YAAY;0BAAZ,YAAY;iCAAZ,YAAY"}

View File

@@ -0,0 +1,27 @@
/**
* @import {
Declaration,
MaybeNamedClassDeclaration,
MaybeNamedFunctionDeclaration,
Node
* } from 'estree-jsx'
*/
// Fix to show references to above types in VS Code.
''
/**
* Check if `node` is a declaration.
*
* @param {Readonly<MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration | Node>} node
* Node to check.
* @returns {node is Declaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration}
* Whether `node` is a declaration.
*/
export function isDeclaration(node) {
return Boolean(
node.type === 'FunctionDeclaration' ||
node.type === 'ClassDeclaration' ||
node.type === 'VariableDeclaration'
)
}

View File

@@ -0,0 +1,16 @@
/**
* @param {ReadonlyArray<Readonly<ExportSpecifier> | Readonly<ImportDefaultSpecifier> | Readonly<ImportNamespaceSpecifier> | Readonly<ImportSpecifier>>} specifiers
* Specifiers.
* @param {Readonly<Expression>} init
* Initializer.
* @returns {Array<VariableDeclarator>}
* Declarations.
*/
export function specifiersToDeclarations(specifiers: ReadonlyArray<Readonly<ExportSpecifier> | Readonly<ImportDefaultSpecifier> | Readonly<ImportNamespaceSpecifier> | Readonly<ImportSpecifier>>, init: Readonly<Expression>): Array<VariableDeclarator>;
import type { ExportSpecifier } from 'estree-jsx';
import type { ImportDefaultSpecifier } from 'estree-jsx';
import type { ImportNamespaceSpecifier } from 'estree-jsx';
import type { ImportSpecifier } from 'estree-jsx';
import type { Expression } from 'estree-jsx';
import type { VariableDeclarator } from 'estree-jsx';
//# sourceMappingURL=estree-util-specifiers-to-declarations.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estree-util-specifiers-to-declarations.d.ts","sourceRoot":"","sources":["estree-util-specifiers-to-declarations.js"],"names":[],"mappings":"AAiBA;;;;;;;GAOG;AACH,qDAPW,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,sBAAsB,CAAC,GAAG,QAAQ,CAAC,wBAAwB,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,QAE5I,QAAQ,CAAC,UAAU,CAAC,GAElB,KAAK,CAAC,kBAAkB,CAAC,CAiFrC;qCA5FS,YAAY;4CAAZ,YAAY;8CAAZ,YAAY;qCAAZ,YAAY;gCAAZ,YAAY;wCAAZ,YAAY"}

View File

@@ -0,0 +1,104 @@
/**
* @import {
AssignmentProperty,
ExportSpecifier,
Expression,
Identifier,
ImportDefaultSpecifier,
ImportNamespaceSpecifier,
ImportSpecifier,
Literal,
VariableDeclarator
* } from 'estree-jsx'
*/
import {ok as assert} from 'devlop'
import {create} from './estree-util-create.js'
/**
* @param {ReadonlyArray<Readonly<ExportSpecifier> | Readonly<ImportDefaultSpecifier> | Readonly<ImportNamespaceSpecifier> | Readonly<ImportSpecifier>>} specifiers
* Specifiers.
* @param {Readonly<Expression>} init
* Initializer.
* @returns {Array<VariableDeclarator>}
* Declarations.
*/
export function specifiersToDeclarations(specifiers, init) {
let index = -1
/** @type {Array<VariableDeclarator>} */
const declarations = []
/** @type {Array<ExportSpecifier | ImportDefaultSpecifier | ImportSpecifier>} */
const otherSpecifiers = []
// Can only be one according to JS syntax.
/** @type {ImportNamespaceSpecifier | undefined} */
let importNamespaceSpecifier
while (++index < specifiers.length) {
const specifier = specifiers[index]
if (specifier.type === 'ImportNamespaceSpecifier') {
importNamespaceSpecifier = specifier
} else {
otherSpecifiers.push(specifier)
}
}
if (importNamespaceSpecifier) {
/** @type {VariableDeclarator} */
const declarator = {
type: 'VariableDeclarator',
id: importNamespaceSpecifier.local,
init
}
create(importNamespaceSpecifier, declarator)
declarations.push(declarator)
}
declarations.push({
type: 'VariableDeclarator',
id: {
type: 'ObjectPattern',
properties: otherSpecifiers.map(function (specifier) {
/** @type {Identifier | Literal} */
let key =
specifier.type === 'ImportSpecifier'
? specifier.imported
: specifier.type === 'ExportSpecifier'
? specifier.exported
: {type: 'Identifier', name: 'default'}
let value = specifier.local
// Switch them around if were exporting.
if (specifier.type === 'ExportSpecifier') {
value = key
key = specifier.local
}
// To do: what to do about literals?
// `const { a: 'b' } = c()` does not work?
assert(value.type === 'Identifier')
/** @type {AssignmentProperty} */
const property = {
type: 'Property',
kind: 'init',
shorthand:
key.type === 'Identifier' &&
value.type === 'Identifier' &&
key.name === value.name,
method: false,
computed: false,
key,
value
}
create(specifier, property)
return property
})
},
init: importNamespaceSpecifier
? {type: 'Identifier', name: importNamespaceSpecifier.local.name}
: init
})
return declarations
}

View File

@@ -0,0 +1,9 @@
/**
* @param {ReadonlyArray<Expression>} expressions
* Expressions.
* @returns {Expression}
* Addition.
*/
export function toBinaryAddition(expressions: ReadonlyArray<Expression>): Expression;
import type { Expression } from 'estree-jsx';
//# sourceMappingURL=estree-util-to-binary-addition.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estree-util-to-binary-addition.d.ts","sourceRoot":"","sources":["estree-util-to-binary-addition.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,8CALW,aAAa,CAAC,UAAU,CAAC,GAEvB,UAAU,CAetB;gCAvB4B,YAAY"}

View File

@@ -0,0 +1,25 @@
/**
* @import {Expression} from 'estree-jsx'
*/
import {ok as assert} from 'devlop'
/**
* @param {ReadonlyArray<Expression>} expressions
* Expressions.
* @returns {Expression}
* Addition.
*/
export function toBinaryAddition(expressions) {
let index = -1
/** @type {Expression | undefined} */
let left
while (++index < expressions.length) {
const right = expressions[index]
left = left ? {type: 'BinaryExpression', left, operator: '+', right} : right
}
assert(left, 'expected non-empty `expressions` to be passed')
return left
}

View File

@@ -0,0 +1,19 @@
/**
* @param {ReadonlyArray<number | string>} ids
* Identifiers (example: `['list', 0]).
* @returns {Identifier | MemberExpression}
* Identifier or member expression.
*/
export function toIdOrMemberExpression(ids: ReadonlyArray<number | string>): Identifier | MemberExpression;
/**
* @param {ReadonlyArray<number | string>} ids
* Identifiers (example: `['list', 0]).
* @returns {JSXIdentifier | JSXMemberExpression}
* Identifier or member expression.
*/
export function toJsxIdOrMemberExpression(ids: ReadonlyArray<number | string>): JSXIdentifier | JSXMemberExpression;
import type { Identifier } from 'estree-jsx';
import type { MemberExpression } from 'estree-jsx';
import type { JSXIdentifier } from 'estree-jsx';
import type { JSXMemberExpression } from 'estree-jsx';
//# sourceMappingURL=estree-util-to-id-or-member-expression.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"estree-util-to-id-or-member-expression.d.ts","sourceRoot":"","sources":["estree-util-to-id-or-member-expression.js"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH,4CALW,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,GAE5B,UAAU,GAAG,gBAAgB,CA6BzC;AAED;;;;;GAKG;AACH,+CALW,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,GAE5B,aAAa,GAAG,mBAAmB,CAsB/C;gCAjES,YAAY;sCAAZ,YAAY;mCAAZ,YAAY;yCAAZ,YAAY"}

View File

@@ -0,0 +1,73 @@
/**
* @import {
Identifier,
JSXIdentifier,
JSXMemberExpression,
Literal,
MemberExpression
* } from 'estree-jsx'
*/
import {ok as assert} from 'devlop'
import {name as isIdentifierName} from 'estree-util-is-identifier-name'
/**
* @param {ReadonlyArray<number | string>} ids
* Identifiers (example: `['list', 0]).
* @returns {Identifier | MemberExpression}
* Identifier or member expression.
*/
export function toIdOrMemberExpression(ids) {
let index = -1
/** @type {Identifier | Literal | MemberExpression | undefined} */
let object
while (++index < ids.length) {
const name = ids[index]
/** @type {Identifier | Literal} */
const id =
typeof name === 'string' && isIdentifierName(name)
? {type: 'Identifier', name}
: {type: 'Literal', value: name}
object = object
? {
type: 'MemberExpression',
object,
property: id,
computed: id.type === 'Literal',
optional: false
}
: id
}
assert(object, 'expected non-empty `ids` to be passed')
assert(object.type !== 'Literal', 'expected identifier as left-most value')
return object
}
/**
* @param {ReadonlyArray<number | string>} ids
* Identifiers (example: `['list', 0]).
* @returns {JSXIdentifier | JSXMemberExpression}
* Identifier or member expression.
*/
export function toJsxIdOrMemberExpression(ids) {
let index = -1
/** @type {JSXIdentifier | JSXMemberExpression | undefined} */
let object
while (++index < ids.length) {
const name = ids[index]
assert(
typeof name === 'string' && isIdentifierName(name, {jsx: true}),
'expected valid jsx identifier, not `' + name + '`'
)
/** @type {JSXIdentifier} */
const id = {type: 'JSXIdentifier', name}
object = object ? {type: 'JSXMemberExpression', object, property: id} : id
}
assert(object, 'expected non-empty `ids` to be passed')
return object
}

View File

@@ -0,0 +1,10 @@
/**
* Turn a list of extnames (*with* dots) into an expression.
*
* @param {ReadonlyArray<string>} extnames
* List of extnames.
* @returns {RegExp}
* Regex matching them.
*/
export function extnamesToRegex(extnames: ReadonlyArray<string>): RegExp;
//# sourceMappingURL=extnames-to-regex.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"extnames-to-regex.d.ts","sourceRoot":"","sources":["extnames-to-regex.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,0CALW,aAAa,CAAC,MAAM,CAAC,GAEnB,MAAM,CAalB"}

View File

@@ -0,0 +1,19 @@
/**
* Turn a list of extnames (*with* dots) into an expression.
*
* @param {ReadonlyArray<string>} extnames
* List of extnames.
* @returns {RegExp}
* Regex matching them.
*/
export function extnamesToRegex(extnames) {
return new RegExp(
'\\.(' +
extnames
.map(function (d) {
return d.slice(1)
})
.join('|') +
')([?#]|$)'
)
}

View File

@@ -0,0 +1,3 @@
export const md: string[];
export const mdx: string[];
//# sourceMappingURL=extnames.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"extnames.d.ts","sourceRoot":"","sources":["extnames.js"],"names":[],"mappings":"AAEA,0BAEE;AACF,2BAA2B"}

View File

@@ -0,0 +1,6 @@
import markdownExtensions from 'markdown-extensions'
export const md = markdownExtensions.map(function (d) {
return '.' + d
})
export const mdx = ['.mdx']

View File

@@ -0,0 +1,71 @@
/**
* Split compiletime options from runtime options.
*
* @param {Readonly<EvaluateOptions> | null | undefined} options
* Configuration.
* @returns {{compiletime: CompileOptions, runtime: RunOptions}}
* Split options.
*/
export function resolveEvaluateOptions(options: Readonly<EvaluateOptions> | null | undefined): {
compiletime: CompileOptions;
runtime: RunOptions;
};
/**
* Configuration for `evaluate`.
*/
export type EvaluateOptions = EvaluateProcessorOptions & RunOptions;
/**
* Compile configuration without JSX options for evaluation.
*/
export type EvaluateProcessorOptions = Omit<CompileOptions, "baseUrl" | "jsx" | "jsxImportSource" | "jsxRuntime" | "outputFormat" | "pragma" | "pragmaFrag" | "pragmaImportSource" | "providerImportSource">;
/**
* Configuration to run compiled code.
*
* `Fragment`, `jsx`, and `jsxs` are used when the code is compiled in
* production mode (`development: false`).
* `Fragment` and `jsxDEV` are used when compiled in development mode
* (`development: true`).
* `useMDXComponents` is used when the code is compiled with
* `providerImportSource: '#'` (the exact value of this compile option
* doesnt matter).
*/
export type RunOptions = {
/**
* Use this URL as `import.meta.url` and resolve `import` and `export … from`
* relative to it (optional, example: `import.meta.url`);
* this option can also be given at compile time in `CompileOptions`;
* you should pass this (likely at runtime), as you might get runtime errors
* when using `import.meta.url` / `import` / `export … from ` otherwise.
*/
baseUrl?: URL | string | null | undefined;
/**
* Symbol to use for fragments (**required**).
*/
Fragment: Fragment;
/**
* Function to generate an element with static children in production mode.
*/
jsx?: Jsx | null | undefined;
/**
* Function to generate an element in development mode.
*/
jsxDEV?: JsxDev | null | undefined;
/**
* Function to generate an element with dynamic children in production mode.
*/
jsxs?: Jsx | null | undefined;
/**
* Function to get components from context.
*/
useMDXComponents?: UseMdxComponents | null | undefined;
};
/**
* Get components from context.
*/
export type UseMdxComponents = () => MDXComponents;
import type { CompileOptions } from '../compile.js';
import type { Fragment } from 'hast-util-to-jsx-runtime';
import type { Jsx } from 'hast-util-to-jsx-runtime';
import type { JsxDev } from 'hast-util-to-jsx-runtime';
import type { MDXComponents } from 'mdx/types.js';
//# sourceMappingURL=resolve-evaluate-options.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"resolve-evaluate-options.d.ts","sourceRoot":"","sources":["resolve-evaluate-options.js"],"names":[],"mappings":"AAiDA;;;;;;;GAOG;AACH,gDALW,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,GAAG,SAAS,GAE1C;IAAC,WAAW,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAC,CAgC9D;;;;8BA/EY,wBAAwB,GAAG,UAAU;;;;uCAGrC,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,KAAK,GAAG,iBAAiB,GAAG,YAAY,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;;;cAapK,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;;;;cAM/B,QAAQ;;;;UAER,GAAG,GAAG,IAAI,GAAG,SAAS;;;;aAEtB,MAAM,GAAG,IAAI,GAAG,SAAS;;;;WAEzB,GAAG,GAAG,IAAI,GAAG,SAAS;;;;uBAEtB,gBAAgB,GAAG,IAAI,GAAG,SAAS;;;;;qCAKpC,aAAa;oCAvCO,eAAe;8BAFR,0BAA0B;yBAA1B,0BAA0B;4BAA1B,0BAA0B;mCAClC,cAAc"}

View File

@@ -0,0 +1,87 @@
/**
* @import {Fragment, Jsx, JsxDev} from 'hast-util-to-jsx-runtime'
* @import {MDXComponents} from 'mdx/types.js'
* @import {CompileOptions} from '../compile.js'
*/
/**
* @typedef {EvaluateProcessorOptions & RunOptions} EvaluateOptions
* Configuration for `evaluate`.
*
* @typedef {Omit<CompileOptions, 'baseUrl' | 'jsx' | 'jsxImportSource' | 'jsxRuntime' | 'outputFormat' | 'pragma' | 'pragmaFrag' | 'pragmaImportSource' | 'providerImportSource'> } EvaluateProcessorOptions
* Compile configuration without JSX options for evaluation.
*
* @typedef RunOptions
* Configuration to run compiled code.
*
* `Fragment`, `jsx`, and `jsxs` are used when the code is compiled in
* production mode (`development: false`).
* `Fragment` and `jsxDEV` are used when compiled in development mode
* (`development: true`).
* `useMDXComponents` is used when the code is compiled with
* `providerImportSource: '#'` (the exact value of this compile option
* doesnt matter).
* @property {URL | string | null | undefined} [baseUrl]
* Use this URL as `import.meta.url` and resolve `import` and `export … from`
* relative to it (optional, example: `import.meta.url`);
* this option can also be given at compile time in `CompileOptions`;
* you should pass this (likely at runtime), as you might get runtime errors
* when using `import.meta.url` / `import` / `export … from ` otherwise.
* @property {Fragment} Fragment
* Symbol to use for fragments (**required**).
* @property {Jsx | null | undefined} [jsx]
* Function to generate an element with static children in production mode.
* @property {JsxDev | null | undefined} [jsxDEV]
* Function to generate an element in development mode.
* @property {Jsx | null | undefined} [jsxs]
* Function to generate an element with dynamic children in production mode.
* @property {UseMdxComponents | null | undefined} [useMDXComponents]
* Function to get components from context.
*
* @callback UseMdxComponents
* Get components from context.
* @returns {MDXComponents}
* Current components.
*/
// Fix to show references to above types in VS Code.
''
/**
* Split compiletime options from runtime options.
*
* @param {Readonly<EvaluateOptions> | null | undefined} options
* Configuration.
* @returns {{compiletime: CompileOptions, runtime: RunOptions}}
* Split options.
*/
export function resolveEvaluateOptions(options) {
const {
Fragment,
baseUrl,
development,
jsx,
jsxDEV,
jsxs,
useMDXComponents,
...rest
} = options || {}
if (!Fragment) throw new Error('Expected `Fragment` given to `evaluate`')
if (development) {
if (!jsxDEV) throw new Error('Expected `jsxDEV` given to `evaluate`')
} else {
if (!jsx) throw new Error('Expected `jsx` given to `evaluate`')
if (!jsxs) throw new Error('Expected `jsxs` given to `evaluate`')
}
return {
compiletime: {
...rest,
development,
outputFormat: 'function-body',
providerImportSource: useMDXComponents ? '#' : undefined
},
runtime: {Fragment, baseUrl, jsx, jsxDEV, jsxs, useMDXComponents}
}
}

View File

@@ -0,0 +1,20 @@
/**
* Create a file and options from a given `vfileCompatible` and options that
* might contain `format: 'detect'`.
*
* @param {Readonly<Compatible>} vfileCompatible
* File.
* @param {Readonly<CompileOptions> | null | undefined} [options]
* Configuration (optional).
* @returns {{file: VFile, options: ProcessorOptions}}
* File and options.
*/
export function resolveFileAndOptions(vfileCompatible: Readonly<Compatible>, options?: Readonly<CompileOptions> | null | undefined): {
file: VFile;
options: ProcessorOptions;
};
import type { Compatible } from 'vfile';
import type { CompileOptions } from '../compile.js';
import { VFile } from 'vfile';
import type { ProcessorOptions } from '../core.js';
//# sourceMappingURL=resolve-file-and-options.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"resolve-file-and-options.d.ts","sourceRoot":"","sources":["resolve-file-and-options.js"],"names":[],"mappings":"AASA;;;;;;;;;;GAUG;AACH,uDAPW,QAAQ,CAAC,UAAU,CAAC,YAEpB,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,GAAG,SAAS,GAEzC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAC,CAoBpD;gCApC4B,OAAO;oCACH,eAAe;sBAI5B,OAAO;sCAHQ,YAAY"}

View File

@@ -0,0 +1,53 @@
/**
* @import {Compatible} from 'vfile'
* @import {CompileOptions} from '../compile.js'
* @import {ProcessorOptions} from '../core.js'
*/
import {VFile} from 'vfile'
import {md} from './extnames.js'
/**
* Create a file and options from a given `vfileCompatible` and options that
* might contain `format: 'detect'`.
*
* @param {Readonly<Compatible>} vfileCompatible
* File.
* @param {Readonly<CompileOptions> | null | undefined} [options]
* Configuration (optional).
* @returns {{file: VFile, options: ProcessorOptions}}
* File and options.
*/
export function resolveFileAndOptions(vfileCompatible, options) {
const file = looksLikeAVFile(vfileCompatible)
? vfileCompatible
: new VFile(vfileCompatible)
const {format, ...rest} = options || {}
return {
file,
options: {
format:
format === 'md' || format === 'mdx'
? format
: file.extname && (rest.mdExtensions || md).includes(file.extname)
? 'md'
: 'mdx',
...rest
}
}
}
/**
* @param {Readonly<Compatible> | null | undefined} [value]
* Thing.
* @returns {value is VFile}
* Check.
*/
function looksLikeAVFile(value) {
return Boolean(
value &&
typeof value === 'object' &&
'message' in value &&
'messages' in value
)
}

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2017 Compositor, Inc. and Vercel, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,21 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*)
if command -v cygpath > /dev/null 2>&1; then
basedir=`cygpath -w "$basedir"`
fi
;;
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/acorn@8.16.0/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/bin/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/acorn@8.16.0/node_modules:/Volumes/Alpha SSD/Coding/e-tib.com/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../../../../../../acorn@8.16.0/node_modules/acorn/bin/acorn" "$@"
else
exec node "$basedir/../../../../../../acorn@8.16.0/node_modules/acorn/bin/acorn" "$@"
fi

View File

@@ -0,0 +1,108 @@
{
"name": "@mdx-js/mdx",
"version": "3.1.1",
"description": "MDX compiler",
"license": "MIT",
"keywords": [
"jsx",
"markdown",
"mdx",
"remark"
],
"homepage": "https://mdxjs.com",
"repository": {
"type": "git",
"url": "https://github.com/mdx-js/mdx",
"directory": "packages/mdx/"
},
"bugs": "https://github.com/mdx-js/mdx/issues",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
},
"author": "John Otander <johnotander@gmail.com> (https://johno.com)",
"contributors": [
"John Otander <johnotander@gmail.com> (https://johno.com)",
"Tim Neutkens <tim@vercel.com>",
"Matija Marohnić <matija.marohnic@gmail.com>",
"Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)",
"JounQin <admin@1stg.me> (https://www.1stg.me)",
"Christian Murphy <christian.murphy.42@gmail.com>"
],
"type": "module",
"sideEffects": false,
"exports": {
".": "./index.js",
"./internal-create-format-aware-processors": "./lib/util/create-format-aware-processors.js",
"./internal-extnames-to-regex": "./lib/util/extnames-to-regex.js"
},
"files": [
"lib/",
"index.d.ts.map",
"index.d.ts",
"index.js"
],
"dependencies": {
"@types/estree": "^1.0.0",
"@types/estree-jsx": "^1.0.0",
"@types/hast": "^3.0.0",
"@types/mdx": "^2.0.0",
"acorn": "^8.0.0",
"collapse-white-space": "^2.0.0",
"devlop": "^1.0.0",
"estree-util-is-identifier-name": "^3.0.0",
"estree-util-scope": "^1.0.0",
"estree-walker": "^3.0.0",
"hast-util-to-jsx-runtime": "^2.0.0",
"markdown-extensions": "^2.0.0",
"recma-build-jsx": "^1.0.0",
"recma-jsx": "^1.0.0",
"recma-stringify": "^1.0.0",
"rehype-recma": "^1.0.0",
"remark-mdx": "^3.0.0",
"remark-parse": "^11.0.0",
"remark-rehype": "^11.0.0",
"source-map": "^0.7.0",
"unified": "^11.0.0",
"unist-util-position-from-estree": "^2.0.0",
"unist-util-stringify-position": "^4.0.0",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.0"
},
"scripts": {
"test": "npm run test-coverage",
"test-api": "node --conditions development --enable-source-maps test/index.js",
"test-coverage": "c8 --100 --reporter lcov npm run test-api"
},
"xo": {
"overrides": [
{
"files": [
"test/**/*.js"
],
"rules": {
"no-restricted-globals": "off"
}
},
{
"files": [
"**/*.ts"
],
"rules": {
"@typescript-eslint/array-type": "off",
"@typescript-eslint/ban-types": "off",
"@typescript-eslint/consistent-type-definitions": "off"
}
}
],
"prettier": true,
"rules": {
"complexity": "off",
"logical-assignment-operators": "off",
"max-depth": "off",
"n/file-extension-in-import": "off",
"unicorn/prefer-at": "off",
"unicorn/prefer-code-point": "off"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
../../../@types+estree@1.0.8/node_modules/@types/estree

View File

@@ -0,0 +1 @@
../../../@types+estree-jsx@1.0.5/node_modules/@types/estree-jsx

View File

@@ -0,0 +1 @@
../../../@types+hast@3.0.4/node_modules/@types/hast

View File

@@ -0,0 +1 @@
../../../@types+mdx@2.0.13/node_modules/@types/mdx

1
node_modules/.pnpm/@mdx-js+mdx@3.1.1/node_modules/acorn generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../../acorn@8.16.0/node_modules/acorn

View File

@@ -0,0 +1 @@
../../collapse-white-space@2.1.0/node_modules/collapse-white-space

View File

@@ -0,0 +1 @@
../../devlop@1.1.0/node_modules/devlop

View File

@@ -0,0 +1 @@
../../estree-util-is-identifier-name@3.0.0/node_modules/estree-util-is-identifier-name

View File

@@ -0,0 +1 @@
../../estree-util-scope@1.0.0/node_modules/estree-util-scope

View File

@@ -0,0 +1 @@
../../estree-walker@3.0.3/node_modules/estree-walker

View File

@@ -0,0 +1 @@
../../hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime

View File

@@ -0,0 +1 @@
../../markdown-extensions@2.0.0/node_modules/markdown-extensions

View File

@@ -0,0 +1 @@
../../recma-build-jsx@1.0.0/node_modules/recma-build-jsx

View File

@@ -0,0 +1 @@
../../recma-jsx@1.0.1_acorn@8.16.0/node_modules/recma-jsx

View File

@@ -0,0 +1 @@
../../recma-stringify@1.0.0/node_modules/recma-stringify

View File

@@ -0,0 +1 @@
../../rehype-recma@1.0.0/node_modules/rehype-recma

View File

@@ -0,0 +1 @@
../../remark-mdx@3.1.1/node_modules/remark-mdx

View File

@@ -0,0 +1 @@
../../remark-parse@11.0.0/node_modules/remark-parse

View File

@@ -0,0 +1 @@
../../remark-rehype@11.1.2/node_modules/remark-rehype

View File

@@ -0,0 +1 @@
../../source-map@0.7.6/node_modules/source-map

View File

@@ -0,0 +1 @@
../../unified@11.0.5/node_modules/unified

View File

@@ -0,0 +1 @@
../../unist-util-position-from-estree@2.0.0/node_modules/unist-util-position-from-estree

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