// 给所有 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,
};