唯杰地图 logo唯杰地图
VJMAP
EN

_common.js

vjmap-service/examples/nodejs/_common.js 2.7 KB81 行
原文
// 给所有 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,
};