@aiquants/markdown 1.7.0 → 1.9.0
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.
- package/dist/index.server.cjs +1 -1
- package/dist/index.server.cjs.map +1 -1
- package/dist/index.server.js +182 -120
- package/dist/index.server.js.map +1 -1
- package/dist/markdown-api +0 -0
- package/dist/src/remarkProcessor.server.d.ts.map +1 -1
- package/dist/vite.config.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.server.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";var x=Object.create;var U=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var I=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of J(e))!N.call(t,a)&&a!==r&&U(t,a,{get:()=>e[a],enumerable:!(s=j(e,a))||s.enumerable});return t};var E=(t,e,r)=>(r=t!=null?x(L(t)):{},I(e||!t||!t.__esModule?U(r,"default",{value:t,enumerable:!0}):r,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("node:fs/promises"),h=require("node:path"),A=require("unist-util-visit"),S=require("./simple-logger-DZxBpX7v.cjs"),B=require("cheerio"),$=require("url-join"),z=require("node:child_process"),v=require("node:fs"),W=require("node:net"),G=require("node:url"),K=require("@connectrpc/connect"),Z=require("@connectrpc/connect-node"),c=require("@bufbuild/protobuf");var M=typeof document<"u"?document.currentScript:null;function R(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,s.get?s:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const P=R(h),H=R(B),C=R(W),V=/<!--\s+@import\s+"(.+?)"\s+-->/;function X(t){return async e=>{const{markdownFilePath:r}=t,s=h.dirname(r),a=[];if(A.visit(e,"html",(o,n,i)=>{if(!i||typeof n!="number")return;const l=o.value.match(V);if(!l)return;const f=l[1],u=h.resolve(s,f);Array.isArray(i.children)&&a.push({parent:i,index:n,absolutePath:u})}),a.length===0)return;const d=await Promise.all(a.map(async({absolutePath:o})=>{try{const n=await D.readFile(o,"utf-8");return this.parse(n)}catch(n){return n&&n.code==="ENOENT"?S.Logger.warn(`[remark-import-directive] Import file not found: ${o}`):S.Logger.error(`[remark-import-directive] Error processing import: ${o}`,n),null}}));for(let o=a.length-1;o>=0;o--){const{parent:n,index:i}=a[o],l=d[o];l?.children&&Array.isArray(l.children)&&n.children.splice(i,1,...l.children)}}}const Q=/^[a-z][a-z0-9+.-]*:/,_=async(t,e,r,s,a=!1)=>{if(!t)return"";if(Q.test(t)){const f=t.substring(0,t.indexOf(":")).toLowerCase();if(["http","https","mailto","tel","file"].includes(f))return t}if(t.startsWith("#")||t.startsWith("/"))return t;const d=decodeURIComponent(t),o=h.dirname(r),n=h.normalize(h.join(o,d)),i=h.resolve(s,n);if(!i.startsWith(s)||n.startsWith(".."))return S.Logger.error(`Security Alert: Attempt to access file outside project root: ${i}`),"";if(a)try{await D.access(i)}catch{return S.Logger.warn(`File not found: ${i}`),""}const l=n.replace(/\\/g,"/");return e?$("/assets/",l):`?filePath=${encodeURIComponent(l)}`};function Y(t){return async e=>{if(!(t?.markdownFilePath&&t?.workspaceRoot)){S.Logger.warn("remark-resolve-uri-async: markdownFilePath and workspaceRoot are required. Skipping URI resolution.");return}const r=[],s=[];A.visit(e,["image","link","html"],o=>{if(o.type==="html")s.push(o);else{const n=o;n.url&&r.push({node:n,isImage:n.type==="image"})}});const a=r.map(async({node:o,isImage:n})=>{const i=await _(o.url,n,t.markdownFilePath,t.workspaceRoot,t.validateExistence);o.url=i}),d=s.map(async o=>{const n=H.load(o.value,null,!1);let i=!1;const l=n("img").toArray();for(const u of l){const m=n(u).attr("src");if(m){const p=await _(m,!0,t.markdownFilePath,t.workspaceRoot,t.validateExistence);p!==m&&(n(u).attr("src",p),i=!0)}}const f=n("a").toArray();for(const u of f){const m=n(u).attr("href");if(m){const p=await _(m,!1,t.markdownFilePath,t.workspaceRoot,t.validateExistence);p!==m&&(n(u).attr("href",p),i=!0)}}if(i){const u=n.html();u&&(o.value=u)}});await Promise.all([...a,...d])}}class w extends c.Message{markdownText="";filePath="";workspaceRoot="";validateExistence=!1;enableSubscript;enableSuperscript;enableMark;enableTableMerge;enableEmbeds;enableZennDirectives;constructor(e){super(),c.proto3.util.initPartial(e,this)}static runtime=c.proto3;static typeName="markdown.v1.ConvertRequest";static fields=c.proto3.util.newFieldList(()=>[{no:1,name:"markdown_text",kind:"scalar",T:9},{no:2,name:"file_path",kind:"scalar",T:9},{no:3,name:"workspace_root",kind:"scalar",T:9},{no:4,name:"validate_existence",kind:"scalar",T:8},{no:5,name:"enable_subscript",kind:"scalar",T:8,opt:!0},{no:6,name:"enable_superscript",kind:"scalar",T:8,opt:!0},{no:7,name:"enable_mark",kind:"scalar",T:8,opt:!0},{no:8,name:"enable_table_merge",kind:"scalar",T:8,opt:!0},{no:9,name:"enable_embeds",kind:"scalar",T:8,opt:!0},{no:10,name:"enable_zenn_directives",kind:"scalar",T:8,opt:!0}]);static fromBinary(e,r){return new w().fromBinary(e,r)}static fromJson(e,r){return new w().fromJson(e,r)}static fromJsonString(e,r){return new w().fromJsonString(e,r)}static equals(e,r){return c.proto3.util.equals(w,e,r)}}class k extends c.Message{htmlContent="";headings=[];constructor(e){super(),c.proto3.util.initPartial(e,this)}static runtime=c.proto3;static typeName="markdown.v1.ConvertResponse";static fields=c.proto3.util.newFieldList(()=>[{no:1,name:"html_content",kind:"scalar",T:9},{no:2,name:"headings",kind:"message",T:y,repeated:!0}]);static fromBinary(e,r){return new k().fromBinary(e,r)}static fromJson(e,r){return new k().fromJson(e,r)}static fromJsonString(e,r){return new k().fromJsonString(e,r)}static equals(e,r){return c.proto3.util.equals(k,e,r)}}class y extends c.Message{text="";depth=0;id="";constructor(e){super(),c.proto3.util.initPartial(e,this)}static runtime=c.proto3;static typeName="markdown.v1.Heading";static fields=c.proto3.util.newFieldList(()=>[{no:1,name:"text",kind:"scalar",T:9},{no:2,name:"depth",kind:"scalar",T:5},{no:3,name:"id",kind:"scalar",T:9}]);static fromBinary(e,r){return new y().fromBinary(e,r)}static fromJson(e,r){return new y().fromJson(e,r)}static fromJsonString(e,r){return new y().fromJsonString(e,r)}static equals(e,r){return c.proto3.util.equals(y,e,r)}}const O={typeName:"markdown.v1.MarkdownService",methods:{convert:{name:"Convert",I:w,O:k,kind:c.MethodKind.Unary}}},T=process.env.MARKDOWN_SOCKET_PATH||"/tmp/markdown.sock",ee=Z.createConnectTransport({baseUrl:"http://localhost",httpVersion:"2",nodeOptions:{createConnection:()=>C.connect(T)}}),te=K.createClient(O,ee),re=()=>{try{const t=G.fileURLToPath(typeof document>"u"?require("url").pathToFileURL(t).href:M&&M.tagName.toUpperCase()==="SCRIPT"&&M.src||new URL("index.server.cjs",document.baseURI).href);return P.dirname(t)}catch{return __dirname}},ne=()=>{const t=re(),e=P.join(t,"markdown-api");if(v.existsSync(e))return e;const r=P.join(t,"..","dist","markdown-api");if(v.existsSync(r))return r;const s=P.join(t,"..","..","go","markdown-api","markdown-api");if(v.existsSync(s))return s},F=()=>new Promise(t=>{const e=C.connect(T);e.on("connect",()=>{e.destroy(),t(!0)}),e.on("error",()=>t(!1))}),ae=async t=>{const e=Date.now();for(;Date.now()-e<t;){if(await F())return!0;await new Promise(r=>setTimeout(r,100))}return!1};let g=null,b=null;const oe=async()=>{if(await F())return!0;if(b)return b;b=(async()=>{const e=ne();if(!e)return console.warn("markdown-api binary not found. Cannot auto-start markdown server."),!1;try{v.existsSync(T)&&(await import("node:fs")).unlinkSync(T)}catch{}try{g=z.spawn(e,[],{stdio:"ignore"});const r=()=>{if(g){try{g.kill("SIGTERM")}catch{}g=null}};return process.on("exit",r),await ae(1e4)?!0:(console.error("markdown-api Go server did not become ready on socket:",T),r(),!1)}catch(r){return console.error("Failed to spawn markdown-api Go server:",r),g=null,!1}})();const t=await b;return t||(b=null),t},se=async(t,e,r,s,a=!0)=>{await oe();let d=!0,o,n,i,l,f,u;typeof a=="boolean"?d=a:a&&typeof a=="object"&&(d=a.validateExistence??!0,o=a.enableSubscript,n=a.enableSuperscript,i=a.enableMark,l=a.enableTableMerge,f=a.enableEmbeds,u=a.enableZennDirectives);const m={};s&&(m.Authorization=`Bearer ${s}`);const p=await te.convert({markdownText:t,filePath:e,workspaceRoot:r,validateExistence:d,enableSubscript:o,enableSuperscript:n,enableMark:i,enableTableMerge:l,enableEmbeds:f,enableZennDirectives:u},{headers:m});return{htmlContent:p.htmlContent,headings:p.headings.map(q=>({text:q.text,depth:q.depth,id:q.id}))}};exports.parseMarkdown=se;exports.remarkImportDirective=X;exports.remarkResolveUriAsync=Y;exports.transformUriAsync=_;
|
|
2
2
|
//# sourceMappingURL=index.server.cjs.map
|
|
@@ -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 * as net from \"node:net\"\nimport { createClient } from \"@connectrpc/connect\"\nimport { createConnectTransport } from \"@connectrpc/connect-node\"\nimport { MarkdownService } from \"./gen/markdown/v1/markdown_connect.ts\"\n\nconst transport = createConnectTransport({\n baseUrl: \"http://localhost\",\n httpVersion: \"2\",\n nodeOptions: {\n createConnection: () => {\n return net.connect(\"/workspace/tmp/markdown.sock\")\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\nexport const parseMarkdown = async (markdownText: string, markdownFilePath: string, workspaceRoot: string, userOAuthToken?: string, validateExistenceOrOptions: boolean | ParseOptions = true): Promise<ParseResult> => {\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","transport","createConnectTransport","net","client","createClient","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: 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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"}
|
package/dist/index.server.js
CHANGED
|
@@ -1,111 +1,115 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import D from "node:fs/promises";
|
|
2
|
+
import * as P from "node:path";
|
|
3
|
+
import w from "node:path";
|
|
4
|
+
import { visit as J } from "unist-util-visit";
|
|
5
|
+
import { L as v } from "./simple-logger-DIfMY3fH.js";
|
|
6
|
+
import * as _ from "cheerio";
|
|
7
|
+
import x from "url-join";
|
|
8
|
+
import { spawn as U } from "node:child_process";
|
|
9
|
+
import { existsSync as S } from "node:fs";
|
|
10
|
+
import * as R from "node:net";
|
|
11
|
+
import { fileURLToPath as E } from "node:url";
|
|
12
|
+
import { createClient as N } from "@connectrpc/connect";
|
|
13
|
+
import { createConnectTransport as I } from "@connectrpc/connect-node";
|
|
14
|
+
import { Message as A, proto3 as m, MethodKind as B } from "@bufbuild/protobuf";
|
|
15
|
+
const j = /<!--\s+@import\s+"(.+?)"\s+-->/;
|
|
16
|
+
function oe(r) {
|
|
13
17
|
return async (e) => {
|
|
14
|
-
const { markdownFilePath: t } =
|
|
15
|
-
if (
|
|
16
|
-
if (!s || typeof
|
|
18
|
+
const { markdownFilePath: t } = r, i = w.dirname(t), o = [];
|
|
19
|
+
if (J(e, "html", (a, n, s) => {
|
|
20
|
+
if (!s || typeof n != "number")
|
|
17
21
|
return;
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
22
|
+
const c = a.value.match(j);
|
|
23
|
+
if (!c)
|
|
20
24
|
return;
|
|
21
|
-
const
|
|
22
|
-
Array.isArray(s.children) && o.push({ parent: s, index:
|
|
25
|
+
const d = c[1], l = w.resolve(i, d);
|
|
26
|
+
Array.isArray(s.children) && o.push({ parent: s, index: n, absolutePath: l });
|
|
23
27
|
}), o.length === 0)
|
|
24
28
|
return;
|
|
25
|
-
const
|
|
29
|
+
const f = await Promise.all(
|
|
26
30
|
o.map(async ({ absolutePath: a }) => {
|
|
27
31
|
try {
|
|
28
|
-
const
|
|
29
|
-
return this.parse(
|
|
30
|
-
} catch (
|
|
31
|
-
return
|
|
32
|
+
const n = await D.readFile(a, "utf-8");
|
|
33
|
+
return this.parse(n);
|
|
34
|
+
} catch (n) {
|
|
35
|
+
return n && n.code === "ENOENT" ? v.warn(`[remark-import-directive] Import file not found: ${a}`) : v.error(`[remark-import-directive] Error processing import: ${a}`, n), null;
|
|
32
36
|
}
|
|
33
37
|
})
|
|
34
38
|
);
|
|
35
39
|
for (let a = o.length - 1; a >= 0; a--) {
|
|
36
|
-
const { parent:
|
|
37
|
-
|
|
40
|
+
const { parent: n, index: s } = o[a], c = f[a];
|
|
41
|
+
c?.children && Array.isArray(c.children) && n.children.splice(s, 1, ...c.children);
|
|
38
42
|
}
|
|
39
43
|
};
|
|
40
44
|
}
|
|
41
|
-
const
|
|
42
|
-
if (!
|
|
45
|
+
const L = /^[a-z][a-z0-9+.-]*:/, M = async (r, e, t, i, o = !1) => {
|
|
46
|
+
if (!r)
|
|
43
47
|
return "";
|
|
44
|
-
if (
|
|
45
|
-
const
|
|
46
|
-
if (["http", "https", "mailto", "tel", "file"].includes(
|
|
47
|
-
return
|
|
48
|
+
if (L.test(r)) {
|
|
49
|
+
const d = r.substring(0, r.indexOf(":")).toLowerCase();
|
|
50
|
+
if (["http", "https", "mailto", "tel", "file"].includes(d))
|
|
51
|
+
return r;
|
|
48
52
|
}
|
|
49
|
-
if (
|
|
50
|
-
return
|
|
51
|
-
const
|
|
52
|
-
if (!s.startsWith(
|
|
53
|
-
return
|
|
53
|
+
if (r.startsWith("#") || r.startsWith("/"))
|
|
54
|
+
return r;
|
|
55
|
+
const f = decodeURIComponent(r), a = w.dirname(t), n = w.normalize(w.join(a, f)), s = w.resolve(i, n);
|
|
56
|
+
if (!s.startsWith(i) || n.startsWith(".."))
|
|
57
|
+
return v.error(`Security Alert: Attempt to access file outside project root: ${s}`), "";
|
|
54
58
|
if (o)
|
|
55
59
|
try {
|
|
56
|
-
await
|
|
60
|
+
await D.access(s);
|
|
57
61
|
} catch {
|
|
58
|
-
return
|
|
62
|
+
return v.warn(`File not found: ${s}`), "";
|
|
59
63
|
}
|
|
60
|
-
const
|
|
61
|
-
return e ?
|
|
64
|
+
const c = n.replace(/\\/g, "/");
|
|
65
|
+
return e ? x("/assets/", c) : `?filePath=${encodeURIComponent(c)}`;
|
|
62
66
|
};
|
|
63
|
-
function
|
|
67
|
+
function se(r) {
|
|
64
68
|
return async (e) => {
|
|
65
|
-
if (!(
|
|
66
|
-
|
|
69
|
+
if (!(r?.markdownFilePath && r?.workspaceRoot)) {
|
|
70
|
+
v.warn("remark-resolve-uri-async: markdownFilePath and workspaceRoot are required. Skipping URI resolution.");
|
|
67
71
|
return;
|
|
68
72
|
}
|
|
69
|
-
const t = [],
|
|
70
|
-
|
|
73
|
+
const t = [], i = [];
|
|
74
|
+
J(e, ["image", "link", "html"], (a) => {
|
|
71
75
|
if (a.type === "html")
|
|
72
|
-
|
|
76
|
+
i.push(a);
|
|
73
77
|
else {
|
|
74
|
-
const
|
|
75
|
-
|
|
78
|
+
const n = a;
|
|
79
|
+
n.url && t.push({ node: n, isImage: n.type === "image" });
|
|
76
80
|
}
|
|
77
81
|
});
|
|
78
|
-
const o = t.map(async ({ node: a, isImage:
|
|
79
|
-
const s = await
|
|
82
|
+
const o = t.map(async ({ node: a, isImage: n }) => {
|
|
83
|
+
const s = await M(a.url, n, r.markdownFilePath, r.workspaceRoot, r.validateExistence);
|
|
80
84
|
a.url = s;
|
|
81
|
-
}),
|
|
82
|
-
const
|
|
85
|
+
}), f = i.map(async (a) => {
|
|
86
|
+
const n = _.load(a.value, null, !1);
|
|
83
87
|
let s = !1;
|
|
84
|
-
const
|
|
85
|
-
for (const
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
const p = await
|
|
89
|
-
p !==
|
|
88
|
+
const c = n("img").toArray();
|
|
89
|
+
for (const l of c) {
|
|
90
|
+
const u = n(l).attr("src");
|
|
91
|
+
if (u) {
|
|
92
|
+
const p = await M(u, !0, r.markdownFilePath, r.workspaceRoot, r.validateExistence);
|
|
93
|
+
p !== u && (n(l).attr("src", p), s = !0);
|
|
90
94
|
}
|
|
91
95
|
}
|
|
92
|
-
const
|
|
93
|
-
for (const
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
const p = await
|
|
97
|
-
p !==
|
|
96
|
+
const d = n("a").toArray();
|
|
97
|
+
for (const l of d) {
|
|
98
|
+
const u = n(l).attr("href");
|
|
99
|
+
if (u) {
|
|
100
|
+
const p = await M(u, !1, r.markdownFilePath, r.workspaceRoot, r.validateExistence);
|
|
101
|
+
p !== u && (n(l).attr("href", p), s = !0);
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
104
|
if (s) {
|
|
101
|
-
const
|
|
102
|
-
|
|
105
|
+
const l = n.html();
|
|
106
|
+
l && (a.value = l);
|
|
103
107
|
}
|
|
104
108
|
});
|
|
105
|
-
await Promise.all([...o, ...
|
|
109
|
+
await Promise.all([...o, ...f]);
|
|
106
110
|
};
|
|
107
111
|
}
|
|
108
|
-
class
|
|
112
|
+
class h extends A {
|
|
109
113
|
/**
|
|
110
114
|
* @generated from field: string markdown_text = 1;
|
|
111
115
|
*/
|
|
@@ -147,11 +151,11 @@ class k extends v {
|
|
|
147
151
|
*/
|
|
148
152
|
enableZennDirectives;
|
|
149
153
|
constructor(e) {
|
|
150
|
-
super(),
|
|
154
|
+
super(), m.util.initPartial(e, this);
|
|
151
155
|
}
|
|
152
|
-
static runtime =
|
|
156
|
+
static runtime = m;
|
|
153
157
|
static typeName = "markdown.v1.ConvertRequest";
|
|
154
|
-
static fields =
|
|
158
|
+
static fields = m.util.newFieldList(() => [
|
|
155
159
|
{
|
|
156
160
|
no: 1,
|
|
157
161
|
name: "markdown_text",
|
|
@@ -188,19 +192,19 @@ class k extends v {
|
|
|
188
192
|
{ no: 10, name: "enable_zenn_directives", kind: "scalar", T: 8, opt: !0 }
|
|
189
193
|
]);
|
|
190
194
|
static fromBinary(e, t) {
|
|
191
|
-
return new
|
|
195
|
+
return new h().fromBinary(e, t);
|
|
192
196
|
}
|
|
193
197
|
static fromJson(e, t) {
|
|
194
|
-
return new
|
|
198
|
+
return new h().fromJson(e, t);
|
|
195
199
|
}
|
|
196
200
|
static fromJsonString(e, t) {
|
|
197
|
-
return new
|
|
201
|
+
return new h().fromJsonString(e, t);
|
|
198
202
|
}
|
|
199
203
|
static equals(e, t) {
|
|
200
|
-
return
|
|
204
|
+
return m.util.equals(h, e, t);
|
|
201
205
|
}
|
|
202
206
|
}
|
|
203
|
-
class
|
|
207
|
+
class k extends A {
|
|
204
208
|
/**
|
|
205
209
|
* @generated from field: string html_content = 1;
|
|
206
210
|
*/
|
|
@@ -210,11 +214,11 @@ class w extends v {
|
|
|
210
214
|
*/
|
|
211
215
|
headings = [];
|
|
212
216
|
constructor(e) {
|
|
213
|
-
super(),
|
|
217
|
+
super(), m.util.initPartial(e, this);
|
|
214
218
|
}
|
|
215
|
-
static runtime =
|
|
219
|
+
static runtime = m;
|
|
216
220
|
static typeName = "markdown.v1.ConvertResponse";
|
|
217
|
-
static fields =
|
|
221
|
+
static fields = m.util.newFieldList(() => [
|
|
218
222
|
{
|
|
219
223
|
no: 1,
|
|
220
224
|
name: "html_content",
|
|
@@ -222,22 +226,22 @@ class w extends v {
|
|
|
222
226
|
T: 9
|
|
223
227
|
/* ScalarType.STRING */
|
|
224
228
|
},
|
|
225
|
-
{ no: 2, name: "headings", kind: "message", T:
|
|
229
|
+
{ no: 2, name: "headings", kind: "message", T: y, repeated: !0 }
|
|
226
230
|
]);
|
|
227
231
|
static fromBinary(e, t) {
|
|
228
|
-
return new
|
|
232
|
+
return new k().fromBinary(e, t);
|
|
229
233
|
}
|
|
230
234
|
static fromJson(e, t) {
|
|
231
|
-
return new
|
|
235
|
+
return new k().fromJson(e, t);
|
|
232
236
|
}
|
|
233
237
|
static fromJsonString(e, t) {
|
|
234
|
-
return new
|
|
238
|
+
return new k().fromJsonString(e, t);
|
|
235
239
|
}
|
|
236
240
|
static equals(e, t) {
|
|
237
|
-
return
|
|
241
|
+
return m.util.equals(k, e, t);
|
|
238
242
|
}
|
|
239
243
|
}
|
|
240
|
-
class
|
|
244
|
+
class y extends A {
|
|
241
245
|
/**
|
|
242
246
|
* @generated from field: string text = 1;
|
|
243
247
|
*/
|
|
@@ -251,11 +255,11 @@ class b extends v {
|
|
|
251
255
|
*/
|
|
252
256
|
id = "";
|
|
253
257
|
constructor(e) {
|
|
254
|
-
super(),
|
|
258
|
+
super(), m.util.initPartial(e, this);
|
|
255
259
|
}
|
|
256
|
-
static runtime =
|
|
260
|
+
static runtime = m;
|
|
257
261
|
static typeName = "markdown.v1.Heading";
|
|
258
|
-
static fields =
|
|
262
|
+
static fields = m.util.newFieldList(() => [
|
|
259
263
|
{
|
|
260
264
|
no: 1,
|
|
261
265
|
name: "text",
|
|
@@ -279,19 +283,19 @@ class b extends v {
|
|
|
279
283
|
}
|
|
280
284
|
]);
|
|
281
285
|
static fromBinary(e, t) {
|
|
282
|
-
return new
|
|
286
|
+
return new y().fromBinary(e, t);
|
|
283
287
|
}
|
|
284
288
|
static fromJson(e, t) {
|
|
285
|
-
return new
|
|
289
|
+
return new y().fromJson(e, t);
|
|
286
290
|
}
|
|
287
291
|
static fromJsonString(e, t) {
|
|
288
|
-
return new
|
|
292
|
+
return new y().fromJsonString(e, t);
|
|
289
293
|
}
|
|
290
294
|
static equals(e, t) {
|
|
291
|
-
return
|
|
295
|
+
return m.util.equals(y, e, t);
|
|
292
296
|
}
|
|
293
297
|
}
|
|
294
|
-
const
|
|
298
|
+
const $ = {
|
|
295
299
|
typeName: "markdown.v1.MarkdownService",
|
|
296
300
|
methods: {
|
|
297
301
|
/**
|
|
@@ -299,50 +303,108 @@ const C = {
|
|
|
299
303
|
*/
|
|
300
304
|
convert: {
|
|
301
305
|
name: "Convert",
|
|
302
|
-
I:
|
|
303
|
-
O:
|
|
304
|
-
kind:
|
|
306
|
+
I: h,
|
|
307
|
+
O: k,
|
|
308
|
+
kind: B.Unary
|
|
305
309
|
}
|
|
306
310
|
}
|
|
307
|
-
},
|
|
311
|
+
}, T = process.env.MARKDOWN_SOCKET_PATH || "/tmp/markdown.sock", q = I({
|
|
308
312
|
baseUrl: "http://localhost",
|
|
309
313
|
httpVersion: "2",
|
|
310
314
|
nodeOptions: {
|
|
311
|
-
createConnection: () =>
|
|
315
|
+
createConnection: () => R.connect(T)
|
|
316
|
+
}
|
|
317
|
+
}), z = N($, q), W = () => {
|
|
318
|
+
try {
|
|
319
|
+
const r = E(import.meta.url);
|
|
320
|
+
return P.dirname(r);
|
|
321
|
+
} catch {
|
|
322
|
+
return __dirname;
|
|
323
|
+
}
|
|
324
|
+
}, G = () => {
|
|
325
|
+
const r = W(), e = P.join(r, "markdown-api");
|
|
326
|
+
if (S(e)) return e;
|
|
327
|
+
const t = P.join(r, "..", "dist", "markdown-api");
|
|
328
|
+
if (S(t)) return t;
|
|
329
|
+
const i = P.join(r, "..", "..", "go", "markdown-api", "markdown-api");
|
|
330
|
+
if (S(i)) return i;
|
|
331
|
+
}, C = () => new Promise((r) => {
|
|
332
|
+
const e = R.connect(T);
|
|
333
|
+
e.on("connect", () => {
|
|
334
|
+
e.destroy(), r(!0);
|
|
335
|
+
}), e.on("error", () => r(!1));
|
|
336
|
+
}), K = async (r) => {
|
|
337
|
+
const e = Date.now();
|
|
338
|
+
for (; Date.now() - e < r; ) {
|
|
339
|
+
if (await C()) return !0;
|
|
340
|
+
await new Promise((t) => setTimeout(t, 100));
|
|
312
341
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
342
|
+
return !1;
|
|
343
|
+
};
|
|
344
|
+
let b = null, g = null;
|
|
345
|
+
const Z = async () => {
|
|
346
|
+
if (await C()) return !0;
|
|
347
|
+
if (g) return g;
|
|
348
|
+
g = (async () => {
|
|
349
|
+
const e = G();
|
|
350
|
+
if (!e)
|
|
351
|
+
return console.warn("markdown-api binary not found. Cannot auto-start markdown server."), !1;
|
|
352
|
+
try {
|
|
353
|
+
S(T) && (await import("node:fs")).unlinkSync(T);
|
|
354
|
+
} catch {
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
b = U(e, [], { stdio: "ignore" });
|
|
358
|
+
const t = () => {
|
|
359
|
+
if (b) {
|
|
360
|
+
try {
|
|
361
|
+
b.kill("SIGTERM");
|
|
362
|
+
} catch {
|
|
363
|
+
}
|
|
364
|
+
b = null;
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
return process.on("exit", t), await K(1e4) ? !0 : (console.error("markdown-api Go server did not become ready on socket:", T), t(), !1);
|
|
368
|
+
} catch (t) {
|
|
369
|
+
return console.error("Failed to spawn markdown-api Go server:", t), b = null, !1;
|
|
370
|
+
}
|
|
371
|
+
})();
|
|
372
|
+
const r = await g;
|
|
373
|
+
return r || (g = null), r;
|
|
374
|
+
}, ie = async (r, e, t, i, o = !0) => {
|
|
375
|
+
await Z();
|
|
376
|
+
let f = !0, a, n, s, c, d, l;
|
|
377
|
+
typeof o == "boolean" ? f = o : o && typeof o == "object" && (f = o.validateExistence ?? !0, a = o.enableSubscript, n = o.enableSuperscript, s = o.enableMark, c = o.enableTableMerge, d = o.enableEmbeds, l = o.enableZennDirectives);
|
|
378
|
+
const u = {};
|
|
379
|
+
i && (u.Authorization = `Bearer ${i}`);
|
|
380
|
+
const p = await z.convert(
|
|
319
381
|
{
|
|
320
|
-
markdownText:
|
|
382
|
+
markdownText: r,
|
|
321
383
|
filePath: e,
|
|
322
384
|
workspaceRoot: t,
|
|
323
|
-
validateExistence:
|
|
385
|
+
validateExistence: f,
|
|
324
386
|
enableSubscript: a,
|
|
325
|
-
enableSuperscript:
|
|
387
|
+
enableSuperscript: n,
|
|
326
388
|
enableMark: s,
|
|
327
|
-
enableTableMerge:
|
|
328
|
-
enableEmbeds:
|
|
329
|
-
enableZennDirectives:
|
|
389
|
+
enableTableMerge: c,
|
|
390
|
+
enableEmbeds: d,
|
|
391
|
+
enableZennDirectives: l
|
|
330
392
|
},
|
|
331
|
-
{ headers:
|
|
393
|
+
{ headers: u }
|
|
332
394
|
);
|
|
333
395
|
return {
|
|
334
396
|
htmlContent: p.htmlContent,
|
|
335
|
-
headings: p.headings.map((
|
|
336
|
-
text:
|
|
337
|
-
depth:
|
|
338
|
-
id:
|
|
397
|
+
headings: p.headings.map((F) => ({
|
|
398
|
+
text: F.text,
|
|
399
|
+
depth: F.depth,
|
|
400
|
+
id: F.id
|
|
339
401
|
}))
|
|
340
402
|
};
|
|
341
403
|
};
|
|
342
404
|
export {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
405
|
+
ie as parseMarkdown,
|
|
406
|
+
oe as remarkImportDirective,
|
|
407
|
+
se as remarkResolveUriAsync,
|
|
408
|
+
M as transformUriAsync
|
|
347
409
|
};
|
|
348
410
|
//# sourceMappingURL=index.server.js.map
|
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 * as net from \"node:net\"\nimport { createClient } from \"@connectrpc/connect\"\nimport { createConnectTransport } from \"@connectrpc/connect-node\"\nimport { MarkdownService } from \"./gen/markdown/v1/markdown_connect.ts\"\n\nconst transport = createConnectTransport({\n baseUrl: \"http://localhost\",\n httpVersion: \"2\",\n nodeOptions: {\n createConnection: () => {\n return net.connect(\"/workspace/tmp/markdown.sock\")\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\nexport const parseMarkdown = async (markdownText: string, markdownFilePath: string, workspaceRoot: string, userOAuthToken?: string, validateExistenceOrOptions: boolean | ParseOptions = true): Promise<ParseResult> => {\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","transport","createConnectTransport","net","client","createClient","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: 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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"}
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remarkProcessor.server.d.ts","sourceRoot":"","sources":["../../src/remarkProcessor.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remarkProcessor.server.d.ts","sourceRoot":"","sources":["../../src/remarkProcessor.server.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,MAAM,CAAA;KACb,CAAC,CAAA;CACL;AAED,MAAM,WAAW,YAAY;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CACjC;AA+GD,eAAO,MAAM,aAAa,GAAU,cAAc,MAAM,EAAE,kBAAkB,MAAM,EAAE,eAAe,MAAM,EAAE,iBAAiB,MAAM,EAAE,6BAA4B,OAAO,GAAG,YAAmB,KAAG,OAAO,CAAC,WAAW,CAqDlN,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.config.d.ts","sourceRoot":"","sources":["../vite.config.ts"],"names":[],"mappings":";AAsCA,
|
|
1
|
+
{"version":3,"file":"vite.config.d.ts","sourceRoot":"","sources":["../vite.config.ts"],"names":[],"mappings":";AAsCA,wBAiHE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiquants/markdown",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Markdown renderer for React with advanced features",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"access": "public"
|
|
122
122
|
},
|
|
123
123
|
"scripts": {
|
|
124
|
-
"build": "rimraf dist && vite build && vite build --config vite.config.cli.ts && pnpm build:css",
|
|
124
|
+
"build": "rimraf dist && go build -C ../go/markdown-api -o ../../markdown/dist/markdown-api main.go && vite build && vite build --config vite.config.cli.ts && pnpm build:css",
|
|
125
125
|
"build:css": "tailwindcss -i src/styles/tailwind.css -o dist/styles/markdown.css --minify",
|
|
126
126
|
"dev": "vite build --watch",
|
|
127
127
|
"watch": "vite build --watch",
|