From 6d63d932e03e4a18e13b667e58dc552a21b96af0 Mon Sep 17 00:00:00 2001 From: Daniel Heras Quesada Date: Sat, 12 Sep 2026 12:16:12 +0200 Subject: [PATCH] WIP: minimal data structure implemented --- juker/package.json | 3 +- juker/src/app.ts | 4 +- juker/src/modules/core/juker.types.ts | 19 +++++++++ juker/src/modules/faker/faker.ts | 0 .../modules/parser/fixtures/mock.fixture.json | 40 +++++++++++++++++++ juker/src/modules/parser/json.parser.ts | 27 +++++++++++++ juker/src/modules/parser/juke.parser.ts | 5 +++ juker/src/modules/something.ts | 3 -- juker/tsconfig.json | 8 +++- 9 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 juker/src/modules/core/juker.types.ts create mode 100644 juker/src/modules/faker/faker.ts create mode 100644 juker/src/modules/parser/fixtures/mock.fixture.json create mode 100644 juker/src/modules/parser/json.parser.ts create mode 100644 juker/src/modules/parser/juke.parser.ts delete mode 100644 juker/src/modules/something.ts diff --git a/juker/package.json b/juker/package.json index e96c562..9d732ce 100644 --- a/juker/package.json +++ b/juker/package.json @@ -9,7 +9,8 @@ "dev:node": "node --watch-preserve-output --watch-path=./dist dist/app.js", "dev": "pnpm run dev:tsc:silent & pnpm run dev:node", "build": "tsc", - "start": "node dist/app.js" + "start": "node dist/app.js", + "run": "pnpm run build && pnpm run start" }, "keywords": [], "author": "", diff --git a/juker/src/app.ts b/juker/src/app.ts index a1c1a87..915ff74 100644 --- a/juker/src/app.ts +++ b/juker/src/app.ts @@ -1,4 +1,4 @@ -import { doSomething } from "./modules/something"; +import { readJSON } from "./modules/parser/json.parser"; console.log("TS is working!!!"); -doSomething(); +readJSON("./src/modules/parser/fixtures/mock.fixture.json").then(d => console.log(JSON.stringify(d))); diff --git a/juker/src/modules/core/juker.types.ts b/juker/src/modules/core/juker.types.ts new file mode 100644 index 0000000..74216f1 --- /dev/null +++ b/juker/src/modules/core/juker.types.ts @@ -0,0 +1,19 @@ +export type HTTPHeaders = Record; + +export interface RawJuke { + path: string; + responses: Object[]; +} + +export interface Juke { + path: string; + status: { + condition: (body: T, headers: HTTPHeaders) => boolean; + response: HTTPMinimalResponse; + }[] +} + +export interface HTTPMinimalResponse { + code: number; + body?: T; +} diff --git a/juker/src/modules/faker/faker.ts b/juker/src/modules/faker/faker.ts new file mode 100644 index 0000000..e69de29 diff --git a/juker/src/modules/parser/fixtures/mock.fixture.json b/juker/src/modules/parser/fixtures/mock.fixture.json new file mode 100644 index 0000000..cf20309 --- /dev/null +++ b/juker/src/modules/parser/fixtures/mock.fixture.json @@ -0,0 +1,40 @@ +{ + "routes": [ + { + "path": "/test", + "responses": [ + { + "code": "401", + "when": "body.name !== 'test' || headers['Content-Type'] !== 'application/json'" + }, + { + "code": "200", + "when": "", + "body": { + "name": "$request.body.name", + "param": "$query.id", + "data": [{ + "title": "$word", + "subtitle": "$word", + "description": "$text" + }], + "limitedData": { + "$array": { + "$array.count": 15, + "$array.content": { + "title": "$word", + "subtitle": "$word", + "description": "$text" + } + } + }, + "pagination": { + "page": "$number", + "total": "$number" + } + } + } + ] + } + ] +} diff --git a/juker/src/modules/parser/json.parser.ts b/juker/src/modules/parser/json.parser.ts new file mode 100644 index 0000000..ca74c67 --- /dev/null +++ b/juker/src/modules/parser/json.parser.ts @@ -0,0 +1,27 @@ +import { readFile } from "node:fs/promises"; +import { RawJuke } from "../core/juker.types"; + +export async function readJSON(path: string): Promise { + try { + const jukes: RawJuke[] = []; + const f = await readFile(path); + const j = JSON.parse(f.toString()); + + if ("routes" in j && Array.isArray(j.routes)) { + j.routes.forEach((route: RawJuke) => { + if ("path" in route && "responses" in route && Array.isArray(route.responses)) { + jukes.push({ path: route.path, responses: route.responses }) + } else { + console.error("[!!] Route entry wrong format"); + } + }) + } else { + throw Error("incorrect format, 'routes' not present at the root of the file.") + } + + return jukes; + } catch (e) { + console.error("[!!] Reading JSON error", e); + return []; + } +} diff --git a/juker/src/modules/parser/juke.parser.ts b/juker/src/modules/parser/juke.parser.ts new file mode 100644 index 0000000..443e8e3 --- /dev/null +++ b/juker/src/modules/parser/juke.parser.ts @@ -0,0 +1,5 @@ +import { Juke, RawJuke } from "../core/juker.types"; + +export function parseJuke(raw: RawJuke): Juke { + +} diff --git a/juker/src/modules/something.ts b/juker/src/modules/something.ts deleted file mode 100644 index 9f1a043..0000000 --- a/juker/src/modules/something.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function doSomething() { - console.log("Does something..."); -} diff --git a/juker/tsconfig.json b/juker/tsconfig.json index 4e9bd50..812ff06 100644 --- a/juker/tsconfig.json +++ b/juker/tsconfig.json @@ -10,7 +10,13 @@ "forceConsistentCasingInFileNames": true, "strict": true, - "esModuleInterop": true + "esModuleInterop": true, + "typeRoots": [ + "./node_modules/@types" + ], + "types": [ + "node" + ] }, "include": ["src/**/*.ts"], "exclude": ["node_modules"]