Add JS toolchain: TypeScript, ESLint, Prettier, Vitest
package.json declares the project as ESM with NodeNext module resolution, exposing dist/index.js as the library entry and dist/bin/quack.js as the CLI binary. Dev dependencies are pinned to exact versions (yarn.lock holds the integrity hashes per repo policy on hash-pinned external references). Adds a placeholder src/index.ts and a single smoke test so make check is not a no-op.
This commit is contained in:
10
eslint.config.mjs
Normal file
10
eslint.config.mjs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import js from "@eslint/js";
|
||||||
|
import tseslint from "typescript-eslint";
|
||||||
|
|
||||||
|
export default tseslint.config(
|
||||||
|
{
|
||||||
|
ignores: ["dist/", "node_modules/", "coverage/", ".vitest-cache/"],
|
||||||
|
},
|
||||||
|
js.configs.recommended,
|
||||||
|
...tseslint.configs.recommended,
|
||||||
|
);
|
||||||
39
package.json
Normal file
39
package.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"name": "quack",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "TypeScript client library and CLI for the Ente end-to-end encrypted photo service",
|
||||||
|
"license": "WTFPL",
|
||||||
|
"author": "@sneak <https://sneak.berlin>",
|
||||||
|
"homepage": "https://git.eeqj.de/sneak/quack",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.eeqj.de/sneak/quack.git"
|
||||||
|
},
|
||||||
|
"type": "module",
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"bin": {
|
||||||
|
"quack": "./dist/bin/quack.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist/",
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"test": "vitest run",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"fmt": "prettier --write .",
|
||||||
|
"fmt-check": "prettier --check ."
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/js": "9.38.0",
|
||||||
|
"@types/node": "22.18.13",
|
||||||
|
"eslint": "9.38.0",
|
||||||
|
"prettier": "3.8.1",
|
||||||
|
"typescript": "5.9.3",
|
||||||
|
"typescript-eslint": "8.46.2",
|
||||||
|
"vitest": "2.1.9"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/index.ts
Normal file
1
src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const VERSION = "0.0.0";
|
||||||
9
test/smoke.test.ts
Normal file
9
test/smoke.test.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import { VERSION } from "../src/index.js";
|
||||||
|
|
||||||
|
describe("quack", () => {
|
||||||
|
it("exports a version string", () => {
|
||||||
|
expect(typeof VERSION).toBe("string");
|
||||||
|
expect(VERSION.length).toBeGreaterThan(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
21
tsconfig.json
Normal file
21
tsconfig.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"lib": ["ES2022"],
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"strict": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"resolveJsonModule": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*", "bin/**/*"]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user