#!/usr/bin/env node "use strict"; const assert = require("node:assert/strict"); const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); const { importWolaiExport } = require("./lib/wolai-export-importer"); function writeUtf8(filePath, content) { fs.mkdirSync(path.dirname(filePath), { recursive: true }); fs.writeFileSync(filePath, content, "utf8"); } function makeTempDir() { return fs.mkdtempSync(path.join(os.tmpdir(), "mnote-wolai-import-smoke-")); } function runImportFixture() { const workspace = makeTempDir(); const sourceRoot = path.join(workspace, "source"); const targetRoot = path.join(workspace, "target"); const nbsp = "\u00A0"; const assetName = `12849总结报告-WB17061405${nbsp}肖建洋_qGouWUbkM_.doc`; writeUtf8( path.join(sourceRoot, "liaibo的个人空间.md"), [ "# liaibo的个人空间", "", "- [项目](pages/项目_abcd1234.md)", "", ].join("\n"), ); writeUtf8( path.join(sourceRoot, "pages", "项目_abcd1234.md"), [ "# 项目", "", "![](../image/diagram one.png)", `[报告](../file/${assetName} "12849总结报告-WB17061405${nbsp}肖建洋.doc")`, "[/home/fc/import/markdown/abc/resources/s0040-4020(01)88151-5.pdf](/home/fc/import/markdown/abc/resources/s0040-4020\\(01\\)88151-5.pdf)", "[旧resources附件](../../resources/林可函数.xlsx \"林可函数.xlsx\")", "", ].join("\n"), ); writeUtf8(path.join(sourceRoot, "image", "diagram one.png"), "png-body\n"); writeUtf8(path.join(sourceRoot, "file", assetName), "doc-body\n"); const result = importWolaiExport({ sourceRoot, targetRoot, ownerId: "liaibo", workspaceId: "local-ws:liaibo:my-space", copyMode: "copy", }); return { result, targetRoot, assetName, childMarkdownPath: path.join( targetRoot, "liaibo的个人空间", "项目", "项目.md", ), }; } function assertWolaiExportImport() { const { result, targetRoot, assetName, childMarkdownPath } = runImportFixture(); const childMarkdown = fs.readFileSync(childMarkdownPath, "utf8"); const workspaceMetadata = JSON.parse( fs.readFileSync(path.join(targetRoot, ".mnote", "workspace.json"), "utf8"), ); const importMetadata = JSON.parse( fs.readFileSync(path.join(targetRoot, ".mnote", "wolai-import.json"), "utf8"), ); const localIndexSettings = JSON.parse( fs.readFileSync(path.join(targetRoot, ".mnote", "index", "local-index-settings.json"), "utf8"), ); assert.equal(result.ok, true); assert.equal(result.pages.imported, 2); assert.equal(result.assets.copied, 2); assert.equal(result.links.rewritten, 5); assert.equal(result.links.missing, 2); assert.equal(workspaceMetadata.ownerId, "liaibo"); assert.equal(importMetadata.links.missingSamples.length, 2); assert.deepEqual(localIndexSettings.includePaths, ["."], "导入后默认应索引整个 local-first 工作区"); assert.equal(localIndexSettings.runOnChange, false); assert.match(childMarkdown, /\.assets\/image\/diagram one\.png/); assert.match(childMarkdown, /\.assets\/file\/12849总结报告-WB17061405/); assert.doesNotMatch(childMarkdown, /Wolai资源/); assert.doesNotMatch(childMarkdown, /\]\(\.\.\/file\//); assert.doesNotMatch(childMarkdown, /\/home\/fc\/import/); assert.doesNotMatch(childMarkdown, /resources\/林可函数\.xlsx/); assert.match(childMarkdown, /#wolai-missing-resource/); assert.equal( fs.readFileSync( path.join(targetRoot, "liaibo的个人空间", "项目", ".assets", "image", "diagram one.png"), "utf8", ), "png-body\n", ); assert.equal( fs.readFileSync( path.join(targetRoot, "liaibo的个人空间", "项目", ".assets", "file", assetName), "utf8", ), "doc-body\n", ); const uploadedAssets = JSON.parse( fs.readFileSync(path.join(targetRoot, ".mnote", "uploaded-assets.json"), "utf8"), ); assert.ok(uploadedAssets.entries["liaibo的个人空间/项目/.assets/image/diagram one.png"]); assert.ok(uploadedAssets.entries[`liaibo的个人空间/项目/.assets/file/${assetName}`]); } assertWolaiExportImport(); console.log("wolai-export-importer.test: ok");