@aiquants/markdown 1.9.0 → 1.9.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.server.cjs","sources":["../src/plugins/remark-import-directive.async.server.ts","../src/plugins/transformUri.async.server.ts","../src/plugins/remark-resolve-uri.async.ts","../src/gen/markdown/v1/markdown_pb.ts","../src/gen/markdown/v1/markdown_connect.ts","../src/remarkProcessor.server.ts"],"sourcesContent":["/**\n * @file This file defines a remark plugin to handle `@import` directives in Markdown.\n * @brief このファイルは、Markdown 内の `@import` ディレクティブを処理するための remark プラグインを定義します。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport type { Root } from \"mdast\"\nimport type { Processor } from \"unified\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\n\ntype ParentNodeWithChildren = {\n children: unknown[]\n}\n\nconst importRegex = /<!--\\s+@import\\s+\"(.+?)\"\\s+-->/\n\n/**\n * A remark plugin to support `@import` directives in Markdown.\n * This allows importing content from other Markdown files.\n * Markdown の `@import` ディレクティブをサポートする remark プラグイン。\n * これにより、他の Markdown ファイルからコンテンツをインポート可能。\n *\n * @param this The remark processor instance. / remark プロセッサーのインスタンス。\n * @param options Options for the plugin. / プラグインのオプション。\n * @param options.markdownFilePath The path to the Markdown file being processed. / 処理対象の Markdown ファイルへのパス。\n */\nexport function remarkImportDirective(this: Processor, options: { markdownFilePath: string }) {\n return async (tree: Root): Promise<void> => {\n const { markdownFilePath } = options\n const parentDir = path.dirname(markdownFilePath)\n\n // すべてのインポートディレクティブを収集\n const imports: { parent: ParentNodeWithChildren; index: number; absolutePath: string }[] = []\n visit(tree, \"html\", (node, index, parent) => {\n if (!parent || typeof index !== \"number\") {\n return\n }\n\n const match = node.value.match(importRegex)\n if (!match) {\n return\n }\n\n const importPath = match[1]\n const absolutePath = path.resolve(parentDir, importPath)\n if (Array.isArray((parent as { children?: unknown[] }).children)) {\n imports.push({ parent: parent as ParentNodeWithChildren, index, absolutePath })\n }\n })\n\n if (imports.length === 0) {\n return\n }\n\n // すべてのファイルを読み込み、解析\n const parsedTrees = await Promise.all(\n imports.map(async ({ absolutePath }) => {\n try {\n const fileContent = await fs.readFile(absolutePath, \"utf-8\")\n return this.parse(fileContent) as Root\n } catch (error) {\n if (error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n Logger.warn(`[remark-import-directive] Import file not found: ${absolutePath}`)\n } else {\n Logger.error(`[remark-import-directive] Error processing import: ${absolutePath}`, error)\n }\n return null // エラー時は null を返却\n }\n }),\n )\n\n // ツリー内のノードを後方から置換\n for (let i = imports.length - 1; i >= 0; i--) {\n const { parent, index } = imports[i]\n const newTree = parsedTrees[i]\n\n if (newTree?.children && Array.isArray(newTree.children)) {\n parent.children.splice(index, 1, ...newTree.children)\n }\n }\n }\n}\n","/**\n * @file Async version of transformUri for file existence validation.\n * @brief ファイル存在確認を含む transformUri の非同期版。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport urlJoin from \"url-join\"\nimport { Logger } from \"../utils/simple-logger\"\n\n// RFC 3986 URI scheme regex\nconst URI_SCHEME_REGEX = /^[a-z][a-z0-9+.-]*:/\n\n/**\n * Async version of transformUri that validates file existence.\n * ファイル存在確認を行う transformUri の非同期版。\n *\n * @param uri The URI to transform. / 変換対象の URI。\n * @param isImage Whether this is an image URI. / 画像 URI かどうか。\n * @param markdownFilePath Path to the markdown file. / Markdown ファイルのパス。\n * @param workspaceRoot Workspace root directory. / ワークスペースのルートディレクトリ。\n * @param validateExistence Whether to validate file existence. / ファイル存在確認を行うかどうか。\n * @returns Promise resolving to the transformed URI. / 変換された URI を返す Promise。\n */\nexport const transformUriAsync = async (uri: string, isImage: boolean, markdownFilePath: string, workspaceRoot: string, validateExistence = false): Promise<string> => {\n if (!uri) {\n return \"\"\n }\n\n // 1. 絶対URL (http, https, mailto, tel) はそのまま返す\n if (URI_SCHEME_REGEX.test(uri)) {\n const protocol = uri.substring(0, uri.indexOf(\":\")).toLowerCase()\n if ([\"http\", \"https\", \"mailto\", \"tel\", \"file\"].includes(protocol)) {\n return uri\n }\n }\n\n // 2. アンカーリンク (#fragment) はそのまま返す\n if (uri.startsWith(\"#\")) {\n return uri\n }\n\n // 3. ルート相対パス (/) はそのまま返す\n if (uri.startsWith(\"/\")) {\n return uri\n }\n\n // 4. 相対パスをプロジェクトルートからのパスとして解決する\n const decodedUri = decodeURIComponent(uri)\n const markdownDir = path.dirname(markdownFilePath)\n const projectRelativePath = path.normalize(path.join(markdownDir, decodedUri))\n\n // セキュリティチェック\n const absolutePath = path.resolve(workspaceRoot, projectRelativePath)\n if (!absolutePath.startsWith(workspaceRoot) || projectRelativePath.startsWith(\"..\")) {\n Logger.error(`Security Alert: Attempt to access file outside project root: ${absolutePath}`)\n return \"\"\n }\n\n // ファイル存在確認(オプション)\n if (validateExistence) {\n try {\n await fs.access(absolutePath)\n } catch {\n Logger.warn(`File not found: ${absolutePath}`)\n return \"\"\n }\n }\n\n const pathForEncoding = projectRelativePath.replace(/\\\\/g, \"/\")\n\n if (isImage) {\n return urlJoin(\"/assets/\", pathForEncoding)\n }\n return `?filePath=${encodeURIComponent(pathForEncoding)}`\n}\n","/**\n * @file Async version of remark-resolve-uri plugin.\n * @brief URI 解決プラグインの非同期版。\n */\nimport * as cheerio from \"cheerio\"\nimport type { Html, Image, Link, Root } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\nimport { transformUriAsync } from \"./transformUri.async.server\"\n\ninterface Options {\n markdownFilePath: string\n workspaceRoot: string\n validateExistence?: boolean\n}\n\n/**\n * An async remark plugin to resolve image and link URIs with optional file validation.\n * ファイル検証オプション付きで画像とリンクの URI を解決する非同期 remark プラグイン。\n */\nexport function remarkResolveUriAsync(options: Options) {\n return async (tree: Root): Promise<void> => {\n if (!(options?.markdownFilePath && options?.workspaceRoot)) {\n Logger.warn(\"remark-resolve-uri-async: markdownFilePath and workspaceRoot are required. Skipping URI resolution.\")\n return\n }\n\n // すべての画像とリンクノードを収集\n const uriNodes: Array<{ node: Image | Link; isImage: boolean }> = []\n const htmlNodes: Array<Html> = []\n\n visit(tree, [\"image\", \"link\", \"html\"], (node) => {\n if (node.type === \"html\") {\n htmlNodes.push(node as Html)\n } else {\n const targetNode = node as Image | Link\n if (targetNode.url) {\n uriNodes.push({ node: targetNode, isImage: targetNode.type === \"image\" })\n }\n }\n })\n\n // 並列でURI変換を実行 (標準Markdownノード)\n const transformPromises = uriNodes.map(async ({ node, isImage }) => {\n const transformedUri = await transformUriAsync(node.url, isImage, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n node.url = transformedUri\n })\n\n // 並列でURI変換を実行 (HTMLノード内の属性)\n const htmlTransformPromises = htmlNodes.map(async (node) => {\n // HTMLフラグメントとしてロード (isDocument=false)\n const $ = cheerio.load(node.value, null, false)\n let modified = false\n\n // imgタグのsrc属性を変換\n const imgTags = $(\"img\").toArray()\n for (const img of imgTags) {\n const src = $(img).attr(\"src\")\n if (src) {\n const transformed = await transformUriAsync(src, true, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== src) {\n $(img).attr(\"src\", transformed)\n modified = true\n }\n }\n }\n\n // aタグのhref属性を変換\n const aTags = $(\"a\").toArray()\n for (const a of aTags) {\n const href = $(a).attr(\"href\")\n if (href) {\n const transformed = await transformUriAsync(href, false, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== href) {\n $(a).attr(\"href\", transformed)\n modified = true\n }\n }\n }\n\n if (modified) {\n // 変更があれば node.value を更新\n // html() はエンコードされた実体を返す可能性があるが、HTMLノードとしては許容される\n const newHtml = $.html()\n if (newHtml) {\n node.value = newHtml\n }\n }\n })\n\n await Promise.all([...transformPromises, ...htmlTransformPromises])\n }\n}\n","// @generated by protoc-gen-es v1.10.1 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from \"@bufbuild/protobuf\"\nimport { Message, proto3 } from \"@bufbuild/protobuf\"\n\n/**\n * @generated from message markdown.v1.ConvertRequest\n */\nexport class ConvertRequest extends Message<ConvertRequest> {\n /**\n * @generated from field: string markdown_text = 1;\n */\n markdownText = \"\"\n\n /**\n * @generated from field: string file_path = 2;\n */\n filePath = \"\"\n\n /**\n * @generated from field: string workspace_root = 3;\n */\n workspaceRoot = \"\"\n\n /**\n * @generated from field: bool validate_existence = 4;\n */\n validateExistence = false\n\n /**\n * @generated from field: optional bool enable_subscript = 5;\n */\n enableSubscript?: boolean\n\n /**\n * @generated from field: optional bool enable_superscript = 6;\n */\n enableSuperscript?: boolean\n\n /**\n * @generated from field: optional bool enable_mark = 7;\n */\n enableMark?: boolean\n\n /**\n * @generated from field: optional bool enable_table_merge = 8;\n */\n enableTableMerge?: boolean\n\n /**\n * @generated from field: optional bool enable_embeds = 9;\n */\n enableEmbeds?: boolean\n\n /**\n * @generated from field: optional bool enable_zenn_directives = 10;\n */\n enableZennDirectives?: boolean\n\n constructor(data?: PartialMessage<ConvertRequest>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertRequest\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"markdown_text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"file_path\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 3, name: \"workspace_root\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 4, name: \"validate_existence\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */ },\n { no: 5, name: \"enable_subscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 6, name: \"enable_superscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 7, name: \"enable_mark\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 8, name: \"enable_table_merge\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 9, name: \"enable_embeds\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 10, name: \"enable_zenn_directives\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertRequest {\n return new ConvertRequest().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertRequest | PlainMessage<ConvertRequest> | undefined, b: ConvertRequest | PlainMessage<ConvertRequest> | undefined): boolean {\n return proto3.util.equals(ConvertRequest, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.ConvertResponse\n */\nexport class ConvertResponse extends Message<ConvertResponse> {\n /**\n * @generated from field: string html_content = 1;\n */\n htmlContent = \"\"\n\n /**\n * @generated from field: repeated markdown.v1.Heading headings = 2;\n */\n headings: Heading[] = []\n\n constructor(data?: PartialMessage<ConvertResponse>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertResponse\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"html_content\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"headings\", kind: \"message\", T: Heading, repeated: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertResponse {\n return new ConvertResponse().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertResponse | PlainMessage<ConvertResponse> | undefined, b: ConvertResponse | PlainMessage<ConvertResponse> | undefined): boolean {\n return proto3.util.equals(ConvertResponse, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.Heading\n */\nexport class Heading extends Message<Heading> {\n /**\n * @generated from field: string text = 1;\n */\n text = \"\"\n\n /**\n * @generated from field: int32 depth = 2;\n */\n depth = 0\n\n /**\n * @generated from field: string id = 3;\n */\n id = \"\"\n\n constructor(data?: PartialMessage<Heading>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.Heading\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"depth\", kind: \"scalar\", T: 5 /* ScalarType.INT32 */ },\n { no: 3, name: \"id\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Heading {\n return new Heading().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJsonString(jsonString, options)\n }\n\n static equals(a: Heading | PlainMessage<Heading> | undefined, b: Heading | PlainMessage<Heading> | undefined): boolean {\n return proto3.util.equals(Heading, a, b)\n }\n}\n","// @generated by protoc-gen-connect-es v1.7.0 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport { MethodKind } from \"@bufbuild/protobuf\"\nimport { ConvertRequest, ConvertResponse } from \"./markdown_pb.js\"\n\n/**\n * @generated from service markdown.v1.MarkdownService\n */\nexport const MarkdownService = {\n typeName: \"markdown.v1.MarkdownService\",\n methods: {\n /**\n * @generated from rpc markdown.v1.MarkdownService.Convert\n */\n convert: {\n name: \"Convert\",\n I: ConvertRequest,\n O: ConvertResponse,\n kind: MethodKind.Unary,\n },\n },\n} as const\n","import { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport * as net from \"node:net\"\nimport * as path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createClient } from \"@connectrpc/connect\"\nimport { createConnectTransport } from \"@connectrpc/connect-node\"\nimport { MarkdownService } from \"./gen/markdown/v1/markdown_connect.ts\"\n\nconst SOCKET_PATH = process.env.MARKDOWN_SOCKET_PATH || \"/tmp/markdown.sock\"\n\nconst transport = createConnectTransport({\n baseUrl: \"http://localhost\",\n httpVersion: \"2\",\n nodeOptions: {\n createConnection: () => {\n return net.connect(SOCKET_PATH)\n },\n } as unknown as Record<string, unknown>,\n})\n\nconst client = createClient(MarkdownService, transport)\n\nexport interface ParseResult {\n htmlContent: string\n headings: Array<{\n text: string\n depth: number\n id: string\n }>\n}\n\nexport interface ParseOptions {\n validateExistence?: boolean\n enableSubscript?: boolean\n enableSuperscript?: boolean\n enableMark?: boolean\n enableTableMerge?: boolean\n enableEmbeds?: boolean\n enableZennDirectives?: boolean\n}\n\n// Get the current directory name in an ES Modules friendly way\nconst getDirname = () => {\n try {\n const __filename = fileURLToPath(import.meta.url)\n return path.dirname(__filename)\n } catch {\n return __dirname\n }\n}\n\n// Locate the Go server binary path inside the package or monorepo\nconst getBinaryPath = (): string | undefined => {\n const dir = getDirname()\n // 1. In the same directory as the transpile output (dist/markdown-api)\n const sameDir = path.join(dir, \"markdown-api\")\n if (existsSync(sameDir)) return sameDir\n\n // 2. Fallback to dist directory from src\n const distDir = path.join(dir, \"..\", \"dist\", \"markdown-api\")\n if (existsSync(distDir)) return distDir\n\n // 3. Fallback to monorepo go packages folder for dev environment\n const devDir = path.join(dir, \"..\", \"..\", \"go\", \"markdown-api\", \"markdown-api\")\n if (existsSync(devDir)) return devDir\n\n return undefined\n}\n\nconst canConnect = (): Promise<boolean> =>\n new Promise((resolve) => {\n const socket = net.connect(SOCKET_PATH)\n socket.on(\"connect\", () => {\n socket.destroy()\n resolve(true)\n })\n socket.on(\"error\", () => resolve(false))\n })\n\nconst waitForServer = async (timeoutMs: number): Promise<boolean> => {\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (await canConnect()) return true\n await new Promise((r) => setTimeout(r, 100))\n }\n return false\n}\n\nlet spawnedServer: any = null\nlet startPromise: Promise<boolean> | null = null\n\nconst ensureServerRunning = async (): Promise<boolean> => {\n if (await canConnect()) return true\n\n if (startPromise) return startPromise\n\n startPromise = (async () => {\n const binPath = getBinaryPath()\n if (!binPath) {\n console.warn(\"markdown-api binary not found. Cannot auto-start markdown server.\")\n return false\n }\n\n // Clean up stale socket file if it exists\n try {\n if (existsSync(SOCKET_PATH)) {\n const fs = await import(\"node:fs\")\n fs.unlinkSync(SOCKET_PATH)\n }\n } catch {\n // ignore\n }\n\n try {\n spawnedServer = spawn(binPath, [], { stdio: \"ignore\" })\n\n const cleanup = () => {\n if (spawnedServer) {\n try {\n spawnedServer.kill(\"SIGTERM\")\n } catch {\n // ignore\n }\n spawnedServer = null\n }\n }\n\n process.on(\"exit\", cleanup)\n\n const ready = await waitForServer(10000)\n if (!ready) {\n console.error(\"markdown-api Go server did not become ready on socket:\", SOCKET_PATH)\n cleanup()\n return false\n }\n return true\n } catch (err) {\n console.error(\"Failed to spawn markdown-api Go server:\", err)\n spawnedServer = null\n return false\n }\n })()\n\n const success = await startPromise\n if (!success) {\n startPromise = null\n }\n return success\n}\n\nexport const parseMarkdown = async (markdownText: string, markdownFilePath: string, workspaceRoot: string, userOAuthToken?: string, validateExistenceOrOptions: boolean | ParseOptions = true): Promise<ParseResult> => {\n // Automatically ensure the backend Go server is running\n await ensureServerRunning()\n\n let validateExistence = true\n let enableSubscript: boolean | undefined\n let enableSuperscript: boolean | undefined\n let enableMark: boolean | undefined\n let enableTableMerge: boolean | undefined\n let enableEmbeds: boolean | undefined\n let enableZennDirectives: boolean | undefined\n\n if (typeof validateExistenceOrOptions === \"boolean\") {\n validateExistence = validateExistenceOrOptions\n } else if (validateExistenceOrOptions && typeof validateExistenceOrOptions === \"object\") {\n validateExistence = validateExistenceOrOptions.validateExistence ?? true\n enableSubscript = validateExistenceOrOptions.enableSubscript\n enableSuperscript = validateExistenceOrOptions.enableSuperscript\n enableMark = validateExistenceOrOptions.enableMark\n enableTableMerge = validateExistenceOrOptions.enableTableMerge\n enableEmbeds = validateExistenceOrOptions.enableEmbeds\n enableZennDirectives = validateExistenceOrOptions.enableZennDirectives\n }\n\n const headers: Record<string, string> = {}\n if (userOAuthToken) {\n headers.Authorization = `Bearer ${userOAuthToken}`\n }\n\n const response = await client.convert(\n {\n markdownText,\n filePath: markdownFilePath,\n workspaceRoot,\n validateExistence,\n enableSubscript,\n enableSuperscript,\n enableMark,\n enableTableMerge,\n enableEmbeds,\n enableZennDirectives,\n },\n { headers },\n )\n\n return {\n htmlContent: response.htmlContent,\n headings: response.headings.map((h) => ({\n text: h.text,\n depth: h.depth,\n id: h.id,\n })),\n }\n}\n"],"names":["importRegex","remarkImportDirective","options","tree","markdownFilePath","parentDir","path","imports","visit","node","index","parent","match","importPath","absolutePath","parsedTrees","fileContent","fs","error","Logger","i","newTree","URI_SCHEME_REGEX","transformUriAsync","uri","isImage","workspaceRoot","validateExistence","protocol","decodedUri","markdownDir","projectRelativePath","pathForEncoding","urlJoin","remarkResolveUriAsync","uriNodes","htmlNodes","targetNode","transformPromises","transformedUri","htmlTransformPromises","$","cheerio","modified","imgTags","img","src","transformed","aTags","a","href","newHtml","ConvertRequest","Message","data","proto3","bytes","jsonValue","jsonString","b","ConvertResponse","Heading","MarkdownService","MethodKind","SOCKET_PATH","transport","createConnectTransport","net","client","createClient","getDirname","__filename","fileURLToPath","getBinaryPath","dir","sameDir","existsSync","distDir","devDir","canConnect","resolve","socket","waitForServer","timeoutMs","start","spawnedServer","startPromise","ensureServerRunning","binPath","spawn","cleanup","err","success","parseMarkdown","markdownText","userOAuthToken","validateExistenceOrOptions","enableSubscript","enableSuperscript","enableMark","enableTableMerge","enableEmbeds","enableZennDirectives","headers","response","h"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.server.cjs","sources":["../src/plugins/remark-import-directive.async.server.ts","../src/plugins/transformUri.async.server.ts","../src/plugins/remark-resolve-uri.async.ts","../src/gen/markdown/v1/markdown_pb.ts","../src/gen/markdown/v1/markdown_connect.ts","../src/remarkProcessor.server.ts"],"sourcesContent":["/**\n * @file This file defines a remark plugin to handle `@import` directives in Markdown.\n * @brief このファイルは、Markdown 内の `@import` ディレクティブを処理するための remark プラグインを定義します。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport type { Root } from \"mdast\"\nimport type { Processor } from \"unified\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\n\ntype ParentNodeWithChildren = {\n children: unknown[]\n}\n\nconst importRegex = /<!--\\s+@import\\s+\"(.+?)\"\\s+-->/\n\n/**\n * A remark plugin to support `@import` directives in Markdown.\n * This allows importing content from other Markdown files.\n * Markdown の `@import` ディレクティブをサポートする remark プラグイン。\n * これにより、他の Markdown ファイルからコンテンツをインポート可能。\n *\n * @param this The remark processor instance. / remark プロセッサーのインスタンス。\n * @param options Options for the plugin. / プラグインのオプション。\n * @param options.markdownFilePath The path to the Markdown file being processed. / 処理対象の Markdown ファイルへのパス。\n */\nexport function remarkImportDirective(this: Processor, options: { markdownFilePath: string }) {\n return async (tree: Root): Promise<void> => {\n const { markdownFilePath } = options\n const parentDir = path.dirname(markdownFilePath)\n\n // すべてのインポートディレクティブを収集\n const imports: { parent: ParentNodeWithChildren; index: number; absolutePath: string }[] = []\n visit(tree, \"html\", (node, index, parent) => {\n if (!parent || typeof index !== \"number\") {\n return\n }\n\n const match = node.value.match(importRegex)\n if (!match) {\n return\n }\n\n const importPath = match[1]\n const absolutePath = path.resolve(parentDir, importPath)\n if (Array.isArray((parent as { children?: unknown[] }).children)) {\n imports.push({ parent: parent as ParentNodeWithChildren, index, absolutePath })\n }\n })\n\n if (imports.length === 0) {\n return\n }\n\n // すべてのファイルを読み込み、解析\n const parsedTrees = await Promise.all(\n imports.map(async ({ absolutePath }) => {\n try {\n const fileContent = await fs.readFile(absolutePath, \"utf-8\")\n return this.parse(fileContent) as Root\n } catch (error) {\n if (error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n Logger.warn(`[remark-import-directive] Import file not found: ${absolutePath}`)\n } else {\n Logger.error(`[remark-import-directive] Error processing import: ${absolutePath}`, error)\n }\n return null // エラー時は null を返却\n }\n }),\n )\n\n // ツリー内のノードを後方から置換\n for (let i = imports.length - 1; i >= 0; i--) {\n const { parent, index } = imports[i]\n const newTree = parsedTrees[i]\n\n if (newTree?.children && Array.isArray(newTree.children)) {\n parent.children.splice(index, 1, ...newTree.children)\n }\n }\n }\n}\n","/**\n * @file Async version of transformUri for file existence validation.\n * @brief ファイル存在確認を含む transformUri の非同期版。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport urlJoin from \"url-join\"\nimport { Logger } from \"../utils/simple-logger\"\n\n// RFC 3986 URI scheme regex\nconst URI_SCHEME_REGEX = /^[a-z][a-z0-9+.-]*:/\n\n/**\n * Async version of transformUri that validates file existence.\n * ファイル存在確認を行う transformUri の非同期版。\n *\n * @param uri The URI to transform. / 変換対象の URI。\n * @param isImage Whether this is an image URI. / 画像 URI かどうか。\n * @param markdownFilePath Path to the markdown file. / Markdown ファイルのパス。\n * @param workspaceRoot Workspace root directory. / ワークスペースのルートディレクトリ。\n * @param validateExistence Whether to validate file existence. / ファイル存在確認を行うかどうか。\n * @returns Promise resolving to the transformed URI. / 変換された URI を返す Promise。\n */\nexport const transformUriAsync = async (uri: string, isImage: boolean, markdownFilePath: string, workspaceRoot: string, validateExistence = false): Promise<string> => {\n if (!uri) {\n return \"\"\n }\n\n // 1. 絶対URL (http, https, mailto, tel) はそのまま返す\n if (URI_SCHEME_REGEX.test(uri)) {\n const protocol = uri.substring(0, uri.indexOf(\":\")).toLowerCase()\n if ([\"http\", \"https\", \"mailto\", \"tel\", \"file\"].includes(protocol)) {\n return uri\n }\n }\n\n // 2. アンカーリンク (#fragment) はそのまま返す\n if (uri.startsWith(\"#\")) {\n return uri\n }\n\n // 3. ルート相対パス (/) はそのまま返す\n if (uri.startsWith(\"/\")) {\n return uri\n }\n\n // 4. 相対パスをプロジェクトルートからのパスとして解決する\n const decodedUri = decodeURIComponent(uri)\n const markdownDir = path.dirname(markdownFilePath)\n const projectRelativePath = path.normalize(path.join(markdownDir, decodedUri))\n\n // セキュリティチェック\n const absolutePath = path.resolve(workspaceRoot, projectRelativePath)\n if (!absolutePath.startsWith(workspaceRoot) || projectRelativePath.startsWith(\"..\")) {\n Logger.error(`Security Alert: Attempt to access file outside project root: ${absolutePath}`)\n return \"\"\n }\n\n // ファイル存在確認(オプション)\n if (validateExistence) {\n try {\n await fs.access(absolutePath)\n } catch {\n Logger.warn(`File not found: ${absolutePath}`)\n return \"\"\n }\n }\n\n const pathForEncoding = projectRelativePath.replace(/\\\\/g, \"/\")\n\n if (isImage) {\n return urlJoin(\"/assets/\", pathForEncoding)\n }\n return `?filePath=${encodeURIComponent(pathForEncoding)}`\n}\n","/**\n * @file Async version of remark-resolve-uri plugin.\n * @brief URI 解決プラグインの非同期版。\n */\nimport * as cheerio from \"cheerio\"\nimport type { Html, Image, Link, Root } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\nimport { transformUriAsync } from \"./transformUri.async.server\"\n\ninterface Options {\n markdownFilePath: string\n workspaceRoot: string\n validateExistence?: boolean\n}\n\n/**\n * An async remark plugin to resolve image and link URIs with optional file validation.\n * ファイル検証オプション付きで画像とリンクの URI を解決する非同期 remark プラグイン。\n */\nexport function remarkResolveUriAsync(options: Options) {\n return async (tree: Root): Promise<void> => {\n if (!(options?.markdownFilePath && options?.workspaceRoot)) {\n Logger.warn(\"remark-resolve-uri-async: markdownFilePath and workspaceRoot are required. Skipping URI resolution.\")\n return\n }\n\n // すべての画像とリンクノードを収集\n const uriNodes: Array<{ node: Image | Link; isImage: boolean }> = []\n const htmlNodes: Array<Html> = []\n\n visit(tree, [\"image\", \"link\", \"html\"], (node) => {\n if (node.type === \"html\") {\n htmlNodes.push(node as Html)\n } else {\n const targetNode = node as Image | Link\n if (targetNode.url) {\n uriNodes.push({ node: targetNode, isImage: targetNode.type === \"image\" })\n }\n }\n })\n\n // 並列でURI変換を実行 (標準Markdownノード)\n const transformPromises = uriNodes.map(async ({ node, isImage }) => {\n const transformedUri = await transformUriAsync(node.url, isImage, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n node.url = transformedUri\n })\n\n // 並列でURI変換を実行 (HTMLノード内の属性)\n const htmlTransformPromises = htmlNodes.map(async (node) => {\n // HTMLフラグメントとしてロード (isDocument=false)\n const $ = cheerio.load(node.value, null, false)\n let modified = false\n\n // imgタグのsrc属性を変換\n const imgTags = $(\"img\").toArray()\n for (const img of imgTags) {\n const src = $(img).attr(\"src\")\n if (src) {\n const transformed = await transformUriAsync(src, true, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== src) {\n $(img).attr(\"src\", transformed)\n modified = true\n }\n }\n }\n\n // aタグのhref属性を変換\n const aTags = $(\"a\").toArray()\n for (const a of aTags) {\n const href = $(a).attr(\"href\")\n if (href) {\n const transformed = await transformUriAsync(href, false, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== href) {\n $(a).attr(\"href\", transformed)\n modified = true\n }\n }\n }\n\n if (modified) {\n // 変更があれば node.value を更新\n // html() はエンコードされた実体を返す可能性があるが、HTMLノードとしては許容される\n const newHtml = $.html()\n if (newHtml) {\n node.value = newHtml\n }\n }\n })\n\n await Promise.all([...transformPromises, ...htmlTransformPromises])\n }\n}\n","// @generated by protoc-gen-es v1.10.1 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from \"@bufbuild/protobuf\"\nimport { Message, proto3 } from \"@bufbuild/protobuf\"\n\n/**\n * @generated from message markdown.v1.ConvertRequest\n */\nexport class ConvertRequest extends Message<ConvertRequest> {\n /**\n * @generated from field: string markdown_text = 1;\n */\n markdownText = \"\"\n\n /**\n * @generated from field: string file_path = 2;\n */\n filePath = \"\"\n\n /**\n * @generated from field: string workspace_root = 3;\n */\n workspaceRoot = \"\"\n\n /**\n * @generated from field: bool validate_existence = 4;\n */\n validateExistence = false\n\n /**\n * @generated from field: optional bool enable_subscript = 5;\n */\n enableSubscript?: boolean\n\n /**\n * @generated from field: optional bool enable_superscript = 6;\n */\n enableSuperscript?: boolean\n\n /**\n * @generated from field: optional bool enable_mark = 7;\n */\n enableMark?: boolean\n\n /**\n * @generated from field: optional bool enable_table_merge = 8;\n */\n enableTableMerge?: boolean\n\n /**\n * @generated from field: optional bool enable_embeds = 9;\n */\n enableEmbeds?: boolean\n\n /**\n * @generated from field: optional bool enable_zenn_directives = 10;\n */\n enableZennDirectives?: boolean\n\n constructor(data?: PartialMessage<ConvertRequest>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertRequest\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"markdown_text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"file_path\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 3, name: \"workspace_root\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 4, name: \"validate_existence\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */ },\n { no: 5, name: \"enable_subscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 6, name: \"enable_superscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 7, name: \"enable_mark\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 8, name: \"enable_table_merge\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 9, name: \"enable_embeds\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 10, name: \"enable_zenn_directives\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertRequest {\n return new ConvertRequest().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertRequest | PlainMessage<ConvertRequest> | undefined, b: ConvertRequest | PlainMessage<ConvertRequest> | undefined): boolean {\n return proto3.util.equals(ConvertRequest, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.ConvertResponse\n */\nexport class ConvertResponse extends Message<ConvertResponse> {\n /**\n * @generated from field: string html_content = 1;\n */\n htmlContent = \"\"\n\n /**\n * @generated from field: repeated markdown.v1.Heading headings = 2;\n */\n headings: Heading[] = []\n\n constructor(data?: PartialMessage<ConvertResponse>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertResponse\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"html_content\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"headings\", kind: \"message\", T: Heading, repeated: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertResponse {\n return new ConvertResponse().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertResponse | PlainMessage<ConvertResponse> | undefined, b: ConvertResponse | PlainMessage<ConvertResponse> | undefined): boolean {\n return proto3.util.equals(ConvertResponse, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.Heading\n */\nexport class Heading extends Message<Heading> {\n /**\n * @generated from field: string text = 1;\n */\n text = \"\"\n\n /**\n * @generated from field: int32 depth = 2;\n */\n depth = 0\n\n /**\n * @generated from field: string id = 3;\n */\n id = \"\"\n\n constructor(data?: PartialMessage<Heading>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.Heading\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"depth\", kind: \"scalar\", T: 5 /* ScalarType.INT32 */ },\n { no: 3, name: \"id\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Heading {\n return new Heading().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJsonString(jsonString, options)\n }\n\n static equals(a: Heading | PlainMessage<Heading> | undefined, b: Heading | PlainMessage<Heading> | undefined): boolean {\n return proto3.util.equals(Heading, a, b)\n }\n}\n","// @generated by protoc-gen-connect-es v1.7.0 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport { MethodKind } from \"@bufbuild/protobuf\"\nimport { ConvertRequest, ConvertResponse } from \"./markdown_pb.js\"\n\n/**\n * @generated from service markdown.v1.MarkdownService\n */\nexport const MarkdownService = {\n typeName: \"markdown.v1.MarkdownService\",\n methods: {\n /**\n * @generated from rpc markdown.v1.MarkdownService.Convert\n */\n convert: {\n name: \"Convert\",\n I: ConvertRequest,\n O: ConvertResponse,\n kind: MethodKind.Unary,\n },\n },\n} as const\n","import { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport * as net from \"node:net\"\nimport * as path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createClient } from \"@connectrpc/connect\"\nimport { createConnectTransport } from \"@connectrpc/connect-node\"\nimport { MarkdownService } from \"./gen/markdown/v1/markdown_connect.ts\"\n\nconst SOCKET_PATH = process.env.MARKDOWN_SOCKET_PATH || \"/tmp/markdown.sock\"\n\nconst transport = createConnectTransport({\n baseUrl: \"http://localhost\",\n httpVersion: \"2\",\n nodeOptions: {\n createConnection: () => {\n return net.connect(SOCKET_PATH)\n },\n } as unknown as Record<string, unknown>,\n})\n\nconst client = createClient(MarkdownService, transport)\n\nexport interface ParseResult {\n htmlContent: string\n headings: Array<{\n text: string\n depth: number\n id: string\n }>\n}\n\nexport interface ParseOptions {\n validateExistence?: boolean\n enableSubscript?: boolean\n enableSuperscript?: boolean\n enableMark?: boolean\n enableTableMerge?: boolean\n enableEmbeds?: boolean\n enableZennDirectives?: boolean\n}\n\n// Get the current directory name in an ES Modules friendly way\nconst getDirname = () => {\n try {\n const __filename = fileURLToPath(import.meta.url)\n return path.dirname(__filename)\n } catch {\n return __dirname\n }\n}\n\n// Locate the Go server binary path inside the package or monorepo\nconst getBinaryPath = (): string | undefined => {\n const dir = getDirname()\n // 1. In the same directory as the transpile output (dist/markdown-api)\n const sameDir = path.join(dir, \"markdown-api\")\n if (existsSync(sameDir)) return sameDir\n\n // 2. Fallback to dist directory from src\n const distDir = path.join(dir, \"..\", \"dist\", \"markdown-api\")\n if (existsSync(distDir)) return distDir\n\n // 3. Fallback to monorepo go packages folder for dev environment\n const devDir = path.join(dir, \"..\", \"..\", \"go\", \"markdown-api\", \"markdown-api\")\n if (existsSync(devDir)) return devDir\n\n return undefined\n}\n\nconst canConnect = (): Promise<boolean> =>\n new Promise((resolve) => {\n const socket = net.connect(SOCKET_PATH)\n socket.on(\"connect\", () => {\n socket.destroy()\n resolve(true)\n })\n socket.on(\"error\", () => resolve(false))\n })\n\nconst waitForServer = async (timeoutMs: number): Promise<boolean> => {\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (await canConnect()) return true\n await new Promise((r) => setTimeout(r, 100))\n }\n return false\n}\n\nlet spawnedServer: ReturnType<typeof spawn> | null = null\nlet startPromise: Promise<boolean> | null = null\n\nconst ensureServerRunning = async (): Promise<boolean> => {\n if (await canConnect()) return true\n\n if (startPromise) return startPromise\n\n startPromise = (async () => {\n const binPath = getBinaryPath()\n if (!binPath) {\n console.warn(\"markdown-api binary not found. Cannot auto-start markdown server.\")\n return false\n }\n\n // Clean up stale socket file if it exists\n try {\n if (existsSync(SOCKET_PATH)) {\n const fs = await import(\"node:fs\")\n fs.unlinkSync(SOCKET_PATH)\n }\n } catch {\n // ignore\n }\n\n try {\n spawnedServer = spawn(binPath, [], { stdio: \"ignore\" })\n\n const cleanup = () => {\n if (spawnedServer) {\n try {\n spawnedServer.kill(\"SIGTERM\")\n } catch {\n // ignore\n }\n spawnedServer = null\n }\n }\n\n process.on(\"exit\", cleanup)\n\n const ready = await waitForServer(10000)\n if (!ready) {\n console.error(\"markdown-api Go server did not become ready on socket:\", SOCKET_PATH)\n cleanup()\n return false\n }\n return true\n } catch (err) {\n console.error(\"Failed to spawn markdown-api Go server:\", err)\n spawnedServer = null\n return false\n }\n })()\n\n const success = await startPromise\n if (!success) {\n startPromise = null\n }\n return success\n}\n\nexport const parseMarkdown = async (markdownText: string, markdownFilePath: string, workspaceRoot: string, userOAuthToken?: string, validateExistenceOrOptions: boolean | ParseOptions = true): Promise<ParseResult> => {\n // Automatically ensure the backend Go server is running\n await ensureServerRunning()\n\n let validateExistence = true\n let enableSubscript: boolean | undefined\n let enableSuperscript: boolean | undefined\n let enableMark: boolean | undefined\n let enableTableMerge: boolean | undefined\n let enableEmbeds: boolean | undefined\n let enableZennDirectives: boolean | undefined\n\n if (typeof validateExistenceOrOptions === \"boolean\") {\n validateExistence = validateExistenceOrOptions\n } else if (validateExistenceOrOptions && typeof validateExistenceOrOptions === \"object\") {\n validateExistence = validateExistenceOrOptions.validateExistence ?? true\n enableSubscript = validateExistenceOrOptions.enableSubscript\n enableSuperscript = validateExistenceOrOptions.enableSuperscript\n enableMark = validateExistenceOrOptions.enableMark\n enableTableMerge = validateExistenceOrOptions.enableTableMerge\n enableEmbeds = validateExistenceOrOptions.enableEmbeds\n enableZennDirectives = validateExistenceOrOptions.enableZennDirectives\n }\n\n const headers: Record<string, string> = {}\n if (userOAuthToken) {\n headers.Authorization = `Bearer ${userOAuthToken}`\n }\n\n const response = await client.convert(\n {\n markdownText,\n filePath: markdownFilePath,\n workspaceRoot,\n validateExistence,\n enableSubscript,\n enableSuperscript,\n enableMark,\n enableTableMerge,\n enableEmbeds,\n enableZennDirectives,\n },\n { headers },\n )\n\n return {\n htmlContent: response.htmlContent,\n headings: response.headings.map((h) => ({\n text: h.text,\n depth: h.depth,\n id: h.id,\n })),\n }\n}\n"],"names":["importRegex","remarkImportDirective","options","tree","markdownFilePath","parentDir","path","imports","visit","node","index","parent","match","importPath","absolutePath","parsedTrees","fileContent","fs","error","Logger","i","newTree","URI_SCHEME_REGEX","transformUriAsync","uri","isImage","workspaceRoot","validateExistence","protocol","decodedUri","markdownDir","projectRelativePath","pathForEncoding","urlJoin","remarkResolveUriAsync","uriNodes","htmlNodes","targetNode","transformPromises","transformedUri","htmlTransformPromises","$","cheerio","modified","imgTags","img","src","transformed","aTags","a","href","newHtml","ConvertRequest","Message","data","proto3","bytes","jsonValue","jsonString","b","ConvertResponse","Heading","MarkdownService","MethodKind","SOCKET_PATH","transport","createConnectTransport","net","client","createClient","getDirname","__filename","fileURLToPath","getBinaryPath","dir","sameDir","existsSync","distDir","devDir","canConnect","resolve","socket","waitForServer","timeoutMs","start","spawnedServer","startPromise","ensureServerRunning","binPath","spawn","cleanup","err","success","parseMarkdown","markdownText","userOAuthToken","validateExistenceOrOptions","enableSubscript","enableSuperscript","enableMark","enableTableMerge","enableEmbeds","enableZennDirectives","headers","response","h"],"mappings":"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"}
|
package/dist/index.server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.server.js","sources":["../src/plugins/remark-import-directive.async.server.ts","../src/plugins/transformUri.async.server.ts","../src/plugins/remark-resolve-uri.async.ts","../src/gen/markdown/v1/markdown_pb.ts","../src/gen/markdown/v1/markdown_connect.ts","../src/remarkProcessor.server.ts"],"sourcesContent":["/**\n * @file This file defines a remark plugin to handle `@import` directives in Markdown.\n * @brief このファイルは、Markdown 内の `@import` ディレクティブを処理するための remark プラグインを定義します。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport type { Root } from \"mdast\"\nimport type { Processor } from \"unified\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\n\ntype ParentNodeWithChildren = {\n children: unknown[]\n}\n\nconst importRegex = /<!--\\s+@import\\s+\"(.+?)\"\\s+-->/\n\n/**\n * A remark plugin to support `@import` directives in Markdown.\n * This allows importing content from other Markdown files.\n * Markdown の `@import` ディレクティブをサポートする remark プラグイン。\n * これにより、他の Markdown ファイルからコンテンツをインポート可能。\n *\n * @param this The remark processor instance. / remark プロセッサーのインスタンス。\n * @param options Options for the plugin. / プラグインのオプション。\n * @param options.markdownFilePath The path to the Markdown file being processed. / 処理対象の Markdown ファイルへのパス。\n */\nexport function remarkImportDirective(this: Processor, options: { markdownFilePath: string }) {\n return async (tree: Root): Promise<void> => {\n const { markdownFilePath } = options\n const parentDir = path.dirname(markdownFilePath)\n\n // すべてのインポートディレクティブを収集\n const imports: { parent: ParentNodeWithChildren; index: number; absolutePath: string }[] = []\n visit(tree, \"html\", (node, index, parent) => {\n if (!parent || typeof index !== \"number\") {\n return\n }\n\n const match = node.value.match(importRegex)\n if (!match) {\n return\n }\n\n const importPath = match[1]\n const absolutePath = path.resolve(parentDir, importPath)\n if (Array.isArray((parent as { children?: unknown[] }).children)) {\n imports.push({ parent: parent as ParentNodeWithChildren, index, absolutePath })\n }\n })\n\n if (imports.length === 0) {\n return\n }\n\n // すべてのファイルを読み込み、解析\n const parsedTrees = await Promise.all(\n imports.map(async ({ absolutePath }) => {\n try {\n const fileContent = await fs.readFile(absolutePath, \"utf-8\")\n return this.parse(fileContent) as Root\n } catch (error) {\n if (error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n Logger.warn(`[remark-import-directive] Import file not found: ${absolutePath}`)\n } else {\n Logger.error(`[remark-import-directive] Error processing import: ${absolutePath}`, error)\n }\n return null // エラー時は null を返却\n }\n }),\n )\n\n // ツリー内のノードを後方から置換\n for (let i = imports.length - 1; i >= 0; i--) {\n const { parent, index } = imports[i]\n const newTree = parsedTrees[i]\n\n if (newTree?.children && Array.isArray(newTree.children)) {\n parent.children.splice(index, 1, ...newTree.children)\n }\n }\n }\n}\n","/**\n * @file Async version of transformUri for file existence validation.\n * @brief ファイル存在確認を含む transformUri の非同期版。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport urlJoin from \"url-join\"\nimport { Logger } from \"../utils/simple-logger\"\n\n// RFC 3986 URI scheme regex\nconst URI_SCHEME_REGEX = /^[a-z][a-z0-9+.-]*:/\n\n/**\n * Async version of transformUri that validates file existence.\n * ファイル存在確認を行う transformUri の非同期版。\n *\n * @param uri The URI to transform. / 変換対象の URI。\n * @param isImage Whether this is an image URI. / 画像 URI かどうか。\n * @param markdownFilePath Path to the markdown file. / Markdown ファイルのパス。\n * @param workspaceRoot Workspace root directory. / ワークスペースのルートディレクトリ。\n * @param validateExistence Whether to validate file existence. / ファイル存在確認を行うかどうか。\n * @returns Promise resolving to the transformed URI. / 変換された URI を返す Promise。\n */\nexport const transformUriAsync = async (uri: string, isImage: boolean, markdownFilePath: string, workspaceRoot: string, validateExistence = false): Promise<string> => {\n if (!uri) {\n return \"\"\n }\n\n // 1. 絶対URL (http, https, mailto, tel) はそのまま返す\n if (URI_SCHEME_REGEX.test(uri)) {\n const protocol = uri.substring(0, uri.indexOf(\":\")).toLowerCase()\n if ([\"http\", \"https\", \"mailto\", \"tel\", \"file\"].includes(protocol)) {\n return uri\n }\n }\n\n // 2. アンカーリンク (#fragment) はそのまま返す\n if (uri.startsWith(\"#\")) {\n return uri\n }\n\n // 3. ルート相対パス (/) はそのまま返す\n if (uri.startsWith(\"/\")) {\n return uri\n }\n\n // 4. 相対パスをプロジェクトルートからのパスとして解決する\n const decodedUri = decodeURIComponent(uri)\n const markdownDir = path.dirname(markdownFilePath)\n const projectRelativePath = path.normalize(path.join(markdownDir, decodedUri))\n\n // セキュリティチェック\n const absolutePath = path.resolve(workspaceRoot, projectRelativePath)\n if (!absolutePath.startsWith(workspaceRoot) || projectRelativePath.startsWith(\"..\")) {\n Logger.error(`Security Alert: Attempt to access file outside project root: ${absolutePath}`)\n return \"\"\n }\n\n // ファイル存在確認(オプション)\n if (validateExistence) {\n try {\n await fs.access(absolutePath)\n } catch {\n Logger.warn(`File not found: ${absolutePath}`)\n return \"\"\n }\n }\n\n const pathForEncoding = projectRelativePath.replace(/\\\\/g, \"/\")\n\n if (isImage) {\n return urlJoin(\"/assets/\", pathForEncoding)\n }\n return `?filePath=${encodeURIComponent(pathForEncoding)}`\n}\n","/**\n * @file Async version of remark-resolve-uri plugin.\n * @brief URI 解決プラグインの非同期版。\n */\nimport * as cheerio from \"cheerio\"\nimport type { Html, Image, Link, Root } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\nimport { transformUriAsync } from \"./transformUri.async.server\"\n\ninterface Options {\n markdownFilePath: string\n workspaceRoot: string\n validateExistence?: boolean\n}\n\n/**\n * An async remark plugin to resolve image and link URIs with optional file validation.\n * ファイル検証オプション付きで画像とリンクの URI を解決する非同期 remark プラグイン。\n */\nexport function remarkResolveUriAsync(options: Options) {\n return async (tree: Root): Promise<void> => {\n if (!(options?.markdownFilePath && options?.workspaceRoot)) {\n Logger.warn(\"remark-resolve-uri-async: markdownFilePath and workspaceRoot are required. Skipping URI resolution.\")\n return\n }\n\n // すべての画像とリンクノードを収集\n const uriNodes: Array<{ node: Image | Link; isImage: boolean }> = []\n const htmlNodes: Array<Html> = []\n\n visit(tree, [\"image\", \"link\", \"html\"], (node) => {\n if (node.type === \"html\") {\n htmlNodes.push(node as Html)\n } else {\n const targetNode = node as Image | Link\n if (targetNode.url) {\n uriNodes.push({ node: targetNode, isImage: targetNode.type === \"image\" })\n }\n }\n })\n\n // 並列でURI変換を実行 (標準Markdownノード)\n const transformPromises = uriNodes.map(async ({ node, isImage }) => {\n const transformedUri = await transformUriAsync(node.url, isImage, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n node.url = transformedUri\n })\n\n // 並列でURI変換を実行 (HTMLノード内の属性)\n const htmlTransformPromises = htmlNodes.map(async (node) => {\n // HTMLフラグメントとしてロード (isDocument=false)\n const $ = cheerio.load(node.value, null, false)\n let modified = false\n\n // imgタグのsrc属性を変換\n const imgTags = $(\"img\").toArray()\n for (const img of imgTags) {\n const src = $(img).attr(\"src\")\n if (src) {\n const transformed = await transformUriAsync(src, true, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== src) {\n $(img).attr(\"src\", transformed)\n modified = true\n }\n }\n }\n\n // aタグのhref属性を変換\n const aTags = $(\"a\").toArray()\n for (const a of aTags) {\n const href = $(a).attr(\"href\")\n if (href) {\n const transformed = await transformUriAsync(href, false, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== href) {\n $(a).attr(\"href\", transformed)\n modified = true\n }\n }\n }\n\n if (modified) {\n // 変更があれば node.value を更新\n // html() はエンコードされた実体を返す可能性があるが、HTMLノードとしては許容される\n const newHtml = $.html()\n if (newHtml) {\n node.value = newHtml\n }\n }\n })\n\n await Promise.all([...transformPromises, ...htmlTransformPromises])\n }\n}\n","// @generated by protoc-gen-es v1.10.1 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from \"@bufbuild/protobuf\"\nimport { Message, proto3 } from \"@bufbuild/protobuf\"\n\n/**\n * @generated from message markdown.v1.ConvertRequest\n */\nexport class ConvertRequest extends Message<ConvertRequest> {\n /**\n * @generated from field: string markdown_text = 1;\n */\n markdownText = \"\"\n\n /**\n * @generated from field: string file_path = 2;\n */\n filePath = \"\"\n\n /**\n * @generated from field: string workspace_root = 3;\n */\n workspaceRoot = \"\"\n\n /**\n * @generated from field: bool validate_existence = 4;\n */\n validateExistence = false\n\n /**\n * @generated from field: optional bool enable_subscript = 5;\n */\n enableSubscript?: boolean\n\n /**\n * @generated from field: optional bool enable_superscript = 6;\n */\n enableSuperscript?: boolean\n\n /**\n * @generated from field: optional bool enable_mark = 7;\n */\n enableMark?: boolean\n\n /**\n * @generated from field: optional bool enable_table_merge = 8;\n */\n enableTableMerge?: boolean\n\n /**\n * @generated from field: optional bool enable_embeds = 9;\n */\n enableEmbeds?: boolean\n\n /**\n * @generated from field: optional bool enable_zenn_directives = 10;\n */\n enableZennDirectives?: boolean\n\n constructor(data?: PartialMessage<ConvertRequest>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertRequest\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"markdown_text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"file_path\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 3, name: \"workspace_root\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 4, name: \"validate_existence\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */ },\n { no: 5, name: \"enable_subscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 6, name: \"enable_superscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 7, name: \"enable_mark\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 8, name: \"enable_table_merge\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 9, name: \"enable_embeds\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 10, name: \"enable_zenn_directives\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertRequest {\n return new ConvertRequest().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertRequest | PlainMessage<ConvertRequest> | undefined, b: ConvertRequest | PlainMessage<ConvertRequest> | undefined): boolean {\n return proto3.util.equals(ConvertRequest, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.ConvertResponse\n */\nexport class ConvertResponse extends Message<ConvertResponse> {\n /**\n * @generated from field: string html_content = 1;\n */\n htmlContent = \"\"\n\n /**\n * @generated from field: repeated markdown.v1.Heading headings = 2;\n */\n headings: Heading[] = []\n\n constructor(data?: PartialMessage<ConvertResponse>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertResponse\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"html_content\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"headings\", kind: \"message\", T: Heading, repeated: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertResponse {\n return new ConvertResponse().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertResponse | PlainMessage<ConvertResponse> | undefined, b: ConvertResponse | PlainMessage<ConvertResponse> | undefined): boolean {\n return proto3.util.equals(ConvertResponse, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.Heading\n */\nexport class Heading extends Message<Heading> {\n /**\n * @generated from field: string text = 1;\n */\n text = \"\"\n\n /**\n * @generated from field: int32 depth = 2;\n */\n depth = 0\n\n /**\n * @generated from field: string id = 3;\n */\n id = \"\"\n\n constructor(data?: PartialMessage<Heading>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.Heading\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"depth\", kind: \"scalar\", T: 5 /* ScalarType.INT32 */ },\n { no: 3, name: \"id\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Heading {\n return new Heading().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJsonString(jsonString, options)\n }\n\n static equals(a: Heading | PlainMessage<Heading> | undefined, b: Heading | PlainMessage<Heading> | undefined): boolean {\n return proto3.util.equals(Heading, a, b)\n }\n}\n","// @generated by protoc-gen-connect-es v1.7.0 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport { MethodKind } from \"@bufbuild/protobuf\"\nimport { ConvertRequest, ConvertResponse } from \"./markdown_pb.js\"\n\n/**\n * @generated from service markdown.v1.MarkdownService\n */\nexport const MarkdownService = {\n typeName: \"markdown.v1.MarkdownService\",\n methods: {\n /**\n * @generated from rpc markdown.v1.MarkdownService.Convert\n */\n convert: {\n name: \"Convert\",\n I: ConvertRequest,\n O: ConvertResponse,\n kind: MethodKind.Unary,\n },\n },\n} as const\n","import { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport * as net from \"node:net\"\nimport * as path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createClient } from \"@connectrpc/connect\"\nimport { createConnectTransport } from \"@connectrpc/connect-node\"\nimport { MarkdownService } from \"./gen/markdown/v1/markdown_connect.ts\"\n\nconst SOCKET_PATH = process.env.MARKDOWN_SOCKET_PATH || \"/tmp/markdown.sock\"\n\nconst transport = createConnectTransport({\n baseUrl: \"http://localhost\",\n httpVersion: \"2\",\n nodeOptions: {\n createConnection: () => {\n return net.connect(SOCKET_PATH)\n },\n } as unknown as Record<string, unknown>,\n})\n\nconst client = createClient(MarkdownService, transport)\n\nexport interface ParseResult {\n htmlContent: string\n headings: Array<{\n text: string\n depth: number\n id: string\n }>\n}\n\nexport interface ParseOptions {\n validateExistence?: boolean\n enableSubscript?: boolean\n enableSuperscript?: boolean\n enableMark?: boolean\n enableTableMerge?: boolean\n enableEmbeds?: boolean\n enableZennDirectives?: boolean\n}\n\n// Get the current directory name in an ES Modules friendly way\nconst getDirname = () => {\n try {\n const __filename = fileURLToPath(import.meta.url)\n return path.dirname(__filename)\n } catch {\n return __dirname\n }\n}\n\n// Locate the Go server binary path inside the package or monorepo\nconst getBinaryPath = (): string | undefined => {\n const dir = getDirname()\n // 1. In the same directory as the transpile output (dist/markdown-api)\n const sameDir = path.join(dir, \"markdown-api\")\n if (existsSync(sameDir)) return sameDir\n\n // 2. Fallback to dist directory from src\n const distDir = path.join(dir, \"..\", \"dist\", \"markdown-api\")\n if (existsSync(distDir)) return distDir\n\n // 3. Fallback to monorepo go packages folder for dev environment\n const devDir = path.join(dir, \"..\", \"..\", \"go\", \"markdown-api\", \"markdown-api\")\n if (existsSync(devDir)) return devDir\n\n return undefined\n}\n\nconst canConnect = (): Promise<boolean> =>\n new Promise((resolve) => {\n const socket = net.connect(SOCKET_PATH)\n socket.on(\"connect\", () => {\n socket.destroy()\n resolve(true)\n })\n socket.on(\"error\", () => resolve(false))\n })\n\nconst waitForServer = async (timeoutMs: number): Promise<boolean> => {\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (await canConnect()) return true\n await new Promise((r) => setTimeout(r, 100))\n }\n return false\n}\n\nlet spawnedServer: any = null\nlet startPromise: Promise<boolean> | null = null\n\nconst ensureServerRunning = async (): Promise<boolean> => {\n if (await canConnect()) return true\n\n if (startPromise) return startPromise\n\n startPromise = (async () => {\n const binPath = getBinaryPath()\n if (!binPath) {\n console.warn(\"markdown-api binary not found. Cannot auto-start markdown server.\")\n return false\n }\n\n // Clean up stale socket file if it exists\n try {\n if (existsSync(SOCKET_PATH)) {\n const fs = await import(\"node:fs\")\n fs.unlinkSync(SOCKET_PATH)\n }\n } catch {\n // ignore\n }\n\n try {\n spawnedServer = spawn(binPath, [], { stdio: \"ignore\" })\n\n const cleanup = () => {\n if (spawnedServer) {\n try {\n spawnedServer.kill(\"SIGTERM\")\n } catch {\n // ignore\n }\n spawnedServer = null\n }\n }\n\n process.on(\"exit\", cleanup)\n\n const ready = await waitForServer(10000)\n if (!ready) {\n console.error(\"markdown-api Go server did not become ready on socket:\", SOCKET_PATH)\n cleanup()\n return false\n }\n return true\n } catch (err) {\n console.error(\"Failed to spawn markdown-api Go server:\", err)\n spawnedServer = null\n return false\n }\n })()\n\n const success = await startPromise\n if (!success) {\n startPromise = null\n }\n return success\n}\n\nexport const parseMarkdown = async (markdownText: string, markdownFilePath: string, workspaceRoot: string, userOAuthToken?: string, validateExistenceOrOptions: boolean | ParseOptions = true): Promise<ParseResult> => {\n // Automatically ensure the backend Go server is running\n await ensureServerRunning()\n\n let validateExistence = true\n let enableSubscript: boolean | undefined\n let enableSuperscript: boolean | undefined\n let enableMark: boolean | undefined\n let enableTableMerge: boolean | undefined\n let enableEmbeds: boolean | undefined\n let enableZennDirectives: boolean | undefined\n\n if (typeof validateExistenceOrOptions === \"boolean\") {\n validateExistence = validateExistenceOrOptions\n } else if (validateExistenceOrOptions && typeof validateExistenceOrOptions === \"object\") {\n validateExistence = validateExistenceOrOptions.validateExistence ?? true\n enableSubscript = validateExistenceOrOptions.enableSubscript\n enableSuperscript = validateExistenceOrOptions.enableSuperscript\n enableMark = validateExistenceOrOptions.enableMark\n enableTableMerge = validateExistenceOrOptions.enableTableMerge\n enableEmbeds = validateExistenceOrOptions.enableEmbeds\n enableZennDirectives = validateExistenceOrOptions.enableZennDirectives\n }\n\n const headers: Record<string, string> = {}\n if (userOAuthToken) {\n headers.Authorization = `Bearer ${userOAuthToken}`\n }\n\n const response = await client.convert(\n {\n markdownText,\n filePath: markdownFilePath,\n workspaceRoot,\n validateExistence,\n enableSubscript,\n enableSuperscript,\n enableMark,\n enableTableMerge,\n enableEmbeds,\n enableZennDirectives,\n },\n { headers },\n )\n\n return {\n htmlContent: response.htmlContent,\n headings: response.headings.map((h) => ({\n text: h.text,\n depth: h.depth,\n id: h.id,\n })),\n }\n}\n"],"names":["importRegex","remarkImportDirective","options","tree","markdownFilePath","parentDir","path","imports","visit","node","index","parent","match","importPath","absolutePath","parsedTrees","fileContent","fs","error","Logger","i","newTree","URI_SCHEME_REGEX","transformUriAsync","uri","isImage","workspaceRoot","validateExistence","protocol","decodedUri","markdownDir","projectRelativePath","pathForEncoding","urlJoin","remarkResolveUriAsync","uriNodes","htmlNodes","targetNode","transformPromises","transformedUri","htmlTransformPromises","$","cheerio","modified","imgTags","img","src","transformed","aTags","a","href","newHtml","ConvertRequest","Message","data","proto3","bytes","jsonValue","jsonString","b","ConvertResponse","Heading","MarkdownService","MethodKind","SOCKET_PATH","transport","createConnectTransport","net","client","createClient","getDirname","__filename","fileURLToPath","getBinaryPath","dir","sameDir","existsSync","distDir","devDir","canConnect","resolve","socket","waitForServer","timeoutMs","start","r","spawnedServer","startPromise","ensureServerRunning","binPath","spawn","cleanup","err","success","parseMarkdown","markdownText","userOAuthToken","validateExistenceOrOptions","enableSubscript","enableSuperscript","enableMark","enableTableMerge","enableEmbeds","enableZennDirectives","headers","response","h"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.server.js","sources":["../src/plugins/remark-import-directive.async.server.ts","../src/plugins/transformUri.async.server.ts","../src/plugins/remark-resolve-uri.async.ts","../src/gen/markdown/v1/markdown_pb.ts","../src/gen/markdown/v1/markdown_connect.ts","../src/remarkProcessor.server.ts"],"sourcesContent":["/**\n * @file This file defines a remark plugin to handle `@import` directives in Markdown.\n * @brief このファイルは、Markdown 内の `@import` ディレクティブを処理するための remark プラグインを定義します。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport type { Root } from \"mdast\"\nimport type { Processor } from \"unified\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\n\ntype ParentNodeWithChildren = {\n children: unknown[]\n}\n\nconst importRegex = /<!--\\s+@import\\s+\"(.+?)\"\\s+-->/\n\n/**\n * A remark plugin to support `@import` directives in Markdown.\n * This allows importing content from other Markdown files.\n * Markdown の `@import` ディレクティブをサポートする remark プラグイン。\n * これにより、他の Markdown ファイルからコンテンツをインポート可能。\n *\n * @param this The remark processor instance. / remark プロセッサーのインスタンス。\n * @param options Options for the plugin. / プラグインのオプション。\n * @param options.markdownFilePath The path to the Markdown file being processed. / 処理対象の Markdown ファイルへのパス。\n */\nexport function remarkImportDirective(this: Processor, options: { markdownFilePath: string }) {\n return async (tree: Root): Promise<void> => {\n const { markdownFilePath } = options\n const parentDir = path.dirname(markdownFilePath)\n\n // すべてのインポートディレクティブを収集\n const imports: { parent: ParentNodeWithChildren; index: number; absolutePath: string }[] = []\n visit(tree, \"html\", (node, index, parent) => {\n if (!parent || typeof index !== \"number\") {\n return\n }\n\n const match = node.value.match(importRegex)\n if (!match) {\n return\n }\n\n const importPath = match[1]\n const absolutePath = path.resolve(parentDir, importPath)\n if (Array.isArray((parent as { children?: unknown[] }).children)) {\n imports.push({ parent: parent as ParentNodeWithChildren, index, absolutePath })\n }\n })\n\n if (imports.length === 0) {\n return\n }\n\n // すべてのファイルを読み込み、解析\n const parsedTrees = await Promise.all(\n imports.map(async ({ absolutePath }) => {\n try {\n const fileContent = await fs.readFile(absolutePath, \"utf-8\")\n return this.parse(fileContent) as Root\n } catch (error) {\n if (error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n Logger.warn(`[remark-import-directive] Import file not found: ${absolutePath}`)\n } else {\n Logger.error(`[remark-import-directive] Error processing import: ${absolutePath}`, error)\n }\n return null // エラー時は null を返却\n }\n }),\n )\n\n // ツリー内のノードを後方から置換\n for (let i = imports.length - 1; i >= 0; i--) {\n const { parent, index } = imports[i]\n const newTree = parsedTrees[i]\n\n if (newTree?.children && Array.isArray(newTree.children)) {\n parent.children.splice(index, 1, ...newTree.children)\n }\n }\n }\n}\n","/**\n * @file Async version of transformUri for file existence validation.\n * @brief ファイル存在確認を含む transformUri の非同期版。\n */\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport urlJoin from \"url-join\"\nimport { Logger } from \"../utils/simple-logger\"\n\n// RFC 3986 URI scheme regex\nconst URI_SCHEME_REGEX = /^[a-z][a-z0-9+.-]*:/\n\n/**\n * Async version of transformUri that validates file existence.\n * ファイル存在確認を行う transformUri の非同期版。\n *\n * @param uri The URI to transform. / 変換対象の URI。\n * @param isImage Whether this is an image URI. / 画像 URI かどうか。\n * @param markdownFilePath Path to the markdown file. / Markdown ファイルのパス。\n * @param workspaceRoot Workspace root directory. / ワークスペースのルートディレクトリ。\n * @param validateExistence Whether to validate file existence. / ファイル存在確認を行うかどうか。\n * @returns Promise resolving to the transformed URI. / 変換された URI を返す Promise。\n */\nexport const transformUriAsync = async (uri: string, isImage: boolean, markdownFilePath: string, workspaceRoot: string, validateExistence = false): Promise<string> => {\n if (!uri) {\n return \"\"\n }\n\n // 1. 絶対URL (http, https, mailto, tel) はそのまま返す\n if (URI_SCHEME_REGEX.test(uri)) {\n const protocol = uri.substring(0, uri.indexOf(\":\")).toLowerCase()\n if ([\"http\", \"https\", \"mailto\", \"tel\", \"file\"].includes(protocol)) {\n return uri\n }\n }\n\n // 2. アンカーリンク (#fragment) はそのまま返す\n if (uri.startsWith(\"#\")) {\n return uri\n }\n\n // 3. ルート相対パス (/) はそのまま返す\n if (uri.startsWith(\"/\")) {\n return uri\n }\n\n // 4. 相対パスをプロジェクトルートからのパスとして解決する\n const decodedUri = decodeURIComponent(uri)\n const markdownDir = path.dirname(markdownFilePath)\n const projectRelativePath = path.normalize(path.join(markdownDir, decodedUri))\n\n // セキュリティチェック\n const absolutePath = path.resolve(workspaceRoot, projectRelativePath)\n if (!absolutePath.startsWith(workspaceRoot) || projectRelativePath.startsWith(\"..\")) {\n Logger.error(`Security Alert: Attempt to access file outside project root: ${absolutePath}`)\n return \"\"\n }\n\n // ファイル存在確認(オプション)\n if (validateExistence) {\n try {\n await fs.access(absolutePath)\n } catch {\n Logger.warn(`File not found: ${absolutePath}`)\n return \"\"\n }\n }\n\n const pathForEncoding = projectRelativePath.replace(/\\\\/g, \"/\")\n\n if (isImage) {\n return urlJoin(\"/assets/\", pathForEncoding)\n }\n return `?filePath=${encodeURIComponent(pathForEncoding)}`\n}\n","/**\n * @file Async version of remark-resolve-uri plugin.\n * @brief URI 解決プラグインの非同期版。\n */\nimport * as cheerio from \"cheerio\"\nimport type { Html, Image, Link, Root } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport { Logger } from \"../utils/simple-logger\"\nimport { transformUriAsync } from \"./transformUri.async.server\"\n\ninterface Options {\n markdownFilePath: string\n workspaceRoot: string\n validateExistence?: boolean\n}\n\n/**\n * An async remark plugin to resolve image and link URIs with optional file validation.\n * ファイル検証オプション付きで画像とリンクの URI を解決する非同期 remark プラグイン。\n */\nexport function remarkResolveUriAsync(options: Options) {\n return async (tree: Root): Promise<void> => {\n if (!(options?.markdownFilePath && options?.workspaceRoot)) {\n Logger.warn(\"remark-resolve-uri-async: markdownFilePath and workspaceRoot are required. Skipping URI resolution.\")\n return\n }\n\n // すべての画像とリンクノードを収集\n const uriNodes: Array<{ node: Image | Link; isImage: boolean }> = []\n const htmlNodes: Array<Html> = []\n\n visit(tree, [\"image\", \"link\", \"html\"], (node) => {\n if (node.type === \"html\") {\n htmlNodes.push(node as Html)\n } else {\n const targetNode = node as Image | Link\n if (targetNode.url) {\n uriNodes.push({ node: targetNode, isImage: targetNode.type === \"image\" })\n }\n }\n })\n\n // 並列でURI変換を実行 (標準Markdownノード)\n const transformPromises = uriNodes.map(async ({ node, isImage }) => {\n const transformedUri = await transformUriAsync(node.url, isImage, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n node.url = transformedUri\n })\n\n // 並列でURI変換を実行 (HTMLノード内の属性)\n const htmlTransformPromises = htmlNodes.map(async (node) => {\n // HTMLフラグメントとしてロード (isDocument=false)\n const $ = cheerio.load(node.value, null, false)\n let modified = false\n\n // imgタグのsrc属性を変換\n const imgTags = $(\"img\").toArray()\n for (const img of imgTags) {\n const src = $(img).attr(\"src\")\n if (src) {\n const transformed = await transformUriAsync(src, true, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== src) {\n $(img).attr(\"src\", transformed)\n modified = true\n }\n }\n }\n\n // aタグのhref属性を変換\n const aTags = $(\"a\").toArray()\n for (const a of aTags) {\n const href = $(a).attr(\"href\")\n if (href) {\n const transformed = await transformUriAsync(href, false, options.markdownFilePath, options.workspaceRoot, options.validateExistence)\n if (transformed !== href) {\n $(a).attr(\"href\", transformed)\n modified = true\n }\n }\n }\n\n if (modified) {\n // 変更があれば node.value を更新\n // html() はエンコードされた実体を返す可能性があるが、HTMLノードとしては許容される\n const newHtml = $.html()\n if (newHtml) {\n node.value = newHtml\n }\n }\n })\n\n await Promise.all([...transformPromises, ...htmlTransformPromises])\n }\n}\n","// @generated by protoc-gen-es v1.10.1 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from \"@bufbuild/protobuf\"\nimport { Message, proto3 } from \"@bufbuild/protobuf\"\n\n/**\n * @generated from message markdown.v1.ConvertRequest\n */\nexport class ConvertRequest extends Message<ConvertRequest> {\n /**\n * @generated from field: string markdown_text = 1;\n */\n markdownText = \"\"\n\n /**\n * @generated from field: string file_path = 2;\n */\n filePath = \"\"\n\n /**\n * @generated from field: string workspace_root = 3;\n */\n workspaceRoot = \"\"\n\n /**\n * @generated from field: bool validate_existence = 4;\n */\n validateExistence = false\n\n /**\n * @generated from field: optional bool enable_subscript = 5;\n */\n enableSubscript?: boolean\n\n /**\n * @generated from field: optional bool enable_superscript = 6;\n */\n enableSuperscript?: boolean\n\n /**\n * @generated from field: optional bool enable_mark = 7;\n */\n enableMark?: boolean\n\n /**\n * @generated from field: optional bool enable_table_merge = 8;\n */\n enableTableMerge?: boolean\n\n /**\n * @generated from field: optional bool enable_embeds = 9;\n */\n enableEmbeds?: boolean\n\n /**\n * @generated from field: optional bool enable_zenn_directives = 10;\n */\n enableZennDirectives?: boolean\n\n constructor(data?: PartialMessage<ConvertRequest>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertRequest\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"markdown_text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"file_path\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 3, name: \"workspace_root\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 4, name: \"validate_existence\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */ },\n { no: 5, name: \"enable_subscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 6, name: \"enable_superscript\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 7, name: \"enable_mark\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 8, name: \"enable_table_merge\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 9, name: \"enable_embeds\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n { no: 10, name: \"enable_zenn_directives\", kind: \"scalar\", T: 8 /* ScalarType.BOOL */, opt: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertRequest {\n return new ConvertRequest().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertRequest {\n return new ConvertRequest().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertRequest | PlainMessage<ConvertRequest> | undefined, b: ConvertRequest | PlainMessage<ConvertRequest> | undefined): boolean {\n return proto3.util.equals(ConvertRequest, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.ConvertResponse\n */\nexport class ConvertResponse extends Message<ConvertResponse> {\n /**\n * @generated from field: string html_content = 1;\n */\n htmlContent = \"\"\n\n /**\n * @generated from field: repeated markdown.v1.Heading headings = 2;\n */\n headings: Heading[] = []\n\n constructor(data?: PartialMessage<ConvertResponse>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.ConvertResponse\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"html_content\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"headings\", kind: \"message\", T: Heading, repeated: true },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ConvertResponse {\n return new ConvertResponse().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ConvertResponse {\n return new ConvertResponse().fromJsonString(jsonString, options)\n }\n\n static equals(a: ConvertResponse | PlainMessage<ConvertResponse> | undefined, b: ConvertResponse | PlainMessage<ConvertResponse> | undefined): boolean {\n return proto3.util.equals(ConvertResponse, a, b)\n }\n}\n\n/**\n * @generated from message markdown.v1.Heading\n */\nexport class Heading extends Message<Heading> {\n /**\n * @generated from field: string text = 1;\n */\n text = \"\"\n\n /**\n * @generated from field: int32 depth = 2;\n */\n depth = 0\n\n /**\n * @generated from field: string id = 3;\n */\n id = \"\"\n\n constructor(data?: PartialMessage<Heading>) {\n super()\n proto3.util.initPartial(data, this)\n }\n\n static readonly runtime: typeof proto3 = proto3\n static readonly typeName = \"markdown.v1.Heading\"\n static readonly fields: FieldList = proto3.util.newFieldList(() => [\n { no: 1, name: \"text\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n { no: 2, name: \"depth\", kind: \"scalar\", T: 5 /* ScalarType.INT32 */ },\n { no: 3, name: \"id\", kind: \"scalar\", T: 9 /* ScalarType.STRING */ },\n ])\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Heading {\n return new Heading().fromBinary(bytes, options)\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJson(jsonValue, options)\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Heading {\n return new Heading().fromJsonString(jsonString, options)\n }\n\n static equals(a: Heading | PlainMessage<Heading> | undefined, b: Heading | PlainMessage<Heading> | undefined): boolean {\n return proto3.util.equals(Heading, a, b)\n }\n}\n","// @generated by protoc-gen-connect-es v1.7.0 with parameter \"target=ts\"\n// @generated from file markdown/v1/markdown.proto (package markdown.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport { MethodKind } from \"@bufbuild/protobuf\"\nimport { ConvertRequest, ConvertResponse } from \"./markdown_pb.js\"\n\n/**\n * @generated from service markdown.v1.MarkdownService\n */\nexport const MarkdownService = {\n typeName: \"markdown.v1.MarkdownService\",\n methods: {\n /**\n * @generated from rpc markdown.v1.MarkdownService.Convert\n */\n convert: {\n name: \"Convert\",\n I: ConvertRequest,\n O: ConvertResponse,\n kind: MethodKind.Unary,\n },\n },\n} as const\n","import { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport * as net from \"node:net\"\nimport * as path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { createClient } from \"@connectrpc/connect\"\nimport { createConnectTransport } from \"@connectrpc/connect-node\"\nimport { MarkdownService } from \"./gen/markdown/v1/markdown_connect.ts\"\n\nconst SOCKET_PATH = process.env.MARKDOWN_SOCKET_PATH || \"/tmp/markdown.sock\"\n\nconst transport = createConnectTransport({\n baseUrl: \"http://localhost\",\n httpVersion: \"2\",\n nodeOptions: {\n createConnection: () => {\n return net.connect(SOCKET_PATH)\n },\n } as unknown as Record<string, unknown>,\n})\n\nconst client = createClient(MarkdownService, transport)\n\nexport interface ParseResult {\n htmlContent: string\n headings: Array<{\n text: string\n depth: number\n id: string\n }>\n}\n\nexport interface ParseOptions {\n validateExistence?: boolean\n enableSubscript?: boolean\n enableSuperscript?: boolean\n enableMark?: boolean\n enableTableMerge?: boolean\n enableEmbeds?: boolean\n enableZennDirectives?: boolean\n}\n\n// Get the current directory name in an ES Modules friendly way\nconst getDirname = () => {\n try {\n const __filename = fileURLToPath(import.meta.url)\n return path.dirname(__filename)\n } catch {\n return __dirname\n }\n}\n\n// Locate the Go server binary path inside the package or monorepo\nconst getBinaryPath = (): string | undefined => {\n const dir = getDirname()\n // 1. In the same directory as the transpile output (dist/markdown-api)\n const sameDir = path.join(dir, \"markdown-api\")\n if (existsSync(sameDir)) return sameDir\n\n // 2. Fallback to dist directory from src\n const distDir = path.join(dir, \"..\", \"dist\", \"markdown-api\")\n if (existsSync(distDir)) return distDir\n\n // 3. Fallback to monorepo go packages folder for dev environment\n const devDir = path.join(dir, \"..\", \"..\", \"go\", \"markdown-api\", \"markdown-api\")\n if (existsSync(devDir)) return devDir\n\n return undefined\n}\n\nconst canConnect = (): Promise<boolean> =>\n new Promise((resolve) => {\n const socket = net.connect(SOCKET_PATH)\n socket.on(\"connect\", () => {\n socket.destroy()\n resolve(true)\n })\n socket.on(\"error\", () => resolve(false))\n })\n\nconst waitForServer = async (timeoutMs: number): Promise<boolean> => {\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (await canConnect()) return true\n await new Promise((r) => setTimeout(r, 100))\n }\n return false\n}\n\nlet spawnedServer: ReturnType<typeof spawn> | null = null\nlet startPromise: Promise<boolean> | null = null\n\nconst ensureServerRunning = async (): Promise<boolean> => {\n if (await canConnect()) return true\n\n if (startPromise) return startPromise\n\n startPromise = (async () => {\n const binPath = getBinaryPath()\n if (!binPath) {\n console.warn(\"markdown-api binary not found. Cannot auto-start markdown server.\")\n return false\n }\n\n // Clean up stale socket file if it exists\n try {\n if (existsSync(SOCKET_PATH)) {\n const fs = await import(\"node:fs\")\n fs.unlinkSync(SOCKET_PATH)\n }\n } catch {\n // ignore\n }\n\n try {\n spawnedServer = spawn(binPath, [], { stdio: \"ignore\" })\n\n const cleanup = () => {\n if (spawnedServer) {\n try {\n spawnedServer.kill(\"SIGTERM\")\n } catch {\n // ignore\n }\n spawnedServer = null\n }\n }\n\n process.on(\"exit\", cleanup)\n\n const ready = await waitForServer(10000)\n if (!ready) {\n console.error(\"markdown-api Go server did not become ready on socket:\", SOCKET_PATH)\n cleanup()\n return false\n }\n return true\n } catch (err) {\n console.error(\"Failed to spawn markdown-api Go server:\", err)\n spawnedServer = null\n return false\n }\n })()\n\n const success = await startPromise\n if (!success) {\n startPromise = null\n }\n return success\n}\n\nexport const parseMarkdown = async (markdownText: string, markdownFilePath: string, workspaceRoot: string, userOAuthToken?: string, validateExistenceOrOptions: boolean | ParseOptions = true): Promise<ParseResult> => {\n // Automatically ensure the backend Go server is running\n await ensureServerRunning()\n\n let validateExistence = true\n let enableSubscript: boolean | undefined\n let enableSuperscript: boolean | undefined\n let enableMark: boolean | undefined\n let enableTableMerge: boolean | undefined\n let enableEmbeds: boolean | undefined\n let enableZennDirectives: boolean | undefined\n\n if (typeof validateExistenceOrOptions === \"boolean\") {\n validateExistence = validateExistenceOrOptions\n } else if (validateExistenceOrOptions && typeof validateExistenceOrOptions === \"object\") {\n validateExistence = validateExistenceOrOptions.validateExistence ?? true\n enableSubscript = validateExistenceOrOptions.enableSubscript\n enableSuperscript = validateExistenceOrOptions.enableSuperscript\n enableMark = validateExistenceOrOptions.enableMark\n enableTableMerge = validateExistenceOrOptions.enableTableMerge\n enableEmbeds = validateExistenceOrOptions.enableEmbeds\n enableZennDirectives = validateExistenceOrOptions.enableZennDirectives\n }\n\n const headers: Record<string, string> = {}\n if (userOAuthToken) {\n headers.Authorization = `Bearer ${userOAuthToken}`\n }\n\n const response = await client.convert(\n {\n markdownText,\n filePath: markdownFilePath,\n workspaceRoot,\n validateExistence,\n enableSubscript,\n enableSuperscript,\n enableMark,\n enableTableMerge,\n enableEmbeds,\n enableZennDirectives,\n },\n { headers },\n )\n\n return {\n htmlContent: response.htmlContent,\n headings: response.headings.map((h) => ({\n text: h.text,\n depth: h.depth,\n id: h.id,\n })),\n }\n}\n"],"names":["importRegex","remarkImportDirective","options","tree","markdownFilePath","parentDir","path","imports","visit","node","index","parent","match","importPath","absolutePath","parsedTrees","fileContent","fs","error","Logger","i","newTree","URI_SCHEME_REGEX","transformUriAsync","uri","isImage","workspaceRoot","validateExistence","protocol","decodedUri","markdownDir","projectRelativePath","pathForEncoding","urlJoin","remarkResolveUriAsync","uriNodes","htmlNodes","targetNode","transformPromises","transformedUri","htmlTransformPromises","$","cheerio","modified","imgTags","img","src","transformed","aTags","a","href","newHtml","ConvertRequest","Message","data","proto3","bytes","jsonValue","jsonString","b","ConvertResponse","Heading","MarkdownService","MethodKind","SOCKET_PATH","transport","createConnectTransport","net","client","createClient","getDirname","__filename","fileURLToPath","getBinaryPath","dir","sameDir","existsSync","distDir","devDir","canConnect","resolve","socket","waitForServer","timeoutMs","start","r","spawnedServer","startPromise","ensureServerRunning","binPath","spawn","cleanup","err","success","parseMarkdown","markdownText","userOAuthToken","validateExistenceOrOptions","enableSubscript","enableSuperscript","enableMark","enableTableMerge","enableEmbeds","enableZennDirectives","headers","response","h"],"mappings":"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"}
|
package/dist/markdown-api
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiquants/markdown",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.2",
|
|
4
4
|
"description": "Markdown renderer for React with advanced features",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -140,8 +140,8 @@
|
|
|
140
140
|
"license-check": "pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"",
|
|
141
141
|
"license-check:json": "pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\" --json",
|
|
142
142
|
"clean": "rimraf dist",
|
|
143
|
-
"publish:patch": "
|
|
144
|
-
"publish:minor": "
|
|
145
|
-
"publish:major": "
|
|
143
|
+
"publish:patch": "pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
144
|
+
"publish:minor": "pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
145
|
+
"publish:major": "pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks"
|
|
146
146
|
}
|
|
147
147
|
}
|