vocabflow 0.0.1 → 0.0.2

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.
Files changed (48) hide show
  1. package/dist/__tests__/api-client.test.js +3 -0
  2. package/dist/__tests__/api-client.test.js.map +1 -1
  3. package/dist/__tests__/config.test.js +12 -1
  4. package/dist/__tests__/config.test.js.map +1 -1
  5. package/dist/__tests__/review-mode.test.d.ts +2 -0
  6. package/dist/__tests__/review-mode.test.d.ts.map +1 -0
  7. package/dist/__tests__/review-mode.test.js +152 -0
  8. package/dist/__tests__/review-mode.test.js.map +1 -0
  9. package/dist/__tests__/settings.test.d.ts +2 -0
  10. package/dist/__tests__/settings.test.d.ts.map +1 -0
  11. package/dist/__tests__/settings.test.js +26 -0
  12. package/dist/__tests__/settings.test.js.map +1 -0
  13. package/dist/commands/review.d.ts +2 -1
  14. package/dist/commands/review.d.ts.map +1 -1
  15. package/dist/commands/review.js +249 -47
  16. package/dist/commands/review.js.map +1 -1
  17. package/dist/commands/settings.d.ts +2 -0
  18. package/dist/commands/settings.d.ts.map +1 -0
  19. package/dist/commands/settings.js +41 -0
  20. package/dist/commands/settings.js.map +1 -0
  21. package/dist/index.js +24 -2
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/api-client.d.ts +2 -2
  24. package/dist/lib/api-client.d.ts.map +1 -1
  25. package/dist/lib/api-client.js +1 -1
  26. package/dist/lib/api-client.js.map +1 -1
  27. package/dist/lib/config.d.ts +4 -0
  28. package/dist/lib/config.d.ts.map +1 -1
  29. package/dist/lib/config.js +10 -1
  30. package/dist/lib/config.js.map +1 -1
  31. package/dist/lib/review-mode.d.ts +5 -0
  32. package/dist/lib/review-mode.d.ts.map +1 -0
  33. package/dist/lib/review-mode.js +41 -0
  34. package/dist/lib/review-mode.js.map +1 -0
  35. package/dist/types/review.d.ts +4 -1
  36. package/dist/types/review.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/src/__tests__/api-client.test.ts +3 -0
  39. package/src/__tests__/config.test.ts +14 -1
  40. package/src/__tests__/review-mode.test.ts +179 -0
  41. package/src/__tests__/settings.test.ts +32 -0
  42. package/src/commands/review.ts +289 -61
  43. package/src/commands/settings.ts +48 -0
  44. package/src/index.ts +27 -2
  45. package/src/lib/api-client.ts +3 -2
  46. package/src/lib/config.ts +14 -1
  47. package/src/lib/review-mode.ts +48 -0
  48. package/src/types/review.ts +4 -1
@@ -80,6 +80,7 @@ describe('CLI API client endpoint compatibility', () => {
80
80
  const { reviewApi } = await import('../lib/api-client.js');
81
81
  await reviewApi.getTodayReview();
82
82
  await reviewApi.getReviewQuestion(123);
83
+ await reviewApi.getReviewQuestion(123, 'FLASHCARD_BACKWARD');
83
84
  await reviewApi.submitReview({
84
85
  wordId: 123,
85
86
  result: 'KNOWN',
@@ -88,6 +89,7 @@ describe('CLI API client endpoint compatibility', () => {
88
89
  await reviewApi.deleteWord(123);
89
90
  expect(mockGet).toHaveBeenCalledWith('api/review/today');
90
91
  expect(mockGet).toHaveBeenCalledWith('api/review/questions/123?mode=FLASHCARD_FORWARD');
92
+ expect(mockGet).toHaveBeenCalledWith('api/review/questions/123?mode=FLASHCARD_BACKWARD');
91
93
  expect(mockPost).toHaveBeenCalledWith('api/review/complete', expect.objectContaining({
92
94
  json: {
93
95
  wordId: 123,
@@ -98,6 +100,7 @@ describe('CLI API client endpoint compatibility', () => {
98
100
  expect(mockDelete).toHaveBeenCalledWith('api/words/123');
99
101
  expect(mockGet).not.toHaveBeenCalledWith('/api/review/today');
100
102
  expect(mockGet).not.toHaveBeenCalledWith('/api/review/questions/123?mode=FLASHCARD_FORWARD');
103
+ expect(mockGet).not.toHaveBeenCalledWith('/api/review/questions/123?mode=FLASHCARD_BACKWARD');
101
104
  expect(mockPost).not.toHaveBeenCalledWith('/api/review/complete', expect.anything());
102
105
  expect(mockDelete).not.toHaveBeenCalledWith('/api/words/123');
103
106
  });
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.test.js","sourceRoot":"","sources":["../../src/__tests__/api-client.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.test.js","sourceRoot":"","sources":["../../src/__tests__/api-client.test.ts"],"names":[],"mappings":"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"}
@@ -30,10 +30,12 @@ describe('config store', () => {
30
30
  expect(getToken()).toBe('test-token');
31
31
  });
32
32
  it('should clear all auth data via clearAuth', async () => {
33
- const { setAuth, clearAuth, hasToken } = await import('../lib/config.js');
33
+ const { setAuth, clearAuth, hasToken, getDefaultReviewMode, setDefaultReviewMode } = await import('../lib/config.js');
34
+ setDefaultReviewMode('CHOICE_EN2CN');
34
35
  setAuth({ token: 'test-token', email: 'test@example.com', expiresAt: Date.now() + 86400000 });
35
36
  clearAuth();
36
37
  expect(hasToken()).toBe(false);
38
+ expect(getDefaultReviewMode()).toBe('CHOICE_EN2CN');
37
39
  });
38
40
  it('should detect expired tokens', async () => {
39
41
  const { setAuth, isTokenExpired } = await import('../lib/config.js');
@@ -50,5 +52,14 @@ describe('config store', () => {
50
52
  setAuth({ token: 'test-token', email: 'test@example.com', expiresAt: Date.now() + 86400000 });
51
53
  expect(getEmail()).toBe('test@example.com');
52
54
  });
55
+ it('should use FLASHCARD_FORWARD as default review mode', async () => {
56
+ const { getDefaultReviewMode } = await import('../lib/config.js');
57
+ expect(getDefaultReviewMode()).toBe('FLASHCARD_FORWARD');
58
+ });
59
+ it('should update default review mode', async () => {
60
+ const { getDefaultReviewMode, setDefaultReviewMode } = await import('../lib/config.js');
61
+ setDefaultReviewMode('CHOICE_EN2CN');
62
+ expect(getDefaultReviewMode()).toBe('CHOICE_EN2CN');
63
+ });
53
64
  });
54
65
  //# sourceMappingURL=config.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review-mode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-mode.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/review-mode.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ const mockRequireAuth = vi.fn();
3
+ const mockGetTodayReview = vi.fn();
4
+ const mockGetReviewQuestion = vi.fn();
5
+ const mockSubmitReview = vi.fn();
6
+ const mockDeleteWord = vi.fn();
7
+ const mockIsInteractive = vi.fn();
8
+ const mockSetupRawMode = vi.fn();
9
+ const mockCleanup = vi.fn();
10
+ const mockClearScreen = vi.fn();
11
+ const mockMoveCursorTop = vi.fn();
12
+ vi.mock('../lib/api-client.js', () => ({
13
+ requireAuth: mockRequireAuth,
14
+ isApiSuccess: (code) => code === 0 || code === 200,
15
+ reviewApi: {
16
+ getTodayReview: mockGetTodayReview,
17
+ getReviewQuestion: mockGetReviewQuestion,
18
+ submitReview: mockSubmitReview,
19
+ deleteWord: mockDeleteWord,
20
+ },
21
+ }));
22
+ vi.mock('../lib/tty.js', () => ({
23
+ isInteractive: mockIsInteractive,
24
+ setupRawMode: mockSetupRawMode,
25
+ cleanup: mockCleanup,
26
+ clearScreen: mockClearScreen,
27
+ moveCursorTop: mockMoveCursorTop,
28
+ }));
29
+ const baseWord = {
30
+ id: 101,
31
+ wordText: 'abandon',
32
+ briefExplanation: '放弃',
33
+ nextReviewTime: '2026-03-21T00:00:00Z',
34
+ reviewCount: 2,
35
+ intervalDays: 3,
36
+ easeFactor: 2.5,
37
+ };
38
+ const secondWord = {
39
+ ...baseWord,
40
+ id: 102,
41
+ wordText: 'derive',
42
+ };
43
+ async function setupReviewSession() {
44
+ let keypressHandler;
45
+ vi.spyOn(process.stdin, 'on').mockImplementation(((event, handler) => {
46
+ if (event === 'keypress') {
47
+ keypressHandler = handler;
48
+ }
49
+ return process.stdin;
50
+ }));
51
+ vi.spyOn(process, 'exit').mockImplementation(((code) => {
52
+ throw new Error(`EXIT_${code ?? 0}`);
53
+ }));
54
+ vi.spyOn(console, 'log').mockImplementation(() => { });
55
+ const { review } = await import('../commands/review.js');
56
+ await review();
57
+ if (typeof keypressHandler !== 'function') {
58
+ throw new Error('Failed to register keypress handler');
59
+ }
60
+ return keypressHandler;
61
+ }
62
+ describe('review command mode switching', () => {
63
+ beforeEach(() => {
64
+ vi.resetModules();
65
+ vi.restoreAllMocks();
66
+ vi.clearAllMocks();
67
+ mockRequireAuth.mockResolvedValue({ id: 'u1' });
68
+ mockIsInteractive.mockReturnValue(true);
69
+ mockGetTodayReview.mockResolvedValue({
70
+ code: 0,
71
+ message: 'ok',
72
+ data: {
73
+ datas: [baseWord],
74
+ totalElements: 1,
75
+ },
76
+ });
77
+ mockGetReviewQuestion.mockImplementation(async (_wordId, mode = 'FLASHCARD_FORWARD') => ({
78
+ code: 0,
79
+ message: 'ok',
80
+ data: {
81
+ wordId: baseWord.id,
82
+ mode,
83
+ question: mode === 'CHOICE_EN2CN'
84
+ ? {
85
+ prompt: '选择正确英文',
86
+ choices: [
87
+ { label: 'A', text: 'give up' },
88
+ { label: 'B', text: 'continue' },
89
+ { label: 'C', text: 'collect' },
90
+ { label: 'D', text: 'answer' },
91
+ ],
92
+ }
93
+ : {},
94
+ answer: {},
95
+ },
96
+ }));
97
+ mockSubmitReview.mockResolvedValue({
98
+ code: 0,
99
+ message: 'ok',
100
+ data: {},
101
+ });
102
+ mockDeleteWord.mockResolvedValue({
103
+ code: 0,
104
+ message: 'ok',
105
+ });
106
+ });
107
+ it('defaults to FLASHCARD_FORWARD when no toggle is used', async () => {
108
+ const keypressHandler = await setupReviewSession();
109
+ await expect(keypressHandler('', { name: '1' })).rejects.toThrow('EXIT_0');
110
+ expect(mockSubmitReview).toHaveBeenCalledWith({
111
+ wordId: baseWord.id,
112
+ result: 'UNKNOWN',
113
+ mode: 'FLASHCARD_FORWARD',
114
+ });
115
+ });
116
+ it('switches to REVERT choice mode after pressing r', async () => {
117
+ const keypressHandler = await setupReviewSession();
118
+ expect(mockGetReviewQuestion).toHaveBeenCalledWith(baseWord.id, 'FLASHCARD_FORWARD');
119
+ await keypressHandler('', { name: 'r' });
120
+ expect(mockGetReviewQuestion).toHaveBeenCalledWith(baseWord.id, 'CHOICE_EN2CN');
121
+ await expect(keypressHandler('', { name: 'a' })).rejects.toThrow('EXIT_0');
122
+ expect(mockSubmitReview).toHaveBeenCalledWith({
123
+ wordId: baseWord.id,
124
+ mode: 'CHOICE_EN2CN',
125
+ userAnswer: 'give up',
126
+ });
127
+ });
128
+ it('stays on current word when REVERT answer is incorrect', async () => {
129
+ mockGetTodayReview.mockResolvedValue({
130
+ code: 0,
131
+ message: 'ok',
132
+ data: {
133
+ datas: [baseWord, secondWord],
134
+ totalElements: 2,
135
+ },
136
+ });
137
+ mockSubmitReview.mockResolvedValue({
138
+ code: 0,
139
+ message: 'ok',
140
+ data: {
141
+ isCorrect: false,
142
+ lastReviewResult: 'INCORRECT',
143
+ correctAnswer: 'give up',
144
+ },
145
+ });
146
+ const keypressHandler = await setupReviewSession();
147
+ await keypressHandler('', { name: 'r' });
148
+ await expect(keypressHandler('', { name: 'a' })).resolves.toBeUndefined();
149
+ expect(mockGetReviewQuestion).not.toHaveBeenCalledWith(secondWord.id, 'CHOICE_EN2CN');
150
+ });
151
+ });
152
+ //# sourceMappingURL=review-mode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-mode.test.js","sourceRoot":"","sources":["../../src/__tests__/review-mode.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=settings.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/settings.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ const mockGetDefaultReviewMode = vi.fn();
3
+ const mockSetDefaultReviewMode = vi.fn();
4
+ vi.mock('../lib/config.js', () => ({
5
+ getDefaultReviewMode: mockGetDefaultReviewMode,
6
+ setDefaultReviewMode: mockSetDefaultReviewMode,
7
+ }));
8
+ describe('settings command', () => {
9
+ beforeEach(() => {
10
+ vi.clearAllMocks();
11
+ mockGetDefaultReviewMode.mockReturnValue('FLASHCARD_FORWARD');
12
+ vi.spyOn(console, 'log').mockImplementation(() => { });
13
+ });
14
+ it('shows current default mode', async () => {
15
+ const { settings } = await import('../commands/settings.js');
16
+ await settings([]);
17
+ expect(mockGetDefaultReviewMode).toHaveBeenCalledTimes(1);
18
+ expect(console.log).toHaveBeenCalled();
19
+ });
20
+ it('sets default mode with aliases', async () => {
21
+ const { settings } = await import('../commands/settings.js');
22
+ await settings(['set', 'default-mode', 'revert']);
23
+ expect(mockSetDefaultReviewMode).toHaveBeenCalledWith('CHOICE_EN2CN');
24
+ });
25
+ });
26
+ //# sourceMappingURL=settings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../src/__tests__/settings.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACzC,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEzC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,oBAAoB,EAAE,wBAAwB;IAC9C,oBAAoB,EAAE,wBAAwB;CAC/C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,wBAAwB,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;QAC9D,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC7D,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,CAAC,wBAAwB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC7D,MAAM,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;QAElD,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +1,3 @@
1
- export declare function review(): Promise<void>;
1
+ import type { ReviewMode } from '../types/review.js';
2
+ export declare function review(initialMode?: ReviewMode): Promise<void>;
2
3
  //# sourceMappingURL=review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAkRA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA6Q5C"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAiD,MAAM,oBAAoB,CAAC;AAmYpG,wBAAsB,MAAM,CAAC,WAAW,GAAE,UAAgC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6XzF"}