// 给所有 Node.js 示例共用的最小启动代码,零外部依赖(Node >= 18)。 // // 优先级:进程环境变量 → vjmap-service/tests/.env → 上级目录 test/.env(后两者可选)。 'use strict'; const fs = require('node:fs'); const path = require('node:path'); const HERE = __dirname; const NB_ROOT = path.resolve(HERE, '..', '..'); const REPO_ROOT = path.resolve(NB_ROOT, '..'); const { Vjmap, VjmapError } = require(path.join(NB_ROOT, 'sdk', 'nodejs', 'vjmap.js')); function parseEnvFile(file) { const out = {}; if (!fs.existsSync(file)) return out; for (const raw of fs.readFileSync(file, 'utf-8').split(/\r?\n/)) { const line = raw.trim(); if (!line || line.startsWith('#')) continue; const iEq = line.indexOf('='); const iCo = line.indexOf(':'); let sep; if (iEq !== -1 && (iCo === -1 || iEq < iCo)) sep = iEq; else if (iCo !== -1) sep = iCo; else continue; const k = line.slice(0, sep).trim(); const v = line.slice(sep + 1).trim().replace(/^['"]|['"]$/g, ''); out[k] = v; } return out; } const nbEnv = parseEnvFile(path.join(NB_ROOT, 'tests', '.env')); const rootRaw = parseEnvFile(path.join(REPO_ROOT, 'test', '.env')); const rootEnv = { VJMAP_API: rootRaw.api, VJMAP_TOKEN: rootRaw.token, VJMAP_MAP_SUPER_KEY: rootRaw.map_super_key, }; const ENV = {}; for (const [k, v] of Object.entries(nbEnv)) if (v) ENV[k] = v; for (const [k, v] of Object.entries(rootEnv)) if (v && !ENV[k]) ENV[k] = v; for (const [k, v] of Object.entries(process.env)) if (v) ENV[k] = v; function env(key, def = '') { return ENV[key] || def; } function makeClient() { const base = env('VJMAP_API', 'http://127.0.0.1:27660/api/v1').replace(/\/$/, ''); const token = env('VJMAP_TOKEN', ''); if (!token) { throw new Error('VJMAP_TOKEN 未配置:请设置环境变量(或写入 vjmap-service/tests/.env)'); } return new Vjmap(base, token); } function sampleMapid() { return env('VJMAP_SAMPLE_MAPID', 'sys_zp'); } function sampleVersion() { return env('VJMAP_SAMPLE_VERSION', 'v1'); } function sampleDwg() { const d = env('VJMAP_TEST_DWG_DIR', 'test'); const n = env('VJMAP_TEST_DWG_NAME', 'caf27de8a225.dwg'); const candidates = [ path.join(REPO_ROOT, d, n), path.join(NB_ROOT, d, n), path.isAbsolute(d) ? path.join(d, n) : null, ].filter(Boolean); for (const p of candidates) { if (fs.existsSync(p)) return p; } throw new Error(`示例 DWG 不存在,已尝试:\n${candidates.join('\n')}`); } module.exports = { env, makeClient, sampleMapid, sampleVersion, sampleDwg, Vjmap, VjmapError, NB_ROOT, REPO_ROOT, };