ponomar-ts 0.1.0-alpha.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 (94) hide show
  1. package/LICENSE +674 -0
  2. package/NOTICE.md +27 -0
  3. package/README.md +105 -0
  4. package/dist/core/calendar/jdate.d.ts +52 -0
  5. package/dist/core/calendar/jdate.d.ts.map +1 -0
  6. package/dist/core/calendar/jdate.js +151 -0
  7. package/dist/core/calendar/jdate.js.map +1 -0
  8. package/dist/core/calendar/pcalendar.d.ts +21 -0
  9. package/dist/core/calendar/pcalendar.d.ts.map +1 -0
  10. package/dist/core/calendar/pcalendar.js +33 -0
  11. package/dist/core/calendar/pcalendar.js.map +1 -0
  12. package/dist/core/dsl/eval.d.ts +10 -0
  13. package/dist/core/dsl/eval.d.ts.map +1 -0
  14. package/dist/core/dsl/eval.js +83 -0
  15. package/dist/core/dsl/eval.js.map +1 -0
  16. package/dist/core/dsl/index.d.ts +4 -0
  17. package/dist/core/dsl/index.d.ts.map +1 -0
  18. package/dist/core/dsl/index.js +4 -0
  19. package/dist/core/dsl/index.js.map +1 -0
  20. package/dist/core/dsl/lexer.d.ts +14 -0
  21. package/dist/core/dsl/lexer.d.ts.map +1 -0
  22. package/dist/core/dsl/lexer.js +121 -0
  23. package/dist/core/dsl/lexer.js.map +1 -0
  24. package/dist/core/dsl/parser.d.ts +25 -0
  25. package/dist/core/dsl/parser.d.ts.map +1 -0
  26. package/dist/core/dsl/parser.js +103 -0
  27. package/dist/core/dsl/parser.js.map +1 -0
  28. package/dist/data/divineLiturgy.d.ts +3 -0
  29. package/dist/data/divineLiturgy.d.ts.map +1 -0
  30. package/dist/data/divineLiturgy.js +80 -0
  31. package/dist/data/divineLiturgy.js.map +1 -0
  32. package/dist/data/index.d.ts +6 -0
  33. package/dist/data/index.d.ts.map +1 -0
  34. package/dist/data/index.js +8 -0
  35. package/dist/data/index.js.map +1 -0
  36. package/dist/data/menaion.d.ts +3 -0
  37. package/dist/data/menaion.d.ts.map +1 -0
  38. package/dist/data/menaion.js +18363 -0
  39. package/dist/data/menaion.js.map +1 -0
  40. package/dist/data/pentecostarion.d.ts +3 -0
  41. package/dist/data/pentecostarion.d.ts.map +1 -0
  42. package/dist/data/pentecostarion.js +4096 -0
  43. package/dist/data/pentecostarion.js.map +1 -0
  44. package/dist/data/triodion.d.ts +3 -0
  45. package/dist/data/triodion.d.ts.map +1 -0
  46. package/dist/data/triodion.js +841 -0
  47. package/dist/data/triodion.js.map +1 -0
  48. package/dist/data/types.d.ts +30 -0
  49. package/dist/data/types.d.ts.map +1 -0
  50. package/dist/data/types.js +5 -0
  51. package/dist/data/types.js.map +1 -0
  52. package/dist/engine/day.d.ts +23 -0
  53. package/dist/engine/day.d.ts.map +1 -0
  54. package/dist/engine/day.js +41 -0
  55. package/dist/engine/day.js.map +1 -0
  56. package/dist/engine/index.d.ts +20 -0
  57. package/dist/engine/index.d.ts.map +1 -0
  58. package/dist/engine/index.js +26 -0
  59. package/dist/engine/index.js.map +1 -0
  60. package/dist/engine/lookup.d.ts +7 -0
  61. package/dist/engine/lookup.d.ts.map +1 -0
  62. package/dist/engine/lookup.js +30 -0
  63. package/dist/engine/lookup.js.map +1 -0
  64. package/dist/engine/resolve.d.ts +15 -0
  65. package/dist/engine/resolve.d.ts.map +1 -0
  66. package/dist/engine/resolve.js +30 -0
  67. package/dist/engine/resolve.js.map +1 -0
  68. package/dist/index.d.ts +17 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +16 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/paschalion.d.ts +31 -0
  73. package/dist/paschalion.d.ts.map +1 -0
  74. package/dist/paschalion.js +60 -0
  75. package/dist/paschalion.js.map +1 -0
  76. package/package.json +89 -0
  77. package/src/core/calendar/jdate.ts +192 -0
  78. package/src/core/calendar/pcalendar.ts +47 -0
  79. package/src/core/dsl/eval.ts +94 -0
  80. package/src/core/dsl/index.ts +15 -0
  81. package/src/core/dsl/lexer.ts +121 -0
  82. package/src/core/dsl/parser.ts +148 -0
  83. package/src/data/divineLiturgy.ts +82 -0
  84. package/src/data/index.ts +8 -0
  85. package/src/data/menaion.ts +18365 -0
  86. package/src/data/pentecostarion.ts +4098 -0
  87. package/src/data/triodion.ts +843 -0
  88. package/src/data/types.ts +35 -0
  89. package/src/engine/day.ts +67 -0
  90. package/src/engine/index.ts +44 -0
  91. package/src/engine/lookup.ts +34 -0
  92. package/src/engine/resolve.ts +49 -0
  93. package/src/index.ts +17 -0
  94. package/src/paschalion.ts +80 -0
@@ -0,0 +1,121 @@
1
+ // Ported from Ponomar/StringOp.java (typiconman/ponomar) — tokenizer.
2
+ //
3
+ // The upstream Java `StringOp.eval` is a recursive text-splitting parser.
4
+ // This port tokenises first and then runs a Pratt parser, which yields the
5
+ // same semantics for well-formed expressions but tolerates arbitrary
6
+ // whitespace (upstream requires spaces around binary operators due to its
7
+ // `substring(0, n - 1)` / `substring(n + 2)` slicing).
8
+ export class LexError extends Error {
9
+ source;
10
+ pos;
11
+ constructor(message, source, pos) {
12
+ super(`${message} at position ${pos} in ${JSON.stringify(source)}`);
13
+ this.name = "LexError";
14
+ this.source = source;
15
+ this.pos = pos;
16
+ }
17
+ }
18
+ const SINGLE = {
19
+ "(": "LP",
20
+ ")": "RP",
21
+ "+": "PLUS",
22
+ "-": "MINUS",
23
+ "*": "STAR",
24
+ "/": "SLASH",
25
+ "%": "PERCENT",
26
+ };
27
+ export function tokenize(source) {
28
+ const out = [];
29
+ let i = 0;
30
+ const n = source.length;
31
+ while (i < n) {
32
+ const c = source[i];
33
+ if (c === " " || c === "\t" || c === "\n" || c === "\r") {
34
+ i++;
35
+ continue;
36
+ }
37
+ const start = i;
38
+ const two = source.slice(i, i + 2);
39
+ switch (two) {
40
+ case "==":
41
+ out.push({ kind: "EQ", text: two, pos: start });
42
+ i += 2;
43
+ continue;
44
+ case "!=":
45
+ out.push({ kind: "NE", text: two, pos: start });
46
+ i += 2;
47
+ continue;
48
+ case "<=":
49
+ out.push({ kind: "LE", text: two, pos: start });
50
+ i += 2;
51
+ continue;
52
+ case ">=":
53
+ out.push({ kind: "GE", text: two, pos: start });
54
+ i += 2;
55
+ continue;
56
+ case "&&":
57
+ out.push({ kind: "AND", text: two, pos: start });
58
+ i += 2;
59
+ continue;
60
+ case "||":
61
+ out.push({ kind: "OR", text: two, pos: start });
62
+ i += 2;
63
+ continue;
64
+ }
65
+ if (c === "<") {
66
+ out.push({ kind: "LT", text: "<", pos: start });
67
+ i++;
68
+ continue;
69
+ }
70
+ if (c === ">") {
71
+ out.push({ kind: "GT", text: ">", pos: start });
72
+ i++;
73
+ continue;
74
+ }
75
+ if (c === "!") {
76
+ out.push({ kind: "NOT", text: "!", pos: start });
77
+ i++;
78
+ continue;
79
+ }
80
+ const single = SINGLE[c];
81
+ if (single !== undefined) {
82
+ out.push({ kind: single, text: c, pos: start });
83
+ i++;
84
+ continue;
85
+ }
86
+ if (isDigit(c) || (c === "." && isDigit(source[i + 1] ?? ""))) {
87
+ let j = i;
88
+ while (j < n && isDigit(source[j]))
89
+ j++;
90
+ if (source[j] === ".") {
91
+ j++;
92
+ while (j < n && isDigit(source[j]))
93
+ j++;
94
+ }
95
+ out.push({ kind: "NUMBER", text: source.slice(i, j), pos: start });
96
+ i = j;
97
+ continue;
98
+ }
99
+ if (isIdentStart(c)) {
100
+ let j = i + 1;
101
+ while (j < n && isIdentPart(source[j]))
102
+ j++;
103
+ out.push({ kind: "IDENT", text: source.slice(i, j), pos: start });
104
+ i = j;
105
+ continue;
106
+ }
107
+ throw new LexError(`Unexpected character ${JSON.stringify(c)}`, source, i);
108
+ }
109
+ out.push({ kind: "EOF", text: "", pos: n });
110
+ return out;
111
+ }
112
+ function isDigit(c) {
113
+ return c >= "0" && c <= "9";
114
+ }
115
+ function isIdentStart(c) {
116
+ return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z") || c === "_";
117
+ }
118
+ function isIdentPart(c) {
119
+ return isIdentStart(c) || isDigit(c);
120
+ }
121
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../../src/core/dsl/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type BinaryOp = "||" | "&&" | "==" | "!=" | "<" | "<=" | ">" | ">=" | "+" | "-" | "*" | "/" | "%";
2
+ export type UnaryOp = "!" | "-";
3
+ export type Expr = {
4
+ readonly kind: "number";
5
+ readonly value: number;
6
+ } | {
7
+ readonly kind: "ident";
8
+ readonly name: string;
9
+ } | {
10
+ readonly kind: "unary";
11
+ readonly op: UnaryOp;
12
+ readonly operand: Expr;
13
+ } | {
14
+ readonly kind: "binary";
15
+ readonly op: BinaryOp;
16
+ readonly left: Expr;
17
+ readonly right: Expr;
18
+ };
19
+ export declare class ParseError extends Error {
20
+ readonly source: string;
21
+ readonly pos: number;
22
+ constructor(message: string, source: string, pos: number);
23
+ }
24
+ export declare function parse(source: string): Expr;
25
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/core/dsl/parser.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GACjB,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,CAAC;AAEP,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhC,MAAM,MAAM,IAAI,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GACxE;IACA,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACpB,CAAC;AAEL,qBAAa,UAAW,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAMxD;AAoBD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM1C"}
@@ -0,0 +1,103 @@
1
+ // Ported from Ponomar/StringOp.java (typiconman/ponomar) — Pratt parser.
2
+ //
3
+ // Precedence (low → high) matches the upstream recursive text-splitting
4
+ // evaluator, which splits on operators in exactly this order:
5
+ // ||, &&, == / !=, < / <= / > / >=, + / -, * / / / %, unary ! / -.
6
+ import { tokenize } from "./lexer.js";
7
+ export class ParseError extends Error {
8
+ source;
9
+ pos;
10
+ constructor(message, source, pos) {
11
+ super(`${message} at position ${pos} in ${JSON.stringify(source)}`);
12
+ this.name = "ParseError";
13
+ this.source = source;
14
+ this.pos = pos;
15
+ }
16
+ }
17
+ const INFIX = {
18
+ OR: { prec: 1, op: "||" },
19
+ AND: { prec: 2, op: "&&" },
20
+ EQ: { prec: 3, op: "==" },
21
+ NE: { prec: 3, op: "!=" },
22
+ LT: { prec: 4, op: "<" },
23
+ LE: { prec: 4, op: "<=" },
24
+ GT: { prec: 4, op: ">" },
25
+ GE: { prec: 4, op: ">=" },
26
+ PLUS: { prec: 5, op: "+" },
27
+ MINUS: { prec: 5, op: "-" },
28
+ STAR: { prec: 6, op: "*" },
29
+ SLASH: { prec: 6, op: "/" },
30
+ PERCENT: { prec: 6, op: "%" },
31
+ };
32
+ const UNARY_PREC = 7;
33
+ export function parse(source) {
34
+ const tokens = tokenize(source);
35
+ const p = new Parser(source, tokens);
36
+ const expr = p.parseExpr(0);
37
+ p.expect("EOF");
38
+ return expr;
39
+ }
40
+ class Parser {
41
+ i = 0;
42
+ source;
43
+ tokens;
44
+ constructor(source, tokens) {
45
+ this.source = source;
46
+ this.tokens = tokens;
47
+ }
48
+ parseExpr(minPrec) {
49
+ let left = this.parseUnary();
50
+ while (true) {
51
+ const tok = this.peek();
52
+ const inf = INFIX[tok.kind];
53
+ if (inf === undefined || inf.prec < minPrec)
54
+ break;
55
+ this.i++;
56
+ const right = this.parseExpr(inf.prec + 1);
57
+ left = { kind: "binary", op: inf.op, left, right };
58
+ }
59
+ return left;
60
+ }
61
+ parseUnary() {
62
+ const tok = this.peek();
63
+ if (tok.kind === "NOT") {
64
+ this.i++;
65
+ return { kind: "unary", op: "!", operand: this.parseExpr(UNARY_PREC) };
66
+ }
67
+ if (tok.kind === "MINUS") {
68
+ this.i++;
69
+ return { kind: "unary", op: "-", operand: this.parseExpr(UNARY_PREC) };
70
+ }
71
+ return this.parsePrimary();
72
+ }
73
+ parsePrimary() {
74
+ const tok = this.peek();
75
+ if (tok.kind === "NUMBER") {
76
+ this.i++;
77
+ return { kind: "number", value: Number(tok.text) };
78
+ }
79
+ if (tok.kind === "IDENT") {
80
+ this.i++;
81
+ return { kind: "ident", name: tok.text };
82
+ }
83
+ if (tok.kind === "LP") {
84
+ this.i++;
85
+ const inner = this.parseExpr(0);
86
+ this.expect("RP");
87
+ return inner;
88
+ }
89
+ throw new ParseError(`Expected expression, got ${tok.kind} ${JSON.stringify(tok.text)}`, this.source, tok.pos);
90
+ }
91
+ peek() {
92
+ return this.tokens[this.i];
93
+ }
94
+ expect(kind) {
95
+ const tok = this.peek();
96
+ if (tok.kind !== kind) {
97
+ throw new ParseError(`Expected ${kind}, got ${tok.kind} ${JSON.stringify(tok.text)}`, this.source, tok.pos);
98
+ }
99
+ this.i++;
100
+ return tok;
101
+ }
102
+ }
103
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/core/dsl/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "./types.ts";
2
+ export declare const DIVINE_LITURGY_COMMANDS: ReadonlyArray<Command>;
3
+ //# sourceMappingURL=divineLiturgy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divineLiturgy.d.ts","sourceRoot":"","sources":["../../src/data/divineLiturgy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,OAAO,CA2EjD,CAAC"}
@@ -0,0 +1,80 @@
1
+ // AUTO-GENERATED by scripts/codegen — DO NOT EDIT.
2
+ // Source: vendor/ponomar/Ponomar/languages/xml (git submodule).
3
+ // Regenerate with `npm run codegen`.
4
+ export const DIVINE_LITURGY_COMMANDS = [
5
+ {
6
+ "name": "Transfer",
7
+ "value": "nday >= 52 || nday < -55",
8
+ "cmd": "GS == 1",
9
+ "comment": "This determines whether the sequential readings may be skipped or transferred."
10
+ },
11
+ {
12
+ "name": "Transfer",
13
+ "value": "nday >= 52 || nday < -55",
14
+ "cmd": "GS == 0",
15
+ "comment": "This determines whether the sequential readings may be skipped or transferred."
16
+ },
17
+ {
18
+ "name": "Suppress",
19
+ "value": "doy == 4 && dow != 0 && dow != 6",
20
+ "cmd": "GS == 1",
21
+ "comment": "Eve of Theophany can have seq. readings on Sat. (see Table 25b, 2019) and on Sun. (see Table 24b, 2087)"
22
+ },
23
+ {
24
+ "name": "Suppress",
25
+ "value": "doy == 357 && dow != 6",
26
+ "cmd": "GS == 1",
27
+ "comment": "Eve of Nativity can have seq. readings on Sat. (see Table 27a, 2084)"
28
+ },
29
+ {
30
+ "name": "Suppress",
31
+ "value": "(doy == 358 || doy == 5)",
32
+ "comment": "Nativity and Theophany never have seq. readings"
33
+ },
34
+ {
35
+ "name": "Suppress",
36
+ "value": "(doy == 256 || doy == 217) && dow == 0",
37
+ "comment": "Suppress seq. readings if Exaltation or Transfiguration falls on Sunday"
38
+ },
39
+ {
40
+ "name": "Class3Transfers",
41
+ "value": "!(doy == 358 || doy == 357 || doy == 4 || doy == 5 || doy == 256 || doy == 217) && ((dRank >= 5 && dow != 0) || dRank == 8)",
42
+ "cmd": "GS == 1 || GS == 0"
43
+ },
44
+ {
45
+ "name": "Class3Transfers",
46
+ "value": "(doy == 3 && dow == 5) || (doy == 356 && dow == 5)",
47
+ "cmd": "GS == 1 || GS == 0",
48
+ "comment": "There is no Liturgy on Friday when the Royal Hours occur. The readings are moved to Thursday."
49
+ },
50
+ {
51
+ "name": "Class3Transfers",
52
+ "value": "(doy == 256 || doy == 217) && dow != 0",
53
+ "comment": "Exaltation and Transfiguration readings are only transferred if it's not a Sunday"
54
+ },
55
+ {
56
+ "name": "TransferRulesB",
57
+ "value": "dow != 0 && !(nday >= -63 && nday <= 0) && doy != 338",
58
+ "cmd": "GS == 1",
59
+ "comment": "This determines the rules used to transfer the readings to the previous day. Note that St. Nicholas's day has a special set of rules"
60
+ },
61
+ {
62
+ "name": "TransferRulesF",
63
+ "value": "!(nday >= -63 && nday <= 0) && (dow == 2 && doy != 339) || ((doy == 340 && (dow != 0 && dow != 2)))",
64
+ "cmd": "GS == 1",
65
+ "comment": "This determines the rules used to transfer the readings to the next day (forwards). Note that St. Nicholas's day has a special set of rules."
66
+ },
67
+ {
68
+ "name": "TransferRulesB",
69
+ "value": "dow != 0 && !(nday >= -63 && nday <= 0) && doy != 338",
70
+ "cmd": "GS == 0",
71
+ "comment": "This determines the rules used to transfer the readings to the previous day. Note that St. Nicholas's day has a special set of rules"
72
+ },
73
+ {
74
+ "name": "TransferRulesF",
75
+ "value": "!(nday >= -63 && nday <= 0) && (dow == 2 && doy != 339) || ((doy == 340 && (dow != 0 && dow != 2)))",
76
+ "cmd": "GS == 0",
77
+ "comment": "This determines the rules used to transfer the readings to the next day (forwards). Note that St. Nicholas's day has a special set of rules."
78
+ }
79
+ ];
80
+ //# sourceMappingURL=divineLiturgy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divineLiturgy.js","sourceRoot":"","sources":["../../src/data/divineLiturgy.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,gEAAgE;AAChE,qCAAqC;AAIrC,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC9D;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,gFAAgF;KAC3F;IACD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,gFAAgF;KAC3F;IACD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,kCAAkC;QAC3C,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,yGAAyG;KACpH;IACD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,wBAAwB;QACjC,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,sEAAsE;KACjF;IACD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,0BAA0B;QACnC,SAAS,EAAE,iDAAiD;KAC5D;IACD;QACC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,wCAAwC;QACjD,SAAS,EAAE,yEAAyE;KACpF;IACD;QACC,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,6HAA6H;QACtI,KAAK,EAAE,oBAAoB;KAC3B;IACD;QACC,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,oDAAoD;QAC7D,KAAK,EAAE,oBAAoB;QAC3B,SAAS,EAAE,+FAA+F;KAC1G;IACD;QACC,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,wCAAwC;QACjD,SAAS,EAAE,mFAAmF;KAC9F;IACD;QACC,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,uDAAuD;QAChE,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,sIAAsI;KACjJ;IACD;QACC,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,sGAAsG;QAC/G,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,8IAA8I;KACzJ;IACD;QACC,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,uDAAuD;QAChE,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,sIAAsI;KACjJ;IACD;QACC,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,sGAAsG;QAC/G,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,8IAA8I;KACzJ;CACQ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./types.ts";
2
+ export { PENTECOSTARION } from "./pentecostarion.ts";
3
+ export { TRIODION } from "./triodion.ts";
4
+ export { MENAION } from "./menaion.ts";
5
+ export { DIVINE_LITURGY_COMMANDS } from "./divineLiturgy.ts";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Barrel for generated data + shared type definitions. This file is
2
+ // hand-written; individual data modules alongside are auto-generated.
3
+ export * from "./types.js";
4
+ export { PENTECOSTARION } from "./pentecostarion.js";
5
+ export { TRIODION } from "./triodion.js";
6
+ export { MENAION } from "./menaion.js";
7
+ export { DIVINE_LITURGY_COMMANDS } from "./divineLiturgy.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,sEAAsE;AAEtE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DayEntry } from "./types.ts";
2
+ export declare const MENAION: Readonly<Record<string, DayEntry>>;
3
+ //# sourceMappingURL=menaion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menaion.d.ts","sourceRoot":"","sources":["../../src/data/menaion.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAs7jB7C,CAAC"}