Skip to content

Releases: Ahoo-Wang/fetcher

v3.10.5

07 Feb 11:15
e802980

Choose a tag to compare

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

05 Feb 07:16
7571793

Choose a tag to compare

What's Changed

🎉 New Features

  • feat(viewer): 更新远程选择组件和查看器故事书 by @poplike in #1038

🤖 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

04 Feb 13:21

Choose a tag to compare

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

27 Jan 01:50
590768f

Choose a tag to compare

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

09 Jan 03:51
0a38bda

Choose a tag to compare

What's Changed

Other Changes

Full Changelog: v3.9.8...v3.9.9

v3.9.8

09 Jan 02:31
5d27e87

Choose a tag to compare

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

07 Jan 09:04

Choose a tag to compare

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

27 Dec 05:39

Choose a tag to compare

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 推断
  • 查询状态管理:内置 setQuerygetQuery 进行参数管理
  • 自动执行:查询参数更改时可选的自动执行
  • 执行控制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

27 Dec 03:38

Choose a tag to compare

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

v3.9.2

26 Dec 06:07
5200848

Choose a tag to compare

What's Changed

Other Changes

Full Changelog: v3.9.1...v3.9.2