chronolizer 0.1.0 → 0.3.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 (62) hide show
  1. package/README.md +184 -119
  2. package/dist/ast/constructors.d.mts +135 -0
  3. package/dist/ast/constructors.mjs +25 -0
  4. package/dist/ast/fold.d.mts +13 -0
  5. package/dist/ast/fold.mjs +58 -0
  6. package/dist/ast/normalize.d.mts +42 -0
  7. package/dist/ast/normalize.mjs +34 -0
  8. package/dist/ast/schemas.d.mts +80 -0
  9. package/dist/ast/schemas.mjs +65 -0
  10. package/dist/filter/codec.d.mts +92 -0
  11. package/dist/filter/codec.mjs +48 -0
  12. package/dist/filter/errors.d.mts +14 -0
  13. package/dist/filter/errors.mjs +10 -0
  14. package/dist/filter/expression.d.mts +8 -0
  15. package/dist/filter/expression.mjs +76 -0
  16. package/dist/filter/schema.d.mts +13 -0
  17. package/dist/filter/schema.mjs +11 -0
  18. package/dist/filter/transformation.d.mts +37 -0
  19. package/dist/filter/transformation.mjs +20 -0
  20. package/dist/index.d.mts +22 -969
  21. package/dist/index.mjs +22 -2305
  22. package/dist/language/errors.d.mts +38 -0
  23. package/dist/language/errors.mjs +30 -0
  24. package/dist/language/model.d.mts +239 -0
  25. package/dist/language/model.mjs +50 -0
  26. package/dist/language/registry.d.mts +17 -0
  27. package/dist/language/registry.mjs +116 -0
  28. package/dist/locales/cs.d.mts +10 -0
  29. package/dist/locales/cs.mjs +746 -0
  30. package/dist/locales/de.d.mts +10 -0
  31. package/dist/locales/de.mjs +1039 -0
  32. package/dist/locales/en.d.mts +10 -0
  33. package/dist/locales/en.mjs +598 -0
  34. package/dist/locales/es.d.mts +10 -0
  35. package/dist/locales/es.mjs +908 -0
  36. package/dist/locales/fr.d.mts +10 -0
  37. package/dist/locales/fr.mjs +901 -0
  38. package/dist/locales/nl.d.mts +10 -0
  39. package/dist/locales/nl.mjs +791 -0
  40. package/dist/locales/pl.d.mts +10 -0
  41. package/dist/locales/pl.mjs +885 -0
  42. package/dist/locales/shared.mjs +395 -0
  43. package/dist/locales/tr.d.mts +10 -0
  44. package/dist/locales/tr.mjs +725 -0
  45. package/dist/natural/correction.d.mts +13 -0
  46. package/dist/natural/correction.mjs +73 -0
  47. package/dist/natural/format.d.mts +47 -0
  48. package/dist/natural/format.mjs +14 -0
  49. package/dist/natural/parse.d.mts +99 -0
  50. package/dist/natural/parse.mjs +66 -0
  51. package/dist/natural/policy.mjs +6 -0
  52. package/dist/natural/suggest.d.mts +53 -0
  53. package/dist/natural/suggest.mjs +24 -0
  54. package/dist/natural/suggestion.d.mts +4 -0
  55. package/dist/natural/suggestion.mjs +79 -0
  56. package/dist/natural/text.d.mts +5 -0
  57. package/dist/natural/text.mjs +5 -0
  58. package/dist/resolve/resolve.d.mts +79 -0
  59. package/dist/resolve/resolve.mjs +58 -0
  60. package/dist/resolve/schema.d.mts +59 -0
  61. package/dist/resolve/schema.mjs +28 -0
  62. package/package.json +15 -3
@@ -0,0 +1,38 @@
1
+ import { Schema } from "effect";
2
+ //#region src/language/errors.d.ts
3
+ declare const UnsupportedLocaleError_base: Schema.Class<UnsupportedLocaleError, Schema.TaggedStruct<"UnsupportedLocaleError", {
4
+ readonly locale: Schema.String;
5
+ }>, import("effect/Cause").YieldableError>;
6
+ declare class UnsupportedLocaleError extends UnsupportedLocaleError_base {}
7
+ declare const LanguageConflictError_base: Schema.Class<LanguageConflictError, Schema.TaggedStruct<"LanguageConflictError", {
8
+ readonly locale: Schema.String;
9
+ readonly firstPluginId: Schema.String;
10
+ readonly secondPluginId: Schema.String;
11
+ readonly message: Schema.String;
12
+ }>, import("effect/Cause").YieldableError>;
13
+ declare class LanguageConflictError extends LanguageConflictError_base {}
14
+ declare const LanguageRegistrationError_base: Schema.Class<LanguageRegistrationError, Schema.TaggedStruct<"LanguageRegistrationError", {
15
+ readonly pluginId: Schema.String;
16
+ readonly locale: Schema.String;
17
+ readonly message: Schema.String;
18
+ }>, import("effect/Cause").YieldableError>;
19
+ declare class LanguageRegistrationError extends LanguageRegistrationError_base {}
20
+ declare const NaturalLanguageParseError_base: Schema.Class<NaturalLanguageParseError, Schema.TaggedStruct<"NaturalLanguageParseError", {
21
+ readonly input: Schema.String;
22
+ readonly locale: Schema.String;
23
+ readonly message: Schema.String;
24
+ }>, import("effect/Cause").YieldableError>;
25
+ declare class NaturalLanguageParseError extends NaturalLanguageParseError_base {}
26
+ declare const AmbiguousNaturalLanguageError_base: Schema.Class<AmbiguousNaturalLanguageError, Schema.TaggedStruct<"AmbiguousNaturalLanguageError", {
27
+ readonly input: Schema.String;
28
+ readonly locale: Schema.String;
29
+ readonly alternatives: Schema.$Array<Schema.String>;
30
+ }>, import("effect/Cause").YieldableError>;
31
+ declare class AmbiguousNaturalLanguageError extends AmbiguousNaturalLanguageError_base {}
32
+ declare const NaturalLanguageRenderError_base: Schema.Class<NaturalLanguageRenderError, Schema.TaggedStruct<"NaturalLanguageRenderError", {
33
+ readonly locale: Schema.String;
34
+ readonly message: Schema.String;
35
+ }>, import("effect/Cause").YieldableError>;
36
+ declare class NaturalLanguageRenderError extends NaturalLanguageRenderError_base {}
37
+ //#endregion
38
+ export { AmbiguousNaturalLanguageError, LanguageConflictError, LanguageRegistrationError, NaturalLanguageParseError, NaturalLanguageRenderError, UnsupportedLocaleError };
@@ -0,0 +1,30 @@
1
+ import { Schema } from "effect";
2
+ //#region src/language/errors.ts
3
+ var UnsupportedLocaleError = class extends Schema.TaggedError()("UnsupportedLocaleError", { locale: Schema.String }) {};
4
+ var LanguageConflictError = class extends Schema.TaggedError()("LanguageConflictError", {
5
+ locale: Schema.String,
6
+ firstPluginId: Schema.String,
7
+ secondPluginId: Schema.String,
8
+ message: Schema.String
9
+ }) {};
10
+ var LanguageRegistrationError = class extends Schema.TaggedError()("LanguageRegistrationError", {
11
+ pluginId: Schema.String,
12
+ locale: Schema.String,
13
+ message: Schema.String
14
+ }) {};
15
+ var NaturalLanguageParseError = class extends Schema.TaggedError()("NaturalLanguageParseError", {
16
+ input: Schema.String,
17
+ locale: Schema.String,
18
+ message: Schema.String
19
+ }) {};
20
+ var AmbiguousNaturalLanguageError = class extends Schema.TaggedError()("AmbiguousNaturalLanguageError", {
21
+ input: Schema.String,
22
+ locale: Schema.String,
23
+ alternatives: Schema.Array(Schema.String)
24
+ }) {};
25
+ var NaturalLanguageRenderError = class extends Schema.TaggedError()("NaturalLanguageRenderError", {
26
+ locale: Schema.String,
27
+ message: Schema.String
28
+ }) {};
29
+ //#endregion
30
+ export { AmbiguousNaturalLanguageError, LanguageConflictError, LanguageRegistrationError, NaturalLanguageParseError, NaturalLanguageRenderError, UnsupportedLocaleError };
@@ -0,0 +1,239 @@
1
+ import { DateRangeExpr, InstantExpr } from "../ast/schemas.mjs";
2
+ import { LanguageConflictError, LanguageRegistrationError } from "./errors.mjs";
3
+ import { Effect, Option, Schema, Scope } from "effect";
4
+ //#region src/language/model.d.ts
5
+ declare const ParseQuality: Schema.Literals<readonly ["exact", "corrected", "ambiguous"]>;
6
+ type ParseQuality = typeof ParseQuality.Type;
7
+ declare const Correction: Schema.Struct<{
8
+ readonly original: Schema.String;
9
+ readonly replacement: Schema.String;
10
+ readonly distance: Schema.Int;
11
+ readonly offset: Schema.Int;
12
+ }>;
13
+ type Correction = typeof Correction.Type;
14
+ declare const NaturalCorrectionCandidate: Schema.Struct<{
15
+ readonly text: Schema.String;
16
+ readonly corrections: Schema.$Array<Schema.Struct<{
17
+ readonly original: Schema.String;
18
+ readonly replacement: Schema.String;
19
+ readonly distance: Schema.Int;
20
+ readonly offset: Schema.Int;
21
+ }>>;
22
+ readonly cost: Schema.Int;
23
+ }>;
24
+ type NaturalCorrectionCandidate = typeof NaturalCorrectionCandidate.Type;
25
+ declare const NaturalCandidate: Schema.Struct<{
26
+ readonly range: Schema.Union<readonly [Schema.TaggedStruct<"DateRange", {
27
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
28
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
29
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
30
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
31
+ }>]>;
32
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
33
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
34
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
35
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
36
+ }>]>;
37
+ }>, Schema.TaggedStruct<"DateRange", {
38
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
39
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
40
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
41
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
42
+ }>]>;
43
+ readonly upper: Schema.optionalKey<Schema.Never>;
44
+ }>, Schema.TaggedStruct<"DateRange", {
45
+ readonly lower: Schema.optionalKey<Schema.Never>;
46
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
47
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
48
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
49
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
50
+ }>]>;
51
+ }>]>;
52
+ readonly canonical: Schema.String;
53
+ }>;
54
+ type NaturalCandidate = typeof NaturalCandidate.Type;
55
+ declare const NaturalAlternative: Schema.Struct<{
56
+ readonly range: Schema.Union<readonly [Schema.TaggedStruct<"DateRange", {
57
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
58
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
59
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
60
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
61
+ }>]>;
62
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
63
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
64
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
65
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
66
+ }>]>;
67
+ }>, Schema.TaggedStruct<"DateRange", {
68
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
69
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
70
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
71
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
72
+ }>]>;
73
+ readonly upper: Schema.optionalKey<Schema.Never>;
74
+ }>, Schema.TaggedStruct<"DateRange", {
75
+ readonly lower: Schema.optionalKey<Schema.Never>;
76
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
77
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
78
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
79
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
80
+ }>]>;
81
+ }>]>;
82
+ readonly canonical: Schema.String;
83
+ }>;
84
+ type NaturalAlternative = NaturalCandidate;
85
+ declare const NaturalParseResult: Schema.Struct<{
86
+ readonly range: Schema.Union<readonly [Schema.TaggedStruct<"DateRange", {
87
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
88
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
89
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
90
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
91
+ }>]>;
92
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
93
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
94
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
95
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
96
+ }>]>;
97
+ }>, Schema.TaggedStruct<"DateRange", {
98
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
99
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
100
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
101
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
102
+ }>]>;
103
+ readonly upper: Schema.optionalKey<Schema.Never>;
104
+ }>, Schema.TaggedStruct<"DateRange", {
105
+ readonly lower: Schema.optionalKey<Schema.Never>;
106
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
107
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
108
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
109
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
110
+ }>]>;
111
+ }>]>;
112
+ readonly quality: Schema.Literals<readonly ["exact", "corrected", "ambiguous"]>;
113
+ readonly corrections: Schema.$Array<Schema.Struct<{
114
+ readonly original: Schema.String;
115
+ readonly replacement: Schema.String;
116
+ readonly distance: Schema.Int;
117
+ readonly offset: Schema.Int;
118
+ }>>;
119
+ readonly alternatives: Schema.$Array<Schema.Struct<{
120
+ readonly range: Schema.Union<readonly [Schema.TaggedStruct<"DateRange", {
121
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
122
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
123
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
124
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
125
+ }>]>;
126
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
127
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
128
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
129
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
130
+ }>]>;
131
+ }>, Schema.TaggedStruct<"DateRange", {
132
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
133
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
134
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
135
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
136
+ }>]>;
137
+ readonly upper: Schema.optionalKey<Schema.Never>;
138
+ }>, Schema.TaggedStruct<"DateRange", {
139
+ readonly lower: Schema.optionalKey<Schema.Never>;
140
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
141
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
142
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
143
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
144
+ }>]>;
145
+ }>]>;
146
+ readonly canonical: Schema.String;
147
+ }>>;
148
+ }>;
149
+ type NaturalParseResult = typeof NaturalParseResult.Type;
150
+ declare const NaturalSuggestion: Schema.Struct<{
151
+ readonly text: Schema.String;
152
+ readonly range: Schema.Union<readonly [Schema.TaggedStruct<"DateRange", {
153
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
154
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
155
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
156
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
157
+ }>]>;
158
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
159
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
160
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
161
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
162
+ }>]>;
163
+ }>, Schema.TaggedStruct<"DateRange", {
164
+ readonly lower: Schema.Union<readonly [Schema.TaggedStruct<"GreaterThan", {
165
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
166
+ }>, Schema.TaggedStruct<"GreaterThanOrEqual", {
167
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
168
+ }>]>;
169
+ readonly upper: Schema.optionalKey<Schema.Never>;
170
+ }>, Schema.TaggedStruct<"DateRange", {
171
+ readonly lower: Schema.optionalKey<Schema.Never>;
172
+ readonly upper: Schema.Union<readonly [Schema.TaggedStruct<"LessThan", {
173
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
174
+ }>, Schema.TaggedStruct<"LessThanOrEqual", {
175
+ readonly value: Schema.Codec<InstantExpr, InstantExpr, never, never>;
176
+ }>]>;
177
+ }>]>;
178
+ }>;
179
+ type NaturalSuggestion = typeof NaturalSuggestion.Type;
180
+ declare const BaseLanguageContribution_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Readonly<A> & {
181
+ readonly _tag: "BaseLanguage";
182
+ } & import("effect/Pipeable").Pipeable;
183
+ declare class BaseLanguageContribution extends BaseLanguageContribution_base<{
184
+ readonly locale: string;
185
+ readonly vocabulary: ReadonlyArray<string>;
186
+ readonly normalize?: (input: string, locale: string) => string;
187
+ readonly correct?: (input: string, vocabulary: ReadonlyArray<string>) => ReadonlyArray<NaturalCorrectionCandidate>;
188
+ readonly parseExact: (input: string) => Option.Option<NaturalCandidate>;
189
+ readonly suggest?: (input: string, limit: number) => ReadonlyArray<string>;
190
+ readonly render: (range: DateRangeExpr) => Option.Option<string>;
191
+ }> {}
192
+ declare const LanguageExtensionContribution_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Readonly<A> & {
193
+ readonly _tag: "LanguageExtension";
194
+ } & import("effect/Pipeable").Pipeable;
195
+ declare class LanguageExtensionContribution extends LanguageExtensionContribution_base<{
196
+ readonly locale: string;
197
+ readonly priority: number;
198
+ readonly vocabulary: ReadonlyArray<string>;
199
+ readonly parseExact: (input: string) => Option.Option<NaturalCandidate>;
200
+ readonly suggest?: (input: string, limit: number) => ReadonlyArray<string>;
201
+ }> {}
202
+ type LanguageContribution = BaseLanguageContribution | LanguageExtensionContribution;
203
+ declare const canonicalBaseLocale: (input: string) => Option.Option<string>;
204
+ declare const Locale: Schema.String;
205
+ declare const BaseLanguageMetadata: Schema.TaggedStruct<"BaseLanguage", {
206
+ readonly locale: Schema.String;
207
+ readonly vocabulary: Schema.$Array<Schema.String>;
208
+ }>;
209
+ declare const LanguageExtensionMetadata: Schema.TaggedStruct<"LanguageExtension", {
210
+ readonly locale: Schema.String;
211
+ readonly priority: Schema.Int;
212
+ readonly vocabulary: Schema.$Array<Schema.String>;
213
+ }>;
214
+ declare const LanguageContributionMetadata: Schema.Union<readonly [Schema.TaggedStruct<"BaseLanguage", {
215
+ readonly locale: Schema.String;
216
+ readonly vocabulary: Schema.$Array<Schema.String>;
217
+ }>, Schema.TaggedStruct<"LanguageExtension", {
218
+ readonly locale: Schema.String;
219
+ readonly priority: Schema.Int;
220
+ readonly vocabulary: Schema.$Array<Schema.String>;
221
+ }>]>;
222
+ interface LanguagePluginContext {
223
+ readonly register: (pluginId: string, contribution: LanguageContribution) => Effect.Effect<void, LanguageRegistrationError | LanguageConflictError, Scope.Scope>;
224
+ }
225
+ interface LanguagePlugin {
226
+ readonly id: string;
227
+ readonly effect: (context: LanguagePluginContext) => Effect.Effect<void, LanguageRegistrationError | LanguageConflictError, Scope.Scope>;
228
+ }
229
+ interface CompiledLanguage {
230
+ readonly locale: string;
231
+ readonly vocabulary: ReadonlyArray<string>;
232
+ readonly normalize: (input: string, locale: string) => string;
233
+ readonly correct: ((input: string, vocabulary: ReadonlyArray<string>) => ReadonlyArray<NaturalCorrectionCandidate>) | undefined;
234
+ readonly parseExact: (input: string) => ReadonlyArray<NaturalCandidate>;
235
+ readonly suggest: (input: string, limit: number) => ReadonlyArray<string>;
236
+ readonly render: (range: DateRangeExpr) => Option.Option<string>;
237
+ }
238
+ //#endregion
239
+ export { BaseLanguageContribution, BaseLanguageMetadata, CompiledLanguage, Correction, LanguageContribution, LanguageContributionMetadata, LanguageExtensionContribution, LanguageExtensionMetadata, LanguagePlugin, LanguagePluginContext, Locale, NaturalAlternative, NaturalCandidate, NaturalCorrectionCandidate, NaturalParseResult, NaturalSuggestion, ParseQuality, canonicalBaseLocale };
@@ -0,0 +1,50 @@
1
+ import { DateRangeExpr } from "../ast/schemas.mjs";
2
+ import { Data, Option, Result, Schema } from "effect";
3
+ //#region src/language/model.ts
4
+ const ParseQuality = Schema.Literals([
5
+ "exact",
6
+ "corrected",
7
+ "ambiguous"
8
+ ]);
9
+ const Correction = Schema.Struct({
10
+ original: Schema.String,
11
+ replacement: Schema.String,
12
+ distance: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),
13
+ offset: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))
14
+ });
15
+ const NaturalCorrectionCandidate = Schema.Struct({
16
+ text: Schema.String,
17
+ corrections: Schema.Array(Correction),
18
+ cost: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))
19
+ });
20
+ const NaturalCandidate = Schema.Struct({
21
+ range: DateRangeExpr,
22
+ canonical: Schema.String
23
+ });
24
+ const NaturalAlternative = NaturalCandidate;
25
+ const NaturalParseResult = Schema.Struct({
26
+ range: DateRangeExpr,
27
+ quality: ParseQuality,
28
+ corrections: Schema.Array(Correction),
29
+ alternatives: Schema.Array(NaturalAlternative)
30
+ });
31
+ const NaturalSuggestion = Schema.Struct({
32
+ text: Schema.String,
33
+ range: DateRangeExpr
34
+ });
35
+ var BaseLanguageContribution = class extends Data.TaggedClass("BaseLanguage") {};
36
+ var LanguageExtensionContribution = class extends Data.TaggedClass("LanguageExtension") {};
37
+ const canonicalBaseLocale = (input) => Result.getSuccess(Result.try(() => new Intl.Locale(input).baseName));
38
+ const Locale = Schema.String.check(Schema.makeFilter((value) => Option.contains(canonicalBaseLocale(value), value), { expected: "a canonical BCP 47 base locale identifier" })).annotate({ identifier: "Locale" });
39
+ const BaseLanguageMetadata = Schema.TaggedStruct("BaseLanguage", {
40
+ locale: Locale,
41
+ vocabulary: Schema.Array(Schema.String)
42
+ });
43
+ const LanguageExtensionMetadata = Schema.TaggedStruct("LanguageExtension", {
44
+ locale: Locale,
45
+ priority: Schema.Int,
46
+ vocabulary: Schema.Array(Schema.String)
47
+ });
48
+ const LanguageContributionMetadata = Schema.Union([BaseLanguageMetadata, LanguageExtensionMetadata]);
49
+ //#endregion
50
+ export { BaseLanguageContribution, BaseLanguageMetadata, Correction, LanguageContributionMetadata, LanguageExtensionContribution, LanguageExtensionMetadata, Locale, NaturalAlternative, NaturalCandidate, NaturalCorrectionCandidate, NaturalParseResult, NaturalSuggestion, ParseQuality, canonicalBaseLocale };
@@ -0,0 +1,17 @@
1
+ import { LanguageConflictError, LanguageRegistrationError, UnsupportedLocaleError } from "./errors.mjs";
2
+ import { CompiledLanguage, LanguageContribution, LanguagePlugin } from "./model.mjs";
3
+ import { Context, Effect, Layer, Scope } from "effect";
4
+ //#region src/language/registry.d.ts
5
+ declare namespace LanguageRegistry {
6
+ interface Service {
7
+ readonly register: (pluginId: string, contribution: LanguageContribution) => Effect.Effect<void, LanguageRegistrationError | LanguageConflictError, Scope.Scope>;
8
+ readonly resolve: (locale: string) => Effect.Effect<CompiledLanguage, UnsupportedLocaleError>;
9
+ }
10
+ }
11
+ declare const LanguageRegistry_base: Context.ServiceClass<LanguageRegistry, "chronolizer/LanguageRegistry", LanguageRegistry.Service>;
12
+ declare class LanguageRegistry extends LanguageRegistry_base {}
13
+ declare const LanguageRegistryLayer: Layer.Layer<LanguageRegistry, never, never>;
14
+ declare const languagePluginsLayer: (plugins: ReadonlyArray<LanguagePlugin>) => Layer.Layer<LanguageRegistry, LanguageConflictError | LanguageRegistrationError, never>;
15
+ declare const defineLanguagePlugin: (plugin: LanguagePlugin) => LanguagePlugin;
16
+ //#endregion
17
+ export { LanguageRegistry, LanguageRegistryLayer, defineLanguagePlugin, languagePluginsLayer };
@@ -0,0 +1,116 @@
1
+ import { LanguageConflictError, LanguageRegistrationError, UnsupportedLocaleError } from "./errors.mjs";
2
+ import { LanguageContributionMetadata, canonicalBaseLocale } from "./model.mjs";
3
+ import { normalizeNaturalText } from "../natural/text.mjs";
4
+ import { Array, Context, Effect, Layer, Match, Option, Order, Ref, Result, Schema } from "effect";
5
+ //#region src/language/registry.ts
6
+ var LanguageRegistry = class extends Context.Service()("chronolizer/LanguageRegistry") {};
7
+ const localeCandidates = (locale) => {
8
+ const candidates = [locale];
9
+ let parent = locale;
10
+ while (parent.includes("-")) {
11
+ parent = parent.slice(0, parent.lastIndexOf("-"));
12
+ candidates.push(parent);
13
+ }
14
+ return candidates;
15
+ };
16
+ const compileLanguage = (locale, registered) => {
17
+ const locales = localeCandidates(locale);
18
+ const base = Array.sort(Array.filterMap(registered, (entry) => Match.valueTags(entry.contribution, {
19
+ BaseLanguage: (contribution) => locales.includes(contribution.locale) ? Result.succeed({
20
+ pluginId: entry.pluginId,
21
+ contribution
22
+ }) : Result.failVoid,
23
+ LanguageExtension: () => Result.failVoid
24
+ })), Order.mapInput(Order.Number, (entry) => locales.indexOf(entry.contribution.locale)))[0];
25
+ if (base === void 0) return Option.none();
26
+ const extensions = Array.sort(Array.filterMap(registered, (entry) => Match.valueTags(entry.contribution, {
27
+ BaseLanguage: () => Result.failVoid,
28
+ LanguageExtension: (contribution) => locales.includes(contribution.locale) ? Result.succeed({
29
+ pluginId: entry.pluginId,
30
+ contribution
31
+ }) : Result.failVoid
32
+ })), Order.combine(Order.mapInput(Order.flip(Order.Number), (entry) => entry.contribution.priority), Order.mapInput(Order.String, (entry) => entry.pluginId)));
33
+ const vocabulary = Object.freeze(Array.dedupe([...base.contribution.vocabulary, ...Array.flatMap(extensions, (entry) => entry.contribution.vocabulary)]));
34
+ const parsers = Object.freeze([...extensions.map((entry) => entry.contribution.parseExact), base.contribution.parseExact]);
35
+ const suggesters = Object.freeze([...extensions.map((entry) => entry.contribution.suggest), base.contribution.suggest].filter((suggest) => suggest !== void 0));
36
+ const parseExact = (input) => Array.flatMap(parsers, (parser) => Option.toArray(parser(input)));
37
+ return Option.some(Object.freeze({
38
+ locale: base.contribution.locale,
39
+ vocabulary,
40
+ normalize: base.contribution.normalize ?? normalizeNaturalText,
41
+ correct: base.contribution.correct,
42
+ parseExact,
43
+ suggest: (input, limit) => Array.flatMap(suggesters, (suggest) => suggest(input, limit)),
44
+ render: base.contribution.render
45
+ }));
46
+ };
47
+ const createRegistry = Effect.fn(function* () {
48
+ const entries = yield* Ref.make([]);
49
+ const register = Effect.fn(function* (pluginId, contribution) {
50
+ if (pluginId.length === 0 || !Schema.is(LanguageContributionMetadata)(contribution)) return yield* new LanguageRegistrationError({
51
+ pluginId,
52
+ locale: contribution.locale,
53
+ message: "Invalid plugin identifier or contribution metadata"
54
+ });
55
+ const token = Symbol(pluginId);
56
+ yield* Effect.acquireRelease(Ref.modify(entries, (current) => {
57
+ const conflictingBase = Match.valueTags(contribution, {
58
+ BaseLanguage: (base) => Array.findFirst(current, (entry) => Match.valueTags(entry.contribution, {
59
+ BaseLanguage: (registeredBase) => registeredBase.locale === base.locale,
60
+ LanguageExtension: () => false
61
+ })),
62
+ LanguageExtension: () => Option.none()
63
+ });
64
+ return Option.match(conflictingBase, {
65
+ onNone: () => [Result.succeed(token), Array.append(current, {
66
+ token,
67
+ pluginId,
68
+ contribution
69
+ })],
70
+ onSome: (conflict) => [Result.fail(new LanguageConflictError({
71
+ locale: contribution.locale,
72
+ firstPluginId: conflict.pluginId,
73
+ secondPluginId: pluginId,
74
+ message: "Only one base language can be registered for a locale"
75
+ })), current]
76
+ });
77
+ }).pipe(Effect.flatMap((result) => Effect.fromResult(result))), (registeredToken) => Ref.update(entries, (items) => Array.filter(items, (entry) => entry.token !== registeredToken)));
78
+ });
79
+ const resolve = Effect.fn(function* (locale) {
80
+ const canonical = canonicalBaseLocale(locale);
81
+ if (Option.isSome(canonical)) {
82
+ const compiled = compileLanguage(canonical.value, yield* Ref.get(entries));
83
+ if (Option.isSome(compiled)) return compiled.value;
84
+ }
85
+ return yield* new UnsupportedLocaleError({ locale });
86
+ });
87
+ return LanguageRegistry.of({
88
+ register,
89
+ resolve
90
+ });
91
+ });
92
+ const LanguageRegistryLayer = Layer.effect(LanguageRegistry, createRegistry());
93
+ const duplicatePluginId = (plugins) => {
94
+ const ids = /* @__PURE__ */ new Set();
95
+ for (const plugin of plugins) {
96
+ if (ids.has(plugin.id)) return plugin.id;
97
+ ids.add(plugin.id);
98
+ }
99
+ };
100
+ const createPluginRegistry = Effect.fn(function* (plugins) {
101
+ const duplicate = duplicatePluginId(plugins);
102
+ if (duplicate !== void 0) return yield* new LanguageRegistrationError({
103
+ pluginId: duplicate,
104
+ locale: "*",
105
+ message: "Plugin identifiers must be unique"
106
+ });
107
+ const registry = yield* createRegistry();
108
+ const context = { register: registry.register };
109
+ const ordered = Array.sortWith(plugins, (plugin) => plugin.id, Order.String);
110
+ for (const plugin of ordered) yield* plugin.effect(context);
111
+ return registry;
112
+ });
113
+ const languagePluginsLayer = (plugins) => Layer.effect(LanguageRegistry, createPluginRegistry(plugins));
114
+ const defineLanguagePlugin = (plugin) => plugin;
115
+ //#endregion
116
+ export { LanguageRegistry, LanguageRegistryLayer, defineLanguagePlugin, languagePluginsLayer };
@@ -0,0 +1,10 @@
1
+ import { LanguageConflictError, LanguageRegistrationError } from "../language/errors.mjs";
2
+ import { BaseLanguageContribution, LanguagePlugin } from "../language/model.mjs";
3
+ import { LanguageRegistry } from "../language/registry.mjs";
4
+ import "../index.mjs";
5
+ //#region src/locales/cs.d.ts
6
+ declare const CzechContribution: BaseLanguageContribution;
7
+ declare const CzechLanguage: LanguagePlugin;
8
+ declare const CzechLanguageLayer: import("effect/Layer").Layer<LanguageRegistry, LanguageConflictError | LanguageRegistrationError, never>;
9
+ //#endregion
10
+ export { CzechContribution, CzechLanguage, CzechLanguageLayer };