@nekosu/maa-tools 1.0.7 → 1.0.9

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.mjs CHANGED
@@ -286,7 +286,7 @@ async function loadAllTestCases(folder, pattern) {
286
286
  const results = [];
287
287
  const fails = [];
288
288
  for await (const file of fs.glob(pattern, { cwd: folder })) {
289
- const testCases = await loadTestCases(path.resolve(pattern, file));
289
+ const testCases = await loadTestCases(path.resolve(folder, file));
290
290
  if (testCases) results.push(testCases);
291
291
  else fails.push(file);
292
292
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["pkg.name"],"sources":["../src/utils/bundle.ts","../src/check/utils.ts","../src/check/index.ts","../src/test/utils.ts","../src/test/index.ts","../src/utils/config.ts","../src/cli.ts","../src/utils/tools.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport * as path from 'node:path'\n\nimport { FsContentLoader, FsContentWatcher, InterfaceBundle } from '@nekosu/maa-pipeline-manager'\n\nexport async function loadBundle(interfacePath: string) {\n if (!existsSync(interfacePath)) {\n console.log(`${interfacePath} not exists`)\n return null\n }\n\n const bundle = new InterfaceBundle(\n new FsContentLoader(),\n new FsContentWatcher(),\n false,\n path.dirname(interfacePath),\n path.basename(interfacePath)\n )\n await bundle.load()\n await bundle.flush(false) // 刷下 imports\n\n return bundle\n}\n","export function calucateLocation(content: string, offset: number): [line: number, col: number] {\n const previous = content.slice(0, offset)\n let line = 0\n let last = 0\n for (let i = 0; i < previous.length; i++) {\n if (previous[i] === '\\n') {\n line += 1\n last = i\n }\n }\n return [line + 1, offset - last]\n}\n","import { error as coreError, warning as coreWarning, endGroup, startGroup } from '@actions/core'\nimport * as fs from 'node:fs/promises'\nimport * as path from 'node:path'\n\nimport {\n type Diagnostic,\n buildDiagnosticMessage,\n joinPath,\n performDiagnostic\n} from '@nekosu/maa-pipeline-manager'\n\nimport type { FullConfig } from '../types/config'\nimport { loadBundle } from '../utils/bundle'\nimport { loadMaa, setupMaa } from '../utils/maa'\nimport { calucateLocation } from './utils'\n\nexport async function runCheck(cfg: FullConfig): Promise<boolean> {\n if (!cfg.check) {\n return false\n }\n\n const modulePath = await setupMaa(cfg)\n if (!modulePath) {\n return false\n }\n await loadMaa(modulePath)\n if (cfg.maaStdoutLevel) {\n maa.Global.stdout_level = cfg.maaStdoutLevel\n }\n\n const repo = path.resolve(cfg.cwd ?? process.cwd(), cfg.repo ?? '.')\n\n const result: Diagnostic[] = []\n\n const bundle = await loadBundle(path.resolve(cfg.cwd ?? process.cwd(), cfg.check.interfacePath))\n if (!bundle) {\n return false\n }\n\n const files: Record<string, string> = {}\n const locate = async (file: string, offset: number) => {\n let content = files[file]\n if (!content) {\n content = await fs.readFile(file, 'utf8')\n files[file] = content\n }\n return calucateLocation(content, offset)\n }\n\n let loadResourceFailed = false\n\n const ctrlNames = bundle.allControllerNames()\n for (const ctrlName of ctrlNames) {\n const resNames = bundle.allResourceNames(ctrlName)\n for (const resName of resNames) {\n await bundle.switchActive(ctrlName, resName)\n\n if (!cfg.mode || cfg.mode === 'stdio') {\n console.log(`${ctrlName} ${resName}`)\n } else if (cfg.mode === 'github') {\n startGroup(`${ctrlName} ${resName}`)\n }\n\n const rawDiags = performDiagnostic(bundle, {})\n const currDiags: Diagnostic[] = []\n for (const diag of rawDiags) {\n const override = cfg.check.override?.[diag.type]\n if (override === 'ignore') {\n continue\n }\n if (override) {\n currDiags.push({\n ...diag,\n level: override\n })\n } else {\n currDiags.push(diag)\n }\n }\n\n for (const diag of currDiags) {\n const [start, _end, brief] = await buildDiagnosticMessage(bundle.root, diag, locate, {})\n\n const [line, col] = start\n const relative = path.relative(repo, diag.file)\n switch (cfg.mode ?? 'stdio') {\n case 'stdio':\n console.log(` ${diag.level}: ${relative}:${line}:${col} ${brief}`)\n break\n case 'github':\n switch (diag.level) {\n case 'warning':\n coreWarning(brief, {\n file: relative,\n startLine: line,\n startColumn: col,\n endColumn: col + diag.length\n })\n break\n case 'error':\n coreError(brief, {\n file: relative,\n startLine: line,\n startColumn: col,\n endColumn: col + diag.length\n })\n break\n }\n }\n }\n if (cfg.mode === 'github') {\n endGroup()\n }\n\n result.push(...currDiags)\n\n const res = new maa.Resource()\n for (const folder of bundle.paths) {\n const succ = await res.post_bundle(joinPath(bundle.root, folder)).wait().succeeded\n if (!succ) {\n if (!cfg.mode || cfg.mode === 'stdio') {\n console.error(' load resource failed')\n } else if (cfg.mode === 'github') {\n coreError(' load resource failed')\n }\n loadResourceFailed = true\n }\n }\n res.destroy()\n }\n }\n\n if (cfg.mode === 'json') {\n process.stdout.write(JSON.stringify(result))\n return true\n }\n\n return result.length === 0 || !loadResourceFailed\n}\n","// return if real inside expect\nexport function checkRect(expect: maa.Rect, real: maa.Rect) {\n return (\n real[0] >= expect[0] &&\n real[1] >= expect[1] &&\n real[0] + real[2] <= expect[0] + expect[2] &&\n real[1] + real[3] <= expect[1] + expect[3]\n )\n}\n","import { existsSync } from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\nimport * as workerpool from 'workerpool'\n\nimport { joinPath } from '@nekosu/maa-pipeline-manager'\n\nimport type { FullConfig } from '../types/config'\nimport { loadBundle } from '../utils/bundle'\nimport { setupMaa } from '../utils/maa'\nimport type { GroupRecoResult, RecoJob, RecoResult } from './types'\nimport { checkRect } from './utils'\n\nfunction splitChunk<T>(arr: T[], size: number) {\n const result: T[][] = []\n let curr = 0\n while (curr < arr.length) {\n const next = curr + size\n result.push(arr.slice(curr, next))\n curr = next\n }\n return result\n}\n\nexport async function runTest(cfg: FullConfig) {\n if (!cfg.test) {\n return false\n }\n\n const modulePath = await setupMaa(cfg)\n if (!modulePath) {\n return false\n }\n\n const result: GroupRecoResult[] = []\n\n const bundle = await loadBundle(path.resolve(cfg.cwd ?? process.cwd(), cfg.test.interfacePath))\n if (!bundle) {\n return false\n }\n\n let finished = 0\n\n let allTestCases = cfg.test.cases\n if (typeof allTestCases === 'function') {\n allTestCases = await allTestCases()\n }\n\n const taskCount = allTestCases\n .map(testCase => {\n const imageCount = testCase.cases.length\n const nodeCount = testCase.cases.map(c => c.hits.length).reduce((a, b) => a + b, 0)\n return imageCount * nodeCount\n })\n .reduce((a, b) => a + b, 0)\n\n const maxNodePerJob = cfg.test.maxNodePerJob ?? 50\n\n for (const testCases of allTestCases) {\n const name =\n testCases.configs.name ?? `${testCases.configs.controller}:${testCases.configs.resource}`\n\n const allImages = testCases.cases\n .map(c => ({\n image:\n path.resolve(\n cfg.cwd ?? process.cwd(),\n cfg.test!.casesCwd ?? '.',\n testCases.configs.imageRoot ?? '.',\n c.image\n ) + '.png',\n imageRaw: c.image\n }))\n .filter(({ image, imageRaw }) => {\n if (!existsSync(image)) {\n console.log(`${name} ${imageRaw} not exists, ignored`)\n return false\n } else {\n return true\n }\n })\n const allNodes = [\n ...new Set(\n testCases.cases\n .map(c => c.hits.map(hit => (typeof hit === 'string' ? hit : hit.node)).flat())\n .flat()\n )\n ]\n\n await bundle.switchActive(testCases.configs.controller, testCases.configs.resource)\n const resourcePaths = bundle.paths.map(folder => joinPath(bundle.root, folder))\n\n const pool = workerpool.pool(path.join(import.meta.dirname, 'test', 'worker.mjs'), {\n maxWorkers: cfg.test.job ?? os.cpus().length / 4,\n workerType: 'process',\n forkOpts: {\n env: {\n MAAFW_MODULE_PATH: modulePath,\n MAAFW_STDOUT_LEVEL: cfg.mode === 'json' ? 'Off' : cfg.maaStdoutLevel,\n MAAFW_RESOURCE_PATHS: resourcePaths.join(path.delimiter)\n }\n }\n })\n\n const tasks: Promise<void>[] = []\n const scheduleJob = (job: RecoJob, result: RecoResult[]) => {\n const task = pool\n .exec<(job: RecoJob) => RecoResult[]>('performReco', [job])\n .then(res => res)\n .catch(err => {\n console.log(err)\n return []\n })\n .then(res => {\n finished += res.length\n result.push(...res)\n process.stderr.write(`${finished} / ${taskCount}\\r`)\n })\n tasks.push(task)\n }\n\n const groupResult: GroupRecoResult = {\n cases: testCases,\n result: []\n }\n result.push(groupResult)\n for (const { image, imageRaw } of allImages) {\n const nodesChunks = splitChunk(allNodes, maxNodePerJob)\n for (const nodes of nodesChunks) {\n scheduleJob(\n {\n nodes,\n imagePath: image,\n imagePathRaw: imageRaw\n },\n groupResult.result\n )\n }\n }\n\n await Promise.all(tasks)\n await pool.terminate()\n }\n\n for (const group of result) {\n const groupName =\n group.cases.configs.name ??\n `${group.cases.configs.controller}:${group.cases.configs.resource}`\n\n console.log(`${groupName}`)\n for (const testCase of group.cases.cases) {\n for (const res of group.result.filter(res => res.imagePathRaw === testCase.image)) {\n const hitCfg = testCase.hits.find(hit => {\n if (typeof hit === 'string') {\n return hit === res.node\n } else {\n return hit.node === res.node\n }\n })\n if (hitCfg) {\n if (!res.hit) {\n console.log(` ${testCase.image} ${res.node} should hit but missed`)\n } else if (typeof hitCfg !== 'string') {\n if (!res.detail) {\n console.log(` ${testCase.image} ${res.node} missing detail.`)\n } else if (!checkRect(hitCfg.box, res.detail!.box)) {\n console.log(\n ` ${testCase.image} ${res.node} box mismatch. Expect ${JSON.stringify(hitCfg.box)}, hit ${JSON.stringify(res.detail.box)}`\n )\n }\n }\n } else {\n if (res.hit) {\n console.log(` ${testCase.image} ${res.node} should missed but hit`)\n }\n }\n }\n }\n }\n return true\n}\n","import { createJiti } from 'jiti'\nimport * as path from 'node:path'\n\nimport type { FullConfig } from '../types/config'\n\nexport async function loadConfig(file: string) {\n try {\n const jiti = createJiti(import.meta.url)\n return (await jiti.import(path.resolve(process.cwd(), file), { default: true })) as FullConfig\n } catch (_err) {\n console.log(_err)\n return null\n }\n}\n","import { existsSync } from 'node:fs'\nimport * as fs from 'node:fs/promises'\n\nimport { setLocale } from '@nekosu/maa-locale'\n\nimport pkg from '../package.json'\nimport { runCheck } from './check'\nimport { runTest } from './test'\nimport type { FullConfig } from './types/config'\nimport { loadConfig } from './utils/config'\n\nconst defaultConfig = `import type { FullConfig } from '${pkg.name}'\n\nconst config: FullConfig = {\n cwd: import.meta.dirname,\n check: {\n interfacePath: 'assets/interface.json'\n }\n}\n\nexport default config\n`\n\nexport async function runCli(cmd: string, cfg: string | FullConfig) {\n if (cmd === 'init') {\n if (!existsSync('maatools.config.mts')) {\n await fs.writeFile('maatools.config.mts', defaultConfig)\n } else {\n console.error('maatools.config.mts exists')\n }\n return true\n }\n\n if (typeof cfg === 'string') {\n const resolvedCfg = await loadConfig(cfg)\n if (!resolvedCfg) {\n console.error(`load ${cfg} failed`)\n return false\n }\n cfg = resolvedCfg\n }\n if (process.env['GITHUB_ACTIONS']) {\n if (!cfg.mode) {\n cfg.mode = 'github'\n }\n }\n if (cfg.locale) {\n setLocale(cfg.locale)\n }\n switch (cmd) {\n case 'check':\n return await runCheck(cfg)\n\n case 'test':\n return await runTest(cfg)\n }\n\n console.log(`Usage: npx ${pkg.name} <init|check|test> [path to maatools.config.mts]`)\n\n return false\n}\n","import { type ParseError, parse } from 'jsonc-parser'\nimport * as fs from 'node:fs/promises'\nimport * as path from 'node:path'\n\nimport type { TestCases } from '../types/config'\n\nexport async function loadTestCases(file: string) {\n const content = await fs.readFile(file, 'utf8')\n const errors: ParseError[] = []\n const result = parse(content, errors) as TestCases\n return errors.length > 0 ? null : result\n}\n\nexport async function loadAllTestCases(\n folder: string,\n pattern: string\n): Promise<[testCases: TestCases[], failFiles: string[]]> {\n const results: TestCases[] = []\n const fails: string[] = []\n for await (const file of fs.glob(pattern, { cwd: folder })) {\n const testCases = await loadTestCases(path.resolve(pattern, file))\n if (testCases) {\n results.push(testCases)\n } else {\n fails.push(file)\n }\n }\n return [results, fails]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["pkg.name"],"sources":["../src/utils/bundle.ts","../src/check/utils.ts","../src/check/index.ts","../src/test/utils.ts","../src/test/index.ts","../src/utils/config.ts","../src/cli.ts","../src/utils/tools.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport * as path from 'node:path'\n\nimport { FsContentLoader, FsContentWatcher, InterfaceBundle } from '@nekosu/maa-pipeline-manager'\n\nexport async function loadBundle(interfacePath: string) {\n if (!existsSync(interfacePath)) {\n console.log(`${interfacePath} not exists`)\n return null\n }\n\n const bundle = new InterfaceBundle(\n new FsContentLoader(),\n new FsContentWatcher(),\n false,\n path.dirname(interfacePath),\n path.basename(interfacePath)\n )\n await bundle.load()\n await bundle.flush(false) // 刷下 imports\n\n return bundle\n}\n","export function calucateLocation(content: string, offset: number): [line: number, col: number] {\n const previous = content.slice(0, offset)\n let line = 0\n let last = 0\n for (let i = 0; i < previous.length; i++) {\n if (previous[i] === '\\n') {\n line += 1\n last = i\n }\n }\n return [line + 1, offset - last]\n}\n","import { error as coreError, warning as coreWarning, endGroup, startGroup } from '@actions/core'\nimport * as fs from 'node:fs/promises'\nimport * as path from 'node:path'\n\nimport {\n type Diagnostic,\n buildDiagnosticMessage,\n joinPath,\n performDiagnostic\n} from '@nekosu/maa-pipeline-manager'\n\nimport type { FullConfig } from '../types/config'\nimport { loadBundle } from '../utils/bundle'\nimport { loadMaa, setupMaa } from '../utils/maa'\nimport { calucateLocation } from './utils'\n\nexport async function runCheck(cfg: FullConfig): Promise<boolean> {\n if (!cfg.check) {\n return false\n }\n\n const modulePath = await setupMaa(cfg)\n if (!modulePath) {\n return false\n }\n await loadMaa(modulePath)\n if (cfg.maaStdoutLevel) {\n maa.Global.stdout_level = cfg.maaStdoutLevel\n }\n\n const repo = path.resolve(cfg.cwd ?? process.cwd(), cfg.repo ?? '.')\n\n const result: Diagnostic[] = []\n\n const bundle = await loadBundle(path.resolve(cfg.cwd ?? process.cwd(), cfg.check.interfacePath))\n if (!bundle) {\n return false\n }\n\n const files: Record<string, string> = {}\n const locate = async (file: string, offset: number) => {\n let content = files[file]\n if (!content) {\n content = await fs.readFile(file, 'utf8')\n files[file] = content\n }\n return calucateLocation(content, offset)\n }\n\n let loadResourceFailed = false\n\n const ctrlNames = bundle.allControllerNames()\n for (const ctrlName of ctrlNames) {\n const resNames = bundle.allResourceNames(ctrlName)\n for (const resName of resNames) {\n await bundle.switchActive(ctrlName, resName)\n\n if (!cfg.mode || cfg.mode === 'stdio') {\n console.log(`${ctrlName} ${resName}`)\n } else if (cfg.mode === 'github') {\n startGroup(`${ctrlName} ${resName}`)\n }\n\n const rawDiags = performDiagnostic(bundle, {})\n const currDiags: Diagnostic[] = []\n for (const diag of rawDiags) {\n const override = cfg.check.override?.[diag.type]\n if (override === 'ignore') {\n continue\n }\n if (override) {\n currDiags.push({\n ...diag,\n level: override\n })\n } else {\n currDiags.push(diag)\n }\n }\n\n for (const diag of currDiags) {\n const [start, _end, brief] = await buildDiagnosticMessage(bundle.root, diag, locate, {})\n\n const [line, col] = start\n const relative = path.relative(repo, diag.file)\n switch (cfg.mode ?? 'stdio') {\n case 'stdio':\n console.log(` ${diag.level}: ${relative}:${line}:${col} ${brief}`)\n break\n case 'github':\n switch (diag.level) {\n case 'warning':\n coreWarning(brief, {\n file: relative,\n startLine: line,\n startColumn: col,\n endColumn: col + diag.length\n })\n break\n case 'error':\n coreError(brief, {\n file: relative,\n startLine: line,\n startColumn: col,\n endColumn: col + diag.length\n })\n break\n }\n }\n }\n if (cfg.mode === 'github') {\n endGroup()\n }\n\n result.push(...currDiags)\n\n const res = new maa.Resource()\n for (const folder of bundle.paths) {\n const succ = await res.post_bundle(joinPath(bundle.root, folder)).wait().succeeded\n if (!succ) {\n if (!cfg.mode || cfg.mode === 'stdio') {\n console.error(' load resource failed')\n } else if (cfg.mode === 'github') {\n coreError(' load resource failed')\n }\n loadResourceFailed = true\n }\n }\n res.destroy()\n }\n }\n\n if (cfg.mode === 'json') {\n process.stdout.write(JSON.stringify(result))\n return true\n }\n\n return result.length === 0 || !loadResourceFailed\n}\n","// return if real inside expect\nexport function checkRect(expect: maa.Rect, real: maa.Rect) {\n return (\n real[0] >= expect[0] &&\n real[1] >= expect[1] &&\n real[0] + real[2] <= expect[0] + expect[2] &&\n real[1] + real[3] <= expect[1] + expect[3]\n )\n}\n","import { existsSync } from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\nimport * as workerpool from 'workerpool'\n\nimport { joinPath } from '@nekosu/maa-pipeline-manager'\n\nimport type { FullConfig } from '../types/config'\nimport { loadBundle } from '../utils/bundle'\nimport { setupMaa } from '../utils/maa'\nimport type { GroupRecoResult, RecoJob, RecoResult } from './types'\nimport { checkRect } from './utils'\n\nfunction splitChunk<T>(arr: T[], size: number) {\n const result: T[][] = []\n let curr = 0\n while (curr < arr.length) {\n const next = curr + size\n result.push(arr.slice(curr, next))\n curr = next\n }\n return result\n}\n\nexport async function runTest(cfg: FullConfig) {\n if (!cfg.test) {\n return false\n }\n\n const modulePath = await setupMaa(cfg)\n if (!modulePath) {\n return false\n }\n\n const result: GroupRecoResult[] = []\n\n const bundle = await loadBundle(path.resolve(cfg.cwd ?? process.cwd(), cfg.test.interfacePath))\n if (!bundle) {\n return false\n }\n\n let finished = 0\n\n let allTestCases = cfg.test.cases\n if (typeof allTestCases === 'function') {\n allTestCases = await allTestCases()\n }\n\n const taskCount = allTestCases\n .map(testCase => {\n const imageCount = testCase.cases.length\n const nodeCount = testCase.cases.map(c => c.hits.length).reduce((a, b) => a + b, 0)\n return imageCount * nodeCount\n })\n .reduce((a, b) => a + b, 0)\n\n const maxNodePerJob = cfg.test.maxNodePerJob ?? 50\n\n for (const testCases of allTestCases) {\n const name =\n testCases.configs.name ?? `${testCases.configs.controller}:${testCases.configs.resource}`\n\n const allImages = testCases.cases\n .map(c => ({\n image:\n path.resolve(\n cfg.cwd ?? process.cwd(),\n cfg.test!.casesCwd ?? '.',\n testCases.configs.imageRoot ?? '.',\n c.image\n ) + '.png',\n imageRaw: c.image\n }))\n .filter(({ image, imageRaw }) => {\n if (!existsSync(image)) {\n console.log(`${name} ${imageRaw} not exists, ignored`)\n return false\n } else {\n return true\n }\n })\n const allNodes = [\n ...new Set(\n testCases.cases\n .map(c => c.hits.map(hit => (typeof hit === 'string' ? hit : hit.node)).flat())\n .flat()\n )\n ]\n\n await bundle.switchActive(testCases.configs.controller, testCases.configs.resource)\n const resourcePaths = bundle.paths.map(folder => joinPath(bundle.root, folder))\n\n const pool = workerpool.pool(path.join(import.meta.dirname, 'test', 'worker.mjs'), {\n maxWorkers: cfg.test.job ?? os.cpus().length / 4,\n workerType: 'process',\n forkOpts: {\n env: {\n MAAFW_MODULE_PATH: modulePath,\n MAAFW_STDOUT_LEVEL: cfg.mode === 'json' ? 'Off' : cfg.maaStdoutLevel,\n MAAFW_RESOURCE_PATHS: resourcePaths.join(path.delimiter)\n }\n }\n })\n\n const tasks: Promise<void>[] = []\n const scheduleJob = (job: RecoJob, result: RecoResult[]) => {\n const task = pool\n .exec<(job: RecoJob) => RecoResult[]>('performReco', [job])\n .then(res => res)\n .catch(err => {\n console.log(err)\n return []\n })\n .then(res => {\n finished += res.length\n result.push(...res)\n process.stderr.write(`${finished} / ${taskCount}\\r`)\n })\n tasks.push(task)\n }\n\n const groupResult: GroupRecoResult = {\n cases: testCases,\n result: []\n }\n result.push(groupResult)\n for (const { image, imageRaw } of allImages) {\n const nodesChunks = splitChunk(allNodes, maxNodePerJob)\n for (const nodes of nodesChunks) {\n scheduleJob(\n {\n nodes,\n imagePath: image,\n imagePathRaw: imageRaw\n },\n groupResult.result\n )\n }\n }\n\n await Promise.all(tasks)\n await pool.terminate()\n }\n\n for (const group of result) {\n const groupName =\n group.cases.configs.name ??\n `${group.cases.configs.controller}:${group.cases.configs.resource}`\n\n console.log(`${groupName}`)\n for (const testCase of group.cases.cases) {\n for (const res of group.result.filter(res => res.imagePathRaw === testCase.image)) {\n const hitCfg = testCase.hits.find(hit => {\n if (typeof hit === 'string') {\n return hit === res.node\n } else {\n return hit.node === res.node\n }\n })\n if (hitCfg) {\n if (!res.hit) {\n console.log(` ${testCase.image} ${res.node} should hit but missed`)\n } else if (typeof hitCfg !== 'string') {\n if (!res.detail) {\n console.log(` ${testCase.image} ${res.node} missing detail.`)\n } else if (!checkRect(hitCfg.box, res.detail!.box)) {\n console.log(\n ` ${testCase.image} ${res.node} box mismatch. Expect ${JSON.stringify(hitCfg.box)}, hit ${JSON.stringify(res.detail.box)}`\n )\n }\n }\n } else {\n if (res.hit) {\n console.log(` ${testCase.image} ${res.node} should missed but hit`)\n }\n }\n }\n }\n }\n return true\n}\n","import { createJiti } from 'jiti'\nimport * as path from 'node:path'\n\nimport type { FullConfig } from '../types/config'\n\nexport async function loadConfig(file: string) {\n try {\n const jiti = createJiti(import.meta.url)\n return (await jiti.import(path.resolve(process.cwd(), file), { default: true })) as FullConfig\n } catch (_err) {\n console.log(_err)\n return null\n }\n}\n","import { existsSync } from 'node:fs'\nimport * as fs from 'node:fs/promises'\n\nimport { setLocale } from '@nekosu/maa-locale'\n\nimport pkg from '../package.json'\nimport { runCheck } from './check'\nimport { runTest } from './test'\nimport type { FullConfig } from './types/config'\nimport { loadConfig } from './utils/config'\n\nconst defaultConfig = `import type { FullConfig } from '${pkg.name}'\n\nconst config: FullConfig = {\n cwd: import.meta.dirname,\n check: {\n interfacePath: 'assets/interface.json'\n }\n}\n\nexport default config\n`\n\nexport async function runCli(cmd: string, cfg: string | FullConfig) {\n if (cmd === 'init') {\n if (!existsSync('maatools.config.mts')) {\n await fs.writeFile('maatools.config.mts', defaultConfig)\n } else {\n console.error('maatools.config.mts exists')\n }\n return true\n }\n\n if (typeof cfg === 'string') {\n const resolvedCfg = await loadConfig(cfg)\n if (!resolvedCfg) {\n console.error(`load ${cfg} failed`)\n return false\n }\n cfg = resolvedCfg\n }\n if (process.env['GITHUB_ACTIONS']) {\n if (!cfg.mode) {\n cfg.mode = 'github'\n }\n }\n if (cfg.locale) {\n setLocale(cfg.locale)\n }\n switch (cmd) {\n case 'check':\n return await runCheck(cfg)\n\n case 'test':\n return await runTest(cfg)\n }\n\n console.log(`Usage: npx ${pkg.name} <init|check|test> [path to maatools.config.mts]`)\n\n return false\n}\n","import { type ParseError, parse } from 'jsonc-parser'\nimport * as fs from 'node:fs/promises'\nimport * as path from 'node:path'\n\nimport type { TestCases } from '../types/config'\n\nexport async function loadTestCases(file: string) {\n const content = await fs.readFile(file, 'utf8')\n const errors: ParseError[] = []\n const result = parse(content, errors) as TestCases\n return errors.length > 0 ? null : result\n}\n\nexport async function loadAllTestCases(\n folder: string,\n pattern: string\n): Promise<[testCases: TestCases[], failFiles: string[]]> {\n const results: TestCases[] = []\n const fails: string[] = []\n for await (const file of fs.glob(pattern, { cwd: folder })) {\n const testCases = await loadTestCases(path.resolve(folder, file))\n if (testCases) {\n results.push(testCases)\n } else {\n fails.push(file)\n }\n }\n return [results, fails]\n}\n"],"mappings":";;;;;;;;;;;;;AAKA,eAAsB,WAAW,eAAuB;AACtD,KAAI,CAAC,WAAW,cAAc,EAAE;AAC9B,UAAQ,IAAI,GAAG,cAAc,aAAa;AAC1C,SAAO;;CAGT,MAAM,SAAS,IAAI,gBACjB,IAAI,iBAAiB,EACrB,IAAI,kBAAkB,EACtB,OACA,KAAK,QAAQ,cAAc,EAC3B,KAAK,SAAS,cAAc,CAC7B;AACD,OAAM,OAAO,MAAM;AACnB,OAAM,OAAO,MAAM,MAAM;AAEzB,QAAO;;;;;ACrBT,SAAgB,iBAAiB,SAAiB,QAA6C;CAC7F,MAAM,WAAW,QAAQ,MAAM,GAAG,OAAO;CACzC,IAAI,OAAO;CACX,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IACnC,KAAI,SAAS,OAAO,MAAM;AACxB,UAAQ;AACR,SAAO;;AAGX,QAAO,CAAC,OAAO,GAAG,SAAS,KAAK;;;;;ACMlC,eAAsB,SAAS,KAAmC;AAChE,KAAI,CAAC,IAAI,MACP,QAAO;CAGT,MAAM,aAAa,MAAM,SAAS,IAAI;AACtC,KAAI,CAAC,WACH,QAAO;AAET,OAAM,QAAQ,WAAW;AACzB,KAAI,IAAI,eACN,KAAI,OAAO,eAAe,IAAI;CAGhC,MAAM,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,EAAE,IAAI,QAAQ,IAAI;CAEpE,MAAM,SAAuB,EAAE;CAE/B,MAAM,SAAS,MAAM,WAAW,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,EAAE,IAAI,MAAM,cAAc,CAAC;AAChG,KAAI,CAAC,OACH,QAAO;CAGT,MAAM,QAAgC,EAAE;CACxC,MAAM,SAAS,OAAO,MAAc,WAAmB;EACrD,IAAI,UAAU,MAAM;AACpB,MAAI,CAAC,SAAS;AACZ,aAAU,MAAM,GAAG,SAAS,MAAM,OAAO;AACzC,SAAM,QAAQ;;AAEhB,SAAO,iBAAiB,SAAS,OAAO;;CAG1C,IAAI,qBAAqB;CAEzB,MAAM,YAAY,OAAO,oBAAoB;AAC7C,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,OAAO,iBAAiB,SAAS;AAClD,OAAK,MAAM,WAAW,UAAU;AAC9B,SAAM,OAAO,aAAa,UAAU,QAAQ;AAE5C,OAAI,CAAC,IAAI,QAAQ,IAAI,SAAS,QAC5B,SAAQ,IAAI,GAAG,SAAS,GAAG,UAAU;YAC5B,IAAI,SAAS,SACtB,YAAW,GAAG,SAAS,GAAG,UAAU;GAGtC,MAAM,WAAW,kBAAkB,QAAQ,EAAE,CAAC;GAC9C,MAAM,YAA0B,EAAE;AAClC,QAAK,MAAM,QAAQ,UAAU;IAC3B,MAAM,WAAW,IAAI,MAAM,WAAW,KAAK;AAC3C,QAAI,aAAa,SACf;AAEF,QAAI,SACF,WAAU,KAAK;KACb,GAAG;KACH,OAAO;KACR,CAAC;QAEF,WAAU,KAAK,KAAK;;AAIxB,QAAK,MAAM,QAAQ,WAAW;IAC5B,MAAM,CAAC,OAAO,MAAM,SAAS,MAAM,uBAAuB,OAAO,MAAM,MAAM,QAAQ,EAAE,CAAC;IAExF,MAAM,CAAC,MAAM,OAAO;IACpB,MAAM,WAAW,KAAK,SAAS,MAAM,KAAK,KAAK;AAC/C,YAAQ,IAAI,QAAQ,SAApB;KACE,KAAK;AACH,cAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ;AACnE;KACF,KAAK,SACH,SAAQ,KAAK,OAAb;MACE,KAAK;AACH,eAAY,OAAO;QACjB,MAAM;QACN,WAAW;QACX,aAAa;QACb,WAAW,MAAM,KAAK;QACvB,CAAC;AACF;MACF,KAAK;AACH,aAAU,OAAO;QACf,MAAM;QACN,WAAW;QACX,aAAa;QACb,WAAW,MAAM,KAAK;QACvB,CAAC;AACF;;;;AAIV,OAAI,IAAI,SAAS,SACf,WAAU;AAGZ,UAAO,KAAK,GAAG,UAAU;GAEzB,MAAM,MAAM,IAAI,IAAI,UAAU;AAC9B,QAAK,MAAM,UAAU,OAAO,MAE1B,KAAI,CADS,MAAM,IAAI,YAAY,SAAS,OAAO,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,WAC9D;AACT,QAAI,CAAC,IAAI,QAAQ,IAAI,SAAS,QAC5B,SAAQ,MAAM,yBAAyB;aAC9B,IAAI,SAAS,SACtB,OAAU,yBAAyB;AAErC,yBAAqB;;AAGzB,OAAI,SAAS;;;AAIjB,KAAI,IAAI,SAAS,QAAQ;AACvB,UAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,CAAC;AAC5C,SAAO;;AAGT,QAAO,OAAO,WAAW,KAAK,CAAC;;;;;ACxIjC,SAAgB,UAAU,QAAkB,MAAgB;AAC1D,QACE,KAAK,MAAM,OAAO,MAClB,KAAK,MAAM,OAAO,MAClB,KAAK,KAAK,KAAK,MAAM,OAAO,KAAK,OAAO,MACxC,KAAK,KAAK,KAAK,MAAM,OAAO,KAAK,OAAO;;;;;ACO5C,SAAS,WAAc,KAAU,MAAc;CAC7C,MAAM,SAAgB,EAAE;CACxB,IAAI,OAAO;AACX,QAAO,OAAO,IAAI,QAAQ;EACxB,MAAM,OAAO,OAAO;AACpB,SAAO,KAAK,IAAI,MAAM,MAAM,KAAK,CAAC;AAClC,SAAO;;AAET,QAAO;;AAGT,eAAsB,QAAQ,KAAiB;AAC7C,KAAI,CAAC,IAAI,KACP,QAAO;CAGT,MAAM,aAAa,MAAM,SAAS,IAAI;AACtC,KAAI,CAAC,WACH,QAAO;CAGT,MAAM,SAA4B,EAAE;CAEpC,MAAM,SAAS,MAAM,WAAW,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,EAAE,IAAI,KAAK,cAAc,CAAC;AAC/F,KAAI,CAAC,OACH,QAAO;CAGT,IAAI,WAAW;CAEf,IAAI,eAAe,IAAI,KAAK;AAC5B,KAAI,OAAO,iBAAiB,WAC1B,gBAAe,MAAM,cAAc;CAGrC,MAAM,YAAY,aACf,KAAI,aAAY;AAGf,SAFmB,SAAS,MAAM,SAChB,SAAS,MAAM,KAAI,MAAK,EAAE,KAAK,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,GAAG,EAAE;GAEnF,CACD,QAAQ,GAAG,MAAM,IAAI,GAAG,EAAE;CAE7B,MAAM,gBAAgB,IAAI,KAAK,iBAAiB;AAEhD,MAAK,MAAM,aAAa,cAAc;EACpC,MAAM,OACJ,UAAU,QAAQ,QAAQ,GAAG,UAAU,QAAQ,WAAW,GAAG,UAAU,QAAQ;EAEjF,MAAM,YAAY,UAAU,MACzB,KAAI,OAAM;GACT,OACE,KAAK,QACH,IAAI,OAAO,QAAQ,KAAK,EACxB,IAAI,KAAM,YAAY,KACtB,UAAU,QAAQ,aAAa,KAC/B,EAAE,MACH,GAAG;GACN,UAAU,EAAE;GACb,EAAE,CACF,QAAQ,EAAE,OAAO,eAAe;AAC/B,OAAI,CAAC,WAAW,MAAM,EAAE;AACtB,YAAQ,IAAI,GAAG,KAAK,GAAG,SAAS,sBAAsB;AACtD,WAAO;SAEP,QAAO;IAET;EACJ,MAAM,WAAW,CACf,GAAG,IAAI,IACL,UAAU,MACP,KAAI,MAAK,EAAE,KAAK,KAAI,QAAQ,OAAO,QAAQ,WAAW,MAAM,IAAI,KAAM,CAAC,MAAM,CAAC,CAC9E,MAAM,CACV,CACF;AAED,QAAM,OAAO,aAAa,UAAU,QAAQ,YAAY,UAAU,QAAQ,SAAS;EACnF,MAAM,gBAAgB,OAAO,MAAM,KAAI,WAAU,SAAS,OAAO,MAAM,OAAO,CAAC;EAE/E,MAAM,OAAO,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,SAAS,QAAQ,aAAa,EAAE;GACjF,YAAY,IAAI,KAAK,OAAO,GAAG,MAAM,CAAC,SAAS;GAC/C,YAAY;GACZ,UAAU,EACR,KAAK;IACH,mBAAmB;IACnB,oBAAoB,IAAI,SAAS,SAAS,QAAQ,IAAI;IACtD,sBAAsB,cAAc,KAAK,KAAK,UAAU;IACzD,EACF;GACF,CAAC;EAEF,MAAM,QAAyB,EAAE;EACjC,MAAM,eAAe,KAAc,WAAyB;GAC1D,MAAM,OAAO,KACV,KAAqC,eAAe,CAAC,IAAI,CAAC,CAC1D,MAAK,QAAO,IAAI,CAChB,OAAM,QAAO;AACZ,YAAQ,IAAI,IAAI;AAChB,WAAO,EAAE;KACT,CACD,MAAK,QAAO;AACX,gBAAY,IAAI;AAChB,WAAO,KAAK,GAAG,IAAI;AACnB,YAAQ,OAAO,MAAM,GAAG,SAAS,KAAK,UAAU,IAAI;KACpD;AACJ,SAAM,KAAK,KAAK;;EAGlB,MAAM,cAA+B;GACnC,OAAO;GACP,QAAQ,EAAE;GACX;AACD,SAAO,KAAK,YAAY;AACxB,OAAK,MAAM,EAAE,OAAO,cAAc,WAAW;GAC3C,MAAM,cAAc,WAAW,UAAU,cAAc;AACvD,QAAK,MAAM,SAAS,YAClB,aACE;IACE;IACA,WAAW;IACX,cAAc;IACf,EACD,YAAY,OACb;;AAIL,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,KAAK,WAAW;;AAGxB,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,YACJ,MAAM,MAAM,QAAQ,QACpB,GAAG,MAAM,MAAM,QAAQ,WAAW,GAAG,MAAM,MAAM,QAAQ;AAE3D,UAAQ,IAAI,GAAG,YAAY;AAC3B,OAAK,MAAM,YAAY,MAAM,MAAM,MACjC,MAAK,MAAM,OAAO,MAAM,OAAO,QAAO,QAAO,IAAI,iBAAiB,SAAS,MAAM,EAAE;GACjF,MAAM,SAAS,SAAS,KAAK,MAAK,QAAO;AACvC,QAAI,OAAO,QAAQ,SACjB,QAAO,QAAQ,IAAI;QAEnB,QAAO,IAAI,SAAS,IAAI;KAE1B;AACF,OAAI,QACF;QAAI,CAAC,IAAI,IACP,SAAQ,IAAI,KAAK,SAAS,MAAM,GAAG,IAAI,KAAK,wBAAwB;aAC3D,OAAO,WAAW,UAC3B;SAAI,CAAC,IAAI,OACP,SAAQ,IAAI,KAAK,SAAS,MAAM,GAAG,IAAI,KAAK,kBAAkB;cACrD,CAAC,UAAU,OAAO,KAAK,IAAI,OAAQ,IAAI,CAChD,SAAQ,IACN,KAAK,SAAS,MAAM,GAAG,IAAI,KAAK,wBAAwB,KAAK,UAAU,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,IAAI,GAC1H;;cAID,IAAI,IACN,SAAQ,IAAI,KAAK,SAAS,MAAM,GAAG,IAAI,KAAK,wBAAwB;;;AAM9E,QAAO;;;;;AC9KT,eAAsB,WAAW,MAAc;AAC7C,KAAI;AAEF,SAAQ,MADK,WAAW,OAAO,KAAK,IAAI,CACrB,OAAO,KAAK,QAAQ,QAAQ,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,MAAM,CAAC;UACxE,MAAM;AACb,UAAQ,IAAI,KAAK;AACjB,SAAO;;;;;;ACAX,MAAM,gBAAgB,oCAAoCA,KAAS;;;;;;;;;;;AAYnE,eAAsB,OAAO,KAAa,KAA0B;AAClE,KAAI,QAAQ,QAAQ;AAClB,MAAI,CAAC,WAAW,sBAAsB,CACpC,OAAM,GAAG,UAAU,uBAAuB,cAAc;MAExD,SAAQ,MAAM,6BAA6B;AAE7C,SAAO;;AAGT,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,cAAc,MAAM,WAAW,IAAI;AACzC,MAAI,CAAC,aAAa;AAChB,WAAQ,MAAM,QAAQ,IAAI,SAAS;AACnC,UAAO;;AAET,QAAM;;AAER,KAAI,QAAQ,IAAI,mBACd;MAAI,CAAC,IAAI,KACP,KAAI,OAAO;;AAGf,KAAI,IAAI,OACN,WAAU,IAAI,OAAO;AAEvB,SAAQ,KAAR;EACE,KAAK,QACH,QAAO,MAAM,SAAS,IAAI;EAE5B,KAAK,OACH,QAAO,MAAM,QAAQ,IAAI;;AAG7B,SAAQ,IAAI,cAAcA,KAAS,kDAAkD;AAErF,QAAO;;;;;ACrDT,eAAsB,cAAc,MAAc;CAChD,MAAM,UAAU,MAAM,GAAG,SAAS,MAAM,OAAO;CAC/C,MAAM,SAAuB,EAAE;CAC/B,MAAM,SAAS,MAAM,SAAS,OAAO;AACrC,QAAO,OAAO,SAAS,IAAI,OAAO;;AAGpC,eAAsB,iBACpB,QACA,SACwD;CACxD,MAAM,UAAuB,EAAE;CAC/B,MAAM,QAAkB,EAAE;AAC1B,YAAW,MAAM,QAAQ,GAAG,KAAK,SAAS,EAAE,KAAK,QAAQ,CAAC,EAAE;EAC1D,MAAM,YAAY,MAAM,cAAc,KAAK,QAAQ,QAAQ,KAAK,CAAC;AACjE,MAAI,UACF,SAAQ,KAAK,UAAU;MAEvB,OAAM,KAAK,KAAK;;AAGpB,QAAO,CAAC,SAAS,MAAM"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nekosu/maa-tools",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "maa-tools": "bin/maa-tools"
@@ -23,9 +23,9 @@
23
23
  "jiti": "^2.6.1",
24
24
  "jsonc-parser": "^3.3.1",
25
25
  "workerpool": "^10.0.1",
26
- "@nekosu/maa-pipeline-manager": "1.0.1",
27
- "@nekosu/maa-locale": "1.0.0",
28
- "@nekosu/maa-version-manager": "1.0.2"
26
+ "@nekosu/maa-pipeline-manager": "1.0.2",
27
+ "@nekosu/maa-version-manager": "1.0.2",
28
+ "@nekosu/maa-locale": "1.0.0"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@maaxyz/maa-node": "5.7.2",