Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8ca3eda
Add mandarin
MelbourneDeveloper Jan 16, 2026
f0a35b5
Fix CSS issue
MelbourneDeveloper Jan 16, 2026
9f0721f
Fixes
MelbourneDeveloper Jan 16, 2026
6a696d3
Corrections
MelbourneDeveloper Jan 16, 2026
55f0738
Fix readmes
MelbourneDeveloper Jan 16, 2026
ee60ada
Fix readmes
MelbourneDeveloper Jan 16, 2026
afcf693
Ignore index.mds because they are copied from readme
MelbourneDeveloper Jan 16, 2026
e458dba
Build fixes
MelbourneDeveloper Jan 16, 2026
9ca9c33
fix file watch
MelbourneDeveloper Jan 16, 2026
76d3ad9
Translations, corrections and tests
MelbourneDeveloper Jan 16, 2026
5dd3cb2
Testing
MelbourneDeveloper Jan 16, 2026
32a327a
tests
MelbourneDeveloper Jan 16, 2026
0520438
Update the lock files
MelbourneDeveloper Jan 16, 2026
c7eb0f6
coverage
MelbourneDeveloper Jan 16, 2026
52c5b53
Fixes
MelbourneDeveloper Jan 16, 2026
3935277
Links to chinese docs from Dart
MelbourneDeveloper Jan 16, 2026
a7c47e3
js and google analytics
MelbourneDeveloper Jan 16, 2026
29f7986
Fix Chinese docs links to use /zh/ prefix and update .gitignore
MelbourneDeveloper Jan 16, 2026
7e0a2ea
Improve sidebar file filtering in API docs generator
MelbourneDeveloper Jan 16, 2026
becbcb8
Improve Chinese doc links consistency and fix logo link
MelbourneDeveloper Jan 16, 2026
f012d6c
Add Chinese documentation links to all dart_node_react files
MelbourneDeveloper Jan 16, 2026
eba250e
Add Chinese MDN links to dart_node_ws documentation
MelbourneDeveloper Jan 16, 2026
9c085af
Add Chinese MDN links to all synthetic event types
MelbourneDeveloper Jan 16, 2026
7e3774e
Fix Chinese blog post location and improve MDN link formatting
MelbourneDeveloper Jan 16, 2026
d00bb7d
Docs
MelbourneDeveloper Jan 17, 2026
cbb2afe
Docs
MelbourneDeveloper Jan 17, 2026
b3d5189
Cache Playwright browsers in CI
MelbourneDeveloper Jan 17, 2026
e6d6ad6
run tests in parallel
MelbourneDeveloper Jan 17, 2026
6be040d
Fixes
MelbourneDeveloper Jan 17, 2026
842001b
Fixes
MelbourneDeveloper Jan 17, 2026
be91894
Fixes
MelbourneDeveloper Jan 17, 2026
c3f39a2
Fixes
MelbourneDeveloper Jan 17, 2026
f96e223
Spelling
MelbourneDeveloper Jan 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,58 @@ env:
MIN_COVERAGE: ${{ vars.MIN_COVERAGE }}

jobs:
ci:
website:
name: Website Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Dart
uses: dart-lang/setup-dart@v1
with:
sdk: ${{ vars.DART_VERSION }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: website/package-lock.json

- name: Install dependencies
working-directory: website
run: npm ci

- name: Get Playwright version
id: playwright-version
working-directory: website
run: echo "version=$(npm ls @playwright/test --json | jq -r '.dependencies["@playwright/test"].version')" >> $GITHUB_OUTPUT

- name: Cache Playwright browsers
uses: actions/cache@v4
id: playwright-cache
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ steps.playwright-version.outputs.version }}

- name: Install Playwright browsers
if: steps.playwright-cache.outputs.cache-hit != 'true'
working-directory: website
run: npx playwright install --with-deps chromium

- name: Install Playwright deps only (cached)
if: steps.playwright-cache.outputs.cache-hit == 'true'
run: npx playwright install-deps chromium

- name: Build website
working-directory: website
run: npm run build

- name: Run tests
working-directory: website
run: npm test

packages:
name: Lint, Test & Build
runs-on: ubuntu-latest
steps:
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/deploy-website.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ jobs:
working-directory: website
run: npm ci

- name: Generate API documentation
- name: Build website
working-directory: website
run: ./scripts/generate-api-docs.sh
run: npm run build

- name: Build website
- name: Run website tests
working-directory: website
run: npx @11ty/eleventy
run: bash scripts/test.sh

- name: Setup Pages
uses: actions/configure-pages@v4
Expand Down
16 changes: 15 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ examples/mobile/rn/.expo/
# Website generated files
website/_site/
website/src/api/
website/src/zh/api/dart_node_core/
website/src/zh/api/dart_node_express/
website/src/zh/api/dart_node_react/
website/src/zh/api/dart_node_react_native/
website/src/zh/api/dart_node_ws/
website/src/zh/api/dart_node_better_sqlite3/
website/src/zh/api/dart_node_mcp/
website/src/zh/api/dart_logging/
website/src/zh/api/reflux/
website/.dart-doc-temp/

examples/frontend/coverage/
Expand All @@ -39,4 +48,9 @@ examples/too_many_cooks_vscode_extension/.vscode-test/
examples/reflux_demo/flutter_counter/test/failures/


mutation-reports
mutation-reports
.playwright-mcp/

website/playwright-report/

website/test-results/
13 changes: 13 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,19 @@ Dart packages for building Node.js apps. Typed Dart layer over JS interop.
- All packages require: `austerity` (linting), `nadz` (Result types)
- `node_preamble` for dart2js Node.js compatibility

# Web & Translation

- Optimize for AI Search and SEO
https://developers.google.com/search/blog/2025/05/succeeding-in-ai-search
https://developers.google.com/search/docs/fundamentals/seo-starter-guide

- Always translate the English version to the target language directly.
- Be careful of cultural differences.
- Avoid literal translations that may offend the reader.
- Keep the code examples the same as the original but translate the comments to the target language
- Minimize CSS.
- Don't name CSS after sections. Name them after the HTML element

## Codebase Structure

```
Expand Down
48 changes: 48 additions & 0 deletions README_zh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# dart_node

使用 Dart 编写完整技术栈:React Web 应用、基于 Expo 的 React Native 移动应用,以及 Node.js Express 后端。

[文档](https://melbournedeveloper.github.io/dart_node/)

![React 和 React Native](images/dart_node.gif)

## 包

| 包 | 描述 |
|---------|-------------|
| [dart_node_core](packages/dart_node_core) | 核心 JS 互操作工具 |
| [dart_node_express](packages/dart_node_express) | Express.js 绑定 |
| [dart_node_ws](packages/dart_node_ws) | WebSocket 绑定 |
| [dart_node_react](packages/dart_node_react) | React 绑定 |
| [dart_node_react_native](packages/dart_node_react_native) | React Native 绑定 |
| [dart_node_mcp](packages/dart_node_mcp) | MCP 服务器绑定 |
| [dart_node_better_sqlite3](packages/dart_node_better_sqlite3) | SQLite3 绑定 |
| [dart_jsx](packages/dart_jsx) | Dart JSX 转译器 |
| [reflux](packages/reflux) | Redux 风格状态管理 |
| [dart_logging](packages/dart_logging) | 结构化日志 |
| [dart_node_coverage](packages/dart_node_coverage) | dart2js 代码覆盖率 |

## 工具

| 工具 | 描述 |
|------|-------------|
| [too-many-cooks](examples/too_many_cooks) | 多智能体协调 MCP 服务器 ([npm](https://www.npmjs.com/package/too-many-cooks)) |
| [Too Many Cooks VSCode](examples/too_many_cooks_vscode_extension) | 智能体可视化 VSCode 扩展 |

## 快速开始

```bash
# 切换到本地依赖
dart tools/switch_deps.dart local

# 运行全部
sh run_dev.sh
```

打开 http://localhost:8080/web/

**移动端:** 使用 VSCode 启动配置 `Mobile: Build & Run (Expo)`

## 许可证

BSD 3-Clause 许可证。版权所有 (c) 2025,Christian Findlay。
7 changes: 7 additions & 0 deletions packages/dart_jsx/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

JSX transpiler for Dart - transforms JSX syntax to dart_node_react calls.

## Installation

```yaml
dependencies:
dart_jsx: ^0.1.0
```

## Usage

Write JSX inside `jsx()` calls in your Dart files:
Expand Down
38 changes: 38 additions & 0 deletions packages/dart_jsx/README_zh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# dart_jsx

Dart 的 JSX 转译器 - 将 JSX 语法转换为 dart_node_react 调用。

## 安装

```yaml
dependencies:
dart_jsx: ^0.1.0
```

## 使用方法

在 Dart 文件中的 `jsx()` 调用内编写 JSX:

```dart
final element = jsx(<div className="app">
<h1>Hello World</h1>
<button onClick={handleClick}>Click me</button>
</div>);
```

转译器将其转换为:

```dart
final element = $div(className: 'app') >> [
$h1 >> 'Hello World',
$button(onClick: handleClick) >> 'Click me',
];
```

## VSCode 扩展

配套的 VSCode 扩展为 `.jsx` Dart 文件提供语法高亮。请参阅 [.vscode/extensions/dart-jsx](../../.vscode/extensions/dart-jsx)。

## dart_node 的一部分

[GitHub](https://github.com/MelbourneDeveloper/dart_node)
104 changes: 99 additions & 5 deletions packages/dart_logging/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# dart_logging

Pino-style structured logging with child loggers.
Pino-style structured logging with child loggers. Provides hierarchical logging with automatic context inheritance.

## Getting Started
## Installation

```yaml
dependencies:
dart_logging: ^0.11.0-beta
```

## Quick Start

```dart
import 'package:dart_logging/dart_logging.dart';
Expand All @@ -23,6 +29,94 @@ void main() {
}
```

## Part of dart_node
## Core Concepts

### Logging Context

Create a logging context with one or more transports:

```dart
final context = createLoggingContext(
transports: [logTransport(logToConsole)],
);
```

### Log Levels

Standard log levels are available (from lowest to highest severity):

```dart
logger.trace('Very detailed trace info');
logger.debug('Debugging info');
logger.info('Information');
logger.warn('Warning');
logger.error('Error occurred');
logger.fatal('Fatal error');
```

### Structured Data

Pass structured data with log messages:

```dart
logger.info('User logged in', structuredData: {'userId': 123, 'email': 'user@example.com'});
```

### Child Loggers

Create child loggers that inherit and extend context:

```dart
final requestLogger = logger.child({'requestId': 'abc-123'});
requestLogger.info('Start'); // Includes requestId

final userLogger = requestLogger.child({'userId': 456});
userLogger.info('Action'); // Includes both requestId and userId
```

This is useful for adding context that applies to a scope (like a request handler).

### Custom Transports

Create custom transports to send logs to different destinations:

```dart
void myTransport(LogEntry entry) {
// Send to external service, file, etc.
print('${entry.level}: ${entry.message}');
}

final context = createLoggingContext(
transports: [logTransport(myTransport)],
);
```

## Example: Express Server Logging

```dart
import 'dart:js_interop';
import 'package:dart_node_express/dart_node_express.dart';
import 'package:dart_logging/dart_logging.dart';

void main() {
final logger = createLoggerWithContext(
createLoggingContext(transports: [logTransport(logToConsole)]),
);

final app = express();

app.use(middleware((req, res, next) {
final reqLogger = logger.child({'path': req.path, 'method': req.method});
reqLogger.info('Request received');
next();
}));

app.listen(3000, () {
logger.info('Server started', structuredData: {'port': 3000});
}.toJS);
}
```

## Source Code

[GitHub](https://github.com/MelbourneDeveloper/dart_node)
The source code is available on [GitHub](https://github.com/melbournedeveloper/dart_node/tree/main/packages/dart_logging).
Loading