@rspress/plugin-playground 1.1.3 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -330,7 +330,6 @@ function createPlaygroundNode(currentNode, attrs) {
330
330
  }
331
331
  var remarkPlugin = ({
332
332
  getRouteMeta,
333
- defaultDirection,
334
333
  editorPosition
335
334
  }) => {
336
335
  const routeMeta2 = getRouteMeta();
@@ -351,7 +350,7 @@ var remarkPlugin = ({
351
350
  if (!import_fs_extra.default.existsSync(demoPath)) {
352
351
  return;
353
352
  }
354
- const direction = getNodeAttribute(node, "direction") || defaultDirection;
353
+ const direction = getNodeAttribute(node, "direction") || "";
355
354
  const code = import_fs_extra.default.readFileSync(demoPath, {
356
355
  encoding: "utf8"
357
356
  });
@@ -370,7 +369,7 @@ var remarkPlugin = ({
370
369
  if (isPure) {
371
370
  return;
372
371
  }
373
- const direction = getNodeMeta(node, "direction") || defaultDirection;
372
+ const direction = getNodeMeta(node, "direction") || "";
374
373
  createPlaygroundNode(node, [
375
374
  ["code", node.value],
376
375
  ["language", node.lang],
@@ -411,7 +410,6 @@ function pluginPlayground(options) {
411
410
  );
412
411
  }
413
412
  const preloads = [];
414
- preloads.push(babelUrl || DEFAULT_BABEL_URL);
415
413
  const monacoPrefix = monacoLoader.paths?.vs || DEFAULT_MONACO_URL;
416
414
  preloads.push(normalizeUrl(`${monacoPrefix}/loader.js`));
417
415
  preloads.push(normalizeUrl(`${monacoPrefix}/editor/editor.main.js`));
@@ -494,6 +492,9 @@ function pluginPlayground(options) {
494
492
  }
495
493
  });
496
494
  }
495
+ if (!("react" in imports)) {
496
+ imports.react = "react";
497
+ }
497
498
  const importKeys = Object.keys(imports);
498
499
  const code = [
499
500
  ...importKeys.map(
@@ -519,21 +520,32 @@ function pluginPlayground(options) {
519
520
  builderConfig: {
520
521
  source: {
521
522
  define: {
522
- __PLAYGROUND_BABEL_URL__: JSON.stringify(babelUrl),
523
+ __PLAYGROUND_DIRECTION__: JSON.stringify(defaultDirection),
523
524
  __PLAYGROUND_MONACO_LOADER__: JSON.stringify(monacoLoader),
524
525
  __PLAYGROUND_MONACO_OPTIONS__: JSON.stringify(monacoOptions)
525
526
  }
526
527
  },
527
528
  html: {
528
- tags: preloads.map((url) => ({
529
- tag: "link",
530
- head: true,
531
- attrs: {
532
- rel: "preload",
533
- href: url,
534
- as: "script"
529
+ tags: [
530
+ ...preloads.map((url) => ({
531
+ tag: "link",
532
+ head: true,
533
+ attrs: {
534
+ rel: "preload",
535
+ href: url,
536
+ as: "script"
537
+ }
538
+ })),
539
+ {
540
+ tag: "script",
541
+ head: true,
542
+ attrs: {
543
+ id: "rspress-playground-babel",
544
+ async: true,
545
+ src: babelUrl || DEFAULT_BABEL_URL
546
+ }
535
547
  }
536
- }))
548
+ ]
537
549
  },
538
550
  tools: {
539
551
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
@@ -544,9 +556,7 @@ function pluginPlayground(options) {
544
556
  }
545
557
  },
546
558
  markdown: {
547
- remarkPlugins: [
548
- [remarkPlugin, { getRouteMeta, defaultDirection, editorPosition }]
549
- ],
559
+ remarkPlugins: [[remarkPlugin, { getRouteMeta, editorPosition }]],
550
560
  globalComponents: [
551
561
  render ? render : import_path3.default.join(staticPath, "global-components", "Playground.tsx")
552
562
  ]
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["index","is","visit","routeMeta","fs","code"],"sources":["../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/lib/index.js","../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/color.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/index.js","../../../../../node_modules/.pnpm/unist-util-visit@4.1.1/node_modules/unist-util-visit/index.js","../../../src/cli/index.ts","../../../src/cli/constant.ts","../../../src/cli/utils.ts","../../../src/cli/remarkPlugin.ts","../../../src/web/constant.ts","../../../src/web/utils.ts"],"sourcesContent":["/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n */\n\n/**\n * @typedef {Record<string, unknown>} Props\n * @typedef {null | undefined | string | Props | TestFunctionAnything | Array<string | Props | TestFunctionAnything>} Test\n * Check for an arbitrary node, unaware of TypeScript inferral.\n *\n * @callback TestFunctionAnything\n * Check if a node passes a test, unaware of TypeScript inferral.\n * @param {unknown} this\n * The given context.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean | void}\n * Whether this node passes the test.\n */\n\n/**\n * @template {Node} Kind\n * Node type.\n * @typedef {Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind> | Array<Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind>>} PredicateTest\n * Check for a node that can be inferred by TypeScript.\n */\n\n/**\n * Check if a node passes a certain test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback TestFunctionPredicate\n * Complex test function for a node that can be inferred by TypeScript.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this node passes the test.\n */\n\n/**\n * @callback AssertAnything\n * Check that an arbitrary value is a node, unaware of TypeScript inferral.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if a node is a node and passes a certain node test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback AssertPredicate\n * Check that an arbitrary value is a specific node, aware of TypeScript.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param node\n * Thing to check, typically `Node`.\n * @param test\n * A check for a specific node.\n * @param index\n * The node’s position in its parent.\n * @param parent\n * The node’s parent.\n * @returns\n * Whether `node` is a node and passes a test.\n */\nexport const is =\n /**\n * @type {(\n * (() => false) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index: number, parent: Parent, context?: unknown) => node is Kind) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index?: null | undefined, parent?: null | undefined, context?: unknown) => node is Kind) &\n * ((node: unknown, test: Test, index: number, parent: Parent, context?: unknown) => boolean) &\n * ((node: unknown, test?: Test, index?: null | undefined, parent?: null | undefined, context?: unknown) => boolean)\n * )}\n */\n (\n /**\n * @param {unknown} [node]\n * @param {Test} [test]\n * @param {number | null | undefined} [index]\n * @param {Parent | null | undefined} [parent]\n * @param {unknown} [context]\n * @returns {boolean}\n */\n // eslint-disable-next-line max-params\n function is(node, test, index, parent, context) {\n const check = convert(test)\n\n if (\n index !== undefined &&\n index !== null &&\n (typeof index !== 'number' ||\n index < 0 ||\n index === Number.POSITIVE_INFINITY)\n ) {\n throw new Error('Expected positive finite index')\n }\n\n if (\n parent !== undefined &&\n parent !== null &&\n (!is(parent) || !parent.children)\n ) {\n throw new Error('Expected parent node')\n }\n\n if (\n (parent === undefined || parent === null) !==\n (index === undefined || index === null)\n ) {\n throw new Error('Expected both parent and index')\n }\n\n // @ts-expect-error Looks like a node.\n return node && node.type && typeof node.type === 'string'\n ? Boolean(check.call(context, node, index, parent))\n : false\n }\n )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param test\n * * when nullish, checks if `node` is a `Node`.\n * * when `string`, works like passing `(node) => node.type === test`.\n * * when `function` checks if function passed the node is true.\n * * when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n * * when `array`, checks if any one of the subtests pass.\n * @returns\n * An assertion.\n */\nexport const convert =\n /**\n * @type {(\n * (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &\n * ((test?: Test) => AssertAnything)\n * )}\n */\n (\n /**\n * @param {Test} [test]\n * @returns {AssertAnything}\n */\n function (test) {\n if (test === undefined || test === null) {\n return ok\n }\n\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n if (typeof test === 'object') {\n return Array.isArray(test) ? anyFactory(test) : propsFactory(test)\n }\n\n if (typeof test === 'function') {\n return castFactory(test)\n }\n\n throw new Error('Expected function, string, or object as test')\n }\n )\n\n/**\n * @param {Array<string | Props | TestFunctionAnything>} tests\n * @returns {AssertAnything}\n */\nfunction anyFactory(tests) {\n /** @type {Array<AssertAnything>} */\n const checks = []\n let index = -1\n\n while (++index < tests.length) {\n checks[index] = convert(tests[index])\n }\n\n return castFactory(any)\n\n /**\n * @this {unknown}\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function any(...parameters) {\n let index = -1\n\n while (++index < checks.length) {\n if (checks[index].call(this, ...parameters)) return true\n }\n\n return false\n }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {AssertAnything}\n */\nfunction propsFactory(check) {\n return castFactory(all)\n\n /**\n * @param {Node} node\n * @returns {boolean}\n */\n function all(node) {\n /** @type {string} */\n let key\n\n for (key in check) {\n // @ts-expect-error: hush, it sure works as an index.\n if (node[key] !== check[key]) return false\n }\n\n return true\n }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {AssertAnything}\n */\nfunction typeFactory(check) {\n return castFactory(type)\n\n /**\n * @param {Node} node\n */\n function type(node) {\n return node && node.type === check\n }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunctionAnything} check\n * @returns {AssertAnything}\n */\nfunction castFactory(check) {\n return assertion\n\n /**\n * @this {unknown}\n * @param {unknown} node\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function assertion(node, ...parameters) {\n return Boolean(\n node &&\n typeof node === 'object' &&\n 'type' in node &&\n // @ts-expect-error: fine.\n Boolean(check.call(this, node, ...parameters))\n )\n }\n}\n\nfunction ok() {\n return true\n}\n","/**\n * @typedef {import('./lib/index.js').Test} Test\n * @typedef {import('./lib/index.js').TestFunctionAnything} TestFunctionAnything\n * @typedef {import('./lib/index.js').AssertAnything} AssertAnything\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').PredicateTest<Kind>} PredicateTest\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').TestFunctionPredicate<Kind>} TestFunctionPredicate\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').AssertPredicate<Kind>} AssertPredicate\n */\n\nexport {is, convert} from './lib/index.js'\n","/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n return '\\u001B[33m' + d + '\\u001B[39m'\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n */\n\n/**\n * @typedef {boolean | 'skip'} Action\n * Union of the action types.\n *\n * @typedef {number} Index\n * Move to the sibling at `index` next (after node itself is completely\n * traversed).\n *\n * Useful if mutating the tree, such as removing the node the visitor is\n * currently on, or any of its previous siblings.\n * Results less than 0 or greater than or equal to `children.length` stop\n * traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n * List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n * Any value that can be returned from a visitor.\n */\n\n/**\n * @template {Node} [Visited=Node]\n * Visited node type.\n * @template {Parent} [Ancestor=Parent]\n * Ancestor type.\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform the parent of node (the last of `ancestors`).\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of an ancestor still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Array<Ancestor>} ancestors\n * Ancestors of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n */\n\n/**\n * @template {Node} [Tree=Node]\n * Tree type.\n * @template {Test} [Check=string]\n * Test type.\n * @typedef {Visitor<import('./complex-types.js').Matches<import('./complex-types.js').InclusiveDescendant<Tree>, Check>, Extract<import('./complex-types.js').InclusiveDescendant<Tree>, Parent>>} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parents`.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from './color.js'\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @param tree\n * Tree to traverse.\n * @param test\n * `unist-util-is`-compatible test\n * @param visitor\n * Handle each node.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns\n * Nothing.\n */\nexport const visitParents =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {Visitor<Node>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {void}\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n // @ts-expect-error no visitor given, so `visitor` is test.\n visitor = test\n test = null\n }\n\n const is = convert(test)\n const step = reverse ? -1 : 1\n\n factory(tree, undefined, [])()\n\n /**\n * @param {Node} node\n * @param {number | undefined} index\n * @param {Array<Parent>} parents\n */\n function factory(node, index, parents) {\n /** @type {Record<string, unknown>} */\n // @ts-expect-error: hush\n const value = node && typeof node === 'object' ? node : {}\n\n if (typeof value.type === 'string') {\n const name =\n // `hast`\n typeof value.tagName === 'string'\n ? value.tagName\n : // `xast`\n typeof value.name === 'string'\n ? value.name\n : undefined\n\n Object.defineProperty(visit, 'name', {\n value:\n 'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n })\n }\n\n return visit\n\n function visit() {\n /** @type {ActionTuple} */\n let result = []\n /** @type {ActionTuple} */\n let subresult\n /** @type {number} */\n let offset\n /** @type {Array<Parent>} */\n let grandparents\n\n if (!test || is(node, index, parents[parents.length - 1] || null)) {\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n // @ts-expect-error looks like a parent.\n if (node.children && result[0] !== SKIP) {\n // @ts-expect-error looks like a parent.\n offset = (reverse ? node.children.length : -1) + step\n // @ts-expect-error looks like a parent.\n grandparents = parents.concat(node)\n\n // @ts-expect-error looks like a parent.\n while (offset > -1 && offset < node.children.length) {\n // @ts-expect-error looks like a parent.\n subresult = factory(node.children[offset], offset, grandparents)()\n\n if (subresult[0] === EXIT) {\n return subresult\n }\n\n offset =\n typeof subresult[1] === 'number' ? subresult[1] : offset + step\n }\n }\n\n return result\n }\n }\n }\n )\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n * Valid return values from visitors.\n * @returns {ActionTuple}\n * Clean result.\n */\nfunction toResult(value) {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return [value]\n}\n","// Note: types exported from `index.d.ts`\nexport {CONTINUE, EXIT, SKIP, visitParents} from './lib/index.js'\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n * @typedef {import('./complex-types.js').Visitor} Visitor\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\n/**\n * Visit children of tree which pass test.\n *\n * @param tree\n * Tree to walk\n * @param [test]\n * `unist-util-is`-compatible test\n * @param visitor\n * Function called for nodes that pass `test`.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).\n */\nexport const visit =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {import('./complex-types.js').Visitor} visitor\n * @param {boolean} [reverse]\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n visitor = test\n test = null\n }\n\n visitParents(tree, test, overload, reverse)\n\n /**\n * @param {Node} node\n * @param {Array<Parent>} parents\n */\n function overload(node, parents) {\n const parent = parents[parents.length - 1]\n return visitor(\n node,\n parent ? parent.children.indexOf(node) : null,\n parent\n )\n }\n }\n )\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n","import path, { join } from 'path';\nimport { type RouteMeta, type RspressPlugin } from '@rspress/shared';\nimport { RspackVirtualModulePlugin } from 'rspack-plugin-virtual-module';\nimport type {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { staticPath } from './constant';\nimport { getNodeAttribute, parseImports } from './utils';\nimport { remarkPlugin } from './remarkPlugin';\nimport { DEFAULT_BABEL_URL, DEFAULT_MONACO_URL } from '@/web/constant';\nimport { normalizeUrl } from '@/web/utils';\n\ninterface PlaygroundOptions {\n render: string;\n include: Array<string | [string, string]>;\n\n defaultDirection: 'horizontal' | 'vertical';\n editorPosition: 'left' | 'right';\n\n babelUrl: string;\n\n monacoLoader: Parameters<typeof loader.config>[0];\n monacoOptions: MonacoEditorProps['options'];\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let routeMeta: RouteMeta[];\n\n/**\n * The plugin is used to preview component.\n */\nexport function pluginPlayground(\n options?: Partial<PlaygroundOptions>,\n): RspressPlugin {\n const {\n render = '',\n include,\n defaultDirection = 'horizontal',\n editorPosition = 'left',\n babelUrl = '',\n monacoLoader = {},\n monacoOptions = {},\n } = options || {};\n\n const playgroundVirtualModule = new RspackVirtualModulePlugin({});\n const getRouteMeta = () => routeMeta;\n\n if (render && !/Playground\\.(jsx?|tsx?)$/.test(render)) {\n throw new Error(\n '[Playground]: render should ends with Playground.(jsx?|tsx?)',\n );\n }\n\n const preloads: string[] = [];\n preloads.push(babelUrl || DEFAULT_BABEL_URL);\n const monacoPrefix = monacoLoader.paths?.vs || DEFAULT_MONACO_URL;\n preloads.push(normalizeUrl(`${monacoPrefix}/loader.js`));\n preloads.push(normalizeUrl(`${monacoPrefix}/editor/editor.main.js`));\n\n return {\n name: '@rspress/plugin-playground',\n config(config) {\n config.markdown = config.markdown || {};\n config.markdown.mdxRs = false;\n return config;\n },\n async routeGenerated(routes: RouteMeta[]) {\n const { default: fs } = await import('@modern-js/utils/fs-extra');\n\n // init routeMeta\n routeMeta = routes;\n\n const files = routes.map(route => route.absolutePath);\n\n const imports: Record<string, string> = {};\n\n // scan all demos, and generate imports\n await Promise.all(\n files.map(async (filepath, _index) => {\n const isMdxFile = /\\.mdx?$/.test(filepath);\n if (!isMdxFile) {\n return;\n }\n const { createProcessor } = await import('@mdx-js/mdx');\n const { visit } = await import('unist-util-visit');\n const { default: remarkGFM } = await import('remark-gfm');\n try {\n const processor = createProcessor({\n format: path.extname(filepath).slice(1) as 'mdx' | 'md',\n remarkPlugins: [remarkGFM],\n });\n const source = await fs.readFile(filepath, 'utf-8');\n const ast = processor.parse(source);\n\n visit(ast, 'mdxJsxFlowElement', (node: any) => {\n if (node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(filepath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n\n const thisImports = parseImports(code, path.extname(demoPath));\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n\n visit(ast, 'code', (node: any) => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const { value } = node;\n const isPure = node?.meta?.includes('pure');\n\n // do not anything for pure mode\n if (isPure) {\n return;\n }\n\n const thisImports = parseImports(value, node.lang);\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n } catch (e) {\n console.error(e);\n throw e;\n }\n }),\n );\n\n if (include) {\n include.forEach(item => {\n if (typeof item === 'string') {\n imports[item] = item;\n } else {\n imports[item[0]] = item[1];\n }\n });\n }\n\n const importKeys = Object.keys(imports);\n const code = [\n ...importKeys.map(\n (x, index) => `import * as i_${index} from '${imports[x]}';`,\n ),\n 'const imports = new Map();',\n ...importKeys.map((x, index) => `imports.set('${x}', i_${index});`),\n 'function getImport(name, getDefault) {',\n ' if (!imports.has(name)) {',\n ' throw new Error(\"Module \" + name + \" not found\");',\n ' }',\n ' const result = imports.get(name);',\n ' if (getDefault && typeof result === \"object\") {',\n ' return result.default || result;',\n ' }',\n ' return result;',\n '}',\n 'export { imports };',\n 'export default getImport;',\n ].join('\\n');\n\n // console.log('playground-imports', code);\n\n playgroundVirtualModule.writeModule('_rspress_playground_imports', code);\n },\n builderConfig: {\n source: {\n define: {\n __PLAYGROUND_BABEL_URL__: JSON.stringify(babelUrl),\n __PLAYGROUND_MONACO_LOADER__: JSON.stringify(monacoLoader),\n __PLAYGROUND_MONACO_OPTIONS__: JSON.stringify(monacoOptions),\n },\n },\n html: {\n tags: preloads.map(url => ({\n tag: 'link',\n head: true,\n attrs: {\n rel: 'preload',\n href: url,\n as: 'script',\n },\n })),\n },\n tools: {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error\n // @ts-ignore\n rspack: {\n plugins: [playgroundVirtualModule],\n },\n },\n },\n markdown: {\n remarkPlugins: [\n [remarkPlugin, { getRouteMeta, defaultDirection, editorPosition }],\n ],\n globalComponents: [\n render\n ? render\n : path.join(staticPath, 'global-components', 'Playground.tsx'),\n ],\n },\n globalStyles: path.join(staticPath, 'global-styles', 'web.css'),\n };\n}\n","import path from 'path';\n\nexport const staticPath = path.join(__dirname, '../../../static');\n","/* eslint-disable consistent-return */\nimport type { Program } from '@babel/types';\nimport oxc from '@oxidation-compiler/napi';\n\nexport const parseImports = (code: string, sourceExt: string) => {\n const parsed = oxc.parseSync(code, {\n sourceType: 'module',\n sourceFilename: `index.${sourceExt}`,\n });\n\n const ast = JSON.parse(parsed.program) as Program;\n\n const result: string[] = [];\n\n // oxc didn't have \"traverse\", so it currently only scans the first level\n // (generally, demos are not too complicated, right?)\n ast.body.forEach(statement => {\n if (statement.type === 'ImportDeclaration') {\n result.push(statement.source.value);\n }\n });\n\n return result;\n};\n\nexport const getNodeAttribute = (\n node: any,\n attrName: string,\n): string | undefined => {\n return node.attributes.find(\n (attr: { name: string; value: string }) => attr.name === attrName,\n )?.value;\n};\n\nexport const getNodeMeta = (\n node: any,\n metaName: string,\n): string | undefined => {\n if (!node.meta) {\n return;\n }\n const meta: string[] = node.meta.split(' ');\n const item: string | undefined = meta.find((x: string) =>\n x.startsWith(metaName),\n );\n if (item?.startsWith(`${metaName}=`)) {\n return item.substring(metaName.length + 1);\n }\n return item;\n};\n","import path, { join } from 'path';\nimport { visit } from 'unist-util-visit';\nimport fs from '@modern-js/utils/fs-extra';\nimport type { RouteMeta } from '@rspress/shared';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\nimport { getNodeAttribute, getNodeMeta } from './utils';\n\nfunction createPlaygroundNode(\n currentNode: any,\n attrs: Array<[string, string]>,\n) {\n Object.assign(currentNode, {\n type: 'mdxJsxFlowElement',\n name: 'Playground',\n attributes: attrs.map(it => ({\n type: 'mdxJsxAttribute',\n name: it[0],\n value: it[1],\n })),\n });\n}\n\ninterface RemarkPluginProps {\n getRouteMeta: () => RouteMeta[];\n defaultDirection: 'horizontal' | 'vertical';\n editorPosition: 'left' | 'right';\n}\n\n/**\n * remark plugin to transform code to demo\n */\nexport const remarkPlugin: Plugin<[RemarkPluginProps], Root> = ({\n getRouteMeta,\n defaultDirection,\n editorPosition,\n}) => {\n const routeMeta = getRouteMeta();\n\n return (tree, vfile) => {\n const route = routeMeta.find(\n meta => meta.absolutePath === (vfile.path || vfile.history[0]),\n );\n if (!route) {\n return;\n }\n\n // 1. External demo , use <code src=\"xxx\" /> to declare demo\n tree.children.forEach((node: any) => {\n if (node.type === 'mdxJsxFlowElement' && node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(route.absolutePath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n const direction =\n getNodeAttribute(node, 'direction') || defaultDirection;\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n const language = src.substr(src.lastIndexOf('.') + 1);\n createPlaygroundNode(node, [\n ['code', code],\n ['language', language],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n\n // 2. Internal demo, use ```j/tsx to declare demo\n visit(tree, 'code', node => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const isPure = getNodeMeta(node, 'pure') === 'pure';\n\n // do nothing for pure mode\n if (isPure) {\n return;\n }\n\n const direction = getNodeMeta(node, 'direction') || defaultDirection;\n\n createPlaygroundNode(node, [\n ['code', node.value],\n ['language', node.lang],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n };\n};\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","const loadingMap = new Map<string, Promise<void>>();\n\nexport function loadScript(url: string): Promise<void> {\n const exists = loadingMap.get(url);\n if (exists) {\n return exists;\n }\n const n: Promise<void> = new Promise(resolve => {\n const e = document.createElement('script');\n e.src = url;\n e.onload = () => resolve();\n document.body.appendChild(e);\n });\n loadingMap.set(url, n);\n return n;\n}\n\nexport function normalizeUrl(u: string) {\n return u.replace(/\\/\\//g, '/');\n}\n"]}
1
+ {"version":3,"mappings":"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","names":["index","is","visit","routeMeta","fs","code"],"sources":["../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/lib/index.js","../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/color.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/index.js","../../../../../node_modules/.pnpm/unist-util-visit@4.1.1/node_modules/unist-util-visit/index.js","../../../src/cli/index.ts","../../../src/cli/constant.ts","../../../src/cli/utils.ts","../../../src/cli/remarkPlugin.ts","../../../src/web/constant.ts","../../../src/web/utils.ts"],"sourcesContent":["/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n */\n\n/**\n * @typedef {Record<string, unknown>} Props\n * @typedef {null | undefined | string | Props | TestFunctionAnything | Array<string | Props | TestFunctionAnything>} Test\n * Check for an arbitrary node, unaware of TypeScript inferral.\n *\n * @callback TestFunctionAnything\n * Check if a node passes a test, unaware of TypeScript inferral.\n * @param {unknown} this\n * The given context.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean | void}\n * Whether this node passes the test.\n */\n\n/**\n * @template {Node} Kind\n * Node type.\n * @typedef {Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind> | Array<Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind>>} PredicateTest\n * Check for a node that can be inferred by TypeScript.\n */\n\n/**\n * Check if a node passes a certain test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback TestFunctionPredicate\n * Complex test function for a node that can be inferred by TypeScript.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this node passes the test.\n */\n\n/**\n * @callback AssertAnything\n * Check that an arbitrary value is a node, unaware of TypeScript inferral.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if a node is a node and passes a certain node test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback AssertPredicate\n * Check that an arbitrary value is a specific node, aware of TypeScript.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param node\n * Thing to check, typically `Node`.\n * @param test\n * A check for a specific node.\n * @param index\n * The node’s position in its parent.\n * @param parent\n * The node’s parent.\n * @returns\n * Whether `node` is a node and passes a test.\n */\nexport const is =\n /**\n * @type {(\n * (() => false) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index: number, parent: Parent, context?: unknown) => node is Kind) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index?: null | undefined, parent?: null | undefined, context?: unknown) => node is Kind) &\n * ((node: unknown, test: Test, index: number, parent: Parent, context?: unknown) => boolean) &\n * ((node: unknown, test?: Test, index?: null | undefined, parent?: null | undefined, context?: unknown) => boolean)\n * )}\n */\n (\n /**\n * @param {unknown} [node]\n * @param {Test} [test]\n * @param {number | null | undefined} [index]\n * @param {Parent | null | undefined} [parent]\n * @param {unknown} [context]\n * @returns {boolean}\n */\n // eslint-disable-next-line max-params\n function is(node, test, index, parent, context) {\n const check = convert(test)\n\n if (\n index !== undefined &&\n index !== null &&\n (typeof index !== 'number' ||\n index < 0 ||\n index === Number.POSITIVE_INFINITY)\n ) {\n throw new Error('Expected positive finite index')\n }\n\n if (\n parent !== undefined &&\n parent !== null &&\n (!is(parent) || !parent.children)\n ) {\n throw new Error('Expected parent node')\n }\n\n if (\n (parent === undefined || parent === null) !==\n (index === undefined || index === null)\n ) {\n throw new Error('Expected both parent and index')\n }\n\n // @ts-expect-error Looks like a node.\n return node && node.type && typeof node.type === 'string'\n ? Boolean(check.call(context, node, index, parent))\n : false\n }\n )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param test\n * * when nullish, checks if `node` is a `Node`.\n * * when `string`, works like passing `(node) => node.type === test`.\n * * when `function` checks if function passed the node is true.\n * * when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n * * when `array`, checks if any one of the subtests pass.\n * @returns\n * An assertion.\n */\nexport const convert =\n /**\n * @type {(\n * (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &\n * ((test?: Test) => AssertAnything)\n * )}\n */\n (\n /**\n * @param {Test} [test]\n * @returns {AssertAnything}\n */\n function (test) {\n if (test === undefined || test === null) {\n return ok\n }\n\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n if (typeof test === 'object') {\n return Array.isArray(test) ? anyFactory(test) : propsFactory(test)\n }\n\n if (typeof test === 'function') {\n return castFactory(test)\n }\n\n throw new Error('Expected function, string, or object as test')\n }\n )\n\n/**\n * @param {Array<string | Props | TestFunctionAnything>} tests\n * @returns {AssertAnything}\n */\nfunction anyFactory(tests) {\n /** @type {Array<AssertAnything>} */\n const checks = []\n let index = -1\n\n while (++index < tests.length) {\n checks[index] = convert(tests[index])\n }\n\n return castFactory(any)\n\n /**\n * @this {unknown}\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function any(...parameters) {\n let index = -1\n\n while (++index < checks.length) {\n if (checks[index].call(this, ...parameters)) return true\n }\n\n return false\n }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {AssertAnything}\n */\nfunction propsFactory(check) {\n return castFactory(all)\n\n /**\n * @param {Node} node\n * @returns {boolean}\n */\n function all(node) {\n /** @type {string} */\n let key\n\n for (key in check) {\n // @ts-expect-error: hush, it sure works as an index.\n if (node[key] !== check[key]) return false\n }\n\n return true\n }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {AssertAnything}\n */\nfunction typeFactory(check) {\n return castFactory(type)\n\n /**\n * @param {Node} node\n */\n function type(node) {\n return node && node.type === check\n }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunctionAnything} check\n * @returns {AssertAnything}\n */\nfunction castFactory(check) {\n return assertion\n\n /**\n * @this {unknown}\n * @param {unknown} node\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function assertion(node, ...parameters) {\n return Boolean(\n node &&\n typeof node === 'object' &&\n 'type' in node &&\n // @ts-expect-error: fine.\n Boolean(check.call(this, node, ...parameters))\n )\n }\n}\n\nfunction ok() {\n return true\n}\n","/**\n * @typedef {import('./lib/index.js').Test} Test\n * @typedef {import('./lib/index.js').TestFunctionAnything} TestFunctionAnything\n * @typedef {import('./lib/index.js').AssertAnything} AssertAnything\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').PredicateTest<Kind>} PredicateTest\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').TestFunctionPredicate<Kind>} TestFunctionPredicate\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').AssertPredicate<Kind>} AssertPredicate\n */\n\nexport {is, convert} from './lib/index.js'\n","/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n return '\\u001B[33m' + d + '\\u001B[39m'\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n */\n\n/**\n * @typedef {boolean | 'skip'} Action\n * Union of the action types.\n *\n * @typedef {number} Index\n * Move to the sibling at `index` next (after node itself is completely\n * traversed).\n *\n * Useful if mutating the tree, such as removing the node the visitor is\n * currently on, or any of its previous siblings.\n * Results less than 0 or greater than or equal to `children.length` stop\n * traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n * List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n * Any value that can be returned from a visitor.\n */\n\n/**\n * @template {Node} [Visited=Node]\n * Visited node type.\n * @template {Parent} [Ancestor=Parent]\n * Ancestor type.\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform the parent of node (the last of `ancestors`).\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of an ancestor still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Array<Ancestor>} ancestors\n * Ancestors of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n */\n\n/**\n * @template {Node} [Tree=Node]\n * Tree type.\n * @template {Test} [Check=string]\n * Test type.\n * @typedef {Visitor<import('./complex-types.js').Matches<import('./complex-types.js').InclusiveDescendant<Tree>, Check>, Extract<import('./complex-types.js').InclusiveDescendant<Tree>, Parent>>} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parents`.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from './color.js'\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @param tree\n * Tree to traverse.\n * @param test\n * `unist-util-is`-compatible test\n * @param visitor\n * Handle each node.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns\n * Nothing.\n */\nexport const visitParents =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {Visitor<Node>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {void}\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n // @ts-expect-error no visitor given, so `visitor` is test.\n visitor = test\n test = null\n }\n\n const is = convert(test)\n const step = reverse ? -1 : 1\n\n factory(tree, undefined, [])()\n\n /**\n * @param {Node} node\n * @param {number | undefined} index\n * @param {Array<Parent>} parents\n */\n function factory(node, index, parents) {\n /** @type {Record<string, unknown>} */\n // @ts-expect-error: hush\n const value = node && typeof node === 'object' ? node : {}\n\n if (typeof value.type === 'string') {\n const name =\n // `hast`\n typeof value.tagName === 'string'\n ? value.tagName\n : // `xast`\n typeof value.name === 'string'\n ? value.name\n : undefined\n\n Object.defineProperty(visit, 'name', {\n value:\n 'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n })\n }\n\n return visit\n\n function visit() {\n /** @type {ActionTuple} */\n let result = []\n /** @type {ActionTuple} */\n let subresult\n /** @type {number} */\n let offset\n /** @type {Array<Parent>} */\n let grandparents\n\n if (!test || is(node, index, parents[parents.length - 1] || null)) {\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n // @ts-expect-error looks like a parent.\n if (node.children && result[0] !== SKIP) {\n // @ts-expect-error looks like a parent.\n offset = (reverse ? node.children.length : -1) + step\n // @ts-expect-error looks like a parent.\n grandparents = parents.concat(node)\n\n // @ts-expect-error looks like a parent.\n while (offset > -1 && offset < node.children.length) {\n // @ts-expect-error looks like a parent.\n subresult = factory(node.children[offset], offset, grandparents)()\n\n if (subresult[0] === EXIT) {\n return subresult\n }\n\n offset =\n typeof subresult[1] === 'number' ? subresult[1] : offset + step\n }\n }\n\n return result\n }\n }\n }\n )\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n * Valid return values from visitors.\n * @returns {ActionTuple}\n * Clean result.\n */\nfunction toResult(value) {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return [value]\n}\n","// Note: types exported from `index.d.ts`\nexport {CONTINUE, EXIT, SKIP, visitParents} from './lib/index.js'\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n * @typedef {import('./complex-types.js').Visitor} Visitor\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\n/**\n * Visit children of tree which pass test.\n *\n * @param tree\n * Tree to walk\n * @param [test]\n * `unist-util-is`-compatible test\n * @param visitor\n * Function called for nodes that pass `test`.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).\n */\nexport const visit =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {import('./complex-types.js').Visitor} visitor\n * @param {boolean} [reverse]\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n visitor = test\n test = null\n }\n\n visitParents(tree, test, overload, reverse)\n\n /**\n * @param {Node} node\n * @param {Array<Parent>} parents\n */\n function overload(node, parents) {\n const parent = parents[parents.length - 1]\n return visitor(\n node,\n parent ? parent.children.indexOf(node) : null,\n parent\n )\n }\n }\n )\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n","import path, { join } from 'path';\nimport { type RouteMeta, type RspressPlugin } from '@rspress/shared';\nimport { RspackVirtualModulePlugin } from 'rspack-plugin-virtual-module';\nimport type {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { staticPath } from './constant';\nimport { getNodeAttribute, parseImports } from './utils';\nimport { remarkPlugin } from './remarkPlugin';\nimport { DEFAULT_BABEL_URL, DEFAULT_MONACO_URL } from '@/web/constant';\nimport { normalizeUrl } from '@/web/utils';\n\ninterface PlaygroundOptions {\n render: string;\n include: Array<string | [string, string]>;\n\n defaultDirection: 'horizontal' | 'vertical';\n editorPosition: 'left' | 'right';\n\n babelUrl: string;\n\n monacoLoader: Parameters<typeof loader.config>[0];\n monacoOptions: MonacoEditorProps['options'];\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let routeMeta: RouteMeta[];\n\n/**\n * The plugin is used to preview component.\n */\nexport function pluginPlayground(\n options?: Partial<PlaygroundOptions>,\n): RspressPlugin {\n const {\n render = '',\n include,\n defaultDirection = 'horizontal',\n editorPosition = 'left',\n babelUrl = '',\n monacoLoader = {},\n monacoOptions = {},\n } = options || {};\n\n const playgroundVirtualModule = new RspackVirtualModulePlugin({});\n const getRouteMeta = () => routeMeta;\n\n if (render && !/Playground\\.(jsx?|tsx?)$/.test(render)) {\n throw new Error(\n '[Playground]: render should ends with Playground.(jsx?|tsx?)',\n );\n }\n\n const preloads: string[] = [];\n const monacoPrefix = monacoLoader.paths?.vs || DEFAULT_MONACO_URL;\n preloads.push(normalizeUrl(`${monacoPrefix}/loader.js`));\n preloads.push(normalizeUrl(`${monacoPrefix}/editor/editor.main.js`));\n\n return {\n name: '@rspress/plugin-playground',\n config(config) {\n config.markdown = config.markdown || {};\n config.markdown.mdxRs = false;\n return config;\n },\n async routeGenerated(routes: RouteMeta[]) {\n const { default: fs } = await import('@modern-js/utils/fs-extra');\n\n // init routeMeta\n routeMeta = routes;\n\n const files = routes.map(route => route.absolutePath);\n\n const imports: Record<string, string> = {};\n\n // scan all demos, and generate imports\n await Promise.all(\n files.map(async (filepath, _index) => {\n const isMdxFile = /\\.mdx?$/.test(filepath);\n if (!isMdxFile) {\n return;\n }\n const { createProcessor } = await import('@mdx-js/mdx');\n const { visit } = await import('unist-util-visit');\n const { default: remarkGFM } = await import('remark-gfm');\n try {\n const processor = createProcessor({\n format: path.extname(filepath).slice(1) as 'mdx' | 'md',\n remarkPlugins: [remarkGFM],\n });\n const source = await fs.readFile(filepath, 'utf-8');\n const ast = processor.parse(source);\n\n visit(ast, 'mdxJsxFlowElement', (node: any) => {\n if (node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(filepath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n\n const thisImports = parseImports(code, path.extname(demoPath));\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n\n visit(ast, 'code', (node: any) => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const { value } = node;\n const isPure = node?.meta?.includes('pure');\n\n // do not anything for pure mode\n if (isPure) {\n return;\n }\n\n const thisImports = parseImports(value, node.lang);\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n } catch (e) {\n console.error(e);\n throw e;\n }\n }),\n );\n\n if (include) {\n include.forEach(item => {\n if (typeof item === 'string') {\n imports[item] = item;\n } else {\n imports[item[0]] = item[1];\n }\n });\n }\n\n if (!('react' in imports)) {\n imports.react = 'react';\n }\n\n const importKeys = Object.keys(imports);\n const code = [\n ...importKeys.map(\n (x, index) => `import * as i_${index} from '${imports[x]}';`,\n ),\n 'const imports = new Map();',\n ...importKeys.map((x, index) => `imports.set('${x}', i_${index});`),\n 'function getImport(name, getDefault) {',\n ' if (!imports.has(name)) {',\n ' throw new Error(\"Module \" + name + \" not found\");',\n ' }',\n ' const result = imports.get(name);',\n ' if (getDefault && typeof result === \"object\") {',\n ' return result.default || result;',\n ' }',\n ' return result;',\n '}',\n 'export { imports };',\n 'export default getImport;',\n ].join('\\n');\n\n // console.log('playground-imports', code);\n\n playgroundVirtualModule.writeModule('_rspress_playground_imports', code);\n },\n builderConfig: {\n source: {\n define: {\n __PLAYGROUND_DIRECTION__: JSON.stringify(defaultDirection),\n __PLAYGROUND_MONACO_LOADER__: JSON.stringify(monacoLoader),\n __PLAYGROUND_MONACO_OPTIONS__: JSON.stringify(monacoOptions),\n },\n },\n html: {\n tags: [\n ...preloads.map(url => ({\n tag: 'link',\n head: true,\n attrs: {\n rel: 'preload',\n href: url,\n as: 'script',\n },\n })),\n {\n tag: 'script',\n head: true,\n attrs: {\n id: 'rspress-playground-babel',\n async: true,\n src: babelUrl || DEFAULT_BABEL_URL,\n },\n },\n ],\n },\n tools: {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error\n // @ts-ignore\n rspack: {\n plugins: [playgroundVirtualModule],\n },\n },\n },\n markdown: {\n remarkPlugins: [[remarkPlugin, { getRouteMeta, editorPosition }]],\n globalComponents: [\n render\n ? render\n : path.join(staticPath, 'global-components', 'Playground.tsx'),\n ],\n },\n globalStyles: path.join(staticPath, 'global-styles', 'web.css'),\n };\n}\n","import path from 'path';\n\nexport const staticPath = path.join(__dirname, '../../../static');\n","/* eslint-disable consistent-return */\nimport type { Program } from '@babel/types';\nimport oxc from '@oxidation-compiler/napi';\n\nexport const parseImports = (code: string, sourceExt: string) => {\n const parsed = oxc.parseSync(code, {\n sourceType: 'module',\n sourceFilename: `index.${sourceExt}`,\n });\n\n const ast = JSON.parse(parsed.program) as Program;\n\n const result: string[] = [];\n\n // oxc didn't have \"traverse\", so it currently only scans the first level\n // (generally, demos are not too complicated, right?)\n ast.body.forEach(statement => {\n if (statement.type === 'ImportDeclaration') {\n result.push(statement.source.value);\n }\n });\n\n return result;\n};\n\nexport const getNodeAttribute = (\n node: any,\n attrName: string,\n): string | undefined => {\n return node.attributes.find(\n (attr: { name: string; value: string }) => attr.name === attrName,\n )?.value;\n};\n\nexport const getNodeMeta = (\n node: any,\n metaName: string,\n): string | undefined => {\n if (!node.meta) {\n return;\n }\n const meta: string[] = node.meta.split(' ');\n const item: string | undefined = meta.find((x: string) =>\n x.startsWith(metaName),\n );\n if (item?.startsWith(`${metaName}=`)) {\n return item.substring(metaName.length + 1);\n }\n return item;\n};\n","import path, { join } from 'path';\nimport { visit } from 'unist-util-visit';\nimport fs from '@modern-js/utils/fs-extra';\nimport type { RouteMeta } from '@rspress/shared';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\nimport { getNodeAttribute, getNodeMeta } from './utils';\n\nfunction createPlaygroundNode(\n currentNode: any,\n attrs: Array<[string, string]>,\n) {\n Object.assign(currentNode, {\n type: 'mdxJsxFlowElement',\n name: 'Playground',\n attributes: attrs.map(it => ({\n type: 'mdxJsxAttribute',\n name: it[0],\n value: it[1],\n })),\n });\n}\n\ninterface RemarkPluginProps {\n getRouteMeta: () => RouteMeta[];\n editorPosition: 'left' | 'right';\n}\n\n/**\n * remark plugin to transform code to demo\n */\nexport const remarkPlugin: Plugin<[RemarkPluginProps], Root> = ({\n getRouteMeta,\n editorPosition,\n}) => {\n const routeMeta = getRouteMeta();\n\n return (tree, vfile) => {\n const route = routeMeta.find(\n meta => meta.absolutePath === (vfile.path || vfile.history[0]),\n );\n if (!route) {\n return;\n }\n\n // 1. External demo , use <code src=\"xxx\" /> to declare demo\n tree.children.forEach((node: any) => {\n if (node.type === 'mdxJsxFlowElement' && node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(route.absolutePath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n const direction = getNodeAttribute(node, 'direction') || '';\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n const language = src.substr(src.lastIndexOf('.') + 1);\n createPlaygroundNode(node, [\n ['code', code],\n ['language', language],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n\n // 2. Internal demo, use ```j/tsx to declare demo\n visit(tree, 'code', node => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const isPure = getNodeMeta(node, 'pure') === 'pure';\n\n // do nothing for pure mode\n if (isPure) {\n return;\n }\n\n const direction = getNodeMeta(node, 'direction') || '';\n\n createPlaygroundNode(node, [\n ['code', node.value],\n ['language', node.lang],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n };\n};\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","export function normalizeUrl(u: string) {\n return u.replace(/\\/\\//g, '/');\n}\n"]}
@@ -302,7 +302,6 @@ function createPlaygroundNode(currentNode, attrs) {
302
302
  }
303
303
  var remarkPlugin = ({
304
304
  getRouteMeta,
305
- defaultDirection,
306
305
  editorPosition
307
306
  }) => {
308
307
  const routeMeta2 = getRouteMeta();
@@ -323,7 +322,7 @@ var remarkPlugin = ({
323
322
  if (!fs.existsSync(demoPath)) {
324
323
  return;
325
324
  }
326
- const direction = getNodeAttribute(node, "direction") || defaultDirection;
325
+ const direction = getNodeAttribute(node, "direction") || "";
327
326
  const code = fs.readFileSync(demoPath, {
328
327
  encoding: "utf8"
329
328
  });
@@ -342,7 +341,7 @@ var remarkPlugin = ({
342
341
  if (isPure) {
343
342
  return;
344
343
  }
345
- const direction = getNodeMeta(node, "direction") || defaultDirection;
344
+ const direction = getNodeMeta(node, "direction") || "";
346
345
  createPlaygroundNode(node, [
347
346
  ["code", node.value],
348
347
  ["language", node.lang],
@@ -383,7 +382,6 @@ function pluginPlayground(options) {
383
382
  );
384
383
  }
385
384
  const preloads = [];
386
- preloads.push(babelUrl || DEFAULT_BABEL_URL);
387
385
  const monacoPrefix = monacoLoader.paths?.vs || DEFAULT_MONACO_URL;
388
386
  preloads.push(normalizeUrl(`${monacoPrefix}/loader.js`));
389
387
  preloads.push(normalizeUrl(`${monacoPrefix}/editor/editor.main.js`));
@@ -466,6 +464,9 @@ function pluginPlayground(options) {
466
464
  }
467
465
  });
468
466
  }
467
+ if (!("react" in imports)) {
468
+ imports.react = "react";
469
+ }
469
470
  const importKeys = Object.keys(imports);
470
471
  const code = [
471
472
  ...importKeys.map(
@@ -491,21 +492,32 @@ function pluginPlayground(options) {
491
492
  builderConfig: {
492
493
  source: {
493
494
  define: {
494
- __PLAYGROUND_BABEL_URL__: JSON.stringify(babelUrl),
495
+ __PLAYGROUND_DIRECTION__: JSON.stringify(defaultDirection),
495
496
  __PLAYGROUND_MONACO_LOADER__: JSON.stringify(monacoLoader),
496
497
  __PLAYGROUND_MONACO_OPTIONS__: JSON.stringify(monacoOptions)
497
498
  }
498
499
  },
499
500
  html: {
500
- tags: preloads.map((url) => ({
501
- tag: "link",
502
- head: true,
503
- attrs: {
504
- rel: "preload",
505
- href: url,
506
- as: "script"
501
+ tags: [
502
+ ...preloads.map((url) => ({
503
+ tag: "link",
504
+ head: true,
505
+ attrs: {
506
+ rel: "preload",
507
+ href: url,
508
+ as: "script"
509
+ }
510
+ })),
511
+ {
512
+ tag: "script",
513
+ head: true,
514
+ attrs: {
515
+ id: "rspress-playground-babel",
516
+ async: true,
517
+ src: babelUrl || DEFAULT_BABEL_URL
518
+ }
507
519
  }
508
- }))
520
+ ]
509
521
  },
510
522
  tools: {
511
523
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
@@ -516,9 +528,7 @@ function pluginPlayground(options) {
516
528
  }
517
529
  },
518
530
  markdown: {
519
- remarkPlugins: [
520
- [remarkPlugin, { getRouteMeta, defaultDirection, editorPosition }]
521
- ],
531
+ remarkPlugins: [[remarkPlugin, { getRouteMeta, editorPosition }]],
522
532
  globalComponents: [
523
533
  render ? render : path3.join(staticPath, "global-components", "Playground.tsx")
524
534
  ]
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["index","is","visit","path","routeMeta","fs","join","code"],"sources":["../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/lib/index.js","../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/color.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/index.js","../../../../../node_modules/.pnpm/unist-util-visit@4.1.1/node_modules/unist-util-visit/index.js","../../../src/cli/index.ts","../../../src/cli/constant.ts","../../../src/cli/utils.ts","../../../src/cli/remarkPlugin.ts","../../../src/web/constant.ts","../../../src/web/utils.ts"],"sourcesContent":["/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n */\n\n/**\n * @typedef {Record<string, unknown>} Props\n * @typedef {null | undefined | string | Props | TestFunctionAnything | Array<string | Props | TestFunctionAnything>} Test\n * Check for an arbitrary node, unaware of TypeScript inferral.\n *\n * @callback TestFunctionAnything\n * Check if a node passes a test, unaware of TypeScript inferral.\n * @param {unknown} this\n * The given context.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean | void}\n * Whether this node passes the test.\n */\n\n/**\n * @template {Node} Kind\n * Node type.\n * @typedef {Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind> | Array<Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind>>} PredicateTest\n * Check for a node that can be inferred by TypeScript.\n */\n\n/**\n * Check if a node passes a certain test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback TestFunctionPredicate\n * Complex test function for a node that can be inferred by TypeScript.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this node passes the test.\n */\n\n/**\n * @callback AssertAnything\n * Check that an arbitrary value is a node, unaware of TypeScript inferral.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if a node is a node and passes a certain node test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback AssertPredicate\n * Check that an arbitrary value is a specific node, aware of TypeScript.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param node\n * Thing to check, typically `Node`.\n * @param test\n * A check for a specific node.\n * @param index\n * The node’s position in its parent.\n * @param parent\n * The node’s parent.\n * @returns\n * Whether `node` is a node and passes a test.\n */\nexport const is =\n /**\n * @type {(\n * (() => false) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index: number, parent: Parent, context?: unknown) => node is Kind) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index?: null | undefined, parent?: null | undefined, context?: unknown) => node is Kind) &\n * ((node: unknown, test: Test, index: number, parent: Parent, context?: unknown) => boolean) &\n * ((node: unknown, test?: Test, index?: null | undefined, parent?: null | undefined, context?: unknown) => boolean)\n * )}\n */\n (\n /**\n * @param {unknown} [node]\n * @param {Test} [test]\n * @param {number | null | undefined} [index]\n * @param {Parent | null | undefined} [parent]\n * @param {unknown} [context]\n * @returns {boolean}\n */\n // eslint-disable-next-line max-params\n function is(node, test, index, parent, context) {\n const check = convert(test)\n\n if (\n index !== undefined &&\n index !== null &&\n (typeof index !== 'number' ||\n index < 0 ||\n index === Number.POSITIVE_INFINITY)\n ) {\n throw new Error('Expected positive finite index')\n }\n\n if (\n parent !== undefined &&\n parent !== null &&\n (!is(parent) || !parent.children)\n ) {\n throw new Error('Expected parent node')\n }\n\n if (\n (parent === undefined || parent === null) !==\n (index === undefined || index === null)\n ) {\n throw new Error('Expected both parent and index')\n }\n\n // @ts-expect-error Looks like a node.\n return node && node.type && typeof node.type === 'string'\n ? Boolean(check.call(context, node, index, parent))\n : false\n }\n )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param test\n * * when nullish, checks if `node` is a `Node`.\n * * when `string`, works like passing `(node) => node.type === test`.\n * * when `function` checks if function passed the node is true.\n * * when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n * * when `array`, checks if any one of the subtests pass.\n * @returns\n * An assertion.\n */\nexport const convert =\n /**\n * @type {(\n * (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &\n * ((test?: Test) => AssertAnything)\n * )}\n */\n (\n /**\n * @param {Test} [test]\n * @returns {AssertAnything}\n */\n function (test) {\n if (test === undefined || test === null) {\n return ok\n }\n\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n if (typeof test === 'object') {\n return Array.isArray(test) ? anyFactory(test) : propsFactory(test)\n }\n\n if (typeof test === 'function') {\n return castFactory(test)\n }\n\n throw new Error('Expected function, string, or object as test')\n }\n )\n\n/**\n * @param {Array<string | Props | TestFunctionAnything>} tests\n * @returns {AssertAnything}\n */\nfunction anyFactory(tests) {\n /** @type {Array<AssertAnything>} */\n const checks = []\n let index = -1\n\n while (++index < tests.length) {\n checks[index] = convert(tests[index])\n }\n\n return castFactory(any)\n\n /**\n * @this {unknown}\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function any(...parameters) {\n let index = -1\n\n while (++index < checks.length) {\n if (checks[index].call(this, ...parameters)) return true\n }\n\n return false\n }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {AssertAnything}\n */\nfunction propsFactory(check) {\n return castFactory(all)\n\n /**\n * @param {Node} node\n * @returns {boolean}\n */\n function all(node) {\n /** @type {string} */\n let key\n\n for (key in check) {\n // @ts-expect-error: hush, it sure works as an index.\n if (node[key] !== check[key]) return false\n }\n\n return true\n }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {AssertAnything}\n */\nfunction typeFactory(check) {\n return castFactory(type)\n\n /**\n * @param {Node} node\n */\n function type(node) {\n return node && node.type === check\n }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunctionAnything} check\n * @returns {AssertAnything}\n */\nfunction castFactory(check) {\n return assertion\n\n /**\n * @this {unknown}\n * @param {unknown} node\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function assertion(node, ...parameters) {\n return Boolean(\n node &&\n typeof node === 'object' &&\n 'type' in node &&\n // @ts-expect-error: fine.\n Boolean(check.call(this, node, ...parameters))\n )\n }\n}\n\nfunction ok() {\n return true\n}\n","/**\n * @typedef {import('./lib/index.js').Test} Test\n * @typedef {import('./lib/index.js').TestFunctionAnything} TestFunctionAnything\n * @typedef {import('./lib/index.js').AssertAnything} AssertAnything\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').PredicateTest<Kind>} PredicateTest\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').TestFunctionPredicate<Kind>} TestFunctionPredicate\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').AssertPredicate<Kind>} AssertPredicate\n */\n\nexport {is, convert} from './lib/index.js'\n","/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n return '\\u001B[33m' + d + '\\u001B[39m'\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n */\n\n/**\n * @typedef {boolean | 'skip'} Action\n * Union of the action types.\n *\n * @typedef {number} Index\n * Move to the sibling at `index` next (after node itself is completely\n * traversed).\n *\n * Useful if mutating the tree, such as removing the node the visitor is\n * currently on, or any of its previous siblings.\n * Results less than 0 or greater than or equal to `children.length` stop\n * traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n * List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n * Any value that can be returned from a visitor.\n */\n\n/**\n * @template {Node} [Visited=Node]\n * Visited node type.\n * @template {Parent} [Ancestor=Parent]\n * Ancestor type.\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform the parent of node (the last of `ancestors`).\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of an ancestor still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Array<Ancestor>} ancestors\n * Ancestors of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n */\n\n/**\n * @template {Node} [Tree=Node]\n * Tree type.\n * @template {Test} [Check=string]\n * Test type.\n * @typedef {Visitor<import('./complex-types.js').Matches<import('./complex-types.js').InclusiveDescendant<Tree>, Check>, Extract<import('./complex-types.js').InclusiveDescendant<Tree>, Parent>>} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parents`.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from './color.js'\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @param tree\n * Tree to traverse.\n * @param test\n * `unist-util-is`-compatible test\n * @param visitor\n * Handle each node.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns\n * Nothing.\n */\nexport const visitParents =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {Visitor<Node>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {void}\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n // @ts-expect-error no visitor given, so `visitor` is test.\n visitor = test\n test = null\n }\n\n const is = convert(test)\n const step = reverse ? -1 : 1\n\n factory(tree, undefined, [])()\n\n /**\n * @param {Node} node\n * @param {number | undefined} index\n * @param {Array<Parent>} parents\n */\n function factory(node, index, parents) {\n /** @type {Record<string, unknown>} */\n // @ts-expect-error: hush\n const value = node && typeof node === 'object' ? node : {}\n\n if (typeof value.type === 'string') {\n const name =\n // `hast`\n typeof value.tagName === 'string'\n ? value.tagName\n : // `xast`\n typeof value.name === 'string'\n ? value.name\n : undefined\n\n Object.defineProperty(visit, 'name', {\n value:\n 'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n })\n }\n\n return visit\n\n function visit() {\n /** @type {ActionTuple} */\n let result = []\n /** @type {ActionTuple} */\n let subresult\n /** @type {number} */\n let offset\n /** @type {Array<Parent>} */\n let grandparents\n\n if (!test || is(node, index, parents[parents.length - 1] || null)) {\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n // @ts-expect-error looks like a parent.\n if (node.children && result[0] !== SKIP) {\n // @ts-expect-error looks like a parent.\n offset = (reverse ? node.children.length : -1) + step\n // @ts-expect-error looks like a parent.\n grandparents = parents.concat(node)\n\n // @ts-expect-error looks like a parent.\n while (offset > -1 && offset < node.children.length) {\n // @ts-expect-error looks like a parent.\n subresult = factory(node.children[offset], offset, grandparents)()\n\n if (subresult[0] === EXIT) {\n return subresult\n }\n\n offset =\n typeof subresult[1] === 'number' ? subresult[1] : offset + step\n }\n }\n\n return result\n }\n }\n }\n )\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n * Valid return values from visitors.\n * @returns {ActionTuple}\n * Clean result.\n */\nfunction toResult(value) {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return [value]\n}\n","// Note: types exported from `index.d.ts`\nexport {CONTINUE, EXIT, SKIP, visitParents} from './lib/index.js'\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n * @typedef {import('./complex-types.js').Visitor} Visitor\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\n/**\n * Visit children of tree which pass test.\n *\n * @param tree\n * Tree to walk\n * @param [test]\n * `unist-util-is`-compatible test\n * @param visitor\n * Function called for nodes that pass `test`.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).\n */\nexport const visit =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {import('./complex-types.js').Visitor} visitor\n * @param {boolean} [reverse]\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n visitor = test\n test = null\n }\n\n visitParents(tree, test, overload, reverse)\n\n /**\n * @param {Node} node\n * @param {Array<Parent>} parents\n */\n function overload(node, parents) {\n const parent = parents[parents.length - 1]\n return visitor(\n node,\n parent ? parent.children.indexOf(node) : null,\n parent\n )\n }\n }\n )\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n","import path, { join } from 'path';\nimport { type RouteMeta, type RspressPlugin } from '@rspress/shared';\nimport { RspackVirtualModulePlugin } from 'rspack-plugin-virtual-module';\nimport type {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { staticPath } from './constant';\nimport { getNodeAttribute, parseImports } from './utils';\nimport { remarkPlugin } from './remarkPlugin';\nimport { DEFAULT_BABEL_URL, DEFAULT_MONACO_URL } from '@/web/constant';\nimport { normalizeUrl } from '@/web/utils';\n\ninterface PlaygroundOptions {\n render: string;\n include: Array<string | [string, string]>;\n\n defaultDirection: 'horizontal' | 'vertical';\n editorPosition: 'left' | 'right';\n\n babelUrl: string;\n\n monacoLoader: Parameters<typeof loader.config>[0];\n monacoOptions: MonacoEditorProps['options'];\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let routeMeta: RouteMeta[];\n\n/**\n * The plugin is used to preview component.\n */\nexport function pluginPlayground(\n options?: Partial<PlaygroundOptions>,\n): RspressPlugin {\n const {\n render = '',\n include,\n defaultDirection = 'horizontal',\n editorPosition = 'left',\n babelUrl = '',\n monacoLoader = {},\n monacoOptions = {},\n } = options || {};\n\n const playgroundVirtualModule = new RspackVirtualModulePlugin({});\n const getRouteMeta = () => routeMeta;\n\n if (render && !/Playground\\.(jsx?|tsx?)$/.test(render)) {\n throw new Error(\n '[Playground]: render should ends with Playground.(jsx?|tsx?)',\n );\n }\n\n const preloads: string[] = [];\n preloads.push(babelUrl || DEFAULT_BABEL_URL);\n const monacoPrefix = monacoLoader.paths?.vs || DEFAULT_MONACO_URL;\n preloads.push(normalizeUrl(`${monacoPrefix}/loader.js`));\n preloads.push(normalizeUrl(`${monacoPrefix}/editor/editor.main.js`));\n\n return {\n name: '@rspress/plugin-playground',\n config(config) {\n config.markdown = config.markdown || {};\n config.markdown.mdxRs = false;\n return config;\n },\n async routeGenerated(routes: RouteMeta[]) {\n const { default: fs } = await import('@modern-js/utils/fs-extra');\n\n // init routeMeta\n routeMeta = routes;\n\n const files = routes.map(route => route.absolutePath);\n\n const imports: Record<string, string> = {};\n\n // scan all demos, and generate imports\n await Promise.all(\n files.map(async (filepath, _index) => {\n const isMdxFile = /\\.mdx?$/.test(filepath);\n if (!isMdxFile) {\n return;\n }\n const { createProcessor } = await import('@mdx-js/mdx');\n const { visit } = await import('unist-util-visit');\n const { default: remarkGFM } = await import('remark-gfm');\n try {\n const processor = createProcessor({\n format: path.extname(filepath).slice(1) as 'mdx' | 'md',\n remarkPlugins: [remarkGFM],\n });\n const source = await fs.readFile(filepath, 'utf-8');\n const ast = processor.parse(source);\n\n visit(ast, 'mdxJsxFlowElement', (node: any) => {\n if (node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(filepath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n\n const thisImports = parseImports(code, path.extname(demoPath));\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n\n visit(ast, 'code', (node: any) => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const { value } = node;\n const isPure = node?.meta?.includes('pure');\n\n // do not anything for pure mode\n if (isPure) {\n return;\n }\n\n const thisImports = parseImports(value, node.lang);\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n } catch (e) {\n console.error(e);\n throw e;\n }\n }),\n );\n\n if (include) {\n include.forEach(item => {\n if (typeof item === 'string') {\n imports[item] = item;\n } else {\n imports[item[0]] = item[1];\n }\n });\n }\n\n const importKeys = Object.keys(imports);\n const code = [\n ...importKeys.map(\n (x, index) => `import * as i_${index} from '${imports[x]}';`,\n ),\n 'const imports = new Map();',\n ...importKeys.map((x, index) => `imports.set('${x}', i_${index});`),\n 'function getImport(name, getDefault) {',\n ' if (!imports.has(name)) {',\n ' throw new Error(\"Module \" + name + \" not found\");',\n ' }',\n ' const result = imports.get(name);',\n ' if (getDefault && typeof result === \"object\") {',\n ' return result.default || result;',\n ' }',\n ' return result;',\n '}',\n 'export { imports };',\n 'export default getImport;',\n ].join('\\n');\n\n // console.log('playground-imports', code);\n\n playgroundVirtualModule.writeModule('_rspress_playground_imports', code);\n },\n builderConfig: {\n source: {\n define: {\n __PLAYGROUND_BABEL_URL__: JSON.stringify(babelUrl),\n __PLAYGROUND_MONACO_LOADER__: JSON.stringify(monacoLoader),\n __PLAYGROUND_MONACO_OPTIONS__: JSON.stringify(monacoOptions),\n },\n },\n html: {\n tags: preloads.map(url => ({\n tag: 'link',\n head: true,\n attrs: {\n rel: 'preload',\n href: url,\n as: 'script',\n },\n })),\n },\n tools: {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error\n // @ts-ignore\n rspack: {\n plugins: [playgroundVirtualModule],\n },\n },\n },\n markdown: {\n remarkPlugins: [\n [remarkPlugin, { getRouteMeta, defaultDirection, editorPosition }],\n ],\n globalComponents: [\n render\n ? render\n : path.join(staticPath, 'global-components', 'Playground.tsx'),\n ],\n },\n globalStyles: path.join(staticPath, 'global-styles', 'web.css'),\n };\n}\n","import path from 'path';\n\nexport const staticPath = path.join(__dirname, '../../../static');\n","/* eslint-disable consistent-return */\nimport type { Program } from '@babel/types';\nimport oxc from '@oxidation-compiler/napi';\n\nexport const parseImports = (code: string, sourceExt: string) => {\n const parsed = oxc.parseSync(code, {\n sourceType: 'module',\n sourceFilename: `index.${sourceExt}`,\n });\n\n const ast = JSON.parse(parsed.program) as Program;\n\n const result: string[] = [];\n\n // oxc didn't have \"traverse\", so it currently only scans the first level\n // (generally, demos are not too complicated, right?)\n ast.body.forEach(statement => {\n if (statement.type === 'ImportDeclaration') {\n result.push(statement.source.value);\n }\n });\n\n return result;\n};\n\nexport const getNodeAttribute = (\n node: any,\n attrName: string,\n): string | undefined => {\n return node.attributes.find(\n (attr: { name: string; value: string }) => attr.name === attrName,\n )?.value;\n};\n\nexport const getNodeMeta = (\n node: any,\n metaName: string,\n): string | undefined => {\n if (!node.meta) {\n return;\n }\n const meta: string[] = node.meta.split(' ');\n const item: string | undefined = meta.find((x: string) =>\n x.startsWith(metaName),\n );\n if (item?.startsWith(`${metaName}=`)) {\n return item.substring(metaName.length + 1);\n }\n return item;\n};\n","import path, { join } from 'path';\nimport { visit } from 'unist-util-visit';\nimport fs from '@modern-js/utils/fs-extra';\nimport type { RouteMeta } from '@rspress/shared';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\nimport { getNodeAttribute, getNodeMeta } from './utils';\n\nfunction createPlaygroundNode(\n currentNode: any,\n attrs: Array<[string, string]>,\n) {\n Object.assign(currentNode, {\n type: 'mdxJsxFlowElement',\n name: 'Playground',\n attributes: attrs.map(it => ({\n type: 'mdxJsxAttribute',\n name: it[0],\n value: it[1],\n })),\n });\n}\n\ninterface RemarkPluginProps {\n getRouteMeta: () => RouteMeta[];\n defaultDirection: 'horizontal' | 'vertical';\n editorPosition: 'left' | 'right';\n}\n\n/**\n * remark plugin to transform code to demo\n */\nexport const remarkPlugin: Plugin<[RemarkPluginProps], Root> = ({\n getRouteMeta,\n defaultDirection,\n editorPosition,\n}) => {\n const routeMeta = getRouteMeta();\n\n return (tree, vfile) => {\n const route = routeMeta.find(\n meta => meta.absolutePath === (vfile.path || vfile.history[0]),\n );\n if (!route) {\n return;\n }\n\n // 1. External demo , use <code src=\"xxx\" /> to declare demo\n tree.children.forEach((node: any) => {\n if (node.type === 'mdxJsxFlowElement' && node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(route.absolutePath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n const direction =\n getNodeAttribute(node, 'direction') || defaultDirection;\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n const language = src.substr(src.lastIndexOf('.') + 1);\n createPlaygroundNode(node, [\n ['code', code],\n ['language', language],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n\n // 2. Internal demo, use ```j/tsx to declare demo\n visit(tree, 'code', node => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const isPure = getNodeMeta(node, 'pure') === 'pure';\n\n // do nothing for pure mode\n if (isPure) {\n return;\n }\n\n const direction = getNodeMeta(node, 'direction') || defaultDirection;\n\n createPlaygroundNode(node, [\n ['code', node.value],\n ['language', node.lang],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n };\n};\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","const loadingMap = new Map<string, Promise<void>>();\n\nexport function loadScript(url: string): Promise<void> {\n const exists = loadingMap.get(url);\n if (exists) {\n return exists;\n }\n const n: Promise<void> = new Promise(resolve => {\n const e = document.createElement('script');\n e.src = url;\n e.onload = () => resolve();\n document.body.appendChild(e);\n });\n loadingMap.set(url, n);\n return n;\n}\n\nexport function normalizeUrl(u: string) {\n return u.replace(/\\/\\//g, '/');\n}\n"]}
1
+ {"version":3,"mappings":"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","names":["index","is","visit","path","routeMeta","fs","join","code"],"sources":["../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/lib/index.js","../../../../../node_modules/.pnpm/unist-util-is@5.2.1/node_modules/unist-util-is/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/color.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/lib/index.js","../../../../../node_modules/.pnpm/unist-util-visit-parents@5.1.3/node_modules/unist-util-visit-parents/index.js","../../../../../node_modules/.pnpm/unist-util-visit@4.1.1/node_modules/unist-util-visit/index.js","../../../src/cli/index.ts","../../../src/cli/constant.ts","../../../src/cli/utils.ts","../../../src/cli/remarkPlugin.ts","../../../src/web/constant.ts","../../../src/web/utils.ts"],"sourcesContent":["/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n */\n\n/**\n * @typedef {Record<string, unknown>} Props\n * @typedef {null | undefined | string | Props | TestFunctionAnything | Array<string | Props | TestFunctionAnything>} Test\n * Check for an arbitrary node, unaware of TypeScript inferral.\n *\n * @callback TestFunctionAnything\n * Check if a node passes a test, unaware of TypeScript inferral.\n * @param {unknown} this\n * The given context.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean | void}\n * Whether this node passes the test.\n */\n\n/**\n * @template {Node} Kind\n * Node type.\n * @typedef {Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind> | Array<Kind['type'] | Partial<Kind> | TestFunctionPredicate<Kind>>} PredicateTest\n * Check for a node that can be inferred by TypeScript.\n */\n\n/**\n * Check if a node passes a certain test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback TestFunctionPredicate\n * Complex test function for a node that can be inferred by TypeScript.\n * @param {Node} node\n * A node.\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this node passes the test.\n */\n\n/**\n * @callback AssertAnything\n * Check that an arbitrary value is a node, unaware of TypeScript inferral.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if a node is a node and passes a certain node test.\n *\n * @template {Node} Kind\n * Node type.\n * @callback AssertPredicate\n * Check that an arbitrary value is a specific node, aware of TypeScript.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {node is Kind}\n * Whether this is a node and passes a test.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param node\n * Thing to check, typically `Node`.\n * @param test\n * A check for a specific node.\n * @param index\n * The node’s position in its parent.\n * @param parent\n * The node’s parent.\n * @returns\n * Whether `node` is a node and passes a test.\n */\nexport const is =\n /**\n * @type {(\n * (() => false) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index: number, parent: Parent, context?: unknown) => node is Kind) &\n * (<Kind extends Node = Node>(node: unknown, test: PredicateTest<Kind>, index?: null | undefined, parent?: null | undefined, context?: unknown) => node is Kind) &\n * ((node: unknown, test: Test, index: number, parent: Parent, context?: unknown) => boolean) &\n * ((node: unknown, test?: Test, index?: null | undefined, parent?: null | undefined, context?: unknown) => boolean)\n * )}\n */\n (\n /**\n * @param {unknown} [node]\n * @param {Test} [test]\n * @param {number | null | undefined} [index]\n * @param {Parent | null | undefined} [parent]\n * @param {unknown} [context]\n * @returns {boolean}\n */\n // eslint-disable-next-line max-params\n function is(node, test, index, parent, context) {\n const check = convert(test)\n\n if (\n index !== undefined &&\n index !== null &&\n (typeof index !== 'number' ||\n index < 0 ||\n index === Number.POSITIVE_INFINITY)\n ) {\n throw new Error('Expected positive finite index')\n }\n\n if (\n parent !== undefined &&\n parent !== null &&\n (!is(parent) || !parent.children)\n ) {\n throw new Error('Expected parent node')\n }\n\n if (\n (parent === undefined || parent === null) !==\n (index === undefined || index === null)\n ) {\n throw new Error('Expected both parent and index')\n }\n\n // @ts-expect-error Looks like a node.\n return node && node.type && typeof node.type === 'string'\n ? Boolean(check.call(context, node, index, parent))\n : false\n }\n )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param test\n * * when nullish, checks if `node` is a `Node`.\n * * when `string`, works like passing `(node) => node.type === test`.\n * * when `function` checks if function passed the node is true.\n * * when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n * * when `array`, checks if any one of the subtests pass.\n * @returns\n * An assertion.\n */\nexport const convert =\n /**\n * @type {(\n * (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &\n * ((test?: Test) => AssertAnything)\n * )}\n */\n (\n /**\n * @param {Test} [test]\n * @returns {AssertAnything}\n */\n function (test) {\n if (test === undefined || test === null) {\n return ok\n }\n\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n if (typeof test === 'object') {\n return Array.isArray(test) ? anyFactory(test) : propsFactory(test)\n }\n\n if (typeof test === 'function') {\n return castFactory(test)\n }\n\n throw new Error('Expected function, string, or object as test')\n }\n )\n\n/**\n * @param {Array<string | Props | TestFunctionAnything>} tests\n * @returns {AssertAnything}\n */\nfunction anyFactory(tests) {\n /** @type {Array<AssertAnything>} */\n const checks = []\n let index = -1\n\n while (++index < tests.length) {\n checks[index] = convert(tests[index])\n }\n\n return castFactory(any)\n\n /**\n * @this {unknown}\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function any(...parameters) {\n let index = -1\n\n while (++index < checks.length) {\n if (checks[index].call(this, ...parameters)) return true\n }\n\n return false\n }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {AssertAnything}\n */\nfunction propsFactory(check) {\n return castFactory(all)\n\n /**\n * @param {Node} node\n * @returns {boolean}\n */\n function all(node) {\n /** @type {string} */\n let key\n\n for (key in check) {\n // @ts-expect-error: hush, it sure works as an index.\n if (node[key] !== check[key]) return false\n }\n\n return true\n }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {AssertAnything}\n */\nfunction typeFactory(check) {\n return castFactory(type)\n\n /**\n * @param {Node} node\n */\n function type(node) {\n return node && node.type === check\n }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunctionAnything} check\n * @returns {AssertAnything}\n */\nfunction castFactory(check) {\n return assertion\n\n /**\n * @this {unknown}\n * @param {unknown} node\n * @param {Array<unknown>} parameters\n * @returns {boolean}\n */\n function assertion(node, ...parameters) {\n return Boolean(\n node &&\n typeof node === 'object' &&\n 'type' in node &&\n // @ts-expect-error: fine.\n Boolean(check.call(this, node, ...parameters))\n )\n }\n}\n\nfunction ok() {\n return true\n}\n","/**\n * @typedef {import('./lib/index.js').Test} Test\n * @typedef {import('./lib/index.js').TestFunctionAnything} TestFunctionAnything\n * @typedef {import('./lib/index.js').AssertAnything} AssertAnything\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').PredicateTest<Kind>} PredicateTest\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').TestFunctionPredicate<Kind>} TestFunctionPredicate\n */\n\n/**\n * @template {import('unist').Node} Kind\n * @typedef {import('./lib/index.js').AssertPredicate<Kind>} AssertPredicate\n */\n\nexport {is, convert} from './lib/index.js'\n","/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n return '\\u001B[33m' + d + '\\u001B[39m'\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n */\n\n/**\n * @typedef {boolean | 'skip'} Action\n * Union of the action types.\n *\n * @typedef {number} Index\n * Move to the sibling at `index` next (after node itself is completely\n * traversed).\n *\n * Useful if mutating the tree, such as removing the node the visitor is\n * currently on, or any of its previous siblings.\n * Results less than 0 or greater than or equal to `children.length` stop\n * traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n * List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n * Any value that can be returned from a visitor.\n */\n\n/**\n * @template {Node} [Visited=Node]\n * Visited node type.\n * @template {Parent} [Ancestor=Parent]\n * Ancestor type.\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform the parent of node (the last of `ancestors`).\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of an ancestor still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Array<Ancestor>} ancestors\n * Ancestors of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n */\n\n/**\n * @template {Node} [Tree=Node]\n * Tree type.\n * @template {Test} [Check=string]\n * Test type.\n * @typedef {Visitor<import('./complex-types.js').Matches<import('./complex-types.js').InclusiveDescendant<Tree>, Check>, Extract<import('./complex-types.js').InclusiveDescendant<Tree>, Parent>>} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parents`.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from './color.js'\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @param tree\n * Tree to traverse.\n * @param test\n * `unist-util-is`-compatible test\n * @param visitor\n * Handle each node.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns\n * Nothing.\n */\nexport const visitParents =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {Visitor<Node>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {void}\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n // @ts-expect-error no visitor given, so `visitor` is test.\n visitor = test\n test = null\n }\n\n const is = convert(test)\n const step = reverse ? -1 : 1\n\n factory(tree, undefined, [])()\n\n /**\n * @param {Node} node\n * @param {number | undefined} index\n * @param {Array<Parent>} parents\n */\n function factory(node, index, parents) {\n /** @type {Record<string, unknown>} */\n // @ts-expect-error: hush\n const value = node && typeof node === 'object' ? node : {}\n\n if (typeof value.type === 'string') {\n const name =\n // `hast`\n typeof value.tagName === 'string'\n ? value.tagName\n : // `xast`\n typeof value.name === 'string'\n ? value.name\n : undefined\n\n Object.defineProperty(visit, 'name', {\n value:\n 'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n })\n }\n\n return visit\n\n function visit() {\n /** @type {ActionTuple} */\n let result = []\n /** @type {ActionTuple} */\n let subresult\n /** @type {number} */\n let offset\n /** @type {Array<Parent>} */\n let grandparents\n\n if (!test || is(node, index, parents[parents.length - 1] || null)) {\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n // @ts-expect-error looks like a parent.\n if (node.children && result[0] !== SKIP) {\n // @ts-expect-error looks like a parent.\n offset = (reverse ? node.children.length : -1) + step\n // @ts-expect-error looks like a parent.\n grandparents = parents.concat(node)\n\n // @ts-expect-error looks like a parent.\n while (offset > -1 && offset < node.children.length) {\n // @ts-expect-error looks like a parent.\n subresult = factory(node.children[offset], offset, grandparents)()\n\n if (subresult[0] === EXIT) {\n return subresult\n }\n\n offset =\n typeof subresult[1] === 'number' ? subresult[1] : offset + step\n }\n }\n\n return result\n }\n }\n }\n )\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n * Valid return values from visitors.\n * @returns {ActionTuple}\n * Clean result.\n */\nfunction toResult(value) {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return [value]\n}\n","// Note: types exported from `index.d.ts`\nexport {CONTINUE, EXIT, SKIP, visitParents} from './lib/index.js'\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Parent} Parent\n * @typedef {import('unist-util-is').Test} Test\n * @typedef {import('unist-util-visit-parents').VisitorResult} VisitorResult\n * @typedef {import('./complex-types.js').Visitor} Visitor\n */\n\nimport {visitParents} from 'unist-util-visit-parents'\n\n/**\n * Visit children of tree which pass test.\n *\n * @param tree\n * Tree to walk\n * @param [test]\n * `unist-util-is`-compatible test\n * @param visitor\n * Function called for nodes that pass `test`.\n * @param reverse\n * Traverse in reverse preorder (NRL) instead of preorder (NLR) (default).\n */\nexport const visit =\n /**\n * @type {(\n * (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: import('./complex-types.js').BuildVisitor<Tree, Check>, reverse?: boolean) => void) &\n * (<Tree extends Node>(tree: Tree, visitor: import('./complex-types.js').BuildVisitor<Tree>, reverse?: boolean) => void)\n * )}\n */\n (\n /**\n * @param {Node} tree\n * @param {Test} test\n * @param {import('./complex-types.js').Visitor} visitor\n * @param {boolean} [reverse]\n */\n function (tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n visitor = test\n test = null\n }\n\n visitParents(tree, test, overload, reverse)\n\n /**\n * @param {Node} node\n * @param {Array<Parent>} parents\n */\n function overload(node, parents) {\n const parent = parents[parents.length - 1]\n return visitor(\n node,\n parent ? parent.children.indexOf(node) : null,\n parent\n )\n }\n }\n )\n\nexport {CONTINUE, EXIT, SKIP} from 'unist-util-visit-parents'\n","import path, { join } from 'path';\nimport { type RouteMeta, type RspressPlugin } from '@rspress/shared';\nimport { RspackVirtualModulePlugin } from 'rspack-plugin-virtual-module';\nimport type {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { staticPath } from './constant';\nimport { getNodeAttribute, parseImports } from './utils';\nimport { remarkPlugin } from './remarkPlugin';\nimport { DEFAULT_BABEL_URL, DEFAULT_MONACO_URL } from '@/web/constant';\nimport { normalizeUrl } from '@/web/utils';\n\ninterface PlaygroundOptions {\n render: string;\n include: Array<string | [string, string]>;\n\n defaultDirection: 'horizontal' | 'vertical';\n editorPosition: 'left' | 'right';\n\n babelUrl: string;\n\n monacoLoader: Parameters<typeof loader.config>[0];\n monacoOptions: MonacoEditorProps['options'];\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let routeMeta: RouteMeta[];\n\n/**\n * The plugin is used to preview component.\n */\nexport function pluginPlayground(\n options?: Partial<PlaygroundOptions>,\n): RspressPlugin {\n const {\n render = '',\n include,\n defaultDirection = 'horizontal',\n editorPosition = 'left',\n babelUrl = '',\n monacoLoader = {},\n monacoOptions = {},\n } = options || {};\n\n const playgroundVirtualModule = new RspackVirtualModulePlugin({});\n const getRouteMeta = () => routeMeta;\n\n if (render && !/Playground\\.(jsx?|tsx?)$/.test(render)) {\n throw new Error(\n '[Playground]: render should ends with Playground.(jsx?|tsx?)',\n );\n }\n\n const preloads: string[] = [];\n const monacoPrefix = monacoLoader.paths?.vs || DEFAULT_MONACO_URL;\n preloads.push(normalizeUrl(`${monacoPrefix}/loader.js`));\n preloads.push(normalizeUrl(`${monacoPrefix}/editor/editor.main.js`));\n\n return {\n name: '@rspress/plugin-playground',\n config(config) {\n config.markdown = config.markdown || {};\n config.markdown.mdxRs = false;\n return config;\n },\n async routeGenerated(routes: RouteMeta[]) {\n const { default: fs } = await import('@modern-js/utils/fs-extra');\n\n // init routeMeta\n routeMeta = routes;\n\n const files = routes.map(route => route.absolutePath);\n\n const imports: Record<string, string> = {};\n\n // scan all demos, and generate imports\n await Promise.all(\n files.map(async (filepath, _index) => {\n const isMdxFile = /\\.mdx?$/.test(filepath);\n if (!isMdxFile) {\n return;\n }\n const { createProcessor } = await import('@mdx-js/mdx');\n const { visit } = await import('unist-util-visit');\n const { default: remarkGFM } = await import('remark-gfm');\n try {\n const processor = createProcessor({\n format: path.extname(filepath).slice(1) as 'mdx' | 'md',\n remarkPlugins: [remarkGFM],\n });\n const source = await fs.readFile(filepath, 'utf-8');\n const ast = processor.parse(source);\n\n visit(ast, 'mdxJsxFlowElement', (node: any) => {\n if (node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(filepath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n\n const thisImports = parseImports(code, path.extname(demoPath));\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n\n visit(ast, 'code', (node: any) => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const { value } = node;\n const isPure = node?.meta?.includes('pure');\n\n // do not anything for pure mode\n if (isPure) {\n return;\n }\n\n const thisImports = parseImports(value, node.lang);\n thisImports.forEach(x => {\n if (typeof imports[x] === 'undefined') {\n imports[x] = x;\n }\n });\n }\n });\n } catch (e) {\n console.error(e);\n throw e;\n }\n }),\n );\n\n if (include) {\n include.forEach(item => {\n if (typeof item === 'string') {\n imports[item] = item;\n } else {\n imports[item[0]] = item[1];\n }\n });\n }\n\n if (!('react' in imports)) {\n imports.react = 'react';\n }\n\n const importKeys = Object.keys(imports);\n const code = [\n ...importKeys.map(\n (x, index) => `import * as i_${index} from '${imports[x]}';`,\n ),\n 'const imports = new Map();',\n ...importKeys.map((x, index) => `imports.set('${x}', i_${index});`),\n 'function getImport(name, getDefault) {',\n ' if (!imports.has(name)) {',\n ' throw new Error(\"Module \" + name + \" not found\");',\n ' }',\n ' const result = imports.get(name);',\n ' if (getDefault && typeof result === \"object\") {',\n ' return result.default || result;',\n ' }',\n ' return result;',\n '}',\n 'export { imports };',\n 'export default getImport;',\n ].join('\\n');\n\n // console.log('playground-imports', code);\n\n playgroundVirtualModule.writeModule('_rspress_playground_imports', code);\n },\n builderConfig: {\n source: {\n define: {\n __PLAYGROUND_DIRECTION__: JSON.stringify(defaultDirection),\n __PLAYGROUND_MONACO_LOADER__: JSON.stringify(monacoLoader),\n __PLAYGROUND_MONACO_OPTIONS__: JSON.stringify(monacoOptions),\n },\n },\n html: {\n tags: [\n ...preloads.map(url => ({\n tag: 'link',\n head: true,\n attrs: {\n rel: 'preload',\n href: url,\n as: 'script',\n },\n })),\n {\n tag: 'script',\n head: true,\n attrs: {\n id: 'rspress-playground-babel',\n async: true,\n src: babelUrl || DEFAULT_BABEL_URL,\n },\n },\n ],\n },\n tools: {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error\n // @ts-ignore\n rspack: {\n plugins: [playgroundVirtualModule],\n },\n },\n },\n markdown: {\n remarkPlugins: [[remarkPlugin, { getRouteMeta, editorPosition }]],\n globalComponents: [\n render\n ? render\n : path.join(staticPath, 'global-components', 'Playground.tsx'),\n ],\n },\n globalStyles: path.join(staticPath, 'global-styles', 'web.css'),\n };\n}\n","import path from 'path';\n\nexport const staticPath = path.join(__dirname, '../../../static');\n","/* eslint-disable consistent-return */\nimport type { Program } from '@babel/types';\nimport oxc from '@oxidation-compiler/napi';\n\nexport const parseImports = (code: string, sourceExt: string) => {\n const parsed = oxc.parseSync(code, {\n sourceType: 'module',\n sourceFilename: `index.${sourceExt}`,\n });\n\n const ast = JSON.parse(parsed.program) as Program;\n\n const result: string[] = [];\n\n // oxc didn't have \"traverse\", so it currently only scans the first level\n // (generally, demos are not too complicated, right?)\n ast.body.forEach(statement => {\n if (statement.type === 'ImportDeclaration') {\n result.push(statement.source.value);\n }\n });\n\n return result;\n};\n\nexport const getNodeAttribute = (\n node: any,\n attrName: string,\n): string | undefined => {\n return node.attributes.find(\n (attr: { name: string; value: string }) => attr.name === attrName,\n )?.value;\n};\n\nexport const getNodeMeta = (\n node: any,\n metaName: string,\n): string | undefined => {\n if (!node.meta) {\n return;\n }\n const meta: string[] = node.meta.split(' ');\n const item: string | undefined = meta.find((x: string) =>\n x.startsWith(metaName),\n );\n if (item?.startsWith(`${metaName}=`)) {\n return item.substring(metaName.length + 1);\n }\n return item;\n};\n","import path, { join } from 'path';\nimport { visit } from 'unist-util-visit';\nimport fs from '@modern-js/utils/fs-extra';\nimport type { RouteMeta } from '@rspress/shared';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\nimport { getNodeAttribute, getNodeMeta } from './utils';\n\nfunction createPlaygroundNode(\n currentNode: any,\n attrs: Array<[string, string]>,\n) {\n Object.assign(currentNode, {\n type: 'mdxJsxFlowElement',\n name: 'Playground',\n attributes: attrs.map(it => ({\n type: 'mdxJsxAttribute',\n name: it[0],\n value: it[1],\n })),\n });\n}\n\ninterface RemarkPluginProps {\n getRouteMeta: () => RouteMeta[];\n editorPosition: 'left' | 'right';\n}\n\n/**\n * remark plugin to transform code to demo\n */\nexport const remarkPlugin: Plugin<[RemarkPluginProps], Root> = ({\n getRouteMeta,\n editorPosition,\n}) => {\n const routeMeta = getRouteMeta();\n\n return (tree, vfile) => {\n const route = routeMeta.find(\n meta => meta.absolutePath === (vfile.path || vfile.history[0]),\n );\n if (!route) {\n return;\n }\n\n // 1. External demo , use <code src=\"xxx\" /> to declare demo\n tree.children.forEach((node: any) => {\n if (node.type === 'mdxJsxFlowElement' && node.name === 'code') {\n const src = getNodeAttribute(node, 'src');\n if (!src) {\n return;\n }\n const demoPath = join(path.dirname(route.absolutePath), src);\n if (!fs.existsSync(demoPath)) {\n return;\n }\n const direction = getNodeAttribute(node, 'direction') || '';\n const code = fs.readFileSync(demoPath, {\n encoding: 'utf8',\n });\n const language = src.substr(src.lastIndexOf('.') + 1);\n createPlaygroundNode(node, [\n ['code', code],\n ['language', language],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n\n // 2. Internal demo, use ```j/tsx to declare demo\n visit(tree, 'code', node => {\n if (node.lang === 'jsx' || node.lang === 'tsx') {\n const isPure = getNodeMeta(node, 'pure') === 'pure';\n\n // do nothing for pure mode\n if (isPure) {\n return;\n }\n\n const direction = getNodeMeta(node, 'direction') || '';\n\n createPlaygroundNode(node, [\n ['code', node.value],\n ['language', node.lang],\n ['direction', direction],\n ['editorPosition', editorPosition],\n ]);\n }\n });\n };\n};\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","export function normalizeUrl(u: string) {\n return u.replace(/\\/\\//g, '/');\n}\n"]}
@@ -48,7 +48,6 @@ var import_react3 = __toESM(require("@monaco-editor/react"));
48
48
  var import_react = __toESM(require("@monaco-editor/react"));
49
49
 
50
50
  // src/web/constant.ts
51
- var DEFAULT_BABEL_URL = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js";
52
51
  var DEFAULT_MONACO_URL = "https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs";
53
52
 
54
53
  // src/web/editor.tsx
@@ -165,41 +164,25 @@ function createGetImport(name, getDefault) {
165
164
  };
166
165
  }
167
166
 
168
- // src/web/utils.ts
169
- var loadingMap = /* @__PURE__ */ new Map();
170
- function loadScript(url) {
171
- const exists = loadingMap.get(url);
172
- if (exists) {
173
- return exists;
174
- }
175
- const n = new Promise((resolve) => {
176
- const e = document.createElement("script");
177
- e.src = url;
178
- e.onload = () => resolve();
179
- document.body.appendChild(e);
180
- });
181
- loadingMap.set(url, n);
182
- return n;
183
- }
184
-
185
167
  // src/web/babel.ts
186
- async function getBabel() {
187
- if (!window.Babel) {
188
- let babelUrl = DEFAULT_BABEL_URL;
189
- try {
190
- const u = __PLAYGROUND_BABEL_URL__;
191
- if (u) {
192
- babelUrl = u;
193
- }
194
- } catch (e) {
195
- }
196
- await loadScript(babelUrl);
168
+ function getBabel() {
169
+ if (window.Babel) {
170
+ return window.Babel;
197
171
  }
198
- return window.Babel;
172
+ const el = document.getElementById("rspress-playground-babel");
173
+ if (!el) {
174
+ throw new Error("Babel not found");
175
+ }
176
+ return new Promise((resolve) => {
177
+ el.addEventListener("load", () => {
178
+ resolve(window.Babel);
179
+ });
180
+ });
199
181
  }
200
182
 
201
183
  // src/web/runner.tsx
202
184
  var import_jsx_runtime2 = require("react/jsx-runtime");
185
+ var DEBOUNCE_TIME = 800;
203
186
  var Runner = class extends import_react2.Component {
204
187
  constructor(props) {
205
188
  super(props);
@@ -224,7 +207,7 @@ var Runner = class extends import_react2.Component {
224
207
  this.timer = setTimeout(() => {
225
208
  this.timer = null;
226
209
  this.doCompile(targetCode);
227
- }, 600);
210
+ }, DEBOUNCE_TIME);
228
211
  }
229
212
  async doCompile(targetCode) {
230
213
  const { language, getImport } = this.props;
@@ -245,14 +228,22 @@ var Runner = class extends import_react2.Component {
245
228
  }
246
229
  const result = babel.transform(targetCode, {
247
230
  sourceType: "module",
231
+ sourceMaps: "inline",
248
232
  presets,
249
233
  plugins: [
250
234
  {
235
+ pre() {
236
+ this.hasReactImported = false;
237
+ },
251
238
  visitor: {
252
239
  ImportDeclaration(path) {
253
240
  const pkg = path.node.source.value;
254
241
  const code = [];
242
+ const specifiers = [];
255
243
  for (const specifier of path.node.specifiers) {
244
+ if (specifier.local.name === "React") {
245
+ this.hasReactImported = true;
246
+ }
256
247
  if (specifier.type === "ImportDefaultSpecifier") {
257
248
  code.push(
258
249
  createVariableDeclaration(
@@ -270,16 +261,29 @@ var Runner = class extends import_react2.Component {
270
261
  );
271
262
  }
272
263
  if (specifier.type === "ImportSpecifier") {
273
- code.push(
274
- createVariableDeclaration(
275
- createObjectPattern([specifier.local.name]),
276
- createGetImport(pkg)
277
- )
278
- );
264
+ specifiers.push(specifier.local.name);
279
265
  }
280
266
  }
267
+ if (specifiers.length > 0) {
268
+ code.push(
269
+ createVariableDeclaration(
270
+ createObjectPattern(specifiers),
271
+ createGetImport(pkg)
272
+ )
273
+ );
274
+ }
281
275
  path.replaceWithMultiple(code);
282
276
  }
277
+ },
278
+ post(file) {
279
+ if (!this.hasReactImported) {
280
+ file.ast.program.body.unshift(
281
+ createVariableDeclaration(
282
+ "React",
283
+ createGetImport("react", true)
284
+ )
285
+ );
286
+ }
283
287
  }
284
288
  }
285
289
  ]
@@ -298,8 +302,7 @@ var Runner = class extends import_react2.Component {
298
302
  return;
299
303
  }
300
304
  this.setState({
301
- error: new Error("No default export"),
302
- comp: null
305
+ error: new Error("No default export")
303
306
  });
304
307
  } catch (e) {
305
308
  if (targetCode !== this.props.code) {
@@ -307,8 +310,7 @@ var Runner = class extends import_react2.Component {
307
310
  }
308
311
  console.error(e);
309
312
  this.setState({
310
- error: e,
311
- comp: null
313
+ error: e
312
314
  });
313
315
  }
314
316
  }
@@ -327,10 +329,10 @@ var Runner = class extends import_react2.Component {
327
329
  render() {
328
330
  const { className = "", code, language, getImport, ...rest } = this.props;
329
331
  const { error, comp } = this.state;
330
- if (error) {
331
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: `rspress-playground-runner ${className}`, ...rest, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { color: "red" }, children: error.message }) });
332
- }
333
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: `rspress-playground-runner ${className}`, ...rest, children: comp });
332
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: `rspress-playground-runner ${className}`, ...rest, children: [
333
+ comp,
334
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("pre", { className: "rspress-playground-error", children: error.message })
335
+ ] });
334
336
  }
335
337
  };
336
338
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"sources":["../../../src/web/index.ts","../../../src/web/editor.tsx","../../../src/web/constant.ts","../../../src/web/runner.tsx","../../../src/web/ast.ts","../../../src/web/utils.ts","../../../src/web/babel.ts"],"sourcesContent":["export {\n default as MonacoEditor,\n loader as MonacoEditorLoader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nexport { Editor } from './editor';\nexport { Runner } from './runner';\n","import React from 'react';\nimport MonacoEditor, {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { DEFAULT_MONACO_URL } from './constant';\n\n// inject by builder in cli/index.ts\n// see: https://modernjs.dev/builder/api/config-source.html#sourcedefine\ndeclare global {\n const __PLAYGROUND_MONACO_LOADER__: any;\n const __PLAYGROUND_MONACO_OPTIONS__: any;\n}\n\nfunction initLoader() {\n let loaderConfig = {\n paths: {\n vs: DEFAULT_MONACO_URL,\n },\n };\n\n try {\n const keys = Object.keys(__PLAYGROUND_MONACO_LOADER__);\n\n if (keys.length > 0) {\n loaderConfig = __PLAYGROUND_MONACO_LOADER__;\n }\n } catch (e) {\n // ignore\n }\n\n loader.config(loaderConfig);\n}\ninitLoader();\n\nfunction getMonacoOptions() {\n try {\n return __PLAYGROUND_MONACO_OPTIONS__;\n } catch (e) {\n // ignore\n }\n return {};\n}\n\nexport type EditorProps = Partial<MonacoEditorProps>;\n\nexport function Editor(props: EditorProps) {\n const { options, className = '', ...rest } = props || {};\n\n return (\n <div className={`rspress-playground-editor ${className}`}>\n <MonacoEditor\n {...rest}\n theme=\"light\"\n options={{\n minimap: {\n enabled: true,\n autohide: true,\n },\n fontSize: 14,\n lineNumbersMinChars: 7,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n wordBasedSuggestions: true,\n quickSuggestions: true,\n scrollbar: {\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n },\n scrollPredominantAxis: false,\n ...getMonacoOptions(),\n ...options,\n }}\n />\n </div>\n );\n}\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","import type { Node } from '@babel/types';\nimport React, { Component, HTMLAttributes } from 'react';\nimport {\n createGetImport,\n createObjectPattern,\n createVariableDeclaration,\n} from './ast';\nimport { getBabel } from './babel';\n\ninterface RunnerProps extends HTMLAttributes<HTMLDivElement> {\n code: string;\n language: string;\n getImport: (name: string, getDefault?: boolean) => void;\n}\n\ninterface RunnerState {\n error?: Error;\n comp: any;\n}\n\nclass Runner extends Component<RunnerProps, RunnerState> {\n static getDerivedStateFromError(error: Error) {\n return {\n error,\n comp: null,\n };\n }\n\n timer: any;\n\n constructor(props: RunnerProps) {\n super(props);\n\n this.state = {\n error: undefined,\n comp: null,\n };\n\n this.doCompile = this.doCompile.bind(this);\n this.waitCompile = this.waitCompile.bind(this);\n }\n\n waitCompile(targetCode: string) {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.doCompile(targetCode);\n }, 600);\n }\n\n async doCompile(targetCode: string) {\n const { language, getImport } = this.props;\n const babel = await getBabel();\n try {\n const presets = [\n [babel.availablePresets.react],\n [babel.availablePresets.env, { modules: 'commonjs' }],\n ];\n if (language === 'tsx' || language === 'ts') {\n presets.unshift([\n babel.availablePresets.typescript,\n {\n allExtensions: true,\n isTSX: language === 'tsx',\n },\n ]);\n }\n const result = babel.transform(targetCode, {\n sourceType: 'module',\n presets,\n plugins: [\n {\n visitor: {\n ImportDeclaration(path) {\n const pkg = path.node.source.value;\n const code: Node[] = [];\n for (const specifier of path.node.specifiers) {\n // import X from 'xxx'\n if (specifier.type === 'ImportDefaultSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg, true),\n ),\n );\n }\n // import * as X from 'xxx'\n if (specifier.type === 'ImportNamespaceSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg),\n ),\n );\n }\n // import { a, b, c } from 'xxx'\n if (specifier.type === 'ImportSpecifier') {\n // const {${specifier.local.name}} = __get_import()\n code.push(\n createVariableDeclaration(\n createObjectPattern([specifier.local.name]),\n createGetImport(pkg),\n ),\n );\n }\n }\n path.replaceWithMultiple(code);\n },\n },\n },\n ],\n });\n\n // Code has been updated\n if (targetCode !== this.props.code || !result || !result.code) {\n return;\n }\n\n const runExports: any = {};\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const func = new Function('__get_import', 'exports', result.code);\n func(getImport, runExports);\n\n if (runExports.default) {\n this.setState({\n error: undefined,\n comp: React.createElement(runExports.default),\n });\n return;\n }\n\n this.setState({\n error: new Error('No default export'),\n comp: null,\n });\n } catch (e) {\n // Code has been updated\n if (targetCode !== this.props.code) {\n return;\n }\n console.error(e);\n this.setState({\n error: e as Error,\n comp: null,\n });\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(error);\n console.error(errorInfo);\n }\n\n componentDidMount() {\n this.doCompile(this.props.code);\n }\n\n componentDidUpdate(prevProps: RunnerProps) {\n if (prevProps.code !== this.props.code) {\n this.waitCompile(this.props.code);\n }\n }\n\n render() {\n const { className = '', code, language, getImport, ...rest } = this.props;\n const { error, comp } = this.state;\n\n if (error) {\n return (\n <div className={`rspress-playground-runner ${className}`} {...rest}>\n <span style={{ color: 'red' }}>{error.message}</span>\n </div>\n );\n }\n\n return (\n <div className={`rspress-playground-runner ${className}`} {...rest}>\n {comp}\n </div>\n );\n }\n}\n\nexport { Runner };\n","import type {\n CallExpression,\n Expression,\n ObjectPattern,\n VariableDeclaration,\n} from '@babel/types';\n\nexport function createVariableDeclaration(\n id: string | ObjectPattern,\n init: Expression,\n): VariableDeclaration {\n return {\n type: 'VariableDeclaration',\n declarations: [\n {\n type: 'VariableDeclarator',\n id:\n typeof id === 'string'\n ? {\n type: 'Identifier',\n name: id,\n }\n : id,\n init,\n },\n ],\n kind: 'const',\n };\n}\n\nexport function createObjectPattern(names: string[]): ObjectPattern {\n return {\n type: 'ObjectPattern',\n properties: names.map(name => ({\n type: 'ObjectProperty',\n key: {\n type: 'Identifier',\n name,\n },\n computed: false,\n method: false,\n shorthand: true,\n value: {\n type: 'Identifier',\n name,\n },\n })),\n };\n}\n\nexport function createGetImport(\n name: string,\n getDefault?: boolean,\n): CallExpression {\n return {\n type: 'CallExpression',\n callee: {\n type: 'Identifier',\n name: '__get_import',\n },\n arguments: [\n {\n type: 'StringLiteral',\n value: name,\n },\n {\n type: 'BooleanLiteral',\n value: Boolean(getDefault),\n },\n ],\n };\n}\n","const loadingMap = new Map<string, Promise<void>>();\n\nexport function loadScript(url: string): Promise<void> {\n const exists = loadingMap.get(url);\n if (exists) {\n return exists;\n }\n const n: Promise<void> = new Promise(resolve => {\n const e = document.createElement('script');\n e.src = url;\n e.onload = () => resolve();\n document.body.appendChild(e);\n });\n loadingMap.set(url, n);\n return n;\n}\n\nexport function normalizeUrl(u: string) {\n return u.replace(/\\/\\//g, '/');\n}\n","import type babel from '@babel/standalone';\nimport { DEFAULT_BABEL_URL } from './constant';\nimport { loadScript } from './utils';\n\ndeclare global {\n // inject by builder in cli/index.ts\n // see: https://modernjs.dev/builder/api/config-source.html#sourcedefine\n const __PLAYGROUND_BABEL_URL__: any;\n interface Window {\n Babel: typeof babel;\n }\n}\n\nasync function getBabel() {\n if (!window.Babel) {\n let babelUrl = DEFAULT_BABEL_URL;\n try {\n const u = __PLAYGROUND_BABEL_URL__;\n if (u) {\n babelUrl = u;\n }\n } catch (e) {\n // ignore\n }\n await loadScript(babelUrl);\n }\n return window.Babel;\n}\n\nexport { getBabel };\n"]}
1
+ {"version":3,"mappings":"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","names":[],"sources":["../../../src/web/index.ts","../../../src/web/editor.tsx","../../../src/web/constant.ts","../../../src/web/runner.tsx","../../../src/web/ast.ts","../../../src/web/babel.ts"],"sourcesContent":["export {\n default as MonacoEditor,\n loader as MonacoEditorLoader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nexport { Editor } from './editor';\nexport { Runner } from './runner';\n","import React from 'react';\nimport MonacoEditor, {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { DEFAULT_MONACO_URL } from './constant';\n\n// inject by builder in cli/index.ts\n// see: https://modernjs.dev/builder/api/config-source.html#sourcedefine\ndeclare global {\n const __PLAYGROUND_MONACO_LOADER__: any;\n const __PLAYGROUND_MONACO_OPTIONS__: any;\n}\n\nfunction initLoader() {\n let loaderConfig = {\n paths: {\n vs: DEFAULT_MONACO_URL,\n },\n };\n\n try {\n const keys = Object.keys(__PLAYGROUND_MONACO_LOADER__);\n\n if (keys.length > 0) {\n loaderConfig = __PLAYGROUND_MONACO_LOADER__;\n }\n } catch (e) {\n // ignore\n }\n\n loader.config(loaderConfig);\n}\ninitLoader();\n\nfunction getMonacoOptions() {\n try {\n return __PLAYGROUND_MONACO_OPTIONS__;\n } catch (e) {\n // ignore\n }\n return {};\n}\n\nexport type EditorProps = Partial<MonacoEditorProps>;\n\nexport function Editor(props: EditorProps) {\n const { options, className = '', ...rest } = props || {};\n\n return (\n <div className={`rspress-playground-editor ${className}`}>\n <MonacoEditor\n {...rest}\n theme=\"light\"\n options={{\n minimap: {\n enabled: true,\n autohide: true,\n },\n fontSize: 14,\n lineNumbersMinChars: 7,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n wordBasedSuggestions: true,\n quickSuggestions: true,\n scrollbar: {\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n },\n scrollPredominantAxis: false,\n ...getMonacoOptions(),\n ...options,\n }}\n />\n </div>\n );\n}\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","import type { Node } from '@babel/types';\nimport React, { Component, HTMLAttributes } from 'react';\nimport {\n createGetImport,\n createObjectPattern,\n createVariableDeclaration,\n} from './ast';\nimport { getBabel } from './babel';\n\ninterface RunnerProps extends HTMLAttributes<HTMLDivElement> {\n code: string;\n language: string;\n getImport: (name: string, getDefault?: boolean) => void;\n}\n\ninterface RunnerState {\n error?: Error;\n comp: any;\n}\n\nconst DEBOUNCE_TIME = 800;\n\nclass Runner extends Component<RunnerProps, RunnerState> {\n static getDerivedStateFromError(error: Error) {\n return {\n error,\n comp: null,\n };\n }\n\n timer: any;\n\n constructor(props: RunnerProps) {\n super(props);\n\n this.state = {\n error: undefined,\n comp: null,\n };\n\n this.doCompile = this.doCompile.bind(this);\n this.waitCompile = this.waitCompile.bind(this);\n }\n\n waitCompile(targetCode: string) {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.doCompile(targetCode);\n }, DEBOUNCE_TIME);\n }\n\n async doCompile(targetCode: string) {\n const { language, getImport } = this.props;\n const babel = await getBabel();\n try {\n const presets = [\n [babel.availablePresets.react],\n [babel.availablePresets.env, { modules: 'commonjs' }],\n ];\n if (language === 'tsx' || language === 'ts') {\n presets.unshift([\n babel.availablePresets.typescript,\n {\n allExtensions: true,\n isTSX: language === 'tsx',\n },\n ]);\n }\n const result = babel.transform(targetCode, {\n sourceType: 'module',\n sourceMaps: 'inline',\n presets,\n plugins: [\n {\n pre() {\n this.hasReactImported = false;\n },\n visitor: {\n ImportDeclaration(path) {\n const pkg = path.node.source.value;\n const code: Node[] = [];\n const specifiers: string[] = [];\n for (const specifier of path.node.specifiers) {\n if (specifier.local.name === 'React') {\n this.hasReactImported = true;\n }\n // import X from 'xxx'\n if (specifier.type === 'ImportDefaultSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg, true),\n ),\n );\n }\n // import * as X from 'xxx'\n if (specifier.type === 'ImportNamespaceSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg),\n ),\n );\n }\n // import { a, b, c } from 'xxx'\n if (specifier.type === 'ImportSpecifier') {\n // const {${specifier.local.name}} = __get_import()\n specifiers.push(specifier.local.name);\n }\n }\n if (specifiers.length > 0) {\n code.push(\n createVariableDeclaration(\n createObjectPattern(specifiers),\n createGetImport(pkg),\n ),\n );\n }\n path.replaceWithMultiple(code);\n },\n },\n post(file) {\n // Auto import React\n if (!this.hasReactImported) {\n file.ast.program.body.unshift(\n createVariableDeclaration(\n 'React',\n createGetImport('react', true),\n ),\n );\n }\n },\n },\n ],\n });\n\n // Code has been updated\n if (targetCode !== this.props.code || !result || !result.code) {\n return;\n }\n\n const runExports: any = {};\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const func = new Function('__get_import', 'exports', result.code);\n func(getImport, runExports);\n\n if (runExports.default) {\n this.setState({\n error: undefined,\n comp: React.createElement(runExports.default),\n });\n return;\n }\n\n this.setState({\n error: new Error('No default export'),\n });\n } catch (e) {\n // Code has been updated\n if (targetCode !== this.props.code) {\n return;\n }\n console.error(e);\n this.setState({\n error: e as Error,\n });\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(error);\n console.error(errorInfo);\n }\n\n componentDidMount() {\n this.doCompile(this.props.code);\n }\n\n componentDidUpdate(prevProps: RunnerProps) {\n if (prevProps.code !== this.props.code) {\n this.waitCompile(this.props.code);\n }\n }\n\n render() {\n const { className = '', code, language, getImport, ...rest } = this.props;\n const { error, comp } = this.state;\n\n return (\n <div className={`rspress-playground-runner ${className}`} {...rest}>\n {comp}\n {error && (\n <pre className=\"rspress-playground-error\">{error.message}</pre>\n )}\n </div>\n );\n }\n}\n\nexport { Runner };\n","import type {\n CallExpression,\n Expression,\n ObjectPattern,\n VariableDeclaration,\n} from '@babel/types';\n\nexport function createVariableDeclaration(\n id: string | ObjectPattern,\n init: Expression,\n): VariableDeclaration {\n return {\n type: 'VariableDeclaration',\n declarations: [\n {\n type: 'VariableDeclarator',\n id:\n typeof id === 'string'\n ? {\n type: 'Identifier',\n name: id,\n }\n : id,\n init,\n },\n ],\n kind: 'const',\n };\n}\n\nexport function createObjectPattern(names: string[]): ObjectPattern {\n return {\n type: 'ObjectPattern',\n properties: names.map(name => ({\n type: 'ObjectProperty',\n key: {\n type: 'Identifier',\n name,\n },\n computed: false,\n method: false,\n shorthand: true,\n value: {\n type: 'Identifier',\n name,\n },\n })),\n };\n}\n\nexport function createGetImport(\n name: string,\n getDefault?: boolean,\n): CallExpression {\n return {\n type: 'CallExpression',\n callee: {\n type: 'Identifier',\n name: '__get_import',\n },\n arguments: [\n {\n type: 'StringLiteral',\n value: name,\n },\n {\n type: 'BooleanLiteral',\n value: Boolean(getDefault),\n },\n ],\n };\n}\n","import type babel from '@babel/standalone';\n\ntype Babel = typeof babel;\n\ndeclare global {\n interface Window {\n Babel: Babel;\n }\n}\n\nfunction getBabel(): Babel | Promise<Babel> {\n if (window.Babel) {\n return window.Babel;\n }\n const el = document.getElementById('rspress-playground-babel');\n if (!el) {\n throw new Error('Babel not found');\n }\n return new Promise(resolve => {\n el.addEventListener('load', () => {\n resolve(window.Babel);\n });\n });\n}\n\nexport { getBabel };\n"]}
@@ -18,7 +18,6 @@ import MonacoEditor, {
18
18
  } from "@monaco-editor/react";
19
19
 
20
20
  // src/web/constant.ts
21
- var DEFAULT_BABEL_URL = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js";
22
21
  var DEFAULT_MONACO_URL = "https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs";
23
22
 
24
23
  // src/web/editor.tsx
@@ -135,41 +134,25 @@ function createGetImport(name, getDefault) {
135
134
  };
136
135
  }
137
136
 
138
- // src/web/utils.ts
139
- var loadingMap = /* @__PURE__ */ new Map();
140
- function loadScript(url) {
141
- const exists = loadingMap.get(url);
142
- if (exists) {
143
- return exists;
144
- }
145
- const n = new Promise((resolve) => {
146
- const e = document.createElement("script");
147
- e.src = url;
148
- e.onload = () => resolve();
149
- document.body.appendChild(e);
150
- });
151
- loadingMap.set(url, n);
152
- return n;
153
- }
154
-
155
137
  // src/web/babel.ts
156
- async function getBabel() {
157
- if (!window.Babel) {
158
- let babelUrl = DEFAULT_BABEL_URL;
159
- try {
160
- const u = __PLAYGROUND_BABEL_URL__;
161
- if (u) {
162
- babelUrl = u;
163
- }
164
- } catch (e) {
165
- }
166
- await loadScript(babelUrl);
138
+ function getBabel() {
139
+ if (window.Babel) {
140
+ return window.Babel;
167
141
  }
168
- return window.Babel;
142
+ const el = document.getElementById("rspress-playground-babel");
143
+ if (!el) {
144
+ throw new Error("Babel not found");
145
+ }
146
+ return new Promise((resolve) => {
147
+ el.addEventListener("load", () => {
148
+ resolve(window.Babel);
149
+ });
150
+ });
169
151
  }
170
152
 
171
153
  // src/web/runner.tsx
172
- import { jsx as jsx2 } from "react/jsx-runtime";
154
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
155
+ var DEBOUNCE_TIME = 800;
173
156
  var Runner = class extends Component {
174
157
  constructor(props) {
175
158
  super(props);
@@ -194,7 +177,7 @@ var Runner = class extends Component {
194
177
  this.timer = setTimeout(() => {
195
178
  this.timer = null;
196
179
  this.doCompile(targetCode);
197
- }, 600);
180
+ }, DEBOUNCE_TIME);
198
181
  }
199
182
  async doCompile(targetCode) {
200
183
  const { language, getImport } = this.props;
@@ -215,14 +198,22 @@ var Runner = class extends Component {
215
198
  }
216
199
  const result = babel.transform(targetCode, {
217
200
  sourceType: "module",
201
+ sourceMaps: "inline",
218
202
  presets,
219
203
  plugins: [
220
204
  {
205
+ pre() {
206
+ this.hasReactImported = false;
207
+ },
221
208
  visitor: {
222
209
  ImportDeclaration(path) {
223
210
  const pkg = path.node.source.value;
224
211
  const code = [];
212
+ const specifiers = [];
225
213
  for (const specifier of path.node.specifiers) {
214
+ if (specifier.local.name === "React") {
215
+ this.hasReactImported = true;
216
+ }
226
217
  if (specifier.type === "ImportDefaultSpecifier") {
227
218
  code.push(
228
219
  createVariableDeclaration(
@@ -240,16 +231,29 @@ var Runner = class extends Component {
240
231
  );
241
232
  }
242
233
  if (specifier.type === "ImportSpecifier") {
243
- code.push(
244
- createVariableDeclaration(
245
- createObjectPattern([specifier.local.name]),
246
- createGetImport(pkg)
247
- )
248
- );
234
+ specifiers.push(specifier.local.name);
249
235
  }
250
236
  }
237
+ if (specifiers.length > 0) {
238
+ code.push(
239
+ createVariableDeclaration(
240
+ createObjectPattern(specifiers),
241
+ createGetImport(pkg)
242
+ )
243
+ );
244
+ }
251
245
  path.replaceWithMultiple(code);
252
246
  }
247
+ },
248
+ post(file) {
249
+ if (!this.hasReactImported) {
250
+ file.ast.program.body.unshift(
251
+ createVariableDeclaration(
252
+ "React",
253
+ createGetImport("react", true)
254
+ )
255
+ );
256
+ }
253
257
  }
254
258
  }
255
259
  ]
@@ -268,8 +272,7 @@ var Runner = class extends Component {
268
272
  return;
269
273
  }
270
274
  this.setState({
271
- error: new Error("No default export"),
272
- comp: null
275
+ error: new Error("No default export")
273
276
  });
274
277
  } catch (e) {
275
278
  if (targetCode !== this.props.code) {
@@ -277,8 +280,7 @@ var Runner = class extends Component {
277
280
  }
278
281
  console.error(e);
279
282
  this.setState({
280
- error: e,
281
- comp: null
283
+ error: e
282
284
  });
283
285
  }
284
286
  }
@@ -297,10 +299,10 @@ var Runner = class extends Component {
297
299
  render() {
298
300
  const { className = "", code, language, getImport, ...rest } = this.props;
299
301
  const { error, comp } = this.state;
300
- if (error) {
301
- return /* @__PURE__ */ jsx2("div", { className: `rspress-playground-runner ${className}`, ...rest, children: /* @__PURE__ */ jsx2("span", { style: { color: "red" }, children: error.message }) });
302
- }
303
- return /* @__PURE__ */ jsx2("div", { className: `rspress-playground-runner ${className}`, ...rest, children: comp });
302
+ return /* @__PURE__ */ jsxs("div", { className: `rspress-playground-runner ${className}`, ...rest, children: [
303
+ comp,
304
+ error && /* @__PURE__ */ jsx2("pre", { className: "rspress-playground-error", children: error.message })
305
+ ] });
304
306
  }
305
307
  };
306
308
  export {
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["default","loader"],"sources":["../../../src/web/index.ts","../../../src/web/editor.tsx","../../../src/web/constant.ts","../../../src/web/runner.tsx","../../../src/web/ast.ts","../../../src/web/utils.ts","../../../src/web/babel.ts"],"sourcesContent":["export {\n default as MonacoEditor,\n loader as MonacoEditorLoader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nexport { Editor } from './editor';\nexport { Runner } from './runner';\n","import React from 'react';\nimport MonacoEditor, {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { DEFAULT_MONACO_URL } from './constant';\n\n// inject by builder in cli/index.ts\n// see: https://modernjs.dev/builder/api/config-source.html#sourcedefine\ndeclare global {\n const __PLAYGROUND_MONACO_LOADER__: any;\n const __PLAYGROUND_MONACO_OPTIONS__: any;\n}\n\nfunction initLoader() {\n let loaderConfig = {\n paths: {\n vs: DEFAULT_MONACO_URL,\n },\n };\n\n try {\n const keys = Object.keys(__PLAYGROUND_MONACO_LOADER__);\n\n if (keys.length > 0) {\n loaderConfig = __PLAYGROUND_MONACO_LOADER__;\n }\n } catch (e) {\n // ignore\n }\n\n loader.config(loaderConfig);\n}\ninitLoader();\n\nfunction getMonacoOptions() {\n try {\n return __PLAYGROUND_MONACO_OPTIONS__;\n } catch (e) {\n // ignore\n }\n return {};\n}\n\nexport type EditorProps = Partial<MonacoEditorProps>;\n\nexport function Editor(props: EditorProps) {\n const { options, className = '', ...rest } = props || {};\n\n return (\n <div className={`rspress-playground-editor ${className}`}>\n <MonacoEditor\n {...rest}\n theme=\"light\"\n options={{\n minimap: {\n enabled: true,\n autohide: true,\n },\n fontSize: 14,\n lineNumbersMinChars: 7,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n wordBasedSuggestions: true,\n quickSuggestions: true,\n scrollbar: {\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n },\n scrollPredominantAxis: false,\n ...getMonacoOptions(),\n ...options,\n }}\n />\n </div>\n );\n}\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","import type { Node } from '@babel/types';\nimport React, { Component, HTMLAttributes } from 'react';\nimport {\n createGetImport,\n createObjectPattern,\n createVariableDeclaration,\n} from './ast';\nimport { getBabel } from './babel';\n\ninterface RunnerProps extends HTMLAttributes<HTMLDivElement> {\n code: string;\n language: string;\n getImport: (name: string, getDefault?: boolean) => void;\n}\n\ninterface RunnerState {\n error?: Error;\n comp: any;\n}\n\nclass Runner extends Component<RunnerProps, RunnerState> {\n static getDerivedStateFromError(error: Error) {\n return {\n error,\n comp: null,\n };\n }\n\n timer: any;\n\n constructor(props: RunnerProps) {\n super(props);\n\n this.state = {\n error: undefined,\n comp: null,\n };\n\n this.doCompile = this.doCompile.bind(this);\n this.waitCompile = this.waitCompile.bind(this);\n }\n\n waitCompile(targetCode: string) {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.doCompile(targetCode);\n }, 600);\n }\n\n async doCompile(targetCode: string) {\n const { language, getImport } = this.props;\n const babel = await getBabel();\n try {\n const presets = [\n [babel.availablePresets.react],\n [babel.availablePresets.env, { modules: 'commonjs' }],\n ];\n if (language === 'tsx' || language === 'ts') {\n presets.unshift([\n babel.availablePresets.typescript,\n {\n allExtensions: true,\n isTSX: language === 'tsx',\n },\n ]);\n }\n const result = babel.transform(targetCode, {\n sourceType: 'module',\n presets,\n plugins: [\n {\n visitor: {\n ImportDeclaration(path) {\n const pkg = path.node.source.value;\n const code: Node[] = [];\n for (const specifier of path.node.specifiers) {\n // import X from 'xxx'\n if (specifier.type === 'ImportDefaultSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg, true),\n ),\n );\n }\n // import * as X from 'xxx'\n if (specifier.type === 'ImportNamespaceSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg),\n ),\n );\n }\n // import { a, b, c } from 'xxx'\n if (specifier.type === 'ImportSpecifier') {\n // const {${specifier.local.name}} = __get_import()\n code.push(\n createVariableDeclaration(\n createObjectPattern([specifier.local.name]),\n createGetImport(pkg),\n ),\n );\n }\n }\n path.replaceWithMultiple(code);\n },\n },\n },\n ],\n });\n\n // Code has been updated\n if (targetCode !== this.props.code || !result || !result.code) {\n return;\n }\n\n const runExports: any = {};\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const func = new Function('__get_import', 'exports', result.code);\n func(getImport, runExports);\n\n if (runExports.default) {\n this.setState({\n error: undefined,\n comp: React.createElement(runExports.default),\n });\n return;\n }\n\n this.setState({\n error: new Error('No default export'),\n comp: null,\n });\n } catch (e) {\n // Code has been updated\n if (targetCode !== this.props.code) {\n return;\n }\n console.error(e);\n this.setState({\n error: e as Error,\n comp: null,\n });\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(error);\n console.error(errorInfo);\n }\n\n componentDidMount() {\n this.doCompile(this.props.code);\n }\n\n componentDidUpdate(prevProps: RunnerProps) {\n if (prevProps.code !== this.props.code) {\n this.waitCompile(this.props.code);\n }\n }\n\n render() {\n const { className = '', code, language, getImport, ...rest } = this.props;\n const { error, comp } = this.state;\n\n if (error) {\n return (\n <div className={`rspress-playground-runner ${className}`} {...rest}>\n <span style={{ color: 'red' }}>{error.message}</span>\n </div>\n );\n }\n\n return (\n <div className={`rspress-playground-runner ${className}`} {...rest}>\n {comp}\n </div>\n );\n }\n}\n\nexport { Runner };\n","import type {\n CallExpression,\n Expression,\n ObjectPattern,\n VariableDeclaration,\n} from '@babel/types';\n\nexport function createVariableDeclaration(\n id: string | ObjectPattern,\n init: Expression,\n): VariableDeclaration {\n return {\n type: 'VariableDeclaration',\n declarations: [\n {\n type: 'VariableDeclarator',\n id:\n typeof id === 'string'\n ? {\n type: 'Identifier',\n name: id,\n }\n : id,\n init,\n },\n ],\n kind: 'const',\n };\n}\n\nexport function createObjectPattern(names: string[]): ObjectPattern {\n return {\n type: 'ObjectPattern',\n properties: names.map(name => ({\n type: 'ObjectProperty',\n key: {\n type: 'Identifier',\n name,\n },\n computed: false,\n method: false,\n shorthand: true,\n value: {\n type: 'Identifier',\n name,\n },\n })),\n };\n}\n\nexport function createGetImport(\n name: string,\n getDefault?: boolean,\n): CallExpression {\n return {\n type: 'CallExpression',\n callee: {\n type: 'Identifier',\n name: '__get_import',\n },\n arguments: [\n {\n type: 'StringLiteral',\n value: name,\n },\n {\n type: 'BooleanLiteral',\n value: Boolean(getDefault),\n },\n ],\n };\n}\n","const loadingMap = new Map<string, Promise<void>>();\n\nexport function loadScript(url: string): Promise<void> {\n const exists = loadingMap.get(url);\n if (exists) {\n return exists;\n }\n const n: Promise<void> = new Promise(resolve => {\n const e = document.createElement('script');\n e.src = url;\n e.onload = () => resolve();\n document.body.appendChild(e);\n });\n loadingMap.set(url, n);\n return n;\n}\n\nexport function normalizeUrl(u: string) {\n return u.replace(/\\/\\//g, '/');\n}\n","import type babel from '@babel/standalone';\nimport { DEFAULT_BABEL_URL } from './constant';\nimport { loadScript } from './utils';\n\ndeclare global {\n // inject by builder in cli/index.ts\n // see: https://modernjs.dev/builder/api/config-source.html#sourcedefine\n const __PLAYGROUND_BABEL_URL__: any;\n interface Window {\n Babel: typeof babel;\n }\n}\n\nasync function getBabel() {\n if (!window.Babel) {\n let babelUrl = DEFAULT_BABEL_URL;\n try {\n const u = __PLAYGROUND_BABEL_URL__;\n if (u) {\n babelUrl = u;\n }\n } catch (e) {\n // ignore\n }\n await loadScript(babelUrl);\n }\n return window.Babel;\n}\n\nexport { getBabel };\n"]}
1
+ {"version":3,"mappings":"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","names":["default","loader"],"sources":["../../../src/web/index.ts","../../../src/web/editor.tsx","../../../src/web/constant.ts","../../../src/web/runner.tsx","../../../src/web/ast.ts","../../../src/web/babel.ts"],"sourcesContent":["export {\n default as MonacoEditor,\n loader as MonacoEditorLoader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nexport { Editor } from './editor';\nexport { Runner } from './runner';\n","import React from 'react';\nimport MonacoEditor, {\n loader,\n EditorProps as MonacoEditorProps,\n} from '@monaco-editor/react';\nimport { DEFAULT_MONACO_URL } from './constant';\n\n// inject by builder in cli/index.ts\n// see: https://modernjs.dev/builder/api/config-source.html#sourcedefine\ndeclare global {\n const __PLAYGROUND_MONACO_LOADER__: any;\n const __PLAYGROUND_MONACO_OPTIONS__: any;\n}\n\nfunction initLoader() {\n let loaderConfig = {\n paths: {\n vs: DEFAULT_MONACO_URL,\n },\n };\n\n try {\n const keys = Object.keys(__PLAYGROUND_MONACO_LOADER__);\n\n if (keys.length > 0) {\n loaderConfig = __PLAYGROUND_MONACO_LOADER__;\n }\n } catch (e) {\n // ignore\n }\n\n loader.config(loaderConfig);\n}\ninitLoader();\n\nfunction getMonacoOptions() {\n try {\n return __PLAYGROUND_MONACO_OPTIONS__;\n } catch (e) {\n // ignore\n }\n return {};\n}\n\nexport type EditorProps = Partial<MonacoEditorProps>;\n\nexport function Editor(props: EditorProps) {\n const { options, className = '', ...rest } = props || {};\n\n return (\n <div className={`rspress-playground-editor ${className}`}>\n <MonacoEditor\n {...rest}\n theme=\"light\"\n options={{\n minimap: {\n enabled: true,\n autohide: true,\n },\n fontSize: 14,\n lineNumbersMinChars: 7,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n wordBasedSuggestions: true,\n quickSuggestions: true,\n scrollbar: {\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n },\n scrollPredominantAxis: false,\n ...getMonacoOptions(),\n ...options,\n }}\n />\n </div>\n );\n}\n","export const DEFAULT_BABEL_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.22.20/babel.min.js';\n\nexport const DEFAULT_MONACO_URL =\n 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.43.0/min/vs';\n","import type { Node } from '@babel/types';\nimport React, { Component, HTMLAttributes } from 'react';\nimport {\n createGetImport,\n createObjectPattern,\n createVariableDeclaration,\n} from './ast';\nimport { getBabel } from './babel';\n\ninterface RunnerProps extends HTMLAttributes<HTMLDivElement> {\n code: string;\n language: string;\n getImport: (name: string, getDefault?: boolean) => void;\n}\n\ninterface RunnerState {\n error?: Error;\n comp: any;\n}\n\nconst DEBOUNCE_TIME = 800;\n\nclass Runner extends Component<RunnerProps, RunnerState> {\n static getDerivedStateFromError(error: Error) {\n return {\n error,\n comp: null,\n };\n }\n\n timer: any;\n\n constructor(props: RunnerProps) {\n super(props);\n\n this.state = {\n error: undefined,\n comp: null,\n };\n\n this.doCompile = this.doCompile.bind(this);\n this.waitCompile = this.waitCompile.bind(this);\n }\n\n waitCompile(targetCode: string) {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.doCompile(targetCode);\n }, DEBOUNCE_TIME);\n }\n\n async doCompile(targetCode: string) {\n const { language, getImport } = this.props;\n const babel = await getBabel();\n try {\n const presets = [\n [babel.availablePresets.react],\n [babel.availablePresets.env, { modules: 'commonjs' }],\n ];\n if (language === 'tsx' || language === 'ts') {\n presets.unshift([\n babel.availablePresets.typescript,\n {\n allExtensions: true,\n isTSX: language === 'tsx',\n },\n ]);\n }\n const result = babel.transform(targetCode, {\n sourceType: 'module',\n sourceMaps: 'inline',\n presets,\n plugins: [\n {\n pre() {\n this.hasReactImported = false;\n },\n visitor: {\n ImportDeclaration(path) {\n const pkg = path.node.source.value;\n const code: Node[] = [];\n const specifiers: string[] = [];\n for (const specifier of path.node.specifiers) {\n if (specifier.local.name === 'React') {\n this.hasReactImported = true;\n }\n // import X from 'xxx'\n if (specifier.type === 'ImportDefaultSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg, true),\n ),\n );\n }\n // import * as X from 'xxx'\n if (specifier.type === 'ImportNamespaceSpecifier') {\n // const ${specifier.local.name} = __get_import()\n code.push(\n createVariableDeclaration(\n specifier.local.name,\n createGetImport(pkg),\n ),\n );\n }\n // import { a, b, c } from 'xxx'\n if (specifier.type === 'ImportSpecifier') {\n // const {${specifier.local.name}} = __get_import()\n specifiers.push(specifier.local.name);\n }\n }\n if (specifiers.length > 0) {\n code.push(\n createVariableDeclaration(\n createObjectPattern(specifiers),\n createGetImport(pkg),\n ),\n );\n }\n path.replaceWithMultiple(code);\n },\n },\n post(file) {\n // Auto import React\n if (!this.hasReactImported) {\n file.ast.program.body.unshift(\n createVariableDeclaration(\n 'React',\n createGetImport('react', true),\n ),\n );\n }\n },\n },\n ],\n });\n\n // Code has been updated\n if (targetCode !== this.props.code || !result || !result.code) {\n return;\n }\n\n const runExports: any = {};\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const func = new Function('__get_import', 'exports', result.code);\n func(getImport, runExports);\n\n if (runExports.default) {\n this.setState({\n error: undefined,\n comp: React.createElement(runExports.default),\n });\n return;\n }\n\n this.setState({\n error: new Error('No default export'),\n });\n } catch (e) {\n // Code has been updated\n if (targetCode !== this.props.code) {\n return;\n }\n console.error(e);\n this.setState({\n error: e as Error,\n });\n }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(error);\n console.error(errorInfo);\n }\n\n componentDidMount() {\n this.doCompile(this.props.code);\n }\n\n componentDidUpdate(prevProps: RunnerProps) {\n if (prevProps.code !== this.props.code) {\n this.waitCompile(this.props.code);\n }\n }\n\n render() {\n const { className = '', code, language, getImport, ...rest } = this.props;\n const { error, comp } = this.state;\n\n return (\n <div className={`rspress-playground-runner ${className}`} {...rest}>\n {comp}\n {error && (\n <pre className=\"rspress-playground-error\">{error.message}</pre>\n )}\n </div>\n );\n }\n}\n\nexport { Runner };\n","import type {\n CallExpression,\n Expression,\n ObjectPattern,\n VariableDeclaration,\n} from '@babel/types';\n\nexport function createVariableDeclaration(\n id: string | ObjectPattern,\n init: Expression,\n): VariableDeclaration {\n return {\n type: 'VariableDeclaration',\n declarations: [\n {\n type: 'VariableDeclarator',\n id:\n typeof id === 'string'\n ? {\n type: 'Identifier',\n name: id,\n }\n : id,\n init,\n },\n ],\n kind: 'const',\n };\n}\n\nexport function createObjectPattern(names: string[]): ObjectPattern {\n return {\n type: 'ObjectPattern',\n properties: names.map(name => ({\n type: 'ObjectProperty',\n key: {\n type: 'Identifier',\n name,\n },\n computed: false,\n method: false,\n shorthand: true,\n value: {\n type: 'Identifier',\n name,\n },\n })),\n };\n}\n\nexport function createGetImport(\n name: string,\n getDefault?: boolean,\n): CallExpression {\n return {\n type: 'CallExpression',\n callee: {\n type: 'Identifier',\n name: '__get_import',\n },\n arguments: [\n {\n type: 'StringLiteral',\n value: name,\n },\n {\n type: 'BooleanLiteral',\n value: Boolean(getDefault),\n },\n ],\n };\n}\n","import type babel from '@babel/standalone';\n\ntype Babel = typeof babel;\n\ndeclare global {\n interface Window {\n Babel: Babel;\n }\n}\n\nfunction getBabel(): Babel | Promise<Babel> {\n if (window.Babel) {\n return window.Babel;\n }\n const el = document.getElementById('rspress-playground-babel');\n if (!el) {\n throw new Error('Babel not found');\n }\n return new Promise(resolve => {\n el.addEventListener('load', () => {\n resolve(window.Babel);\n });\n });\n}\n\nexport { getBabel };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rspress/plugin-playground",
3
- "version": "1.1.3",
3
+ "version": "1.2.1",
4
4
  "description": "A plugin for rspress to preview the code block in markdown/mdx file.",
5
5
  "bugs": "https://github.com/web-infra-dev/rspress/issues",
6
6
  "repository": {
@@ -33,12 +33,12 @@
33
33
  ],
34
34
  "dependencies": {
35
35
  "@mdx-js/mdx": "2.2.1",
36
- "@modern-js/utils": "2.37.1",
36
+ "@modern-js/utils": "2.38.0",
37
37
  "@monaco-editor/react": "~4.4.6",
38
38
  "@oxidation-compiler/napi": "^0.1.0",
39
39
  "remark-gfm": "3.0.1",
40
40
  "rspack-plugin-virtual-module": "0.1.12",
41
- "@rspress/shared": "1.1.3"
41
+ "@rspress/shared": "1.2.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@babel/types": "^7.22.17",
@@ -1,12 +1,50 @@
1
- import React, { HTMLAttributes, useCallback, useState } from 'react';
1
+ import React, { HTMLAttributes, ReactNode, useCallback, useState } from 'react';
2
2
  import getImport from '_rspress_playground_imports';
3
+ import { usePageData } from '@rspress/core/runtime';
3
4
  import { Editor, Runner } from '../../dist/web/esm';
4
5
 
5
- interface PlaygroundProps extends HTMLAttributes<HTMLDivElement> {
6
+ // inject by builder in cli/index.ts
7
+ declare global {
8
+ const __PLAYGROUND_DIRECTION__: any;
9
+ }
10
+
11
+ type Direction = 'horizontal' | 'vertical';
12
+
13
+ export interface PlaygroundProps extends HTMLAttributes<HTMLDivElement> {
6
14
  code: string;
7
15
  language: string;
8
- direction?: 'horizontal' | 'vertical';
16
+ direction?: Direction;
9
17
  editorPosition?: 'left' | 'right';
18
+ renderChildren?: (
19
+ props: PlaygroundProps,
20
+ code: string,
21
+ direction: Direction,
22
+ ) => ReactNode;
23
+ }
24
+
25
+ function useDirection(props: PlaygroundProps): Direction {
26
+ const { page } = usePageData();
27
+ const { frontmatter = {} } = page;
28
+ const { playgroundDirection } = frontmatter;
29
+
30
+ // from props
31
+ if (props.direction) {
32
+ return props.direction;
33
+ }
34
+
35
+ // from page frontmatter
36
+ if (playgroundDirection) {
37
+ return playgroundDirection as Direction;
38
+ }
39
+
40
+ // inject by config
41
+ try {
42
+ return __PLAYGROUND_DIRECTION__;
43
+ } catch (e) {
44
+ // ignore
45
+ }
46
+
47
+ return 'horizontal';
10
48
  }
11
49
 
12
50
  export default function Playground(props: PlaygroundProps) {
@@ -14,11 +52,14 @@ export default function Playground(props: PlaygroundProps) {
14
52
  code: codeProp,
15
53
  language,
16
54
  className = '',
17
- direction = 'horizontal',
55
+ direction: directionProp,
18
56
  editorPosition,
57
+ renderChildren,
19
58
  ...rest
20
59
  } = props;
21
60
 
61
+ const direction = useDirection(props);
62
+
22
63
  const [code, setCode] = useState(codeProp);
23
64
 
24
65
  const handleCodeChange = useCallback((e?: string) => {
@@ -46,6 +87,7 @@ export default function Playground(props: PlaygroundProps) {
46
87
  onChange={handleCodeChange}
47
88
  language={monacoLanguage}
48
89
  />
90
+ {renderChildren?.(props, code, direction)}
49
91
  </div>
50
92
  );
51
93
  }
@@ -19,7 +19,8 @@
19
19
  flex-direction: column;
20
20
  }
21
21
 
22
- .rspress-playground > .rspress-playground-runner {
22
+ .rspress-playground-runner {
23
+ position: relative;
23
24
  padding: 20px;
24
25
  overflow: auto;
25
26
  }
@@ -49,3 +50,19 @@
49
50
  .rspress-playground-vertical > .rspress-playground-editor {
50
51
  border-top: 1px solid rgba(28, 31, 35, 0.08);
51
52
  }
53
+
54
+ .rspress-playground-error {
55
+ width: 100%;
56
+ height: 100%;
57
+ position: absolute;
58
+ top: 0;
59
+ left: 0;
60
+ margin: 0;
61
+ box-sizing: border-box;
62
+ background: #a12027;
63
+ opacity: 0.86;
64
+ color: #fff;
65
+ padding: 10px;
66
+ overflow: auto;
67
+ font-size: 12px;
68
+ }