Implement Phase 1 tasks 1.1-1.4 (scaffold + core shell + Teltonika framing)

- Project scaffold (Node 22 + TS 5 + pnpm + vitest + ESLint flat config)
- Core shell: TCP server, session loop, adapter registry, types
- Configuration (zod-validated env) and pino logger
- Teltonika adapter: IMEI handshake, frame envelope, CRC-16/IBM,
  codec dispatch registry, DeviceAuthority seam (AllowAllAuthority default)

Codec data parsers (1.5-1.7), Redis publisher (1.8), and downstream
tasks remain. 36 tests covering CRC, framing, handshake, device
authority, config, and core server. typecheck/lint/test/build all clean.
This commit is contained in:
2026-04-30 15:47:26 +02:00
parent c8a5f4cd68
commit 1e9219d14a
35 changed files with 6217 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
// @ts-check
import tseslint from "@typescript-eslint/eslint-plugin";
import tsParser from "@typescript-eslint/parser";
import importPlugin from "eslint-plugin-import";
import { fileURLToPath } from "node:url";
import { dirname, join } from "node:path";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
/** @type {import('eslint').Linter.Config[]} */
export default [
{
ignores: ["dist/**", "node_modules/**", "coverage/**"],
},
{
files: ["src/**/*.ts", "test/**/*.ts"],
plugins: {
"@typescript-eslint": tseslint,
import: importPlugin,
},
languageOptions: {
parser: tsParser,
parserOptions: {
project: "./tsconfig.test.json",
tsconfigRootDir: __dirname,
ecmaVersion: 2022,
sourceType: "module",
},
},
settings: {
"import/resolver": {
typescript: {
project: join(__dirname, "tsconfig.test.json"),
},
},
},
rules: {
// TypeScript strict promise rules — critical in a TCP server
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-misused-promises": "error",
// General quality
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
],
"@typescript-eslint/consistent-type-imports": [
"error",
{ prefer: "type-imports" },
],
// Adapter isolation: core/ must NEVER import from adapters/
"import/no-restricted-paths": [
"error",
{
basePath: __dirname,
zones: [
{
target: "src/core",
from: "src/adapters",
message:
"src/core must not import from src/adapters — adapters depend on core, not the reverse.",
},
],
},
],
},
},
];