@alstate/fsrs 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Alstate contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # `@alstate/fsrs`
2
+
3
+ Experimental first-party adapter from `ts-fsrs` to `@alstate/core`.
4
+
5
+ ```ts
6
+ import { FsrsAlgorithm } from "@alstate/fsrs";
7
+
8
+ const algorithm = new FsrsAlgorithm({ requestRetention: 0.9 });
9
+ ```
10
+
11
+ This package does not reimplement FSRS. It delegates scheduling to `ts-fsrs`
12
+ and owns the Alstate rating mapping, JSON persistence format and date
13
+ conversion.
14
+
15
+ MIT
@@ -0,0 +1,71 @@
1
+ import type { AlgorithmReview, AlgorithmState, JsonObject, LearningAlgorithm, ReviewPreview } from "@alstate/core";
2
+ export type FsrsStep = `${number}${"d" | "h" | "m"}`;
3
+ export interface FsrsOptions {
4
+ readonly requestRetention?: number;
5
+ readonly maximumInterval?: number;
6
+ readonly weights?: readonly number[];
7
+ readonly enableFuzz?: boolean;
8
+ readonly enableShortTerm?: boolean;
9
+ readonly learningSteps?: readonly FsrsStep[];
10
+ readonly relearningSteps?: readonly FsrsStep[];
11
+ }
12
+ export interface FsrsConfiguration extends JsonObject {
13
+ readonly request_retention: number;
14
+ readonly maximum_interval: number;
15
+ readonly w: readonly number[];
16
+ readonly enable_fuzz: boolean;
17
+ readonly enable_short_term: boolean;
18
+ readonly learning_steps: readonly FsrsStep[];
19
+ readonly relearning_steps: readonly FsrsStep[];
20
+ }
21
+ export interface FsrsState extends JsonObject {
22
+ readonly due: string;
23
+ readonly stability: number;
24
+ readonly difficulty: number;
25
+ readonly elapsed_days: number;
26
+ readonly scheduled_days: number;
27
+ readonly learning_steps: number;
28
+ readonly reps: number;
29
+ readonly lapses: number;
30
+ readonly state: number;
31
+ readonly last_review: string | null;
32
+ }
33
+ export interface FsrsReviewData extends JsonObject {
34
+ readonly rating: number;
35
+ readonly state: number;
36
+ readonly due: string;
37
+ readonly stability: number;
38
+ readonly difficulty: number;
39
+ readonly elapsed_days: number;
40
+ readonly last_elapsed_days: number;
41
+ readonly scheduled_days: number;
42
+ readonly learning_steps: number;
43
+ readonly review: string;
44
+ }
45
+ export declare class FsrsAlgorithm implements LearningAlgorithm<FsrsState, FsrsReviewData> {
46
+ #private;
47
+ readonly name = "FSRS";
48
+ readonly version: string;
49
+ readonly description = "Free Spaced Repetition Scheduler";
50
+ readonly ratings: readonly [Readonly<{
51
+ value: "again";
52
+ label: "Again";
53
+ }>, Readonly<{
54
+ value: "hard";
55
+ label: "Hard";
56
+ }>, Readonly<{
57
+ value: "good";
58
+ label: "Good";
59
+ }>, Readonly<{
60
+ value: "easy";
61
+ label: "Easy";
62
+ }>];
63
+ readonly configuration: FsrsConfiguration;
64
+ constructor(options?: FsrsOptions);
65
+ parse(data: JsonObject): FsrsState;
66
+ initialize(at: Date): AlgorithmState<FsrsState>;
67
+ preview(state: AlgorithmState<FsrsState>, at: Date): readonly ReviewPreview[];
68
+ review(state: AlgorithmState<FsrsState>, ratingValue: string, at: Date): AlgorithmReview<FsrsState, FsrsReviewData>;
69
+ private readCard;
70
+ }
71
+ //# sourceMappingURL=fsrs-algorithm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsrs-algorithm.d.ts","sourceRoot":"","sources":["../src/fsrs-algorithm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ import { FSRSVersion, Rating, State, TypeConvert, createEmptyCard, fsrs, generatorParameters, } from "ts-fsrs";
2
+ const ratings = Object.freeze([
3
+ Object.freeze({ value: "again", label: "Again" }),
4
+ Object.freeze({ value: "hard", label: "Hard" }),
5
+ Object.freeze({ value: "good", label: "Good" }),
6
+ Object.freeze({ value: "easy", label: "Easy" }),
7
+ ]);
8
+ const grades = Object.freeze({
9
+ again: Rating.Again,
10
+ hard: Rating.Hard,
11
+ good: Rating.Good,
12
+ easy: Rating.Easy,
13
+ });
14
+ export class FsrsAlgorithm {
15
+ name = "FSRS";
16
+ version = FSRSVersion;
17
+ description = "Free Spaced Repetition Scheduler";
18
+ ratings = ratings;
19
+ configuration;
20
+ #scheduler;
21
+ constructor(options = {}) {
22
+ const parameters = generatorParameters(toParameters(options));
23
+ this.#scheduler = fsrs(parameters);
24
+ this.configuration = serializeParameters(parameters);
25
+ }
26
+ parse(data) {
27
+ return parseState(data);
28
+ }
29
+ initialize(at) {
30
+ requireDate(at, "initialization time");
31
+ const card = createEmptyCard(at);
32
+ return Object.freeze({ dueAt: new Date(card.due), data: serializeCard(card) });
33
+ }
34
+ preview(state, at) {
35
+ requireDate(at, "review time");
36
+ const preview = this.#scheduler.repeat(this.readCard(state), at);
37
+ return Object.freeze(ratings.map((rating) => ({
38
+ rating,
39
+ dueAt: new Date(preview[grades[rating.value]].card.due),
40
+ })));
41
+ }
42
+ review(state, ratingValue, at) {
43
+ requireDate(at, "review time");
44
+ const rating = ratings.find((candidate) => candidate.value === ratingValue);
45
+ if (rating === undefined) {
46
+ throw new Error(`Unsupported FSRS rating '${ratingValue}'.`);
47
+ }
48
+ const result = this.#scheduler.next(this.readCard(state), at, grades[rating.value]);
49
+ return Object.freeze({
50
+ rating,
51
+ state: Object.freeze({
52
+ dueAt: new Date(result.card.due),
53
+ data: serializeCard(result.card),
54
+ }),
55
+ data: serializeReview(result.log),
56
+ });
57
+ }
58
+ readCard(state) {
59
+ const parsed = parseState(state.data);
60
+ const card = TypeConvert.card(toCardInput(parsed));
61
+ if (card.due.getTime() !== state.dueAt.getTime()) {
62
+ throw new Error("FSRS due projection does not match its stored card.");
63
+ }
64
+ return card;
65
+ }
66
+ }
67
+ function serializeCard(card) {
68
+ return Object.freeze({
69
+ due: card.due.toISOString(),
70
+ stability: card.stability,
71
+ difficulty: card.difficulty,
72
+ elapsed_days: card.elapsed_days,
73
+ scheduled_days: card.scheduled_days,
74
+ learning_steps: card.learning_steps,
75
+ reps: card.reps,
76
+ lapses: card.lapses,
77
+ state: card.state,
78
+ last_review: card.last_review?.toISOString() ?? null,
79
+ });
80
+ }
81
+ function parseState(data) {
82
+ const state = integer(data["state"], "state");
83
+ if (state < State.New || state > State.Relearning) {
84
+ throw new Error("FSRS state is outside the supported range.");
85
+ }
86
+ const lastReview = data["last_review"];
87
+ if (lastReview !== null && typeof lastReview !== "string") {
88
+ throw new Error("FSRS last_review must be an ISO date or null.");
89
+ }
90
+ return Object.freeze({
91
+ due: isoString(data["due"], "due"),
92
+ stability: finiteNumber(data["stability"], "stability"),
93
+ difficulty: finiteNumber(data["difficulty"], "difficulty"),
94
+ elapsed_days: integer(data["elapsed_days"], "elapsed_days"),
95
+ scheduled_days: integer(data["scheduled_days"], "scheduled_days"),
96
+ learning_steps: integer(data["learning_steps"], "learning_steps"),
97
+ reps: integer(data["reps"], "reps"),
98
+ lapses: integer(data["lapses"], "lapses"),
99
+ state,
100
+ last_review: lastReview === null ? null : isoString(lastReview, "last_review"),
101
+ });
102
+ }
103
+ function toCardInput(data) {
104
+ return {
105
+ due: data.due,
106
+ stability: data.stability,
107
+ difficulty: data.difficulty,
108
+ elapsed_days: data.elapsed_days,
109
+ scheduled_days: data.scheduled_days,
110
+ learning_steps: data.learning_steps,
111
+ reps: data.reps,
112
+ lapses: data.lapses,
113
+ state: data.state,
114
+ last_review: data.last_review,
115
+ };
116
+ }
117
+ function serializeReview(log) {
118
+ return Object.freeze({
119
+ rating: log.rating,
120
+ state: log.state,
121
+ due: log.due.toISOString(),
122
+ stability: log.stability,
123
+ difficulty: log.difficulty,
124
+ elapsed_days: log.elapsed_days,
125
+ last_elapsed_days: log.last_elapsed_days,
126
+ scheduled_days: log.scheduled_days,
127
+ learning_steps: log.learning_steps,
128
+ review: log.review.toISOString(),
129
+ });
130
+ }
131
+ function toParameters(options) {
132
+ return {
133
+ ...(options.requestRetention === undefined
134
+ ? {}
135
+ : { request_retention: options.requestRetention }),
136
+ ...(options.maximumInterval === undefined
137
+ ? {}
138
+ : { maximum_interval: options.maximumInterval }),
139
+ ...(options.weights === undefined ? {} : { w: [...options.weights] }),
140
+ ...(options.enableFuzz === undefined
141
+ ? {}
142
+ : { enable_fuzz: options.enableFuzz }),
143
+ ...(options.enableShortTerm === undefined
144
+ ? {}
145
+ : { enable_short_term: options.enableShortTerm }),
146
+ ...(options.learningSteps === undefined
147
+ ? {}
148
+ : { learning_steps: [...options.learningSteps] }),
149
+ ...(options.relearningSteps === undefined
150
+ ? {}
151
+ : { relearning_steps: [...options.relearningSteps] }),
152
+ };
153
+ }
154
+ function serializeParameters(parameters) {
155
+ return Object.freeze({
156
+ request_retention: parameters.request_retention,
157
+ maximum_interval: parameters.maximum_interval,
158
+ w: Object.freeze([...parameters.w]),
159
+ enable_fuzz: parameters.enable_fuzz,
160
+ enable_short_term: parameters.enable_short_term,
161
+ learning_steps: Object.freeze([...parameters.learning_steps]),
162
+ relearning_steps: Object.freeze([...parameters.relearning_steps]),
163
+ });
164
+ }
165
+ function finiteNumber(value, field) {
166
+ if (typeof value !== "number" || !Number.isFinite(value)) {
167
+ throw new Error(`FSRS ${field} must be a finite number.`);
168
+ }
169
+ return value;
170
+ }
171
+ function integer(value, field) {
172
+ const number = finiteNumber(value, field);
173
+ if (!Number.isSafeInteger(number) || number < 0) {
174
+ throw new Error(`FSRS ${field} must be a non-negative safe integer.`);
175
+ }
176
+ return number;
177
+ }
178
+ function isoString(value, field) {
179
+ if (typeof value !== "string") {
180
+ throw new Error(`FSRS ${field} must be an ISO date string.`);
181
+ }
182
+ const date = new Date(value);
183
+ requireDate(date, field);
184
+ return date.toISOString();
185
+ }
186
+ function requireDate(value, field) {
187
+ if (Number.isNaN(value.getTime())) {
188
+ throw new Error(`FSRS ${field} must be a valid date.`);
189
+ }
190
+ }
191
+ //# sourceMappingURL=fsrs-algorithm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsrs-algorithm.js","sourceRoot":"","sources":["../src/fsrs-algorithm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,MAAM,EACN,KAAK,EACL,WAAW,EACX,eAAe,EACf,IAAI,EACJ,mBAAmB,GAQpB,MAAM,SAAS,CAAC;AA4DjB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACjD,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACF,CAAC,CAAC;AAEjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC,IAAI;CACT,CAAC,CAAC;AAEZ,MAAM,OAAO,aAAa;IAGR,IAAI,GAAG,MAAM,CAAC;IACd,OAAO,GAAG,WAAW,CAAC;IACtB,WAAW,GAAG,kCAAkC,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC;IAClB,aAAa,CAAoB;IAExC,UAAU,CAAO;IAE1B,YAAmB,OAAO,GAAgB,EAAE;QAC1C,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,IAAgB;QAC3B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEM,UAAU,CAAC,EAAQ;QACxB,WAAW,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAEM,OAAO,CACZ,KAAgC,EAChC,EAAQ;QAER,WAAW,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,MAAM,CAClB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvB,MAAM;YACN,KAAK,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAEM,MAAM,CACX,KAAgC,EAChC,WAAmB,EACnB,EAAQ;QAER,WAAW,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;QAC5E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,WAAW,IAAI,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EACpB,EAAE,EACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAU,CAC9B,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;gBACnB,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBAChC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;aACjC,CAAC;YACF,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,KAAgC;QAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,aAAa,CAAC,IAAU;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI;KACrD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACvC,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QAClC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;QACvD,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;QAC1D,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;QAC3D,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACjE,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACjE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACnC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACzC,KAAK;QACL,WAAW,EACT,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC;KACpE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,IAAe;IAClC,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAc;QAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAc;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE;QAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;KACjC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,OAAoB;IACxC,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpD,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;YACvC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QACxC,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;YACvC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;QACnD,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAe,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;YACvC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAe,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA0B;IACrD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC,CAAwB;QACpF,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAwB;KACzF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAA4B,EAAE,KAAa;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,2BAA2B,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,KAA4B,EAAE,KAAa;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,uCAAuC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAA4B,EAAE,KAAa;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,8BAA8B,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,WAAW,CAAC,KAAW,EAAE,KAAa;IAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,wBAAwB,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./fsrs-algorithm.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./fsrs-algorithm.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@alstate/fsrs",
3
+ "version": "0.1.0",
4
+ "description": "First-party ts-fsrs adapter for Alstate.",
5
+ "keywords": ["learning", "scheduling", "fsrs", "spaced-repetition"],
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": ["dist", "README.md", "LICENSE"],
16
+ "sideEffects": false,
17
+ "scripts": {
18
+ "build": "tsc --project tsconfig.build.json",
19
+ "clean": "node --eval \"require('node:fs').rmSync('dist', { recursive: true, force: true }); require('node:fs').rmSync('.test-dist', { recursive: true, force: true })\"",
20
+ "test": "tsc --project tsconfig.test.json && node --test \".test-dist/test/**/*.test.js\"",
21
+ "typecheck": "tsc --project tsconfig.json --noEmit"
22
+ },
23
+ "dependencies": {
24
+ "@alstate/core": "0.1.0",
25
+ "ts-fsrs": "^5.4.1"
26
+ },
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/laiqfun/alstate.git",
31
+ "directory": "packages/fsrs"
32
+ },
33
+ "homepage": "https://github.com/laiqfun/alstate#readme",
34
+ "bugs": { "url": "https://github.com/laiqfun/alstate/issues" },
35
+ "publishConfig": { "access": "public" }
36
+ }