zixulu 1.67.3 → 1.67.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -147,7 +147,7 @@ export async function get${type}(id: Get${type}Params) {
147
147
 
148
148
  import { Query${type}Params, query${type} } from "@/apis/query${type}"
149
149
 
150
- export function use${type}(params: Query${type}Params) {
150
+ export function useQuery${type}(params: Query${type}Params) {
151
151
  return useQuery({
152
152
  queryKey: ["query-${type2}", params],
153
153
  queryFn: () => query${type}(params),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/addApi.ts"],
4
- "sourcesContent": ["import { capitalize } from \"deepsea-tools\"\nimport { existsSync } from \"fs\"\nimport { writeFile as _writeFile, mkdir } from \"fs/promises\"\nimport { join } from \"path\"\nimport { isPathLike } from \"soda-nodejs\"\n\nexport interface AddApiParams {\n type: string\n api?: string\n hook?: string\n}\n\nasync function writeFile(...args: Parameters<typeof _writeFile>) {\n const [path] = args\n if (isPathLike(path) && existsSync(path)) {\n const { default: inquirer } = await import(\"inquirer\")\n\n interface Answer {\n override: boolean\n }\n\n const { override } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"override\",\n message: `文件 ${path} 已存在,是否覆盖?`,\n })\n\n if (!override) return\n }\n return await _writeFile(...args)\n}\n\nexport async function addApi({ type, api, hook }: AddApiParams) {\n type = capitalize(type)\n api ??= \"apis\"\n hook ??= \"hooks\"\n\n await mkdir(api, { recursive: true })\n await mkdir(hook, { recursive: true })\n\n const type2 = type.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`).replace(/^-/, \"\")\n\n const query = `import { Page } from \"deepsea-tools\"\n\nimport { request } from \"@/utils/request\"\n\nexport interface Query${type}Params {\n pageSize?: number\n pageNum?: number\n}\n\nexport interface ${type} {\n id: string\n name: string\n}\n\nexport type ${type}Id = ${type}[\"id\"]\n\nexport const ${type}Name = \"${type}\"\n\nexport async function query${type}(params: Query${type}Params) {\n const response = await request<Page<${type}>>(\"/${type2}/query\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n await writeFile(join(api, `query${type}.ts`), query)\n\n const add = `import { request } from \"@/utils/request\"\n\nimport { ${type} } from \"./query${type}\"\n\nexport interface Add${type}Params extends Pick<${type}, \"name\"> {}\n\nexport async function add${type}(params: Add${type}Params) {\n const response = await request<${type}>(\"/${type2}/add\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n await writeFile(join(api, `add${type}.ts`), add)\n\n const update = `import { request } from \"@/utils/request\"\n\nimport { ${type} } from \"./query${type}\"\n\nexport interface Update${type}Params extends Pick<${type}, \"id\" | \"name\"> {}\n\nexport async function update${type}(params: Update${type}Params) {\n const response = await request<${type}>(\"/${type2}/update\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n await writeFile(join(api, `update${type}.ts`), update)\n\n const _delete = `import { request } from \"@/utils/request\"\n\nimport { ${type}, ${type}Id } from \"./query${type}\"\n\nexport type Delete${type}Params = ${type}Id\n\nexport async function delete${type}(id: Delete${type}Params) {\n const response = await request<${type}>(\\`/${type2}/delete/\\${id}\\`, {\n method: \"DELETE\",\n })\n return response\n}\n`\n\n await writeFile(join(api, `delete${type}.ts`), _delete)\n\n const get = `import { request } from \"@/utils/request\"\n\nimport { ${type}, ${type}Id } from \"./query${type}\"\n\nexport type Get${type}Params = ${type}Id\n\nexport async function get${type}(id: Get${type}Params) {\n const response = await request<${type}>(\\`/${type2}/get/\\${id}\\`, {\n method: \"POST\",\n })\n return response\n}\n`\n\n await writeFile(join(api, `get${type}.ts`), get)\n\n const useQuery = `import { useQuery } from \"@tanstack/react-query\"\n\nimport { Query${type}Params, query${type} } from \"@/apis/query${type}\"\n\nexport function use${type}(params: Query${type}Params) {\n return useQuery({\n queryKey: [\"query-${type2}\", params],\n queryFn: () => query${type}(params),\n })\n}\n`\n\n await writeFile(join(hook, `useQuery${type}.ts`), useQuery)\n\n const useGet = `import { useQuery } from \"@tanstack/react-query\"\nimport { isNonNullable } from \"deepsea-tools\"\n\nimport { Get${type}Params, get${type} } from \"@/apis/get${type}\"\n\nexport interface Use${type}Params {\n id?: Get${type}Params | undefined\n enabled?: boolean\n}\n\nexport function use${type}(idOrParams?: Use${type}Params | Get${type}Params | undefined) {\n const { id, enabled = true } = typeof idOrParams === \"object\" ? idOrParams : { id: idOrParams, enabled: true }\n\n return useQuery({\n queryKey: [\"get-${type2}\", id],\n queryFn: () => (isNonNullable(id) ? get${type}(id) : Promise.resolve(null)),\n enabled,\n })\n}\n`\n await writeFile(join(hook, `use${type}.ts`), useGet)\n\n const useAdd = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { Add${type}Params, add${type} } from \"@/apis/add${type}\"\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\n\nexport interface UseAdd${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Add${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useAdd${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseAdd${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: add${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`新增\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`新增\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`新增\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n await writeFile(join(hook, `useAdd${type}.ts`), useAdd)\n\n const useUpdate = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\nimport { Update${type}Params, update${type} } from \"@/apis/update${type}\"\n\nexport interface UseUpdate${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Update${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useUpdate${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseUpdate${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: update${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`更新\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`更新\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`更新\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"get-${type2}\", variables.id] })\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n await writeFile(join(hook, `useUpdate${type}.ts`), useUpdate)\n\n const useDelete = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { Delete${type}Params, delete${type} } from \"@/apis/delete${type}\"\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\n\nexport interface UseDelete${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Delete${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useDelete${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseDelete${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: delete${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`删除\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`删除\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`删除\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n await writeFile(join(hook, `useDelete${type}.ts`), useDelete)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { capitalize } from \"deepsea-tools\"\r\nimport { existsSync } from \"fs\"\r\nimport { writeFile as _writeFile, mkdir } from \"fs/promises\"\r\nimport { join } from \"path\"\r\nimport { isPathLike } from \"soda-nodejs\"\r\n\r\nexport interface AddApiParams {\r\n type: string\r\n api?: string\r\n hook?: string\r\n}\r\n\r\nasync function writeFile(...args: Parameters<typeof _writeFile>) {\r\n const [path] = args\r\n if (isPathLike(path) && existsSync(path)) {\r\n const { default: inquirer } = await import(\"inquirer\")\r\n\r\n interface Answer {\r\n override: boolean\r\n }\r\n\r\n const { override } = await inquirer.prompt<Answer>({\r\n type: \"confirm\",\r\n name: \"override\",\r\n message: `文件 ${path} 已存在,是否覆盖?`,\r\n })\r\n\r\n if (!override) return\r\n }\r\n return await _writeFile(...args)\r\n}\r\n\r\nexport async function addApi({ type, api, hook }: AddApiParams) {\r\n type = capitalize(type)\r\n api ??= \"apis\"\r\n hook ??= \"hooks\"\r\n\r\n await mkdir(api, { recursive: true })\r\n await mkdir(hook, { recursive: true })\r\n\r\n const type2 = type.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`).replace(/^-/, \"\")\r\n\r\n const query = `import { Page } from \"deepsea-tools\"\r\n\r\nimport { request } from \"@/utils/request\"\r\n\r\nexport interface Query${type}Params {\r\n pageSize?: number\r\n pageNum?: number\r\n}\r\n\r\nexport interface ${type} {\r\n id: string\r\n name: string\r\n}\r\n\r\nexport type ${type}Id = ${type}[\"id\"]\r\n\r\nexport const ${type}Name = \"${type}\"\r\n\r\nexport async function query${type}(params: Query${type}Params) {\r\n const response = await request<Page<${type}>>(\"/${type2}/query\", {\r\n method: \"POST\",\r\n body: params,\r\n })\r\n return response\r\n}\r\n`\r\n\r\n await writeFile(join(api, `query${type}.ts`), query)\r\n\r\n const add = `import { request } from \"@/utils/request\"\r\n\r\nimport { ${type} } from \"./query${type}\"\r\n\r\nexport interface Add${type}Params extends Pick<${type}, \"name\"> {}\r\n\r\nexport async function add${type}(params: Add${type}Params) {\r\n const response = await request<${type}>(\"/${type2}/add\", {\r\n method: \"POST\",\r\n body: params,\r\n })\r\n return response\r\n}\r\n`\r\n\r\n await writeFile(join(api, `add${type}.ts`), add)\r\n\r\n const update = `import { request } from \"@/utils/request\"\r\n\r\nimport { ${type} } from \"./query${type}\"\r\n\r\nexport interface Update${type}Params extends Pick<${type}, \"id\" | \"name\"> {}\r\n\r\nexport async function update${type}(params: Update${type}Params) {\r\n const response = await request<${type}>(\"/${type2}/update\", {\r\n method: \"POST\",\r\n body: params,\r\n })\r\n return response\r\n}\r\n`\r\n\r\n await writeFile(join(api, `update${type}.ts`), update)\r\n\r\n const _delete = `import { request } from \"@/utils/request\"\r\n\r\nimport { ${type}, ${type}Id } from \"./query${type}\"\r\n\r\nexport type Delete${type}Params = ${type}Id\r\n\r\nexport async function delete${type}(id: Delete${type}Params) {\r\n const response = await request<${type}>(\\`/${type2}/delete/\\${id}\\`, {\r\n method: \"DELETE\",\r\n })\r\n return response\r\n}\r\n`\r\n\r\n await writeFile(join(api, `delete${type}.ts`), _delete)\r\n\r\n const get = `import { request } from \"@/utils/request\"\r\n\r\nimport { ${type}, ${type}Id } from \"./query${type}\"\r\n\r\nexport type Get${type}Params = ${type}Id\r\n\r\nexport async function get${type}(id: Get${type}Params) {\r\n const response = await request<${type}>(\\`/${type2}/get/\\${id}\\`, {\r\n method: \"POST\",\r\n })\r\n return response\r\n}\r\n`\r\n\r\n await writeFile(join(api, `get${type}.ts`), get)\r\n\r\n const useQuery = `import { useQuery } from \"@tanstack/react-query\"\r\n\r\nimport { Query${type}Params, query${type} } from \"@/apis/query${type}\"\r\n\r\nexport function useQuery${type}(params: Query${type}Params) {\r\n return useQuery({\r\n queryKey: [\"query-${type2}\", params],\r\n queryFn: () => query${type}(params),\r\n })\r\n}\r\n`\r\n\r\n await writeFile(join(hook, `useQuery${type}.ts`), useQuery)\r\n\r\n const useGet = `import { useQuery } from \"@tanstack/react-query\"\r\nimport { isNonNullable } from \"deepsea-tools\"\r\n\r\nimport { Get${type}Params, get${type} } from \"@/apis/get${type}\"\r\n\r\nexport interface Use${type}Params {\r\n id?: Get${type}Params | undefined\r\n enabled?: boolean\r\n}\r\n\r\nexport function use${type}(idOrParams?: Use${type}Params | Get${type}Params | undefined) {\r\n const { id, enabled = true } = typeof idOrParams === \"object\" ? idOrParams : { id: idOrParams, enabled: true }\r\n\r\n return useQuery({\r\n queryKey: [\"get-${type2}\", id],\r\n queryFn: () => (isNonNullable(id) ? get${type}(id) : Promise.resolve(null)),\r\n enabled,\r\n })\r\n}\r\n`\r\n await writeFile(join(hook, `use${type}.ts`), useGet)\r\n\r\n const useAdd = `import { useId } from \"react\"\r\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\r\n\r\nimport { Add${type}Params, add${type} } from \"@/apis/add${type}\"\r\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\r\n\r\nexport interface UseAdd${type}Params<TContext = never>\r\n extends Omit<UseMutationOptions<${type}, Error, Add${type}Params, TContext>, \"mutationFn\"> {}\r\n\r\nexport function useAdd${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseAdd${type}Params<TContext> = {}) {\r\n const key = useId()\r\n const queryClient = useQueryClient()\r\n\r\n return useMutation({\r\n mutationFn: add${type},\r\n onMutate(variables) {\r\n message.open({\r\n key,\r\n type: \"loading\",\r\n content: \\`新增\\${${type}Name}中...\\`,\r\n duration: 0,\r\n })\r\n return onMutate?.(variables)\r\n },\r\n onSuccess(data, variables, context) {\r\n message.open({\r\n key,\r\n type: \"success\",\r\n content: \\`新增\\${${type}Name}成功\\`,\r\n })\r\n return onSuccess?.(data, variables, context)\r\n },\r\n onError(error, variables, context) {\r\n message.open({\r\n key,\r\n type: \"error\",\r\n content: \\`新增\\${${type}Name}失败\\`,\r\n })\r\n return onError?.(error, variables, context)\r\n },\r\n onSettled(data, error, variables, context) {\r\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\r\n return onSettled?.(data, error, variables, context)\r\n },\r\n ...rest,\r\n })\r\n}\r\n`\r\n await writeFile(join(hook, `useAdd${type}.ts`), useAdd)\r\n\r\n const useUpdate = `import { useId } from \"react\"\r\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\r\n\r\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\r\nimport { Update${type}Params, update${type} } from \"@/apis/update${type}\"\r\n\r\nexport interface UseUpdate${type}Params<TContext = never>\r\n extends Omit<UseMutationOptions<${type}, Error, Update${type}Params, TContext>, \"mutationFn\"> {}\r\n\r\nexport function useUpdate${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseUpdate${type}Params<TContext> = {}) {\r\n const key = useId()\r\n const queryClient = useQueryClient()\r\n\r\n return useMutation({\r\n mutationFn: update${type},\r\n onMutate(variables) {\r\n message.open({\r\n key,\r\n type: \"loading\",\r\n content: \\`更新\\${${type}Name}中...\\`,\r\n duration: 0,\r\n })\r\n return onMutate?.(variables)\r\n },\r\n onSuccess(data, variables, context) {\r\n message.open({\r\n key,\r\n type: \"success\",\r\n content: \\`更新\\${${type}Name}成功\\`,\r\n })\r\n return onSuccess?.(data, variables, context)\r\n },\r\n onError(error, variables, context) {\r\n message.open({\r\n key,\r\n type: \"error\",\r\n content: \\`更新\\${${type}Name}失败\\`,\r\n })\r\n return onError?.(error, variables, context)\r\n },\r\n onSettled(data, error, variables, context) {\r\n queryClient.invalidateQueries({ queryKey: [\"get-${type2}\", variables.id] })\r\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\r\n return onSettled?.(data, error, variables, context)\r\n },\r\n ...rest,\r\n })\r\n}\r\n`\r\n\r\n await writeFile(join(hook, `useUpdate${type}.ts`), useUpdate)\r\n\r\n const useDelete = `import { useId } from \"react\"\r\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\r\n\r\nimport { Delete${type}Params, delete${type} } from \"@/apis/delete${type}\"\r\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\r\n\r\nexport interface UseDelete${type}Params<TContext = never>\r\n extends Omit<UseMutationOptions<${type}, Error, Delete${type}Params, TContext>, \"mutationFn\"> {}\r\n\r\nexport function useDelete${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseDelete${type}Params<TContext> = {}) {\r\n const key = useId()\r\n const queryClient = useQueryClient()\r\n\r\n return useMutation({\r\n mutationFn: delete${type},\r\n onMutate(variables) {\r\n message.open({\r\n key,\r\n type: \"loading\",\r\n content: \\`删除\\${${type}Name}中...\\`,\r\n duration: 0,\r\n })\r\n return onMutate?.(variables)\r\n },\r\n onSuccess(data, variables, context) {\r\n message.open({\r\n key,\r\n type: \"success\",\r\n content: \\`删除\\${${type}Name}成功\\`,\r\n })\r\n return onSuccess?.(data, variables, context)\r\n },\r\n onError(error, variables, context) {\r\n message.open({\r\n key,\r\n type: \"error\",\r\n content: \\`删除\\${${type}Name}失败\\`,\r\n })\r\n return onError?.(error, variables, context)\r\n },\r\n onSettled(data, error, variables, context) {\r\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\r\n return onSettled?.(data, error, variables, context)\r\n },\r\n ...rest,\r\n })\r\n}\r\n`\r\n\r\n await writeFile(join(hook, `useDelete${type}.ts`), useDelete)\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["_writeFile"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zixulu",
3
- "version": "1.67.3",
3
+ "version": "1.67.4",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "bin": "dist/index.js",
@@ -1,326 +1,326 @@
1
- import { capitalize } from "deepsea-tools"
2
- import { existsSync } from "fs"
3
- import { writeFile as _writeFile, mkdir } from "fs/promises"
4
- import { join } from "path"
5
- import { isPathLike } from "soda-nodejs"
6
-
7
- export interface AddApiParams {
8
- type: string
9
- api?: string
10
- hook?: string
11
- }
12
-
13
- async function writeFile(...args: Parameters<typeof _writeFile>) {
14
- const [path] = args
15
- if (isPathLike(path) && existsSync(path)) {
16
- const { default: inquirer } = await import("inquirer")
17
-
18
- interface Answer {
19
- override: boolean
20
- }
21
-
22
- const { override } = await inquirer.prompt<Answer>({
23
- type: "confirm",
24
- name: "override",
25
- message: `文件 ${path} 已存在,是否覆盖?`,
26
- })
27
-
28
- if (!override) return
29
- }
30
- return await _writeFile(...args)
31
- }
32
-
33
- export async function addApi({ type, api, hook }: AddApiParams) {
34
- type = capitalize(type)
35
- api ??= "apis"
36
- hook ??= "hooks"
37
-
38
- await mkdir(api, { recursive: true })
39
- await mkdir(hook, { recursive: true })
40
-
41
- const type2 = type.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`).replace(/^-/, "")
42
-
43
- const query = `import { Page } from "deepsea-tools"
44
-
45
- import { request } from "@/utils/request"
46
-
47
- export interface Query${type}Params {
48
- pageSize?: number
49
- pageNum?: number
50
- }
51
-
52
- export interface ${type} {
53
- id: string
54
- name: string
55
- }
56
-
57
- export type ${type}Id = ${type}["id"]
58
-
59
- export const ${type}Name = "${type}"
60
-
61
- export async function query${type}(params: Query${type}Params) {
62
- const response = await request<Page<${type}>>("/${type2}/query", {
63
- method: "POST",
64
- body: params,
65
- })
66
- return response
67
- }
68
- `
69
-
70
- await writeFile(join(api, `query${type}.ts`), query)
71
-
72
- const add = `import { request } from "@/utils/request"
73
-
74
- import { ${type} } from "./query${type}"
75
-
76
- export interface Add${type}Params extends Pick<${type}, "name"> {}
77
-
78
- export async function add${type}(params: Add${type}Params) {
79
- const response = await request<${type}>("/${type2}/add", {
80
- method: "POST",
81
- body: params,
82
- })
83
- return response
84
- }
85
- `
86
-
87
- await writeFile(join(api, `add${type}.ts`), add)
88
-
89
- const update = `import { request } from "@/utils/request"
90
-
91
- import { ${type} } from "./query${type}"
92
-
93
- export interface Update${type}Params extends Pick<${type}, "id" | "name"> {}
94
-
95
- export async function update${type}(params: Update${type}Params) {
96
- const response = await request<${type}>("/${type2}/update", {
97
- method: "POST",
98
- body: params,
99
- })
100
- return response
101
- }
102
- `
103
-
104
- await writeFile(join(api, `update${type}.ts`), update)
105
-
106
- const _delete = `import { request } from "@/utils/request"
107
-
108
- import { ${type}, ${type}Id } from "./query${type}"
109
-
110
- export type Delete${type}Params = ${type}Id
111
-
112
- export async function delete${type}(id: Delete${type}Params) {
113
- const response = await request<${type}>(\`/${type2}/delete/\${id}\`, {
114
- method: "DELETE",
115
- })
116
- return response
117
- }
118
- `
119
-
120
- await writeFile(join(api, `delete${type}.ts`), _delete)
121
-
122
- const get = `import { request } from "@/utils/request"
123
-
124
- import { ${type}, ${type}Id } from "./query${type}"
125
-
126
- export type Get${type}Params = ${type}Id
127
-
128
- export async function get${type}(id: Get${type}Params) {
129
- const response = await request<${type}>(\`/${type2}/get/\${id}\`, {
130
- method: "POST",
131
- })
132
- return response
133
- }
134
- `
135
-
136
- await writeFile(join(api, `get${type}.ts`), get)
137
-
138
- const useQuery = `import { useQuery } from "@tanstack/react-query"
139
-
140
- import { Query${type}Params, query${type} } from "@/apis/query${type}"
141
-
142
- export function use${type}(params: Query${type}Params) {
143
- return useQuery({
144
- queryKey: ["query-${type2}", params],
145
- queryFn: () => query${type}(params),
146
- })
147
- }
148
- `
149
-
150
- await writeFile(join(hook, `useQuery${type}.ts`), useQuery)
151
-
152
- const useGet = `import { useQuery } from "@tanstack/react-query"
153
- import { isNonNullable } from "deepsea-tools"
154
-
155
- import { Get${type}Params, get${type} } from "@/apis/get${type}"
156
-
157
- export interface Use${type}Params {
158
- id?: Get${type}Params | undefined
159
- enabled?: boolean
160
- }
161
-
162
- export function use${type}(idOrParams?: Use${type}Params | Get${type}Params | undefined) {
163
- const { id, enabled = true } = typeof idOrParams === "object" ? idOrParams : { id: idOrParams, enabled: true }
164
-
165
- return useQuery({
166
- queryKey: ["get-${type2}", id],
167
- queryFn: () => (isNonNullable(id) ? get${type}(id) : Promise.resolve(null)),
168
- enabled,
169
- })
170
- }
171
- `
172
- await writeFile(join(hook, `use${type}.ts`), useGet)
173
-
174
- const useAdd = `import { useId } from "react"
175
- import { UseMutationOptions, useMutation, useQueryClient } from "@tanstack/react-query"
176
-
177
- import { Add${type}Params, add${type} } from "@/apis/add${type}"
178
- import { ${type}, ${type}Name } from "@/apis/query${type}"
179
-
180
- export interface UseAdd${type}Params<TContext = never>
181
- extends Omit<UseMutationOptions<${type}, Error, Add${type}Params, TContext>, "mutationFn"> {}
182
-
183
- export function useAdd${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseAdd${type}Params<TContext> = {}) {
184
- const key = useId()
185
- const queryClient = useQueryClient()
186
-
187
- return useMutation({
188
- mutationFn: add${type},
189
- onMutate(variables) {
190
- message.open({
191
- key,
192
- type: "loading",
193
- content: \`新增\${${type}Name}中...\`,
194
- duration: 0,
195
- })
196
- return onMutate?.(variables)
197
- },
198
- onSuccess(data, variables, context) {
199
- message.open({
200
- key,
201
- type: "success",
202
- content: \`新增\${${type}Name}成功\`,
203
- })
204
- return onSuccess?.(data, variables, context)
205
- },
206
- onError(error, variables, context) {
207
- message.open({
208
- key,
209
- type: "error",
210
- content: \`新增\${${type}Name}失败\`,
211
- })
212
- return onError?.(error, variables, context)
213
- },
214
- onSettled(data, error, variables, context) {
215
- queryClient.invalidateQueries({ queryKey: ["query-${type2}"] })
216
- return onSettled?.(data, error, variables, context)
217
- },
218
- ...rest,
219
- })
220
- }
221
- `
222
- await writeFile(join(hook, `useAdd${type}.ts`), useAdd)
223
-
224
- const useUpdate = `import { useId } from "react"
225
- import { UseMutationOptions, useMutation, useQueryClient } from "@tanstack/react-query"
226
-
227
- import { ${type}, ${type}Name } from "@/apis/query${type}"
228
- import { Update${type}Params, update${type} } from "@/apis/update${type}"
229
-
230
- export interface UseUpdate${type}Params<TContext = never>
231
- extends Omit<UseMutationOptions<${type}, Error, Update${type}Params, TContext>, "mutationFn"> {}
232
-
233
- export function useUpdate${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseUpdate${type}Params<TContext> = {}) {
234
- const key = useId()
235
- const queryClient = useQueryClient()
236
-
237
- return useMutation({
238
- mutationFn: update${type},
239
- onMutate(variables) {
240
- message.open({
241
- key,
242
- type: "loading",
243
- content: \`更新\${${type}Name}中...\`,
244
- duration: 0,
245
- })
246
- return onMutate?.(variables)
247
- },
248
- onSuccess(data, variables, context) {
249
- message.open({
250
- key,
251
- type: "success",
252
- content: \`更新\${${type}Name}成功\`,
253
- })
254
- return onSuccess?.(data, variables, context)
255
- },
256
- onError(error, variables, context) {
257
- message.open({
258
- key,
259
- type: "error",
260
- content: \`更新\${${type}Name}失败\`,
261
- })
262
- return onError?.(error, variables, context)
263
- },
264
- onSettled(data, error, variables, context) {
265
- queryClient.invalidateQueries({ queryKey: ["get-${type2}", variables.id] })
266
- queryClient.invalidateQueries({ queryKey: ["query-${type2}"] })
267
- return onSettled?.(data, error, variables, context)
268
- },
269
- ...rest,
270
- })
271
- }
272
- `
273
-
274
- await writeFile(join(hook, `useUpdate${type}.ts`), useUpdate)
275
-
276
- const useDelete = `import { useId } from "react"
277
- import { UseMutationOptions, useMutation, useQueryClient } from "@tanstack/react-query"
278
-
279
- import { Delete${type}Params, delete${type} } from "@/apis/delete${type}"
280
- import { ${type}, ${type}Name } from "@/apis/query${type}"
281
-
282
- export interface UseDelete${type}Params<TContext = never>
283
- extends Omit<UseMutationOptions<${type}, Error, Delete${type}Params, TContext>, "mutationFn"> {}
284
-
285
- export function useDelete${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseDelete${type}Params<TContext> = {}) {
286
- const key = useId()
287
- const queryClient = useQueryClient()
288
-
289
- return useMutation({
290
- mutationFn: delete${type},
291
- onMutate(variables) {
292
- message.open({
293
- key,
294
- type: "loading",
295
- content: \`删除\${${type}Name}中...\`,
296
- duration: 0,
297
- })
298
- return onMutate?.(variables)
299
- },
300
- onSuccess(data, variables, context) {
301
- message.open({
302
- key,
303
- type: "success",
304
- content: \`删除\${${type}Name}成功\`,
305
- })
306
- return onSuccess?.(data, variables, context)
307
- },
308
- onError(error, variables, context) {
309
- message.open({
310
- key,
311
- type: "error",
312
- content: \`删除\${${type}Name}失败\`,
313
- })
314
- return onError?.(error, variables, context)
315
- },
316
- onSettled(data, error, variables, context) {
317
- queryClient.invalidateQueries({ queryKey: ["query-${type2}"] })
318
- return onSettled?.(data, error, variables, context)
319
- },
320
- ...rest,
321
- })
322
- }
323
- `
324
-
325
- await writeFile(join(hook, `useDelete${type}.ts`), useDelete)
326
- }
1
+ import { capitalize } from "deepsea-tools"
2
+ import { existsSync } from "fs"
3
+ import { writeFile as _writeFile, mkdir } from "fs/promises"
4
+ import { join } from "path"
5
+ import { isPathLike } from "soda-nodejs"
6
+
7
+ export interface AddApiParams {
8
+ type: string
9
+ api?: string
10
+ hook?: string
11
+ }
12
+
13
+ async function writeFile(...args: Parameters<typeof _writeFile>) {
14
+ const [path] = args
15
+ if (isPathLike(path) && existsSync(path)) {
16
+ const { default: inquirer } = await import("inquirer")
17
+
18
+ interface Answer {
19
+ override: boolean
20
+ }
21
+
22
+ const { override } = await inquirer.prompt<Answer>({
23
+ type: "confirm",
24
+ name: "override",
25
+ message: `文件 ${path} 已存在,是否覆盖?`,
26
+ })
27
+
28
+ if (!override) return
29
+ }
30
+ return await _writeFile(...args)
31
+ }
32
+
33
+ export async function addApi({ type, api, hook }: AddApiParams) {
34
+ type = capitalize(type)
35
+ api ??= "apis"
36
+ hook ??= "hooks"
37
+
38
+ await mkdir(api, { recursive: true })
39
+ await mkdir(hook, { recursive: true })
40
+
41
+ const type2 = type.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`).replace(/^-/, "")
42
+
43
+ const query = `import { Page } from "deepsea-tools"
44
+
45
+ import { request } from "@/utils/request"
46
+
47
+ export interface Query${type}Params {
48
+ pageSize?: number
49
+ pageNum?: number
50
+ }
51
+
52
+ export interface ${type} {
53
+ id: string
54
+ name: string
55
+ }
56
+
57
+ export type ${type}Id = ${type}["id"]
58
+
59
+ export const ${type}Name = "${type}"
60
+
61
+ export async function query${type}(params: Query${type}Params) {
62
+ const response = await request<Page<${type}>>("/${type2}/query", {
63
+ method: "POST",
64
+ body: params,
65
+ })
66
+ return response
67
+ }
68
+ `
69
+
70
+ await writeFile(join(api, `query${type}.ts`), query)
71
+
72
+ const add = `import { request } from "@/utils/request"
73
+
74
+ import { ${type} } from "./query${type}"
75
+
76
+ export interface Add${type}Params extends Pick<${type}, "name"> {}
77
+
78
+ export async function add${type}(params: Add${type}Params) {
79
+ const response = await request<${type}>("/${type2}/add", {
80
+ method: "POST",
81
+ body: params,
82
+ })
83
+ return response
84
+ }
85
+ `
86
+
87
+ await writeFile(join(api, `add${type}.ts`), add)
88
+
89
+ const update = `import { request } from "@/utils/request"
90
+
91
+ import { ${type} } from "./query${type}"
92
+
93
+ export interface Update${type}Params extends Pick<${type}, "id" | "name"> {}
94
+
95
+ export async function update${type}(params: Update${type}Params) {
96
+ const response = await request<${type}>("/${type2}/update", {
97
+ method: "POST",
98
+ body: params,
99
+ })
100
+ return response
101
+ }
102
+ `
103
+
104
+ await writeFile(join(api, `update${type}.ts`), update)
105
+
106
+ const _delete = `import { request } from "@/utils/request"
107
+
108
+ import { ${type}, ${type}Id } from "./query${type}"
109
+
110
+ export type Delete${type}Params = ${type}Id
111
+
112
+ export async function delete${type}(id: Delete${type}Params) {
113
+ const response = await request<${type}>(\`/${type2}/delete/\${id}\`, {
114
+ method: "DELETE",
115
+ })
116
+ return response
117
+ }
118
+ `
119
+
120
+ await writeFile(join(api, `delete${type}.ts`), _delete)
121
+
122
+ const get = `import { request } from "@/utils/request"
123
+
124
+ import { ${type}, ${type}Id } from "./query${type}"
125
+
126
+ export type Get${type}Params = ${type}Id
127
+
128
+ export async function get${type}(id: Get${type}Params) {
129
+ const response = await request<${type}>(\`/${type2}/get/\${id}\`, {
130
+ method: "POST",
131
+ })
132
+ return response
133
+ }
134
+ `
135
+
136
+ await writeFile(join(api, `get${type}.ts`), get)
137
+
138
+ const useQuery = `import { useQuery } from "@tanstack/react-query"
139
+
140
+ import { Query${type}Params, query${type} } from "@/apis/query${type}"
141
+
142
+ export function useQuery${type}(params: Query${type}Params) {
143
+ return useQuery({
144
+ queryKey: ["query-${type2}", params],
145
+ queryFn: () => query${type}(params),
146
+ })
147
+ }
148
+ `
149
+
150
+ await writeFile(join(hook, `useQuery${type}.ts`), useQuery)
151
+
152
+ const useGet = `import { useQuery } from "@tanstack/react-query"
153
+ import { isNonNullable } from "deepsea-tools"
154
+
155
+ import { Get${type}Params, get${type} } from "@/apis/get${type}"
156
+
157
+ export interface Use${type}Params {
158
+ id?: Get${type}Params | undefined
159
+ enabled?: boolean
160
+ }
161
+
162
+ export function use${type}(idOrParams?: Use${type}Params | Get${type}Params | undefined) {
163
+ const { id, enabled = true } = typeof idOrParams === "object" ? idOrParams : { id: idOrParams, enabled: true }
164
+
165
+ return useQuery({
166
+ queryKey: ["get-${type2}", id],
167
+ queryFn: () => (isNonNullable(id) ? get${type}(id) : Promise.resolve(null)),
168
+ enabled,
169
+ })
170
+ }
171
+ `
172
+ await writeFile(join(hook, `use${type}.ts`), useGet)
173
+
174
+ const useAdd = `import { useId } from "react"
175
+ import { UseMutationOptions, useMutation, useQueryClient } from "@tanstack/react-query"
176
+
177
+ import { Add${type}Params, add${type} } from "@/apis/add${type}"
178
+ import { ${type}, ${type}Name } from "@/apis/query${type}"
179
+
180
+ export interface UseAdd${type}Params<TContext = never>
181
+ extends Omit<UseMutationOptions<${type}, Error, Add${type}Params, TContext>, "mutationFn"> {}
182
+
183
+ export function useAdd${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseAdd${type}Params<TContext> = {}) {
184
+ const key = useId()
185
+ const queryClient = useQueryClient()
186
+
187
+ return useMutation({
188
+ mutationFn: add${type},
189
+ onMutate(variables) {
190
+ message.open({
191
+ key,
192
+ type: "loading",
193
+ content: \`新增\${${type}Name}中...\`,
194
+ duration: 0,
195
+ })
196
+ return onMutate?.(variables)
197
+ },
198
+ onSuccess(data, variables, context) {
199
+ message.open({
200
+ key,
201
+ type: "success",
202
+ content: \`新增\${${type}Name}成功\`,
203
+ })
204
+ return onSuccess?.(data, variables, context)
205
+ },
206
+ onError(error, variables, context) {
207
+ message.open({
208
+ key,
209
+ type: "error",
210
+ content: \`新增\${${type}Name}失败\`,
211
+ })
212
+ return onError?.(error, variables, context)
213
+ },
214
+ onSettled(data, error, variables, context) {
215
+ queryClient.invalidateQueries({ queryKey: ["query-${type2}"] })
216
+ return onSettled?.(data, error, variables, context)
217
+ },
218
+ ...rest,
219
+ })
220
+ }
221
+ `
222
+ await writeFile(join(hook, `useAdd${type}.ts`), useAdd)
223
+
224
+ const useUpdate = `import { useId } from "react"
225
+ import { UseMutationOptions, useMutation, useQueryClient } from "@tanstack/react-query"
226
+
227
+ import { ${type}, ${type}Name } from "@/apis/query${type}"
228
+ import { Update${type}Params, update${type} } from "@/apis/update${type}"
229
+
230
+ export interface UseUpdate${type}Params<TContext = never>
231
+ extends Omit<UseMutationOptions<${type}, Error, Update${type}Params, TContext>, "mutationFn"> {}
232
+
233
+ export function useUpdate${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseUpdate${type}Params<TContext> = {}) {
234
+ const key = useId()
235
+ const queryClient = useQueryClient()
236
+
237
+ return useMutation({
238
+ mutationFn: update${type},
239
+ onMutate(variables) {
240
+ message.open({
241
+ key,
242
+ type: "loading",
243
+ content: \`更新\${${type}Name}中...\`,
244
+ duration: 0,
245
+ })
246
+ return onMutate?.(variables)
247
+ },
248
+ onSuccess(data, variables, context) {
249
+ message.open({
250
+ key,
251
+ type: "success",
252
+ content: \`更新\${${type}Name}成功\`,
253
+ })
254
+ return onSuccess?.(data, variables, context)
255
+ },
256
+ onError(error, variables, context) {
257
+ message.open({
258
+ key,
259
+ type: "error",
260
+ content: \`更新\${${type}Name}失败\`,
261
+ })
262
+ return onError?.(error, variables, context)
263
+ },
264
+ onSettled(data, error, variables, context) {
265
+ queryClient.invalidateQueries({ queryKey: ["get-${type2}", variables.id] })
266
+ queryClient.invalidateQueries({ queryKey: ["query-${type2}"] })
267
+ return onSettled?.(data, error, variables, context)
268
+ },
269
+ ...rest,
270
+ })
271
+ }
272
+ `
273
+
274
+ await writeFile(join(hook, `useUpdate${type}.ts`), useUpdate)
275
+
276
+ const useDelete = `import { useId } from "react"
277
+ import { UseMutationOptions, useMutation, useQueryClient } from "@tanstack/react-query"
278
+
279
+ import { Delete${type}Params, delete${type} } from "@/apis/delete${type}"
280
+ import { ${type}, ${type}Name } from "@/apis/query${type}"
281
+
282
+ export interface UseDelete${type}Params<TContext = never>
283
+ extends Omit<UseMutationOptions<${type}, Error, Delete${type}Params, TContext>, "mutationFn"> {}
284
+
285
+ export function useDelete${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseDelete${type}Params<TContext> = {}) {
286
+ const key = useId()
287
+ const queryClient = useQueryClient()
288
+
289
+ return useMutation({
290
+ mutationFn: delete${type},
291
+ onMutate(variables) {
292
+ message.open({
293
+ key,
294
+ type: "loading",
295
+ content: \`删除\${${type}Name}中...\`,
296
+ duration: 0,
297
+ })
298
+ return onMutate?.(variables)
299
+ },
300
+ onSuccess(data, variables, context) {
301
+ message.open({
302
+ key,
303
+ type: "success",
304
+ content: \`删除\${${type}Name}成功\`,
305
+ })
306
+ return onSuccess?.(data, variables, context)
307
+ },
308
+ onError(error, variables, context) {
309
+ message.open({
310
+ key,
311
+ type: "error",
312
+ content: \`删除\${${type}Name}失败\`,
313
+ })
314
+ return onError?.(error, variables, context)
315
+ },
316
+ onSettled(data, error, variables, context) {
317
+ queryClient.invalidateQueries({ queryKey: ["query-${type2}"] })
318
+ return onSettled?.(data, error, variables, context)
319
+ },
320
+ ...rest,
321
+ })
322
+ }
323
+ `
324
+
325
+ await writeFile(join(hook, `useDelete${type}.ts`), useDelete)
326
+ }