Releases: Ahoo-Wang/fetcher
Releases · Ahoo-Wang/fetcher
v3.10.5
What's Changed
🤖 Dependency Updates
- chore(deps): update dependency versions in pnpm workspace by @Ahoo-Wang in #1040
- chore(storybook): upgrade dependencies and update configuration by @Ahoo-Wang in #1043
- chore(deps): update mongo docker tag to v8.2.4 by @renovate[bot] in #1045
- chore(deps): update storybook dependencies to latest versions by @Ahoo-Wang in #1046
- chore(deps): update msw and related dependencies by @Ahoo-Wang in #1047
- chore(deps): update commander dependency to version 14.0.3 by @Ahoo-Wang in #1048
- chore(deps): update testing-library and types dependencies by @Ahoo-Wang in #1049
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.18.2 by @renovate[bot] in #1051
- test(cosec): refactor mocks to use class implementations by @Ahoo-Wang in #1050
- chore(deps): update dependency jsdom to v28 by @renovate[bot] in #1052
Full Changelog: v3.10.3...v3.10.5
v3.10.3
What's Changed
🎉 New Features
🤖 Dependency Updates
- chore(deps): update vite-bundle-analyzer and other dependencies by @Ahoo-Wang in #1039
New Contributors
Full Changelog: v3.10.2...v3.10.3
v3.10.2
What's Changed
🎉 New Features
- refactor(wow): remove unused tenant space owner endpoint constant by @Ahoo-Wang in #1034
- feat(cosec): add space ID support to request interceptor by @Ahoo-Wang in #1035
- docs(cosec): enhance documentation for CoSec configuration and interceptors by @Ahoo-Wang in #1036
🤖 Dependency Updates
- chore(deps): update dependency versions in pnpm lockfile by @Ahoo-Wang in #1033
- chore(deps): update @types/react to version 19.2.11 by @Ahoo-Wang in #1037
Full Changelog: v3.10.0...v3.10.2
v3.10.0
What's Changed
🎉 New Features
- feat: add SpaceId support to domain models, operators, endpoints, and conditions by @Ahoo-Wang in #1031
🤖 Dependency Updates
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.12.1 by @renovate[bot] in #1010
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.12.3 by @renovate[bot] in #1011
- chore(deps): update pnpm to v10.28.0 by @renovate[bot] in #1012
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.12.5 by @renovate[bot] in #1015
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.12.6 by @renovate[bot] in #1016
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.12.9 by @renovate[bot] in #1017
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.13.1 by @renovate[bot] in #1018
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.13.3 by @renovate[bot] in #1019
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.13.5 by @renovate[bot] in #1020
- chore(deps): update dependency versions in pnpm lockfile by @Ahoo-Wang in #1021
- chore(deps): update @types/node dependency by @Ahoo-Wang in #1023
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.13.6 by @renovate[bot] in #1024
- chore(deps): update pnpm to v10.28.2 by @renovate[bot] in #1029
- chore(deps): update workspace dependencies to latest versions by @Ahoo-Wang in #1032
Other Changes
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.13.8 by @renovate[bot] in #1025
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.13.9 by @renovate[bot] in #1027
Full Changelog: v3.9.9...v3.10.0
v3.9.9
v3.9.8
What's Changed
🎉 New Features
- Feature fetcher view by @noahjzc in #1003
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.12.0 by @renovate[bot] in #1005
- feat(ci): add Storybook build workflow by @Ahoo-Wang in #1007
- chore(ci): remove push trigger from build-storybook workflow by @Ahoo-Wang in #1008
🤖 Dependency Updates
- chore(deps): update dependency versions in pnpm lockfile by @Ahoo-Wang in #1004
- chore(deps): update lockfile with latest dependency versions by @Ahoo-Wang in #1006
Full Changelog: v3.9.6...v3.9.8
v3.9.6
What's Changed
🎉 New Features
- feat(github): add opencode workflow for code review automation by @Ahoo-Wang in #992
- fix(filter): adjust end date handling in DateTimeFilter by @Ahoo-Wang in #1002
🤖 Dependency Updates
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.10.1 by @renovate[bot] in #990
- chore(deps): update dependency versions in pnpm lockfile by @Ahoo-Wang in #994
- chore(deps): update actions/checkout action to v6 by @renovate[bot] in #993
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.10.2 by @renovate[bot] in #995
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.11.1 by @renovate[bot] in #998
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.11.2 by @renovate[bot] in #999
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.11.3 by @renovate[bot] in #1000
Other Changes
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.10.0 by @renovate[bot] in #989
- chore(deps): update pnpm to v10.27.0 by @renovate[bot] in #991
- chore(deps): update ghcr.io/ahoo-wang/wow-example-server docker tag to v6.10.3 by @renovate[bot] in #996
Full Changelog: v3.9.5...v3.9.6
v3.9.5
What's Changed
🎉 New Features
- feat(react-api): add query API hooks and utilities for React by @Ahoo-Wang in #987
createQueryApiHooks
🚀 自动类型安全查询 API Hooks 生成 - 从 API 对象自动生成完全类型化的 React 查询 hooks,具有自动查询状态管理、自动执行和高级执行控制。
createQueryApiHooks 函数自动发现 API 对象中的查询方法,并创建相应的扩展 useQuery 的 React hooks。每个生成的 hook 都提供自动查询参数管理、状态管理和对具有类型安全查询访问的自定义执行回调的支持。
主要特性:
- 自动方法发现:遍历对象属性和原型链
- 类型安全查询 Hooks:查询参数和返回类型的完整 TypeScript 推断
- 查询状态管理:内置
setQuery和getQuery进行参数管理 - 自动执行:查询参数更改时可选的自动执行
- 执行控制:
onBeforeExecute回调用于查询检查/修改和中止控制器访问 - 自定义错误类型:支持指定超出默认
FetcherError的错误类型
import { createQueryApiHooks } from '@ahoo-wang/fetcher-react';
import { api, get, post, patch, path, body, autoGeneratedError } from '@ahoo-wang/fetcher-decorator';
// 使用装饰器定义您的 API 服务
@api('/users')
class UserApi {
@get('')
getUsers(query: UserListQuery, attributes?: Record<string, any>): Promise<User[]> {
throw autoGeneratedError(query, attributes);
}
@get('/{id}')
getUser(query: { id: string }, attributes?: Record<string, any>): Promise<User> {
throw autoGeneratedError(query, attributes);
}
@post('')
createUser(query: { name: string; email: string }, attributes?: Record<string, any>): Promise<User> {
throw autoGeneratedError(query, attributes);
}
}
const apiHooks = createQueryApiHooks({ api: new UserApi() });
function UserListComponent() {
const { loading, result, error, execute, setQuery, getQuery } = apiHooks.useGetUsers({
initialQuery: { page: 1, limit: 10 },
autoExecute: true,
onBeforeExecute: (abortController, query) => {
// query 是完全类型化的 UserListQuery
console.log('正在执行查询:', query);
// 如果需要,可以就地修改查询参数
query.page = Math.max(1, query.page);
},
});
const handlePageChange = (page: number) => {
// 自动更新查询并触发执行(如果 autoExecute: true)
setQuery({ ...getQuery(), page });
};
if (loading) return <div>正在加载...</div>;
if (error) return <div>错误: {error.message}</div>;
return (
<div>
<button onClick={() => handlePageChange(2)}>转到第2页</button>
{result?.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}
function UserDetailComponent() {
const { result: user, execute } = apiHooks.useGetUser({
initialQuery: { id: '123' },
});
return (
<div>
<button onClick={execute}>加载用户</button>
{user && <div>用户: {user.name}</div>}
</div>
);
}自定义错误类型:
import { createQueryApiHooks } from '@ahoo-wang/fetcher-react';
// 定义自定义错误类型
class ApiError extends Error {
constructor(
public statusCode: number,
message: string,
) {
super(message);
}
}
// 使用自定义错误类型生成查询 hooks
@api('/data')
class DataApi {
@get('/{id}')
getData(
query: { id: string },
attributes?: Record<string, any>,
): Promise<Data> {
throw autoGeneratedError(query, attributes);
}
}
const apiHooks = createQueryApiHooks<
{
getData: (
query: { id: string },
attributes?: Record<string, any>,
) => Promise<Data>;
},
ApiError
>({
api: new DataApi(),
errorType: ApiError,
});
function MyComponent() {
const { error, execute } = apiHooks.useGetData();
// error 现在类型化为 ApiError | undefined
if (error) {
console.log('状态码:', error.statusCode); // TypeScript 知道 statusCode
}
}高级用法与手动查询管理:
import { createQueryApiHooks } from '@ahoo-wang/fetcher-react';
const apiHooks = createQueryApiHooks({ api: userApi });
function SearchComponent() {
const { loading, result, setQuery, getQuery } = apiHooks.useGetUsers({
initialQuery: { search: '', page: 1 },
autoExecute: false, // 手动执行控制
});
const handleSearch = (searchTerm: string) => {
// 更新查询而不自动执行
setQuery({ search: searchTerm, page: 1 });
};
const handleSearchSubmit = () => {
// 使用当前查询手动执行
apiHooks.useGetUsers().execute();
};
const currentQuery = getQuery(); // 访问当前查询参数
return (
<div>
<input
value={currentQuery.search}
onChange={(e) => handleSearch(e.target.value)}
placeholder="搜索用户..."
/>
<button onClick={handleSearchSubmit} disabled={loading}>
{loading ? '搜索中...' : '搜索'}
</button>
{result?.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}Full Changelog: v3.9.3...v3.9.5
v3.9.3
What's Changed
🎉 New Features
- feat(react): add createExecuteApiHooks utility for generating API method hooks by @Ahoo-Wang in #985
- feat(api): add appendAbortController option to API hooks by @Ahoo-Wang in #986
createExecuteApiHooks
🚀 自动类型安全 API Hooks 生成 - 从 API 对象自动生成完全类型化的 React hooks,具有自动方法发现、类方法支持和高级执行控制。
createExecuteApiHooks 函数自动发现 API 对象中的所有函数方法(包括类实例的原型链),并使用命名模式 use{首字母大写的方法名} 创建相应的 React hooks。每个生成的 hook 都提供完整的状态管理、错误处理,并支持具有类型安全参数访问的自定义执行回调。
主要特性:
- 自动方法发现:遍历对象属性和原型链
- 类型安全 Hook 生成:参数和返回类型的完整 TypeScript 推断
- 类方法支持:处理静态方法和具有
this绑定的类实例 - 执行控制:
onBeforeExecute回调用于参数检查/修改和中止控制器访问 - 自定义错误类型:支持指定超出默认
FetcherError的错误类型
import { createExecuteApiHooks } from '@ahoo-wang/fetcher-react';
import { api, get, post, patch, path, body, autoGeneratedError } from '@ahoo-wang/fetcher-decorator';
// 使用装饰器定义您的 API 服务
import { api, get, post, patch, path, body, autoGeneratedError } from '@ahoo-wang/fetcher-decorator';
@api('/users')
class UserApi {
@get('/{id}')
getUser(@path('id') id: string): Promise<User> {
throw autoGeneratedError(id);
}
@post('')
createUser(@body() data: { name: string; email: string }): Promise<User> {
throw autoGeneratedError(data);
}
@patch('/{id}')
updateUser(@path('id') id: string, @body() updates: Partial<User>): Promise<User> {
throw autoGeneratedError(id, updates);
}
}
const userApi = new UserApi();
// 生成类型安全的 hooks
const apiHooks = createExecuteApiHooks({ api: userApi });
function UserComponent() {
// Hooks 自动生成,具有正确的类型
const { loading: getLoading, result: user, error: getError, execute: getUser } = apiHooks.useGetUser();
const { loading: createLoading, result: createdUser, error: createError, execute: createUser } = apiHooks.useCreateUser({
onBeforeExecute: (abortController, args) => {
// args 完全类型化为 [data: { name: string; email: string }]
const [data] = args;
// 如果需要,可以就地修改参数
data.email = data.email.toLowerCase();
// 访问中止控制器以进行自定义取消
abortController.signal.addEventListener('abort', () => {
console.log('用户创建已取消');
});
},
});
const handleFetchUser = (userId: string) => {
getUser(userId); // 完全类型化 - 仅接受字符串参数
};
const handleCreateUser = (userData: { name: string; email: string }) => {
createUser(userData); // 完全类型化 - 仅接受正确的数据形状
};
return (
<div>
<button onClick={() => handleFetchUser('123')}>
获取用户
</button>
{getLoading && <div>正在加载用户...</div>}
{getError && <div>错误: {getError.message}</div>}
{user && <div>用户: {user.name}</div>}
<button onClick={() => handleCreateUser({ name: 'John', email: 'john@example.com' })}>
创建用户
</button>
{createLoading && <div>正在创建用户...</div>}
{createError && <div>错误: {createError.message}</div>}
{createdUser && <div>已创建: {createdUser.name}</div>}
</div>
);
}Full Changelog: v3.9.2...v3.9.3