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.
- package/dist/utils/addApi.js +1 -1
- package/dist/utils/addApi.js.map +2 -2
- package/package.json +1 -1
- package/src/utils/addApi.ts +326 -326
package/dist/utils/addApi.js
CHANGED
|
@@ -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
|
|
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),
|
package/dist/utils/addApi.js.map
CHANGED
|
@@ -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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA2B;AAC3B,gBAA2B;AAC3B,sBAA+C;AAC/C,kBAAqB;AACrB,yBAA2B;AAQ3B,eAAe,aAAa,MAAqC;AAC7D,QAAM,CAAC,IAAI,IAAI;AACf,UAAI,+BAAW,IAAI,SAAK,sBAAW,IAAI,GAAG;AACtC,UAAM,EAAE,SAAS,SAAS,IAAI,MAAM,OAAO,UAAU;AAMrD,UAAM,EAAE,SAAS,IAAI,MAAM,SAAS,OAAe;AAAA,MAC/C,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,IACnB,CAAC;AAED,QAAI,CAAC;AAAU;AAAA,EACnB;AACA,SAAO,UAAM,gBAAAA,WAAW,GAAG,IAAI;AACnC;AAEA,eAAsB,OAAO,EAAE,MAAM,KAAK,KAAK,GAAiB;AAC5D,aAAO,iCAAW,IAAI;AACtB,UAAQ;AACR,WAAS;AAET,YAAM,uBAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,YAAM,uBAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAErC,QAAM,QAAQ,KAAK,QAAQ,YAAY,CAAC,GAAG,MAAM,IAAI,EAAE,YAAY,GAAG,EAAE,QAAQ,MAAM,EAAE;AAExF,QAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,wBAIM;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKL;AAAA;AAAA;AAAA;AAAA;AAAA,cAKL,YAAY;AAAA;AAAA,eAEX,eAAe;AAAA;AAAA,6BAED,qBAAqB;AAAA,0CACR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlD,QAAM,cAAU,kBAAK,KAAK,QAAQ,SAAS,GAAG,KAAK;AAEnD,QAAM,MAAM;AAAA;AAAA,WAEL,uBAAuB;AAAA;AAAA,sBAEZ,2BAA2B;AAAA;AAAA,2BAEtB,mBAAmB;AAAA,qCACT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5C,QAAM,cAAU,kBAAK,KAAK,MAAM,SAAS,GAAG,GAAG;AAE/C,QAAM,SAAS;AAAA;AAAA,WAER,uBAAuB;AAAA;AAAA,yBAET,2BAA2B;AAAA;AAAA,8BAEtB,sBAAsB;AAAA,qCACf,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5C,QAAM,cAAU,kBAAK,KAAK,SAAS,SAAS,GAAG,MAAM;AAErD,QAAM,UAAU;AAAA;AAAA,WAET,SAAS,yBAAyB;AAAA;AAAA,oBAEzB,gBAAgB;AAAA;AAAA,8BAEN,kBAAkB;AAAA,qCACX,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7C,QAAM,cAAU,kBAAK,KAAK,SAAS,SAAS,GAAG,OAAO;AAEtD,QAAM,MAAM;AAAA;AAAA,WAEL,SAAS,yBAAyB;AAAA;AAAA,iBAE5B,gBAAgB;AAAA;AAAA,2BAEN,eAAe;AAAA,qCACL,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7C,QAAM,cAAU,kBAAK,KAAK,MAAM,SAAS,GAAG,GAAG;AAE/C,QAAM,WAAW;AAAA;AAAA,gBAEL,oBAAoB,4BAA4B;AAAA;AAAA,
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA2B;AAC3B,gBAA2B;AAC3B,sBAA+C;AAC/C,kBAAqB;AACrB,yBAA2B;AAQ3B,eAAe,aAAa,MAAqC;AAC7D,QAAM,CAAC,IAAI,IAAI;AACf,UAAI,+BAAW,IAAI,SAAK,sBAAW,IAAI,GAAG;AACtC,UAAM,EAAE,SAAS,SAAS,IAAI,MAAM,OAAO,UAAU;AAMrD,UAAM,EAAE,SAAS,IAAI,MAAM,SAAS,OAAe;AAAA,MAC/C,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,IACnB,CAAC;AAED,QAAI,CAAC;AAAU;AAAA,EACnB;AACA,SAAO,UAAM,gBAAAA,WAAW,GAAG,IAAI;AACnC;AAEA,eAAsB,OAAO,EAAE,MAAM,KAAK,KAAK,GAAiB;AAC5D,aAAO,iCAAW,IAAI;AACtB,UAAQ;AACR,WAAS;AAET,YAAM,uBAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,YAAM,uBAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAErC,QAAM,QAAQ,KAAK,QAAQ,YAAY,CAAC,GAAG,MAAM,IAAI,EAAE,YAAY,GAAG,EAAE,QAAQ,MAAM,EAAE;AAExF,QAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,wBAIM;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKL;AAAA;AAAA;AAAA;AAAA;AAAA,cAKL,YAAY;AAAA;AAAA,eAEX,eAAe;AAAA;AAAA,6BAED,qBAAqB;AAAA,0CACR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlD,QAAM,cAAU,kBAAK,KAAK,QAAQ,SAAS,GAAG,KAAK;AAEnD,QAAM,MAAM;AAAA;AAAA,WAEL,uBAAuB;AAAA;AAAA,sBAEZ,2BAA2B;AAAA;AAAA,2BAEtB,mBAAmB;AAAA,qCACT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5C,QAAM,cAAU,kBAAK,KAAK,MAAM,SAAS,GAAG,GAAG;AAE/C,QAAM,SAAS;AAAA;AAAA,WAER,uBAAuB;AAAA;AAAA,yBAET,2BAA2B;AAAA;AAAA,8BAEtB,sBAAsB;AAAA,qCACf,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5C,QAAM,cAAU,kBAAK,KAAK,SAAS,SAAS,GAAG,MAAM;AAErD,QAAM,UAAU;AAAA;AAAA,WAET,SAAS,yBAAyB;AAAA;AAAA,oBAEzB,gBAAgB;AAAA;AAAA,8BAEN,kBAAkB;AAAA,qCACX,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7C,QAAM,cAAU,kBAAK,KAAK,SAAS,SAAS,GAAG,OAAO;AAEtD,QAAM,MAAM;AAAA;AAAA,WAEL,SAAS,yBAAyB;AAAA;AAAA,iBAE5B,gBAAgB;AAAA;AAAA,2BAEN,eAAe;AAAA,qCACL,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7C,QAAM,cAAU,kBAAK,KAAK,MAAM,SAAS,GAAG,GAAG;AAE/C,QAAM,WAAW;AAAA;AAAA,gBAEL,oBAAoB,4BAA4B;AAAA;AAAA,0BAEtC,qBAAqB;AAAA;AAAA,4BAEnB;AAAA,8BACE;AAAA;AAAA;AAAA;AAK1B,QAAM,cAAU,kBAAK,MAAM,WAAW,SAAS,GAAG,QAAQ;AAE1D,QAAM,SAAS;AAAA;AAAA;AAAA,cAGL,kBAAkB,0BAA0B;AAAA;AAAA,sBAEpC;AAAA,cACR;AAAA;AAAA;AAAA;AAAA,qBAIO,wBAAwB,mBAAmB;AAAA;AAAA;AAAA;AAAA,0BAItC;AAAA,iDACuB;AAAA;AAAA;AAAA;AAAA;AAK7C,QAAM,cAAU,kBAAK,MAAM,MAAM,SAAS,GAAG,MAAM;AAEnD,QAAM,SAAS;AAAA;AAAA;AAAA,cAGL,kBAAkB,0BAA0B;AAAA,WAC/C,SAAS,gCAAgC;AAAA;AAAA,yBAE3B;AAAA,sCACa,mBAAmB;AAAA;AAAA,wBAEjC,sFAAsF;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKrF;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAQA;AAAA;AAAA;AAAA;AAAA;AAAA,gEAK8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5D,QAAM,cAAU,kBAAK,MAAM,SAAS,SAAS,GAAG,MAAM;AAEtD,QAAM,YAAY;AAAA;AAAA;AAAA,WAGX,SAAS,gCAAgC;AAAA,iBACnC,qBAAqB,6BAA6B;AAAA;AAAA,4BAEvC;AAAA,sCACU,sBAAsB;AAAA;AAAA,2BAEjC,yFAAyF;AAAA;AAAA;AAAA;AAAA;AAAA,4BAKxF;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAQA;AAAA;AAAA;AAAA;AAAA;AAAA,8DAK4B;AAAA,gEACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5D,QAAM,cAAU,kBAAK,MAAM,YAAY,SAAS,GAAG,SAAS;AAE5D,QAAM,YAAY;AAAA;AAAA;AAAA,iBAGL,qBAAqB,6BAA6B;AAAA,WACxD,SAAS,gCAAgC;AAAA;AAAA,4BAExB;AAAA,sCACU,sBAAsB;AAAA;AAAA,2BAEjC,yFAAyF;AAAA;AAAA;AAAA;AAAA;AAAA,4BAKxF;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAQA;AAAA;AAAA;AAAA;AAAA;AAAA,gEAK8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5D,QAAM,cAAU,kBAAK,MAAM,YAAY,SAAS,GAAG,SAAS;AAChE;",
|
|
6
6
|
"names": ["_writeFile"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/src/utils/addApi.ts
CHANGED
|
@@ -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
|
|
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
|
+
}
|