@nekosu/maa-tools 1.0.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/LICENSE +21 -0
- package/bin/maa-tools +11 -0
- package/dist/index.d.mts +58 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +12 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +37 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 nekosu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/bin/maa-tools
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as path from 'node:path'
|
|
3
|
+
|
|
4
|
+
import { runCli } from '../dist/index.mjs'
|
|
5
|
+
|
|
6
|
+
runCli(
|
|
7
|
+
process.argv[2] ?? 'help',
|
|
8
|
+
process.argv[3] ?? path.join(process.cwd(), 'maatools.config.mts')
|
|
9
|
+
).then(succ => {
|
|
10
|
+
process.exit(succ ? 0 : 1)
|
|
11
|
+
})
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/// <reference types="@maaxyz/maa-node" />
|
|
2
|
+
import { DiagnosticType } from "@nekosu/maa-pipeline-manager";
|
|
3
|
+
import { LocaleType } from "@nekosu/maa-locale";
|
|
4
|
+
|
|
5
|
+
//#region pkgs/maa-tools/src/types/config.d.ts
|
|
6
|
+
type BaseConfig = {
|
|
7
|
+
cwd?: string;
|
|
8
|
+
mode?: 'stdio' | 'github' | 'json';
|
|
9
|
+
repo?: string;
|
|
10
|
+
locale?: LocaleType;
|
|
11
|
+
};
|
|
12
|
+
type CheckConfig = {
|
|
13
|
+
interfacePath: string;
|
|
14
|
+
override?: Partial<Record<DiagnosticType, 'ignore' | 'warning' | 'error'>>;
|
|
15
|
+
};
|
|
16
|
+
type TestCases = {
|
|
17
|
+
configs: {
|
|
18
|
+
name?: string;
|
|
19
|
+
resource: string;
|
|
20
|
+
controller: string;
|
|
21
|
+
imageRoot?: string;
|
|
22
|
+
};
|
|
23
|
+
cases: {
|
|
24
|
+
image: string;
|
|
25
|
+
hits: (string | {
|
|
26
|
+
node: string;
|
|
27
|
+
box: maa.Rect;
|
|
28
|
+
})[];
|
|
29
|
+
}[];
|
|
30
|
+
};
|
|
31
|
+
type TestConfig = {
|
|
32
|
+
interfacePath: string;
|
|
33
|
+
casesCwd?: string;
|
|
34
|
+
cases: TestCases[];
|
|
35
|
+
maaVersion?: string;
|
|
36
|
+
maaCache?: string;
|
|
37
|
+
job?: number;
|
|
38
|
+
maxNodePerJob?: number;
|
|
39
|
+
};
|
|
40
|
+
type FullConfig = BaseConfig & {
|
|
41
|
+
check?: CheckConfig;
|
|
42
|
+
test?: TestConfig;
|
|
43
|
+
};
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region pkgs/maa-tools/src/check/index.d.ts
|
|
46
|
+
declare function runCheck(cfg: FullConfig): Promise<boolean>;
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region pkgs/maa-tools/src/test/index.d.ts
|
|
49
|
+
declare function runTest(cfg: FullConfig): Promise<boolean>;
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region pkgs/maa-tools/src/cli.d.ts
|
|
52
|
+
declare function runCli(cmd: string, cfg: string | FullConfig): Promise<boolean>;
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region pkgs/maa-tools/src/utils/config.d.ts
|
|
55
|
+
declare function loadConfig(file: string): Promise<FullConfig>;
|
|
56
|
+
//#endregion
|
|
57
|
+
export { BaseConfig, CheckConfig, FullConfig, TestCases, TestConfig, loadConfig, runCheck, runCli, runTest };
|
|
58
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/config.ts","../src/check/index.ts","../src/test/index.ts","../src/cli.ts","../src/utils/config.ts"],"mappings":";;;;;KAGY,UAAA;EACV,GAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA,GAAS,UAAA;AAAA;AAAA,KAKC,WAAA;EACV,aAAA;EAEA,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,cAAA;AAAA;AAAA,KAGhB,SAAA;EACV,OAAA;IACE,IAAA;IACA,QAAA;IACA,UAAA;IACA,SAAA;EAAA;EAEF,KAAA;IACE,KAAA;IACA,IAAA;MAGM,IAAA;MACA,GAAA,EAAK,GAAA,CAAI,IAAA;IAAA;EAAA;AAAA;AAAA,KAMP,UAAA;EACV,aAAA;EACA,QAAA;EACA,KAAA,EAAO,SAAA;EAEP,UAAA;EACA,QAAA;EAEA,GAAA;EACA,aAAA;AAAA;AAAA,KAGU,UAAA,GAAa,UAAA;EACvB,KAAA,GAAQ,WAAA;EACR,IAAA,GAAO,UAAA;AAAA;;;iBCrCa,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,OAAA;;;iBCgC3B,OAAA,CAAQ,GAAA,EAAK,UAAA,GAAU,OAAA;;;iBCxBvB,MAAA,CAAO,GAAA,UAAa,GAAA,WAAc,UAAA,GAAU,OAAA;;;iBClB5C,UAAA,CAAW,IAAA,WAAY,OAAA,CAAA,UAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{endGroup as e,error as t,startGroup as n,warning as r}from"@actions/core";import*as i from"node:fs/promises";import*as a from"node:path";import{FsContentLoader as o,FsContentWatcher as s,InterfaceBundle as c,buildDiagnosticMessage as l,joinPath as u,performDiagnostic as d}from"@nekosu/maa-pipeline-manager";import*as f from"node:os";import*as p from"workerpool";import{MaaVersionManager as m}from"@nekosu/maa-version-manager";import{existsSync as h}from"node:fs";import{setLocale as g}from"@nekosu/maa-locale";import{createJiti as _}from"jiti";async function v(e){let t=new c(new o,new s,!1,a.dirname(e),a.basename(e));return await t.load(),await t.flush(!1),t}function y(e,t){let n=e.slice(0,t),r=0,i=0;for(let e=0;e<n.length;e++)n[e]===`
|
|
2
|
+
`&&(r+=1,i=e);return[r+1,t-i]}async function b(o){if(!o.check)return!1;let s=a.resolve(o.cwd??process.cwd(),o.repo??`.`),c=[],u=await v(a.resolve(o.cwd??process.cwd(),o.check.interfacePath)),f={},p=async(e,t)=>{let n=f[e];return n||(n=await i.readFile(e,`utf8`),f[e]=n),y(n,t)},m=u.allControllerNames();for(let i of m){let f=u.allResourceNames(i);for(let m of f){await u.switchActive(i,m);let f=d(u,{}),h=[];for(let e of f){let t=o.check.override?.[e.type];t!==`ignore`&&(t?h.push({...e,level:t}):h.push(e))}o.mode===`github`&&n(`${i} ${m}`);for(let e of h){let[n,i,c]=await l(u.root,e,p,{}),[d,f]=n,m=a.relative(u.root,e.file);switch(o.mode??`stdio`){case`stdio`:console.log(` ${e.level}: ${m}:${d}:${f} ${c}`);break;case`github`:switch(e.level){case`warning`:r(c,{file:a.relative(s,e.file),startLine:d,startColumn:f,endColumn:f+e.length});break;case`error`:t(c,{file:a.relative(s,e.file),startLine:d,startColumn:f,endColumn:f+e.length});break}}}o.mode===`github`&&e(),c.push(...h)}}return o.mode===`json`?(process.stdout.write(JSON.stringify(c)),!0):c.length===0}var x=`@nekosu/maa-tools`,S={"@maaxyz/maa-node":`5.7.2`,"@tsconfig/node24":`^24.0.4`,"@types/node":`^25.3.0`,"@types/source-map-support":`^0.5.10`,"source-map-support":`^0.5.21`,typescript:`^5.9.3`};function C(e,t){return t[0]>=e[0]&&t[1]>=e[1]&&t[0]+t[2]<=e[0]+e[2]&&t[1]+t[3]<=e[1]+e[3]}function w(e,t){let n=[],r=0;for(;r<e.length;){let i=r+t;n.push(e.slice(r,i)),r=i}return n}async function T(e){let t=e.test.maaVersion??S[`@maaxyz/maa-node`],n=new m(e.test.maaCache??a.join(f.homedir(),`.maa-checker`));return await n.init(),await n.prepare(t,t=>{e.mode!==`json`&&(t===`prepare-folder`&&console.log(`preparing maafw`),console.log(` `+t))})?n.moduleFolder(t):null}async function E(e){if(!e.test)return!1;let t=await T(e);if(!t)return!1;let n=[],r=await v(a.resolve(e.cwd??process.cwd(),e.test.interfacePath)),i=0,o=e.test.cases.map(e=>e.cases.length*e.cases.map(e=>e.hits.length).reduce((e,t)=>e+t,0)),s=e.test.maxNodePerJob??50;for(let c of e.test.cases){let l=c.cases.map(t=>({image:a.resolve(e.cwd??process.cwd(),e.test.casesCwd??`.`,c.configs.imageRoot??`.`,t.image)+`.png`,imageRaw:t.image})),d=[...new Set(c.cases.map(e=>e.hits.map(e=>typeof e==`string`?e:e.node).flat()).flat())];await r.switchActive(c.configs.controller,c.configs.resource);let m=r.paths.map(e=>u(r.root,e)),h=p.pool(a.join(import.meta.dirname,`test`,`worker.mjs`),{maxWorkers:e.test.job??f.cpus().length/4,workerType:`process`,forkOpts:{env:{MAAFW_MODULE_PATH:t,MAAFW_SILENCE_STDOUT:e.mode===`json`?`1`:``,MAAFW_RESOURCE_PATHS:m.join(a.delimiter)}}}),g=[],_=(e,t)=>{let n=h.exec(`performReco`,[e]).then(e=>e).catch(e=>(console.log(e),[])).then(e=>{i+=e.length,t.push(...e),process.stderr.write(`${i} / ${o}\r`)});g.push(n)},v={cases:c,result:[]};n.push(v);for(let{image:e,imageRaw:t}of l){let n=w(d,s);for(let r of n)_({nodes:r,imagePath:e,imagePathRaw:t},v.result)}await Promise.all(g),await h.terminate()}for(let e of n){let t=e.cases.configs.name??`${e.cases.configs.controller}:${e.cases.configs.resource}`;console.log(`${t}`);for(let t of e.cases.cases)for(let n of e.result.filter(e=>e.imagePathRaw===t.image)){let e=t.hits.find(e=>typeof e==`string`?e===n.node:e.node===n.node);e?n.hit?typeof e!=`string`&&(n.detail?C(e.box,n.detail.box)||console.log(` ${t.image} ${n.node} box mismatch. Expect ${JSON.stringify(e.box)}, hit ${JSON.stringify(n.detail.box)}`):console.log(` ${t.image} ${n.node} missing detail.`)):console.log(` ${t.image} ${n.node} should hit but missed`):n.hit&&console.log(` ${t.image} ${n.node} should missed but hit`)}}return!0}async function D(e){try{return await _(import.meta.url).import(e,{default:!0})}catch{return null}}const O=`import type { FullConfig } from '${x}'
|
|
3
|
+
|
|
4
|
+
const config: FullConfig = {
|
|
5
|
+
check: {
|
|
6
|
+
interfacePath: 'assets/interface.json'
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default config
|
|
11
|
+
`;async function k(e,t){if(typeof t==`string`){let e=await D(t);if(!e)return console.error(`load ${t} failed`),!1;t=e}switch(process.env.GITHUB_ACTIONS&&(t.mode||=`github`),t.locale&&g(t.locale),e){case`init`:return h(`maatools.config.mts`)&&await i.writeFile(`maatools.config.mts`,O),!0;case`check`:return await b(t);case`test`:return await E(t)}return console.log(`Usage: npx ${x} <init|check|test> [path to maatools.config.mts]`),!1}export{D as loadConfig,b as runCheck,k as runCli,E as runTest};
|
|
12
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["pkg.name"],"sources":["../src/utils/bundle.ts","../src/check/utils.ts","../src/check/index.ts","../package.json","../src/test/utils.ts","../src/test/index.ts","../src/utils/config.ts","../src/cli.ts"],"sourcesContent":["import * as path from 'node:path'\n\nimport { FsContentLoader, FsContentWatcher, InterfaceBundle } from '@nekosu/maa-pipeline-manager'\n\nexport async function loadBundle(interfacePath: string) {\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 performDiagnostic\n} from '@nekosu/maa-pipeline-manager'\n\nimport type { FullConfig } from '../types/config'\nimport { loadBundle } from '../utils/bundle'\nimport { calucateLocation } from './utils'\n\nexport async function runCheck(cfg: FullConfig): Promise<boolean> {\n if (!cfg.check) {\n return false\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\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 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 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 if (cfg.mode === 'github') {\n startGroup(`${ctrlName} ${resName}`)\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(bundle.root, 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: path.relative(repo, diag.file),\n startLine: line,\n startColumn: col,\n endColumn: col + diag.length\n })\n break\n case 'error':\n coreError(brief, {\n file: path.relative(repo, diag.file),\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 }\n\n if (cfg.mode === 'json') {\n process.stdout.write(JSON.stringify(result))\n return true\n }\n\n return result.length === 0\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 * as os from 'node:os'\nimport * as path from 'node:path'\nimport * as workerpool from 'workerpool'\n\nimport { joinPath } from '@nekosu/maa-pipeline-manager'\nimport { MaaVersionManager } from '@nekosu/maa-version-manager'\n\nimport pkg from '../../package.json'\nimport type { FullConfig } from '../types/config'\nimport { loadBundle } from '../utils/bundle'\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\nasync function setupMaa(cfg: FullConfig) {\n const maaVersion = cfg.test!.maaVersion ?? pkg.devDependencies['@maaxyz/maa-node']\n\n const versionManager = new MaaVersionManager(\n cfg.test!.maaCache ?? path.join(os.homedir(), '.maa-checker')\n )\n await versionManager.init()\n if (\n !(await versionManager.prepare(maaVersion, msg => {\n if (cfg.mode !== 'json') {\n if (msg === 'prepare-folder') {\n console.log('preparing maafw')\n }\n console.log(' ' + msg)\n }\n }))\n ) {\n return null\n }\n return versionManager.moduleFolder(maaVersion)\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\n let finished = 0\n\n const taskCount = cfg.test.cases.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\n const maxNodePerJob = cfg.test.maxNodePerJob ?? 50\n\n for (const testCases of cfg.test.cases) {\n const allImages = testCases.cases.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 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_SILENCE_STDOUT: cfg.mode === 'json' ? '1' : '',\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'\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(file, { default: true })) as FullConfig\n } catch (_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 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 (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 'init':\n if (existsSync('maatools.config.mts')) {\n await fs.writeFile('maatools.config.mts', defaultConfig)\n }\n return true\n\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"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nekosu/maa-tools",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"maa-tools": "bin/maa-tools"
|
|
7
|
+
},
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"types": "./dist/index.d.mts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "github",
|
|
16
|
+
"url": "git+https://github.com/neko-para/maa-support-extension.git"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@actions/core": "^3.0.0",
|
|
23
|
+
"jiti": "^2.6.1",
|
|
24
|
+
"workerpool": "^10.0.1",
|
|
25
|
+
"@nekosu/maa-locale": "1.0.0",
|
|
26
|
+
"@nekosu/maa-pipeline-manager": "1.0.0",
|
|
27
|
+
"@nekosu/maa-version-manager": "1.0.1"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@maaxyz/maa-node": "5.7.2",
|
|
31
|
+
"@tsconfig/node24": "^24.0.4",
|
|
32
|
+
"@types/node": "^25.3.0",
|
|
33
|
+
"@types/source-map-support": "^0.5.10",
|
|
34
|
+
"source-map-support": "^0.5.21",
|
|
35
|
+
"typescript": "^5.9.3"
|
|
36
|
+
}
|
|
37
|
+
}
|