Update readme.md to include project overview, setup instructions, directory structure, and usage with Docker for Node + TypeScript project.
Some checks failed
ci / build-test-pack (push) Has been cancelled

This commit is contained in:
2025-08-10 01:43:28 +08:00
parent 34637ef77a
commit 26a36b197e
13 changed files with 220 additions and 0 deletions

40
.gitea/workflows/ci.yml Normal file
View File

@@ -0,0 +1,40 @@
name: ci
on:
push:
branches: ["**"]
pull_request:
branches: ["**"]
jobs:
build-test-pack:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
- name: Install dependencies
run: npm ci || npm i
- name: Run tests
run: npm test
- name: Build
run: npm run build
- name: Pack
run: npm pack
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: npm-package
path: "*.tgz"

7
.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
node_modules
dist
*.tgz
npm-debug.log*
.DS_Store

9
.idea/hello-world.iml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="corretto-11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/hello-world.iml" filepath="$PROJECT_DIR$/.idea/hello-world.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

14
Dockerfile Normal file
View File

@@ -0,0 +1,14 @@
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json* tsconfig.json ./
RUN npm install --no-audit --progress=false
COPY src ./src
RUN npm run build && npm pack
CMD ["node", "dist/index.js"]

22
package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"name": "hello-world",
"version": "0.1.0",
"private": false,
"description": "Node + TypeScript OOP test environment for Gitea build and pack",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"clean": "rimraf dist",
"build": "npm run clean && tsc -p tsconfig.json",
"test": "vitest run"
},
"files": [
"dist",
"README.md"
],
"engines": {
"node": ">=20"
},
"license": "MIT"
}

View File

@@ -0,0 +1,51 @@
项目:用于在 Gitea 中测试 Node + TypeScript 项目的构建与打包(含 OOP 示例、CI、Docker
### 快速开始
1) 安装 Node 20建议使用 nvm
```bash
nvm use || nvm install
```
2) 安装依赖并运行测试、构建与打包
```bash
npm i
npm test
npm run build
npm pack
```
生成的 npm 包形如:`hello-world-0.1.0.tgz`
### 目录结构
- `src/`TypeScript 源码OOP 风格示例位于 `src/core/Greeter.ts`
- `tests/`Vitest 单元测试
- `.gitea/workflows/ci.yml`Gitea Actions 工作流(安装、测试、构建、打包、上传构件)
- `Dockerfile`:容器内构建与打包
### 本地使用Docker
```bash
docker build -t node-oop-ci .
docker run --rm node-oop-ci
```
镜像在构建阶段会运行 `npm run build && npm pack`,启动时会执行编译产物 `dist/index.js`
### 在 Gitea 上运行
将仓库推送到 Gitea确保实例启用了 Actions并且 Runner 提供了 `ubuntu-latest` 或兼容标签。
工作流位于 `.gitea/workflows/ci.yml`,包含以下阶段:
- Checkout 代码
- 安装 Node 20 与依赖
- 运行测试Vitest
- 构建TypeScript 到 `dist/`
- 打包(`npm pack`
- 上传构件(若实例提供 `actions/upload-artifact` 镜像)
如你的 Runner 标签不同,可调整 `runs-on`

14
src/core/Greeter.ts Normal file
View File

@@ -0,0 +1,14 @@
export class Greeter {
private readonly greetingPrefix: string;
constructor(greetingPrefix: string = "Hello") {
this.greetingPrefix = greetingPrefix;
}
public greet(name: string): string {
const sanitizedName = (name ?? "").trim() || "World";
return `${this.greetingPrefix}, ${sanitizedName}!`;
}
}

12
src/index.ts Normal file
View File

@@ -0,0 +1,12 @@
import { Greeter } from "./core/Greeter";
export { Greeter };
if (require.main === module) {
const greeter = new Greeter();
// Example run output
// eslint-disable-next-line no-console
console.log(greeter.greet("Gitea"));
}

16
tests/Greeter.test.ts Normal file
View File

@@ -0,0 +1,16 @@
import { describe, it, expect } from "vitest";
import { Greeter } from "../src/core/Greeter";
describe("Greeter", () => {
it("greets with default prefix", () => {
const greeter = new Greeter();
expect(greeter.greet("Alice")).toBe("Hello, Alice!");
});
it("trims name and handles empty name", () => {
const greeter = new Greeter("Hi");
expect(greeter.greet(" ")).toBe("Hi, World!");
});
});

15
tsconfig.json Normal file
View File

@@ -0,0 +1,15 @@
{
"compilerOptions": {
"target": "ES2020",
"module": "CommonJS",
"moduleResolution": "Node",
"declaration": true,
"outDir": "dist",
"rootDir": "src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src"]
}