このコミットが含まれているのは:
@@ -0,0 +1,37 @@
|
||||
import * as jsxRuntime from 'react/jsx-runtime'
|
||||
import { ModuleKind, ScriptTarget, transpileModule } from 'typescript'
|
||||
|
||||
import { useMDXComponents } from '@/mdx-components'
|
||||
import viteConfig from '../../vite.config'
|
||||
|
||||
import type { ComponentType } from 'react'
|
||||
|
||||
type Transform = (source: string, id: string) => Promise<{ code: string } | null>
|
||||
|
||||
|
||||
export const transformMdx = async (source: string, suffix = '.mdx') => {
|
||||
const plugins = viteConfig.plugins?.flat () as { name: string; transform: Transform }[]
|
||||
const plugin = plugins.find (entry => entry.name === '@mdx-js/rollup')
|
||||
if (plugin == null)
|
||||
throw new Error ('The application MDX compiler is not registered')
|
||||
return plugin.transform.call (plugin, source, `/test/help-table${suffix}`)
|
||||
}
|
||||
|
||||
|
||||
export const compileMdx = async (source: string): Promise<ComponentType> => {
|
||||
const result = await transformMdx (source)
|
||||
if (result == null)
|
||||
throw new Error ('MDX was not compiled')
|
||||
const code = transpileModule (result.code, {
|
||||
compilerOptions: { module: ModuleKind.CommonJS, target: ScriptTarget.ES2022 } }).outputText
|
||||
const exports = { } as { default: ComponentType }
|
||||
const requireFixture = (name: string) => {
|
||||
if (name === 'react/jsx-runtime')
|
||||
return jsxRuntime
|
||||
if (name === '@/mdx-components')
|
||||
return { useMDXComponents }
|
||||
throw new Error (`Unexpected MDX dependency: ${name}`)
|
||||
}
|
||||
new Function ('require', 'exports', code) (requireFixture, exports)
|
||||
return exports.default
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import { createElement } from 'react'
|
||||
import { ModuleKind, ScriptTarget, transpileModule } from 'typescript'
|
||||
import { vi } from 'vitest'
|
||||
import { parse } from 'yaml'
|
||||
|
||||
import source from '@/lib/help.ts?raw'
|
||||
|
||||
import type { ReactElement } from 'react'
|
||||
|
||||
import type * as Help from '@/lib/help'
|
||||
|
||||
export const editionRows = [
|
||||
['guide', 'ja', '2026-10-01', '旧ホーム', '過去限定本文'],
|
||||
['guide', 'ja', '2026-10-02', 'ホーム', 'タグを検索する'],
|
||||
['guide', 'ja', '2026-10-02.2', 'ホーム第二版', '第二版本文'],
|
||||
['guide', 'ja', '2026-10-02.3', 'ホーム第三版', '第三版本文'],
|
||||
['guide', 'ja', '2026-10-02.10', 'ホーム第十版', '第十版本文'],
|
||||
['guide', 'en', '2026-10-02', 'Home', 'English body'],
|
||||
['設定 手順', 'ja', '2026-10-03', '設定', 'タグを設定する']] as const
|
||||
|
||||
const compiled = transpileModule (source.replaceAll ('import.meta', 'helpMeta'), {
|
||||
compilerOptions: { module: ModuleKind.CommonJS, target: ScriptTarget.ES2022 } }).outputText
|
||||
|
||||
|
||||
// Replace Vite's file-discovery boundary, executing the actual Help module.
|
||||
export const createHelpFixture = () => {
|
||||
const articles: Record<string, string> = {
|
||||
'../../help/guide/article.yml':
|
||||
'identifier: guide\nlanguages:\n ja:\n current_edition: 2026-10-02\n'
|
||||
+ ' en:\n current_edition: 2026-10-02\n',
|
||||
'../../help/設定 手順/article.yml':
|
||||
'identifier: 設定 手順\nlanguages:\n ja:\n current_edition: 2026-10-03\n' }
|
||||
const raw = Object.fromEntries (editionRows.map (([id, language, edition, title, body]) => [
|
||||
`../../help/${id}/editions/${language}/${edition}.mdx`,
|
||||
vi.fn (async () => `# ${title}\n\n${body}`)]))
|
||||
const modules = Object.fromEntries (editionRows.map (([id, language, edition, title, body]) => [
|
||||
`../../help/${id}/editions/${language}/${edition}.mdx`,
|
||||
vi.fn (async (): Promise<{ default: () => ReactElement }> => ({
|
||||
default: () => createElement ('div', null,
|
||||
createElement ('h1', null, title), createElement ('p', null, body)) }))]))
|
||||
const glob = (pattern: string, options?: { query?: string }) => {
|
||||
if (pattern.endsWith ('article.yml'))
|
||||
return articles
|
||||
if (pattern.endsWith ('*.mdx'))
|
||||
return options?.query === '?raw' ? raw : modules
|
||||
throw new Error (`Unexpected Help glob: ${pattern}`)
|
||||
}
|
||||
const api = { } as typeof Help
|
||||
const requireFixture = (name: string) => {
|
||||
if (name === 'yaml')
|
||||
return { parse }
|
||||
throw new Error (`Unexpected Help dependency: ${name}`)
|
||||
}
|
||||
new Function ('require', 'exports', 'helpMeta', compiled) (
|
||||
requireFixture, api, { glob })
|
||||
return { api, articles, raw, modules }
|
||||
}
|
||||
|
||||
|
||||
export const helpFixture = createHelpFixture ()
|
||||
新しいイシューから参照
ユーザーをブロックする