@zinm/task-service 1.0.0

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.
@@ -0,0 +1,31 @@
1
+ import * as _tanstack_react_query from '@tanstack/react-query';
2
+ import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
3
+ import * as msw from 'msw';
4
+
5
+ type TaskStatus = 'todo' | 'in-progress' | 'done';
6
+ type TaskPriority = 'low' | 'medium' | 'high';
7
+ interface Task {
8
+ id: string;
9
+ title: string;
10
+ description: string;
11
+ status: TaskStatus;
12
+ priority: TaskPriority;
13
+ createdAt: string;
14
+ }
15
+ interface CreateTaskInput {
16
+ title: string;
17
+ description: string;
18
+ priority: TaskPriority;
19
+ }
20
+
21
+ declare function useTasks(queryOptions?: Omit<UseQueryOptions<Task[]>, 'queryKey' | 'queryFn'>): _tanstack_react_query.UseQueryResult<Task[], Error>;
22
+
23
+ declare function useTask(id: string, queryOptions?: Omit<UseQueryOptions<Task>, 'queryKey' | 'queryFn'>): _tanstack_react_query.UseQueryResult<Task, Error>;
24
+
25
+ declare function useCreateTask(mutationOptions?: Omit<UseMutationOptions<Task, Error, CreateTaskInput>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<Task, Error, CreateTaskInput, unknown>;
26
+
27
+ declare function useFilteredTasks(status: TaskStatus): _tanstack_react_query.UseQueryResult<Task[], Error>;
28
+
29
+ declare const taskHandlers: msw.HttpHandler[];
30
+
31
+ export { type CreateTaskInput, type Task, type TaskPriority, type TaskStatus, taskHandlers, useCreateTask, useFilteredTasks, useTask, useTasks };
@@ -0,0 +1,31 @@
1
+ import * as _tanstack_react_query from '@tanstack/react-query';
2
+ import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
3
+ import * as msw from 'msw';
4
+
5
+ type TaskStatus = 'todo' | 'in-progress' | 'done';
6
+ type TaskPriority = 'low' | 'medium' | 'high';
7
+ interface Task {
8
+ id: string;
9
+ title: string;
10
+ description: string;
11
+ status: TaskStatus;
12
+ priority: TaskPriority;
13
+ createdAt: string;
14
+ }
15
+ interface CreateTaskInput {
16
+ title: string;
17
+ description: string;
18
+ priority: TaskPriority;
19
+ }
20
+
21
+ declare function useTasks(queryOptions?: Omit<UseQueryOptions<Task[]>, 'queryKey' | 'queryFn'>): _tanstack_react_query.UseQueryResult<Task[], Error>;
22
+
23
+ declare function useTask(id: string, queryOptions?: Omit<UseQueryOptions<Task>, 'queryKey' | 'queryFn'>): _tanstack_react_query.UseQueryResult<Task, Error>;
24
+
25
+ declare function useCreateTask(mutationOptions?: Omit<UseMutationOptions<Task, Error, CreateTaskInput>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<Task, Error, CreateTaskInput, unknown>;
26
+
27
+ declare function useFilteredTasks(status: TaskStatus): _tanstack_react_query.UseQueryResult<Task[], Error>;
28
+
29
+ declare const taskHandlers: msw.HttpHandler[];
30
+
31
+ export { type CreateTaskInput, type Task, type TaskPriority, type TaskStatus, taskHandlers, useCreateTask, useFilteredTasks, useTask, useTasks };
package/dist/index.js ADDED
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ taskHandlers: () => taskHandlers,
24
+ useCreateTask: () => useCreateTask,
25
+ useFilteredTasks: () => useFilteredTasks,
26
+ useTask: () => useTask,
27
+ useTasks: () => useTasks
28
+ });
29
+ module.exports = __toCommonJS(index_exports);
30
+
31
+ // src/hooks/useTasks.ts
32
+ var import_react_query = require("@tanstack/react-query");
33
+
34
+ // src/api/tasks.ts
35
+ var _a;
36
+ var BASE_URL = (_a = process.env.REACT_APP_API_URL) != null ? _a : "http://localhost:3001";
37
+ async function getTasks() {
38
+ const res = await fetch(`${BASE_URL}/tasks`);
39
+ if (!res.ok) throw new Error("Failed to fetch tasks");
40
+ return res.json();
41
+ }
42
+ async function getTaskById(id) {
43
+ const res = await fetch(`${BASE_URL}/tasks/${id}`);
44
+ if (!res.ok) throw new Error(`Failed to fetch task ${id}`);
45
+ return res.json();
46
+ }
47
+ async function createTask(input) {
48
+ const res = await fetch(`${BASE_URL}/tasks`, {
49
+ method: "POST",
50
+ headers: { "Content-Type": "application/json" },
51
+ body: JSON.stringify(input)
52
+ });
53
+ if (!res.ok) throw new Error("Failed to create task");
54
+ return res.json();
55
+ }
56
+
57
+ // src/hooks/useTasks.ts
58
+ function useTasks(queryOptions) {
59
+ return (0, import_react_query.useQuery)({
60
+ queryKey: ["tasks"],
61
+ queryFn: getTasks,
62
+ ...queryOptions
63
+ });
64
+ }
65
+
66
+ // src/hooks/useTask.ts
67
+ var import_react_query2 = require("@tanstack/react-query");
68
+ function useTask(id, queryOptions) {
69
+ return (0, import_react_query2.useQuery)({
70
+ queryKey: ["tasks", id],
71
+ queryFn: () => getTaskById(id),
72
+ ...queryOptions
73
+ });
74
+ }
75
+
76
+ // src/hooks/useCreateTask.ts
77
+ var import_react_query3 = require("@tanstack/react-query");
78
+ function useCreateTask(mutationOptions) {
79
+ return (0, import_react_query3.useMutation)({
80
+ mutationFn: createTask,
81
+ ...mutationOptions
82
+ });
83
+ }
84
+
85
+ // src/hooks/useFilteredTasks.ts
86
+ var import_react_query4 = require("@tanstack/react-query");
87
+ function useFilteredTasks(status) {
88
+ return (0, import_react_query4.useQuery)({
89
+ queryKey: ["tasks", "filtered", status],
90
+ queryFn: async () => {
91
+ const tasks2 = await getTasks();
92
+ return tasks2.filter((task) => task.status = status);
93
+ }
94
+ });
95
+ }
96
+
97
+ // src/handlers.ts
98
+ var import_msw = require("msw");
99
+ var _a2;
100
+ var BASE_URL2 = (_a2 = process.env.REACT_APP_API_URL) != null ? _a2 : "http://localhost:3001";
101
+ var seedTasks = [
102
+ {
103
+ id: "1",
104
+ title: "Set up project repository",
105
+ description: "Initialize the monorepo and configure workspaces.",
106
+ status: "done",
107
+ priority: "high",
108
+ createdAt: "2024-01-10T09:00:00.000Z"
109
+ },
110
+ {
111
+ id: "2",
112
+ title: "Design task data model",
113
+ description: "Define the Task type and related interfaces.",
114
+ status: "done",
115
+ priority: "high",
116
+ createdAt: "2024-01-11T10:00:00.000Z"
117
+ },
118
+ {
119
+ id: "3",
120
+ title: "Implement API hooks",
121
+ description: "Build useTasks, useTask, and useCreateTask with TanStack Query.",
122
+ status: "in-progress",
123
+ priority: "high",
124
+ createdAt: "2024-01-12T11:00:00.000Z"
125
+ },
126
+ {
127
+ id: "4",
128
+ title: "Write unit tests",
129
+ description: "Add vitest tests for all hooks and handlers.",
130
+ status: "todo",
131
+ priority: "medium",
132
+ createdAt: "2024-01-13T12:00:00.000Z"
133
+ },
134
+ {
135
+ id: "5",
136
+ title: "Publish to npm",
137
+ description: "Bump version, build, and publish @zinm/task-service.",
138
+ status: "todo",
139
+ priority: "low",
140
+ createdAt: "2024-01-14T13:00:00.000Z"
141
+ }
142
+ ];
143
+ var tasks = [...seedTasks];
144
+ var taskHandlers = [
145
+ import_msw.http.get(`${BASE_URL2}/tasks`, () => {
146
+ return import_msw.HttpResponse.json(tasks);
147
+ }),
148
+ import_msw.http.get(`${BASE_URL2}/tasks/:id`, ({ params }) => {
149
+ const task = tasks.find((t) => t.id === params.id);
150
+ if (!task) {
151
+ return import_msw.HttpResponse.json({ error: "Task not found" }, { status: 404 });
152
+ }
153
+ return import_msw.HttpResponse.json(task);
154
+ }),
155
+ import_msw.http.post(`${BASE_URL2}/tasks`, async ({ request }) => {
156
+ const input = await request.json();
157
+ const newTask = {
158
+ id: String(Date.now()),
159
+ title: input.title,
160
+ description: input.description,
161
+ priority: input.priority,
162
+ status: "todo",
163
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
164
+ };
165
+ tasks = [...tasks, newTask];
166
+ return import_msw.HttpResponse.json(newTask, { status: 201 });
167
+ })
168
+ ];
169
+ // Annotate the CommonJS export names for ESM import in node:
170
+ 0 && (module.exports = {
171
+ taskHandlers,
172
+ useCreateTask,
173
+ useFilteredTasks,
174
+ useTask,
175
+ useTasks
176
+ });
177
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/useTasks.ts","../src/api/tasks.ts","../src/hooks/useTask.ts","../src/hooks/useCreateTask.ts","../src/hooks/useFilteredTasks.ts","../src/handlers.ts"],"sourcesContent":["export type { Task, TaskStatus, TaskPriority, CreateTaskInput } from './types'\nexport { useTasks } from './hooks/useTasks'\nexport { useTask } from './hooks/useTask'\nexport { useCreateTask } from './hooks/useCreateTask'\nexport { useFilteredTasks } from './hooks/useFilteredTasks'\nexport { taskHandlers } from './handlers'\n","import { useQuery, type UseQueryOptions } from '@tanstack/react-query'\nimport { getTasks } from '../api/tasks'\nimport type { Task } from '../types'\n\nexport function useTasks(\n queryOptions?: Omit<UseQueryOptions<Task[]>, 'queryKey' | 'queryFn'>\n) {\n return useQuery<Task[]>({\n queryKey: ['tasks'],\n queryFn: getTasks,\n ...queryOptions,\n })\n}\n","import type { Task, CreateTaskInput } from '../types'\n\nconst BASE_URL =\n process.env.REACT_APP_API_URL ?? 'http://localhost:3001'\n\nexport async function getTasks(): Promise<Task[]> {\n const res = await fetch(`${BASE_URL}/tasks`)\n if (!res.ok) throw new Error('Failed to fetch tasks')\n return res.json()\n}\n\nexport async function getTaskById(id: string): Promise<Task> {\n const res = await fetch(`${BASE_URL}/tasks/${id}`)\n if (!res.ok) throw new Error(`Failed to fetch task ${id}`)\n return res.json()\n}\n\nexport async function createTask(input: CreateTaskInput): Promise<Task> {\n const res = await fetch(`${BASE_URL}/tasks`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n })\n if (!res.ok) throw new Error('Failed to create task')\n return res.json()\n}\n","import { useQuery, type UseQueryOptions } from '@tanstack/react-query'\nimport { getTaskById } from '../api/tasks'\nimport type { Task } from '../types'\n\nexport function useTask(\n id: string,\n queryOptions?: Omit<UseQueryOptions<Task>, 'queryKey' | 'queryFn'>\n) {\n return useQuery<Task>({\n queryKey: ['tasks', id],\n queryFn: () => getTaskById(id),\n ...queryOptions,\n })\n}\n","import { useMutation, type UseMutationOptions } from '@tanstack/react-query'\nimport { createTask } from '../api/tasks'\nimport type { Task, CreateTaskInput } from '../types'\n\nexport function useCreateTask(\n mutationOptions?: Omit<\n UseMutationOptions<Task, Error, CreateTaskInput>,\n 'mutationFn'\n >\n) {\n return useMutation<Task, Error, CreateTaskInput>({\n mutationFn: createTask,\n ...mutationOptions,\n })\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { getTasks } from '../api/tasks'\nimport type { Task, TaskStatus } from '../types'\n\nexport function useFilteredTasks(status: TaskStatus) {\n return useQuery<Task[]>({\n queryKey: ['tasks', 'filtered', status],\n queryFn: async () => {\n const tasks = await getTasks()\n // TODO: something seems off here...\n return tasks.filter((task) => (task.status = status))\n },\n })\n}\n","import { http, HttpResponse } from 'msw'\nimport type { Task, CreateTaskInput } from './types'\n\nconst BASE_URL =\n process.env.REACT_APP_API_URL ?? 'http://localhost:3001'\n\nconst seedTasks: Task[] = [\n {\n id: '1',\n title: 'Set up project repository',\n description: 'Initialize the monorepo and configure workspaces.',\n status: 'done',\n priority: 'high',\n createdAt: '2024-01-10T09:00:00.000Z',\n },\n {\n id: '2',\n title: 'Design task data model',\n description: 'Define the Task type and related interfaces.',\n status: 'done',\n priority: 'high',\n createdAt: '2024-01-11T10:00:00.000Z',\n },\n {\n id: '3',\n title: 'Implement API hooks',\n description: 'Build useTasks, useTask, and useCreateTask with TanStack Query.',\n status: 'in-progress',\n priority: 'high',\n createdAt: '2024-01-12T11:00:00.000Z',\n },\n {\n id: '4',\n title: 'Write unit tests',\n description: 'Add vitest tests for all hooks and handlers.',\n status: 'todo',\n priority: 'medium',\n createdAt: '2024-01-13T12:00:00.000Z',\n },\n {\n id: '5',\n title: 'Publish to npm',\n description: 'Bump version, build, and publish @zinm/task-service.',\n status: 'todo',\n priority: 'low',\n createdAt: '2024-01-14T13:00:00.000Z',\n },\n]\n\nlet tasks: Task[] = [...seedTasks]\n\nexport const taskHandlers = [\n http.get(`${BASE_URL}/tasks`, () => {\n return HttpResponse.json(tasks)\n }),\n\n http.get(`${BASE_URL}/tasks/:id`, ({ params }) => {\n const task = tasks.find((t) => t.id === params.id)\n if (!task) {\n return HttpResponse.json({ error: 'Task not found' }, { status: 404 })\n }\n return HttpResponse.json(task)\n }),\n\n http.post(`${BASE_URL}/tasks`, async ({ request }) => {\n const input = (await request.json()) as CreateTaskInput\n const newTask: Task = {\n id: String(Date.now()),\n title: input.title,\n description: input.description,\n priority: input.priority,\n status: 'todo',\n createdAt: new Date().toISOString(),\n }\n tasks = [...tasks, newTask]\n return HttpResponse.json(newTask, { status: 201 })\n }),\n]\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,yBAA+C;;;ACA/C;AAEA,IAAM,YACJ,aAAQ,IAAI,sBAAZ,YAAiC;AAEnC,eAAsB,WAA4B;AAChD,QAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,QAAQ;AAC3C,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACpD,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,YAAY,IAA2B;AAC3D,QAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,UAAU,EAAE,EAAE;AACjD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,EAAE,EAAE;AACzD,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,WAAW,OAAuC;AACtE,QAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,KAAK;AAAA,EAC5B,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACpD,SAAO,IAAI,KAAK;AAClB;;;ADrBO,SAAS,SACd,cACA;AACA,aAAO,6BAAiB;AAAA,IACtB,UAAU,CAAC,OAAO;AAAA,IAClB,SAAS;AAAA,IACT,GAAG;AAAA,EACL,CAAC;AACH;;;AEZA,IAAAA,sBAA+C;AAIxC,SAAS,QACd,IACA,cACA;AACA,aAAO,8BAAe;AAAA,IACpB,UAAU,CAAC,SAAS,EAAE;AAAA,IACtB,SAAS,MAAM,YAAY,EAAE;AAAA,IAC7B,GAAG;AAAA,EACL,CAAC;AACH;;;ACbA,IAAAC,sBAAqD;AAI9C,SAAS,cACd,iBAIA;AACA,aAAO,iCAA0C;AAAA,IAC/C,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;;;ACdA,IAAAC,sBAAyB;AAIlB,SAAS,iBAAiB,QAAoB;AACnD,aAAO,8BAAiB;AAAA,IACtB,UAAU,CAAC,SAAS,YAAY,MAAM;AAAA,IACtC,SAAS,YAAY;AACnB,YAAMC,SAAQ,MAAM,SAAS;AAE7B,aAAOA,OAAM,OAAO,CAAC,SAAU,KAAK,SAAS,MAAO;AAAA,IACtD;AAAA,EACF,CAAC;AACH;;;ACbA,iBAAmC;AAAnC,IAAAC;AAGA,IAAMC,aACJD,MAAA,QAAQ,IAAI,sBAAZ,OAAAA,MAAiC;AAEnC,IAAM,YAAoB;AAAA,EACxB;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAEA,IAAI,QAAgB,CAAC,GAAG,SAAS;AAE1B,IAAM,eAAe;AAAA,EAC1B,gBAAK,IAAI,GAAGC,SAAQ,UAAU,MAAM;AAClC,WAAO,wBAAa,KAAK,KAAK;AAAA,EAChC,CAAC;AAAA,EAED,gBAAK,IAAI,GAAGA,SAAQ,cAAc,CAAC,EAAE,OAAO,MAAM;AAChD,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE;AACjD,QAAI,CAAC,MAAM;AACT,aAAO,wBAAa,KAAK,EAAE,OAAO,iBAAiB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACvE;AACA,WAAO,wBAAa,KAAK,IAAI;AAAA,EAC/B,CAAC;AAAA,EAED,gBAAK,KAAK,GAAGA,SAAQ,UAAU,OAAO,EAAE,QAAQ,MAAM;AACpD,UAAM,QAAS,MAAM,QAAQ,KAAK;AAClC,UAAM,UAAgB;AAAA,MACpB,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,MACrB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,YAAQ,CAAC,GAAG,OAAO,OAAO;AAC1B,WAAO,wBAAa,KAAK,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,EACnD,CAAC;AACH;","names":["import_react_query","import_react_query","import_react_query","tasks","_a","BASE_URL"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,146 @@
1
+ // src/hooks/useTasks.ts
2
+ import { useQuery } from "@tanstack/react-query";
3
+
4
+ // src/api/tasks.ts
5
+ var _a;
6
+ var BASE_URL = (_a = process.env.REACT_APP_API_URL) != null ? _a : "http://localhost:3001";
7
+ async function getTasks() {
8
+ const res = await fetch(`${BASE_URL}/tasks`);
9
+ if (!res.ok) throw new Error("Failed to fetch tasks");
10
+ return res.json();
11
+ }
12
+ async function getTaskById(id) {
13
+ const res = await fetch(`${BASE_URL}/tasks/${id}`);
14
+ if (!res.ok) throw new Error(`Failed to fetch task ${id}`);
15
+ return res.json();
16
+ }
17
+ async function createTask(input) {
18
+ const res = await fetch(`${BASE_URL}/tasks`, {
19
+ method: "POST",
20
+ headers: { "Content-Type": "application/json" },
21
+ body: JSON.stringify(input)
22
+ });
23
+ if (!res.ok) throw new Error("Failed to create task");
24
+ return res.json();
25
+ }
26
+
27
+ // src/hooks/useTasks.ts
28
+ function useTasks(queryOptions) {
29
+ return useQuery({
30
+ queryKey: ["tasks"],
31
+ queryFn: getTasks,
32
+ ...queryOptions
33
+ });
34
+ }
35
+
36
+ // src/hooks/useTask.ts
37
+ import { useQuery as useQuery2 } from "@tanstack/react-query";
38
+ function useTask(id, queryOptions) {
39
+ return useQuery2({
40
+ queryKey: ["tasks", id],
41
+ queryFn: () => getTaskById(id),
42
+ ...queryOptions
43
+ });
44
+ }
45
+
46
+ // src/hooks/useCreateTask.ts
47
+ import { useMutation } from "@tanstack/react-query";
48
+ function useCreateTask(mutationOptions) {
49
+ return useMutation({
50
+ mutationFn: createTask,
51
+ ...mutationOptions
52
+ });
53
+ }
54
+
55
+ // src/hooks/useFilteredTasks.ts
56
+ import { useQuery as useQuery3 } from "@tanstack/react-query";
57
+ function useFilteredTasks(status) {
58
+ return useQuery3({
59
+ queryKey: ["tasks", "filtered", status],
60
+ queryFn: async () => {
61
+ const tasks2 = await getTasks();
62
+ return tasks2.filter((task) => task.status = status);
63
+ }
64
+ });
65
+ }
66
+
67
+ // src/handlers.ts
68
+ import { http, HttpResponse } from "msw";
69
+ var _a2;
70
+ var BASE_URL2 = (_a2 = process.env.REACT_APP_API_URL) != null ? _a2 : "http://localhost:3001";
71
+ var seedTasks = [
72
+ {
73
+ id: "1",
74
+ title: "Set up project repository",
75
+ description: "Initialize the monorepo and configure workspaces.",
76
+ status: "done",
77
+ priority: "high",
78
+ createdAt: "2024-01-10T09:00:00.000Z"
79
+ },
80
+ {
81
+ id: "2",
82
+ title: "Design task data model",
83
+ description: "Define the Task type and related interfaces.",
84
+ status: "done",
85
+ priority: "high",
86
+ createdAt: "2024-01-11T10:00:00.000Z"
87
+ },
88
+ {
89
+ id: "3",
90
+ title: "Implement API hooks",
91
+ description: "Build useTasks, useTask, and useCreateTask with TanStack Query.",
92
+ status: "in-progress",
93
+ priority: "high",
94
+ createdAt: "2024-01-12T11:00:00.000Z"
95
+ },
96
+ {
97
+ id: "4",
98
+ title: "Write unit tests",
99
+ description: "Add vitest tests for all hooks and handlers.",
100
+ status: "todo",
101
+ priority: "medium",
102
+ createdAt: "2024-01-13T12:00:00.000Z"
103
+ },
104
+ {
105
+ id: "5",
106
+ title: "Publish to npm",
107
+ description: "Bump version, build, and publish @zinm/task-service.",
108
+ status: "todo",
109
+ priority: "low",
110
+ createdAt: "2024-01-14T13:00:00.000Z"
111
+ }
112
+ ];
113
+ var tasks = [...seedTasks];
114
+ var taskHandlers = [
115
+ http.get(`${BASE_URL2}/tasks`, () => {
116
+ return HttpResponse.json(tasks);
117
+ }),
118
+ http.get(`${BASE_URL2}/tasks/:id`, ({ params }) => {
119
+ const task = tasks.find((t) => t.id === params.id);
120
+ if (!task) {
121
+ return HttpResponse.json({ error: "Task not found" }, { status: 404 });
122
+ }
123
+ return HttpResponse.json(task);
124
+ }),
125
+ http.post(`${BASE_URL2}/tasks`, async ({ request }) => {
126
+ const input = await request.json();
127
+ const newTask = {
128
+ id: String(Date.now()),
129
+ title: input.title,
130
+ description: input.description,
131
+ priority: input.priority,
132
+ status: "todo",
133
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
134
+ };
135
+ tasks = [...tasks, newTask];
136
+ return HttpResponse.json(newTask, { status: 201 });
137
+ })
138
+ ];
139
+ export {
140
+ taskHandlers,
141
+ useCreateTask,
142
+ useFilteredTasks,
143
+ useTask,
144
+ useTasks
145
+ };
146
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useTasks.ts","../src/api/tasks.ts","../src/hooks/useTask.ts","../src/hooks/useCreateTask.ts","../src/hooks/useFilteredTasks.ts","../src/handlers.ts"],"sourcesContent":["import { useQuery, type UseQueryOptions } from '@tanstack/react-query'\nimport { getTasks } from '../api/tasks'\nimport type { Task } from '../types'\n\nexport function useTasks(\n queryOptions?: Omit<UseQueryOptions<Task[]>, 'queryKey' | 'queryFn'>\n) {\n return useQuery<Task[]>({\n queryKey: ['tasks'],\n queryFn: getTasks,\n ...queryOptions,\n })\n}\n","import type { Task, CreateTaskInput } from '../types'\n\nconst BASE_URL =\n process.env.REACT_APP_API_URL ?? 'http://localhost:3001'\n\nexport async function getTasks(): Promise<Task[]> {\n const res = await fetch(`${BASE_URL}/tasks`)\n if (!res.ok) throw new Error('Failed to fetch tasks')\n return res.json()\n}\n\nexport async function getTaskById(id: string): Promise<Task> {\n const res = await fetch(`${BASE_URL}/tasks/${id}`)\n if (!res.ok) throw new Error(`Failed to fetch task ${id}`)\n return res.json()\n}\n\nexport async function createTask(input: CreateTaskInput): Promise<Task> {\n const res = await fetch(`${BASE_URL}/tasks`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n })\n if (!res.ok) throw new Error('Failed to create task')\n return res.json()\n}\n","import { useQuery, type UseQueryOptions } from '@tanstack/react-query'\nimport { getTaskById } from '../api/tasks'\nimport type { Task } from '../types'\n\nexport function useTask(\n id: string,\n queryOptions?: Omit<UseQueryOptions<Task>, 'queryKey' | 'queryFn'>\n) {\n return useQuery<Task>({\n queryKey: ['tasks', id],\n queryFn: () => getTaskById(id),\n ...queryOptions,\n })\n}\n","import { useMutation, type UseMutationOptions } from '@tanstack/react-query'\nimport { createTask } from '../api/tasks'\nimport type { Task, CreateTaskInput } from '../types'\n\nexport function useCreateTask(\n mutationOptions?: Omit<\n UseMutationOptions<Task, Error, CreateTaskInput>,\n 'mutationFn'\n >\n) {\n return useMutation<Task, Error, CreateTaskInput>({\n mutationFn: createTask,\n ...mutationOptions,\n })\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { getTasks } from '../api/tasks'\nimport type { Task, TaskStatus } from '../types'\n\nexport function useFilteredTasks(status: TaskStatus) {\n return useQuery<Task[]>({\n queryKey: ['tasks', 'filtered', status],\n queryFn: async () => {\n const tasks = await getTasks()\n // TODO: something seems off here...\n return tasks.filter((task) => (task.status = status))\n },\n })\n}\n","import { http, HttpResponse } from 'msw'\nimport type { Task, CreateTaskInput } from './types'\n\nconst BASE_URL =\n process.env.REACT_APP_API_URL ?? 'http://localhost:3001'\n\nconst seedTasks: Task[] = [\n {\n id: '1',\n title: 'Set up project repository',\n description: 'Initialize the monorepo and configure workspaces.',\n status: 'done',\n priority: 'high',\n createdAt: '2024-01-10T09:00:00.000Z',\n },\n {\n id: '2',\n title: 'Design task data model',\n description: 'Define the Task type and related interfaces.',\n status: 'done',\n priority: 'high',\n createdAt: '2024-01-11T10:00:00.000Z',\n },\n {\n id: '3',\n title: 'Implement API hooks',\n description: 'Build useTasks, useTask, and useCreateTask with TanStack Query.',\n status: 'in-progress',\n priority: 'high',\n createdAt: '2024-01-12T11:00:00.000Z',\n },\n {\n id: '4',\n title: 'Write unit tests',\n description: 'Add vitest tests for all hooks and handlers.',\n status: 'todo',\n priority: 'medium',\n createdAt: '2024-01-13T12:00:00.000Z',\n },\n {\n id: '5',\n title: 'Publish to npm',\n description: 'Bump version, build, and publish @zinm/task-service.',\n status: 'todo',\n priority: 'low',\n createdAt: '2024-01-14T13:00:00.000Z',\n },\n]\n\nlet tasks: Task[] = [...seedTasks]\n\nexport const taskHandlers = [\n http.get(`${BASE_URL}/tasks`, () => {\n return HttpResponse.json(tasks)\n }),\n\n http.get(`${BASE_URL}/tasks/:id`, ({ params }) => {\n const task = tasks.find((t) => t.id === params.id)\n if (!task) {\n return HttpResponse.json({ error: 'Task not found' }, { status: 404 })\n }\n return HttpResponse.json(task)\n }),\n\n http.post(`${BASE_URL}/tasks`, async ({ request }) => {\n const input = (await request.json()) as CreateTaskInput\n const newTask: Task = {\n id: String(Date.now()),\n title: input.title,\n description: input.description,\n priority: input.priority,\n status: 'todo',\n createdAt: new Date().toISOString(),\n }\n tasks = [...tasks, newTask]\n return HttpResponse.json(newTask, { status: 201 })\n }),\n]\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","tasks","_a","BASE_URL"]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@zinm/task-service",
3
+ "version": "1.0.0",
4
+ "description": "Hooks and MSW handlers for a Task/Todo domain",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist/"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "test": "vitest run"
22
+ },
23
+ "peerDependencies": {
24
+ "@tanstack/react-query": "^5.0.0",
25
+ "react": "^18.0.0",
26
+ "react-dom": "^18.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@tanstack/react-query": "^5.0.0",
30
+ "@types/node": "^20.19.39",
31
+ "@types/react": "^18.0.0",
32
+ "msw": "^2.0.0",
33
+ "tsup": "^8.0.0",
34
+ "typescript": "^5.0.0",
35
+ "vitest": "^1.0.0"
36
+ },
37
+ "dependencies": {
38
+ "msw": "^2.0.0"
39
+ }
40
+ }