@speakableio/core 0.1.105 → 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.
Files changed (55) hide show
  1. package/dist/analytics-Bj2i88Zk.d.ts +89 -0
  2. package/dist/{assignment.model-DLMWAp0Y.d.ts → assignment.model-BRS4h8gX.d.ts} +1 -1
  3. package/dist/{assignment.model-Bcbxx8oI.d.mts → assignment.model-Bc61gBHl.d.ts} +5 -2
  4. package/dist/{assignment.model-Lu21tZCh.d.mts → assignment.model-Bm9gE2YK.d.ts} +2 -2
  5. package/dist/const.d.ts +3 -73
  6. package/dist/everything.d.ts +1348 -0
  7. package/dist/everything.js +3509 -0
  8. package/dist/everything.js.map +1 -0
  9. package/dist/hooks.d.ts +621 -4
  10. package/dist/hooks.js +1167 -39
  11. package/dist/hooks.js.map +1 -1
  12. package/dist/index.native.d.mts +2272 -27
  13. package/dist/index.native.d.ts +2272 -27
  14. package/dist/index.native.js +2915 -98
  15. package/dist/index.native.js.map +1 -1
  16. package/dist/index.native.mjs +2937 -120
  17. package/dist/index.native.mjs.map +1 -1
  18. package/dist/index.web-DNYJV_41.d.ts +469 -0
  19. package/dist/index.web.d.mts +2437 -6
  20. package/dist/index.web.d.ts +68 -2
  21. package/dist/index.web.js +2937 -120
  22. package/dist/index.web.js.map +1 -1
  23. package/dist/models.d.ts +2 -2
  24. package/dist/repos.d.ts +1 -1
  25. package/dist/speakable-plans-BjWWEWrQ.d.ts +72 -0
  26. package/dist/{const.d.mts → speakable-plans-DR1cQ6IK.d.ts} +19 -258
  27. package/dist/speakable-plans-Dq9nRefI.d.ts +72 -0
  28. package/dist/utils.d.ts +84 -2
  29. package/dist/utils.js +307 -1
  30. package/dist/utils.js.map +1 -1
  31. package/dist/web.constants-qmx4rGyO.d.ts +26 -0
  32. package/package.json +6 -62
  33. package/dist/analytics.cjs +0 -376
  34. package/dist/analytics.cjs.map +0 -1
  35. package/dist/assignment.constants-BIKM6fYi.d.mts +0 -32
  36. package/dist/card.constants-DhKFipX3.d.mts +0 -54
  37. package/dist/const.cjs +0 -526
  38. package/dist/const.cjs.map +0 -1
  39. package/dist/hooks.cjs +0 -1604
  40. package/dist/hooks.cjs.map +0 -1
  41. package/dist/hooks.d.mts +0 -294
  42. package/dist/index.web.cjs +0 -517
  43. package/dist/index.web.cjs.map +0 -1
  44. package/dist/models.cjs +0 -75
  45. package/dist/models.cjs.map +0 -1
  46. package/dist/models.d.mts +0 -56
  47. package/dist/notification.constants-Da4-_0kX.d.mts +0 -21
  48. package/dist/notification.constants-Da4-_0kX.d.ts +0 -21
  49. package/dist/repos.cjs +0 -486
  50. package/dist/repos.cjs.map +0 -1
  51. package/dist/repos.d.mts +0 -209
  52. package/dist/utils.cjs +0 -373
  53. package/dist/utils.cjs.map +0 -1
  54. package/dist/utils.d.mts +0 -39
  55. /package/dist/{notification.constants-B72fb734.d.mts → notification.constants-B72fb734.d.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/entry-points/models.ts","../src/domains/cards/card.model.ts"],"sourcesContent":["/* eslint-disable padding-line-between-statements */\n\n// Assignment models\nexport * from '../domains/assignment/assignment.model'\n\n// Page models\nexport * from '../domains/cards/card.model'\n\n// Set models\nexport * from '../domains/sets/set.model'\n","import { type VerificationCardStatus } from './card.constants'\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport interface PageActivityWithId extends PageActivity {\n id: string\n}\n\nexport interface PageActivity {\n owners: string[]\n checked?: boolean\n completed?: boolean\n media_area_id?: string | null\n media_area_layout?: 'left' | 'right' | null\n score?: number\n verificationStatus?: VerificationCardStatus\n native_text?: string\n repeat?: number\n language?: string | null\n image?: {\n path?: string | null\n url?: string\n }\n audio?: {\n path?: string | null\n url?: string\n } | null\n notes?: string\n difficulty?: string\n default_language?: string\n target_text?: string\n type: ActivityPageType\n grading_criteria?: string\n scoring_type?: string\n grading_method?: 'simple' | 'rubric' | 'manual' | 'standards_based'\n feedback_types?: string[]\n rubricId?: string\n prompt?: string\n title?: string\n passing_score?: number\n maxCharacters?: number\n answer?: string[]\n choices?: {\n value: string\n option: string\n }[]\n MCQType?: string\n multipleAttemptsAllowed?: boolean\n allowRetries?: boolean\n question?: string\n respondTime?: number\n hidePrompt?: boolean\n videoUrl?: string\n link?: string\n text?: string\n isListenAloud?: boolean\n embedCode?: string\n attempt?: number\n correct?: number\n autoGrade?: boolean\n points?: number\n shuffle?: boolean\n translation?: string\n includeAIContext?: boolean\n media_area_context_ref?: string | null\n standardId?: string\n target_proficiency_level?: string\n allowTTS?: boolean\n feedback_language?: string | null\n correct_answer?: string | null\n limit_attempts?: boolean\n max_attempts?: number\n rich_text?: string\n}\n\nexport enum ActivityPageType {\n // DEFAULT = 'READ_REPEAT',\n READ_REPEAT = 'READ_REPEAT',\n VIDEO = 'VIDEO',\n TEXT = 'TEXT',\n READ_RESPOND = 'READ_RESPOND',\n FREE_RESPONSE = 'FREE_RESPONSE',\n REPEAT = 'REPEAT',\n RESPOND = 'RESPOND',\n RESPOND_WRITE = 'RESPOND_WRITE',\n TEXT_TO_SPEECH = 'TEXT_TO_SPEECH',\n MULTIPLE_CHOICE = 'MULTIPLE_CHOICE',\n PODCAST = 'PODCAST',\n MEDIA_PAGE = 'MEDIA_PAGE',\n WRITE = 'WRITE',\n SHORT_ANSWER = 'SHORT_ANSWER',\n SHORT_STORY = 'SHORT_STORY',\n SPEAK = 'SPEAK',\n CONVERSATION = 'CONVERSATION',\n CONVERSATION_WRITE = 'CONVERSATION_WRITE',\n DIALOGUE = 'DIALOGUE',\n INSTRUCTION = 'INSTRUCTION',\n LISTEN = 'LISTEN',\n READ = 'READ',\n ANSWER = 'ANSWER',\n}\n\nexport const RESPOND_PAGE_ACTIVITY_TYPES = [\n ActivityPageType.READ_RESPOND,\n ActivityPageType.RESPOND,\n ActivityPageType.RESPOND_WRITE,\n ActivityPageType.FREE_RESPONSE,\n]\n\nexport const MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES = [ActivityPageType.MULTIPLE_CHOICE]\n\nexport const REPEAT_PAGE_ACTIVITY_TYPES = [ActivityPageType.READ_REPEAT, ActivityPageType.REPEAT]\n\nexport const RESPOND_WRITE_PAGE_ACTIVITY_TYPES = [\n ActivityPageType.RESPOND_WRITE,\n ActivityPageType.FREE_RESPONSE,\n]\n\nexport const RESPOND_AUDIO_PAGE_ACTIVITY_TYPES = [\n ActivityPageType.RESPOND,\n ActivityPageType.READ_RESPOND,\n]\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC0EO,IAAK,mBAAL,kBAAKA,sBAAL;AAEL,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,mBAAgB;AAChB,EAAAA,kBAAA,YAAS;AACT,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,mBAAgB;AAChB,EAAAA,kBAAA,oBAAiB;AACjB,EAAAA,kBAAA,qBAAkB;AAClB,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,wBAAqB;AACrB,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,YAAS;AACT,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,YAAS;AAxBC,SAAAA;AAAA,GAAA;AA2BL,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,sCAAsC,CAAC,uCAAgC;AAE7E,IAAM,6BAA6B,CAAC,iCAA8B,qBAAuB;AAEzF,IAAM,oCAAoC;AAAA,EAC/C;AAAA,EACA;AACF;AAEO,IAAM,oCAAoC;AAAA,EAC/C;AAAA,EACA;AACF;","names":["ActivityPageType"]}
package/dist/models.d.mts DELETED
@@ -1,56 +0,0 @@
1
- import { c as ActivityPageType } from './assignment.model-Lu21tZCh.mjs';
2
- export { g as Assignment, A as AssignmentWithId, M as MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, P as PageActivity, d as PageActivityWithId, f as PageScore, h as REPEAT_PAGE_ACTIVITY_TYPES, j as RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, R as RESPOND_PAGE_ACTIVITY_TYPES, i as RESPOND_WRITE_PAGE_ACTIVITY_TYPES, e as Score, S as ScoreWithId } from './assignment.model-Lu21tZCh.mjs';
3
- import { FieldValue } from 'firebase/firestore';
4
- import '@react-native-firebase/firestore';
5
- import './card.constants-DhKFipX3.mjs';
6
-
7
- interface SetWithId extends Set {
8
- id: string;
9
- }
10
- interface Set {
11
- id: string;
12
- language: string;
13
- ownerName: string;
14
- weights: Record<string, number>;
15
- repeat?: number;
16
- voice?: string;
17
- averagePhraseLength?: number;
18
- passing_score?: number;
19
- organizations?: string[];
20
- description: string;
21
- image: {
22
- url: string;
23
- path: null | string;
24
- };
25
- additionalLanguages?: string[];
26
- owners: string[];
27
- name: string;
28
- content: string[];
29
- types: {
30
- [key in ActivityPageType]?: number;
31
- };
32
- defaultLanguage: string;
33
- createdAt: FieldValue;
34
- public: boolean;
35
- defaultRubricId?: string;
36
- difficulty?: string;
37
- end_screen?: {
38
- variant: 0 | 1 | 2;
39
- title: string;
40
- description: string;
41
- };
42
- mcAllowRetries?: boolean;
43
- welcome_screen?: {
44
- variant: 'colored' | 'blank';
45
- };
46
- poorFunctionalityWarning?: boolean;
47
- status?: 'draft' | 'published';
48
- subjects?: any[];
49
- respondAllowRetries?: boolean;
50
- respondAllowTTS?: boolean;
51
- feedbackLanguage?: string;
52
- respondMaxCharacters?: number;
53
- respondMaxTime?: number;
54
- }
55
-
56
- export { ActivityPageType, type Set, type SetWithId };
@@ -1,21 +0,0 @@
1
- declare const SPEAKABLE_NOTIFICATIONS: {
2
- readonly NEW_ASSIGNMENT: "new_assignment";
3
- readonly ASSESSMENT_SUBMITTED: "assessment_submitted";
4
- readonly ASSESSMENT_SCORED: "assessment_scored";
5
- readonly NEW_COMMENT: "NEW_COMMENT";
6
- };
7
- type SpeakableNotificationType = (typeof SPEAKABLE_NOTIFICATIONS)[keyof typeof SPEAKABLE_NOTIFICATIONS];
8
- declare const SpeakableNotificationTypes: {
9
- NEW_ASSIGNMENT: string;
10
- FEEDBACK_FROM_TEACHER: string;
11
- MESSAGE_FROM_STUDENT: string;
12
- PHRASE_MARKED_CORRECT: string;
13
- STUDENT_PROGRESS: string;
14
- PLAYLIST_FOLLOWERS: string;
15
- PLAYLIST_PLAYS: string;
16
- ASSESSMENT_SUBMITTED: string;
17
- ASSESSMENT_SCORED: string;
18
- NEW_COMMENT: string;
19
- };
20
-
21
- export { type SpeakableNotificationType as S, SPEAKABLE_NOTIFICATIONS as a, SpeakableNotificationTypes as b };
@@ -1,21 +0,0 @@
1
- declare const SPEAKABLE_NOTIFICATIONS: {
2
- readonly NEW_ASSIGNMENT: "new_assignment";
3
- readonly ASSESSMENT_SUBMITTED: "assessment_submitted";
4
- readonly ASSESSMENT_SCORED: "assessment_scored";
5
- readonly NEW_COMMENT: "NEW_COMMENT";
6
- };
7
- type SpeakableNotificationType = (typeof SPEAKABLE_NOTIFICATIONS)[keyof typeof SPEAKABLE_NOTIFICATIONS];
8
- declare const SpeakableNotificationTypes: {
9
- NEW_ASSIGNMENT: string;
10
- FEEDBACK_FROM_TEACHER: string;
11
- MESSAGE_FROM_STUDENT: string;
12
- PHRASE_MARKED_CORRECT: string;
13
- STUDENT_PROGRESS: string;
14
- PLAYLIST_FOLLOWERS: string;
15
- PLAYLIST_PLAYS: string;
16
- ASSESSMENT_SUBMITTED: string;
17
- ASSESSMENT_SCORED: string;
18
- NEW_COMMENT: string;
19
- };
20
-
21
- export { type SpeakableNotificationType as S, SPEAKABLE_NOTIFICATIONS as a, SpeakableNotificationTypes as b };
package/dist/repos.cjs DELETED
@@ -1,486 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/entry-points/repos.ts
31
- var repos_exports = {};
32
- __export(repos_exports, {
33
- createAssignmentRepo: () => createAssignmentRepo,
34
- createCardRepo: () => createCardRepo,
35
- createSetRepo: () => createSetRepo
36
- });
37
- module.exports = __toCommonJS(repos_exports);
38
-
39
- // src/utils/error-handler.ts
40
- var ServiceError = class extends Error {
41
- constructor(message, originalError, code) {
42
- super(message);
43
- this.originalError = originalError;
44
- this.code = code;
45
- this.name = "ServiceError";
46
- }
47
- };
48
- function withErrorHandler(fn, serviceName) {
49
- return async (...args) => {
50
- try {
51
- return await fn(...args);
52
- } catch (error) {
53
- if (error instanceof Error && "code" in error) {
54
- const firebaseError = error;
55
- throw new ServiceError(
56
- `Error in ${serviceName}: ${firebaseError.message}`,
57
- error,
58
- firebaseError.code
59
- );
60
- }
61
- if (error instanceof Error) {
62
- throw new ServiceError(`Error in ${serviceName}: ${error.message}`, error);
63
- }
64
- throw new ServiceError(`Unknown error in ${serviceName}`, error);
65
- }
66
- };
67
- }
68
-
69
- // src/lib/firebase/api.ts
70
- var FirebaseAPI = class _FirebaseAPI {
71
- // eslint-disable-next-line @typescript-eslint/no-empty-function
72
- constructor() {
73
- this.config = null;
74
- }
75
- static getInstance() {
76
- if (!_FirebaseAPI.instance) {
77
- _FirebaseAPI.instance = new _FirebaseAPI();
78
- }
79
- return _FirebaseAPI.instance;
80
- }
81
- initialize(config) {
82
- this.config = config;
83
- }
84
- get db() {
85
- if (!this.config) throw new Error("Firebase API not initialized");
86
- return this.config.db;
87
- }
88
- get helpers() {
89
- if (!this.config) throw new Error("Firebase API not initialized");
90
- return this.config.helpers;
91
- }
92
- get httpsCallable() {
93
- var _a;
94
- return (_a = this.config) == null ? void 0 : _a.httpsCallable;
95
- }
96
- logEvent(name, data) {
97
- var _a;
98
- (_a = this.config) == null ? void 0 : _a.logEvent(name, data);
99
- }
100
- accessQueryConstraints() {
101
- const { query, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment } = this.helpers;
102
- return {
103
- query,
104
- orderBy,
105
- limit,
106
- startAt,
107
- startAfter,
108
- endAt,
109
- endBefore,
110
- where,
111
- increment
112
- };
113
- }
114
- accessHelpers() {
115
- const { doc, collection, writeBatch, serverTimestamp, setDoc } = this.helpers;
116
- return {
117
- doc: (path) => doc(this.db, path),
118
- collection: (path) => collection(this.db, path),
119
- writeBatch: () => writeBatch(this.db),
120
- serverTimestamp,
121
- setDoc
122
- };
123
- }
124
- async getDoc(path) {
125
- const { getDoc, doc } = this.helpers;
126
- const docRef = doc(this.db, path);
127
- const docSnap = await getDoc(docRef);
128
- const data = docSnap.exists() ? {
129
- ...docSnap.data(),
130
- id: docSnap.id
131
- } : null;
132
- return {
133
- id: docSnap.id,
134
- data
135
- };
136
- }
137
- async getDocs(path, ...queryConstraints) {
138
- const { getDocs, query, collection } = this.helpers;
139
- const collectionRef = collection(this.db, path);
140
- const q = queryConstraints.length > 0 ? query(collectionRef, ...queryConstraints) : collectionRef;
141
- const querySnapshot = await getDocs(q);
142
- const data = querySnapshot.docs.map((doc) => ({
143
- data: doc.data(),
144
- id: doc.id
145
- }));
146
- return {
147
- data,
148
- querySnapshot,
149
- empty: querySnapshot.empty
150
- };
151
- }
152
- async addDoc(path, data) {
153
- const { addDoc, collection } = this.helpers;
154
- const collectionRef = collection(this.db, path);
155
- const docRef = await addDoc(collectionRef, data);
156
- return {
157
- ...data,
158
- id: docRef.id
159
- };
160
- }
161
- async setDoc(path, data, options = {}) {
162
- const { setDoc, doc } = this.helpers;
163
- const docRef = doc(this.db, path);
164
- await setDoc(docRef, data, options);
165
- }
166
- async updateDoc(path, data) {
167
- const { updateDoc, doc } = this.helpers;
168
- const docRef = doc(this.db, path);
169
- await updateDoc(docRef, data);
170
- }
171
- async deleteDoc(path) {
172
- const { deleteDoc, doc } = this.helpers;
173
- const docRef = doc(this.db, path);
174
- await deleteDoc(docRef);
175
- }
176
- async runTransaction(updateFunction) {
177
- const { runTransaction } = this.helpers;
178
- return runTransaction(this.db, updateFunction);
179
- }
180
- async runBatch(operations) {
181
- const { writeBatch } = this.helpers;
182
- const batch = writeBatch(this.db);
183
- await Promise.all(operations.map((op) => op()));
184
- await batch.commit();
185
- }
186
- writeBatch() {
187
- const { writeBatch } = this.helpers;
188
- const batch = writeBatch(this.db);
189
- return batch;
190
- }
191
- };
192
- var api = FirebaseAPI.getInstance();
193
-
194
- // src/domains/assignment/assignment.constants.ts
195
- var ASSIGNMENT_ANALYTICS_TYPES = [
196
- "macro" /* Macro */,
197
- "gradebook" /* Gradebook */,
198
- "cards" /* Cards */,
199
- "student" /* Student */,
200
- "student_summary" /* StudentSummary */
201
- ];
202
- var ASSIGNMENTS_COLLECTION = "assignments";
203
- var ANALYTICS_SUBCOLLECTION = "analytics";
204
- var SCORES_SUBCOLLECTION = "scores";
205
- var refsAssignmentFiresotre = {
206
- allAssignments: () => ASSIGNMENTS_COLLECTION,
207
- assignment: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}`,
208
- assignmentAllAnalytics: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}`,
209
- assignmentAnalytics: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}/${params.type}`,
210
- assignmentScores: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${SCORES_SUBCOLLECTION}/${params.userId}`
211
- };
212
-
213
- // src/domains/assignment/services/get-assignments-score.service.ts
214
- var _getAssignmentScores = async ({
215
- assignmentId,
216
- analyticType = "macro" /* Macro */,
217
- studentId,
218
- currentUserId
219
- }) => {
220
- if (analyticType === "student" /* Student */) {
221
- const path = refsAssignmentFiresotre.assignmentScores({
222
- id: assignmentId,
223
- userId: currentUserId
224
- });
225
- const response = await api.getDoc(path);
226
- return { scores: response.data, id: assignmentId };
227
- }
228
- if (analyticType === "student_summary" /* StudentSummary */ && studentId) {
229
- const path = refsAssignmentFiresotre.assignmentScores({
230
- id: assignmentId,
231
- userId: studentId
232
- });
233
- const response = await api.getDoc(path);
234
- return { scores: response.data, id: assignmentId };
235
- }
236
- if (analyticType !== "all" /* All */ && ASSIGNMENT_ANALYTICS_TYPES.includes(analyticType)) {
237
- const ref = refsAssignmentFiresotre.assignmentAnalytics({
238
- id: assignmentId,
239
- type: analyticType
240
- });
241
- const docData = await api.getDoc(ref);
242
- return { scores: docData.data, id: assignmentId };
243
- } else if (analyticType === "all" /* All */) {
244
- const ref = refsAssignmentFiresotre.assignmentAllAnalytics({ id: assignmentId });
245
- const response = await api.getDocs(ref);
246
- const data = response.data.reduce((acc, curr) => {
247
- acc[curr.id] = curr;
248
- return acc;
249
- }, {});
250
- return { scores: data, id: assignmentId };
251
- }
252
- };
253
- var getAssignmentScores = withErrorHandler(_getAssignmentScores, "getAssignmentScores");
254
-
255
- // src/domains/assignment/services/attach-score-assignment.service.ts
256
- var _attachScoresAssignment = async ({
257
- assignments,
258
- analyticType,
259
- studentId,
260
- currentUserId
261
- }) => {
262
- const scoresPromises = assignments.map((a) => {
263
- return getAssignmentScores({
264
- assignmentId: a.id,
265
- analyticType,
266
- studentId,
267
- currentUserId
268
- });
269
- });
270
- const scores = await Promise.all(scoresPromises);
271
- const scoresObject = scores.reduce((acc, curr) => {
272
- acc[curr.id] = curr.scores;
273
- return acc;
274
- }, {});
275
- const assignmentsWithScores = assignments.map((a) => {
276
- var _a;
277
- return {
278
- ...a,
279
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/ban-ts-comment
280
- // @ts-ignore
281
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
282
- scores: (_a = scoresObject[a.id]) != null ? _a : null
283
- };
284
- });
285
- return assignmentsWithScores;
286
- };
287
- var attachScoresAssignment = withErrorHandler(
288
- _attachScoresAssignment,
289
- "attachScoresAssignment"
290
- );
291
-
292
- // src/domains/assignment/services/get-all-assignment.service.ts
293
- async function _getAllAssignments() {
294
- const path = refsAssignmentFiresotre.allAssignments();
295
- const response = await api.getDocs(path);
296
- return response.data;
297
- }
298
- var getAllAssignments = withErrorHandler(_getAllAssignments, "getAllAssignments");
299
-
300
- // src/domains/assignment/utils/check-assignment-availability.ts
301
- var import_dayjs = __toESM(require("dayjs"));
302
- var checkAssignmentAvailability = (scheduledTime) => {
303
- if (!scheduledTime) return true;
304
- const scheduledDate = typeof scheduledTime === "string" ? (0, import_dayjs.default)(scheduledTime) : (0, import_dayjs.default)(scheduledTime.toDate());
305
- if (!scheduledDate.isValid()) return true;
306
- return (0, import_dayjs.default)().isAfter(scheduledDate);
307
- };
308
-
309
- // src/domains/assignment/services/get-assignment.service.ts
310
- async function _getAssignment(params) {
311
- var _a;
312
- const path = refsAssignmentFiresotre.assignment({ id: params.assignmentId });
313
- const response = await api.getDoc(path);
314
- if (!response.data) return null;
315
- const assignment = response.data;
316
- const isAvailable = checkAssignmentAvailability(assignment.scheduledTime);
317
- const assignmentWithId = {
318
- ...assignment,
319
- isAvailable,
320
- id: params.assignmentId,
321
- scheduledTime: (_a = assignment.scheduledTime) != null ? _a : null
322
- };
323
- if (params.analyticType) {
324
- const assignmentsWithScores = await attachScoresAssignment({
325
- assignments: [assignmentWithId],
326
- analyticType: params.analyticType,
327
- currentUserId: params.currentUserId
328
- });
329
- return assignmentsWithScores.length > 0 ? assignmentsWithScores[0] : assignmentWithId;
330
- }
331
- return assignmentWithId;
332
- }
333
- var getAssignment = withErrorHandler(_getAssignment, "getAssignment");
334
-
335
- // src/domains/assignment/assignment.repo.ts
336
- var createAssignmentRepo = () => {
337
- return {
338
- getAssignment,
339
- attachScoresAssignment,
340
- getAssignmentScores,
341
- getAllAssignments
342
- };
343
- };
344
-
345
- // src/domains/cards/services/create-card.service.ts
346
- var import_uuid = require("uuid");
347
-
348
- // src/domains/cards/card.constants.ts
349
- var CARDS_COLLECTION = "flashcards";
350
- var refsCardsFiresotre = {
351
- allCards: CARDS_COLLECTION,
352
- card: (id) => `${CARDS_COLLECTION}/${id}`
353
- };
354
-
355
- // src/utils/text-utils.ts
356
- var import_js_sha1 = __toESM(require("js-sha1"));
357
- var purify = (word) => {
358
- return word.normalize("NFD").replace(/\/([^" "]*)/g, "").replace(/\([^()]*\)/g, "").replace(/([^()]*)/g, "").replace(/[\u0300-\u036f]/g, "").replace(/[-]/g, " ").replace(/[.,/#!¡¿?؟。,.?$%^&*;:{}=\-_`~()’'…\s]/g, "").replace(/\s\s+/g, " ").toLowerCase().trim();
359
- };
360
- var cleanString = (words) => {
361
- const splitWords = words == null ? void 0 : words.split("+");
362
- if (splitWords && splitWords.length === 1) {
363
- const newWord = purify(words);
364
- return newWord;
365
- } else if (splitWords && splitWords.length > 1) {
366
- const split = splitWords.map((w) => purify(w));
367
- return split;
368
- } else {
369
- return "";
370
- }
371
- };
372
- var getWordHash = (word, language) => {
373
- const cleanedWord = cleanString(word);
374
- const wordHash = (0, import_js_sha1.default)(`${language}-${cleanedWord}`);
375
- console.log("wordHash core library", wordHash);
376
- return wordHash;
377
- };
378
-
379
- // src/domains/cards/services/get-card-verification-status.service.ts
380
- var charactarLanguages = ["zh", "ja", "ko"];
381
- var getVerificationStatus = async (target_text, language) => {
382
- if ((target_text == null ? void 0 : target_text.length) < 3 && !charactarLanguages.includes(language)) {
383
- return "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
384
- }
385
- const hash = getWordHash(target_text, language);
386
- const response = await api.getDoc(`checked-pronunciations/${hash}`);
387
- try {
388
- if (response.data) {
389
- return processRecord(response.data);
390
- } else {
391
- return "NOT_CHECKED" /* NOT_CHECKED */;
392
- }
393
- } catch (e) {
394
- return "NOT_CHECKED" /* NOT_CHECKED */;
395
- }
396
- };
397
- var processRecord = (data) => {
398
- const { pronunciations = 0, fails = 0 } = data;
399
- const attempts = pronunciations + fails;
400
- const successRate = attempts > 0 ? pronunciations / attempts * 100 : 0;
401
- let newStatus = null;
402
- if (attempts < 6) {
403
- return "NOT_CHECKED" /* NOT_CHECKED */;
404
- }
405
- if (successRate > 25) {
406
- newStatus = "VERIFIED" /* VERIFIED */;
407
- } else if (successRate > 10) {
408
- newStatus = "WARNING" /* WARNING */;
409
- } else if (fails > 20 && successRate < 10 && pronunciations > 1) {
410
- newStatus = "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
411
- } else if (pronunciations === 0 && fails > 20) {
412
- newStatus = "NOT_WORKING" /* NOT_WORKING */;
413
- } else {
414
- newStatus = "NOT_CHECKED" /* NOT_CHECKED */;
415
- }
416
- return newStatus;
417
- };
418
-
419
- // src/domains/cards/services/create-card.service.ts
420
- async function _createCard({ data }) {
421
- const response = await api.addDoc(refsCardsFiresotre.allCards, data);
422
- return response;
423
- }
424
- var createCard = withErrorHandler(_createCard, "createCard");
425
- async function _createCards({ cards }) {
426
- const { writeBatch, doc } = api.accessHelpers();
427
- const batch = writeBatch();
428
- const cardsWithId = [];
429
- for (const card of cards) {
430
- const cardId = (0, import_uuid.v4)();
431
- const ref = doc(refsCardsFiresotre.card(cardId));
432
- const newCardObject = {
433
- ...card,
434
- id: cardId
435
- };
436
- if (card.type === "READ_REPEAT" /* READ_REPEAT */ && card.target_text && card.language) {
437
- const verificationStatus = await getVerificationStatus(card.target_text, card.language);
438
- newCardObject.verificationStatus = verificationStatus || null;
439
- }
440
- cardsWithId.push(newCardObject);
441
- batch.set(ref, newCardObject);
442
- }
443
- await batch.commit();
444
- return cardsWithId;
445
- }
446
- var createCards = withErrorHandler(_createCards, "createCards");
447
-
448
- // src/domains/cards/services/get-card.service.ts
449
- async function _getCard(params) {
450
- const ref = refsCardsFiresotre.card(params.cardId);
451
- const response = await api.getDoc(ref);
452
- if (!response.data) return null;
453
- return response.data;
454
- }
455
- var getCard = withErrorHandler(_getCard, "getCard");
456
-
457
- // src/domains/cards/card.repo.ts
458
- var createCardRepo = () => {
459
- return {
460
- createCard,
461
- createCards,
462
- getCard
463
- };
464
- };
465
-
466
- // src/domains/sets/set.constants.ts
467
- var SETS_COLLECTION = "sets";
468
- var refsSetsFirestore = {
469
- allSets: SETS_COLLECTION,
470
- set: (id) => `${SETS_COLLECTION}/${id}`
471
- };
472
-
473
- // src/domains/sets/services/get-set.service.ts
474
- async function _getSet({ setId }) {
475
- const response = await api.getDoc(refsSetsFirestore.set(setId));
476
- return response.data;
477
- }
478
- var getSet = withErrorHandler(_getSet, "getSet");
479
-
480
- // src/domains/sets/set.repo.ts
481
- var createSetRepo = () => {
482
- return {
483
- getSet
484
- };
485
- };
486
- //# sourceMappingURL=repos.cjs.map