@ycookiey/yfuzzy 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.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +144 -0
  3. package/THIRD_PARTY_NOTICES.md +38 -0
  4. package/dist/ablate.d.ts +8 -0
  5. package/dist/ablate.d.ts.map +1 -0
  6. package/dist/ablate.js +11 -0
  7. package/dist/ablate.js.map +1 -0
  8. package/dist/bigram.d.ts +6 -0
  9. package/dist/bigram.d.ts.map +1 -0
  10. package/dist/bigram.js +17 -0
  11. package/dist/bigram.js.map +1 -0
  12. package/dist/charmask.d.ts +5 -0
  13. package/dist/charmask.d.ts.map +1 -0
  14. package/dist/charmask.js +23 -0
  15. package/dist/charmask.js.map +1 -0
  16. package/dist/entry.d.ts +29 -0
  17. package/dist/entry.d.ts.map +1 -0
  18. package/dist/entry.js +32 -0
  19. package/dist/entry.js.map +1 -0
  20. package/dist/expand.d.ts +12 -0
  21. package/dist/expand.d.ts.map +1 -0
  22. package/dist/expand.js +52 -0
  23. package/dist/expand.js.map +1 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +56 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/matches.d.ts +8 -0
  29. package/dist/matches.d.ts.map +1 -0
  30. package/dist/matches.js +68 -0
  31. package/dist/matches.js.map +1 -0
  32. package/dist/normalize.d.ts +24 -0
  33. package/dist/normalize.d.ts.map +1 -0
  34. package/dist/normalize.js +114 -0
  35. package/dist/normalize.js.map +1 -0
  36. package/dist/pipeline.d.ts +31 -0
  37. package/dist/pipeline.d.ts.map +1 -0
  38. package/dist/pipeline.js +75 -0
  39. package/dist/pipeline.js.map +1 -0
  40. package/dist/query.d.ts +21 -0
  41. package/dist/query.d.ts.map +1 -0
  42. package/dist/query.js +33 -0
  43. package/dist/query.js.map +1 -0
  44. package/dist/romaji/convert.d.ts +23 -0
  45. package/dist/romaji/convert.d.ts.map +1 -0
  46. package/dist/romaji/convert.js +34 -0
  47. package/dist/romaji/convert.js.map +1 -0
  48. package/dist/romaji/table-hepburn.d.ts +5 -0
  49. package/dist/romaji/table-hepburn.d.ts.map +1 -0
  50. package/dist/romaji/table-hepburn.js +46 -0
  51. package/dist/romaji/table-hepburn.js.map +1 -0
  52. package/dist/romaji/table-kunrei.d.ts +5 -0
  53. package/dist/romaji/table-kunrei.d.ts.map +1 -0
  54. package/dist/romaji/table-kunrei.js +46 -0
  55. package/dist/romaji/table-kunrei.js.map +1 -0
  56. package/dist/syllable.d.ts +37 -0
  57. package/dist/syllable.d.ts.map +1 -0
  58. package/dist/syllable.js +91 -0
  59. package/dist/syllable.js.map +1 -0
  60. package/dist/tiers/tier1-exact.d.ts +3 -0
  61. package/dist/tiers/tier1-exact.d.ts.map +1 -0
  62. package/dist/tiers/tier1-exact.js +59 -0
  63. package/dist/tiers/tier1-exact.js.map +1 -0
  64. package/dist/tiers/tier2-flexible.d.ts +3 -0
  65. package/dist/tiers/tier2-flexible.d.ts.map +1 -0
  66. package/dist/tiers/tier2-flexible.js +169 -0
  67. package/dist/tiers/tier2-flexible.js.map +1 -0
  68. package/dist/tiers/tier3-typo.d.ts +3 -0
  69. package/dist/tiers/tier3-typo.d.ts.map +1 -0
  70. package/dist/tiers/tier3-typo.js +95 -0
  71. package/dist/tiers/tier3-typo.js.map +1 -0
  72. package/dist/tiers/tier4-structural.d.ts +3 -0
  73. package/dist/tiers/tier4-structural.d.ts.map +1 -0
  74. package/dist/tiers/tier4-structural.js +29 -0
  75. package/dist/tiers/tier4-structural.js.map +1 -0
  76. package/dist/tiers/types.d.ts +17 -0
  77. package/dist/tiers/types.d.ts.map +1 -0
  78. package/dist/tiers/types.js +4 -0
  79. package/dist/tiers/types.js.map +1 -0
  80. package/dist/to-kana.d.ts +2 -0
  81. package/dist/to-kana.d.ts.map +1 -0
  82. package/dist/to-kana.js +8 -0
  83. package/dist/to-kana.js.map +1 -0
  84. package/dist/types.d.ts +42 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +3 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/vendor/wanakana/romaji-to-kana.d.ts +6 -0
  89. package/dist/vendor/wanakana/romaji-to-kana.d.ts.map +1 -0
  90. package/dist/vendor/wanakana/romaji-to-kana.js +182 -0
  91. package/dist/vendor/wanakana/romaji-to-kana.js.map +1 -0
  92. package/package.json +54 -0
@@ -0,0 +1,91 @@
1
+ // 音節分割と kana↔romaji 位置対応(spec 2.5)、境界集合(spec 2.6)。
2
+ //
3
+ // 帰属規則(matches のハイライト虫食い防止):
4
+ // - 促音ッ: 次音節の kana 区間に含める(kanaStart はッの位置、kanaLen に算入)。
5
+ // romaji は子音重ねとして反映。次音節が無い末尾ッは無帰属(破棄)。
6
+ // - 長音ー: 直前音節の kana 区間に含める(kanaLen を +1、romaji は持たない)。
7
+ // 直前音節が無い先頭ーは無帰属。
8
+ import { convertCore, startsWithConsonant } from './romaji/convert.js';
9
+ const SOKUON = 'ッ';
10
+ const LONG_VOWEL = 'ー';
11
+ const SMALL_KANA = new Set(['ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ヮ']);
12
+ const KANA_RE = /[ァ-ヺー]/; // カタカナ音節 + ー(・U+30FB は除外)
13
+ const KANA_BASE_RE = /[ァ-ヺ]/; // ダイグラフ先頭になりうるカタカナ
14
+ const ALNUM_RE = /[0-9a-z]/;
15
+ function isKanaOrAlnum(ch) {
16
+ return KANA_RE.test(ch) || ALNUM_RE.test(ch);
17
+ }
18
+ /** kana を音節セグメントへ分割する(ー/ッ 帰属規則込み) */
19
+ export function splitKanaSegments(kana) {
20
+ const segments = [];
21
+ let i = 0;
22
+ let pendingSokuon = false;
23
+ let sokuonStart = -1;
24
+ while (i < kana.length) {
25
+ const ch = kana[i];
26
+ if (ch === SOKUON) {
27
+ if (!pendingSokuon) {
28
+ pendingSokuon = true;
29
+ sokuonStart = i;
30
+ }
31
+ i += 1;
32
+ continue;
33
+ }
34
+ if (ch === LONG_VOWEL) {
35
+ const last = segments[segments.length - 1];
36
+ if (last)
37
+ last.kanaLen += 1; // 直前音節へ帰属(先頭ーは無帰属)
38
+ i += 1;
39
+ continue;
40
+ }
41
+ const start = pendingSokuon ? sokuonStart : i;
42
+ const next = i + 1 < kana.length ? kana[i + 1] : '';
43
+ const consumed = next !== '' && SMALL_KANA.has(next) && KANA_BASE_RE.test(ch) ? 2 : 1;
44
+ const core = kana.slice(i, i + consumed);
45
+ segments.push({ core, sokuon: pendingSokuon, kanaStart: start, kanaLen: i + consumed - start });
46
+ pendingSokuon = false;
47
+ sokuonStart = -1;
48
+ i += consumed;
49
+ }
50
+ // 末尾ッ(pendingSokuon 残り)は無帰属で破棄
51
+ return segments;
52
+ }
53
+ /** セグメント列を指定方式の RomajiForm へ変換する */
54
+ export function buildRomajiForm(segments, table) {
55
+ const syllables = [];
56
+ const boundaries = new Set();
57
+ let cursor = 0;
58
+ let text = '';
59
+ for (const seg of segments) {
60
+ let r = convertCore(seg.core, table);
61
+ if (seg.sokuon && r.length > 0 && startsWithConsonant(r)) {
62
+ r = r[0] + r;
63
+ }
64
+ boundaries.add(cursor);
65
+ syllables.push({ kanaStart: seg.kanaStart, kanaLen: seg.kanaLen, romajiStart: cursor, romajiLen: r.length });
66
+ cursor += r.length;
67
+ text += r;
68
+ }
69
+ return { text, syllables, boundaries };
70
+ }
71
+ /** kana 文字列から RomajiForm を直接生成(データ側 Index 構築用) */
72
+ export function toRomajiForm(kana, table) {
73
+ return buildRomajiForm(splitKanaSegments(kana), table);
74
+ }
75
+ /** kana 文字列のローマ字(位置不要のクエリ側用) */
76
+ export function kanaToRomaji(kana, table) {
77
+ return toRomajiForm(kana, table).text;
78
+ }
79
+ /** かな空間の境界位置(spec 2.6: 先頭 + カナ・英数字以外の直後) */
80
+ export function kanaBoundaries(kana) {
81
+ const boundaries = new Set([0]);
82
+ for (let i = 0; i < kana.length; i++) {
83
+ if (!isKanaOrAlnum(kana[i])) {
84
+ const after = i + 1;
85
+ if (after < kana.length)
86
+ boundaries.add(after);
87
+ }
88
+ }
89
+ return boundaries;
90
+ }
91
+ //# sourceMappingURL=syllable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syllable.js","sourceRoot":"","sources":["../src/syllable.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,6BAA6B;AAC7B,0DAA0D;AAC1D,2CAA2C;AAC3C,yDAAyD;AACzD,sBAAsB;AAEtB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAoB,MAAM,qBAAqB,CAAC;AA8BzF,MAAM,MAAM,GAAG,GAAG,CAAC;AACnB,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,0BAA0B;AACpD,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,mBAAmB;AACjD,MAAM,QAAQ,GAAG,UAAU,CAAC;AAE5B,SAAS,aAAa,CAAC,EAAU;IAC/B,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IAErB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAEpB,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,IAAI,CAAC;gBACrB,WAAW,GAAG,CAAC,CAAC;YAClB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,IAAI;gBAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,mBAAmB;YAChD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;QAChG,aAAa,GAAG,KAAK,CAAC;QACtB,WAAW,GAAG,CAAC,CAAC,CAAC;QACjB,CAAC,IAAI,QAAQ,CAAC;IAChB,CAAC;IAED,+BAA+B;IAC/B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,eAAe,CAAC,QAAgC,EAAE,KAAkB;IAClF,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7G,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAkB;IAC3D,OAAO,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAkB;IAC3D,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Matcher } from './types.js';
2
+ export declare const tier1Exact: Matcher;
3
+ //# sourceMappingURL=tier1-exact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier1-exact.d.ts","sourceRoot":"","sources":["../../src/tiers/tier1-exact.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,YAAY,CAAC;AA4CjD,eAAO,MAAM,UAAU,EAAE,OAyBxB,CAAC"}
@@ -0,0 +1,59 @@
1
+ // tier 1: 完全マッチ層(spec 4.1)。クエリ文字列がデータに連続して現れる。
2
+ // サブマッチ4種を固定優先順で評価し、intraScore 最大を採用(同点は先順位=表の記載順)。
3
+ // 優先順(spec 5章タイブレーク): かな前方 > かな部分 > romaji前方(訓令>ヘボン) > romaji部分(訓令>ヘボン)。
4
+ const KANA_PREFIX = 1.0;
5
+ const KANA_SUBSTRING = 0.9;
6
+ const ROMAJI_PREFIX = 0.97;
7
+ const ROMAJI_SUBSTRING = 0.87;
8
+ const HEPBURN_PENALTY = 0.99; // 訓令優先(両式同時マッチ時の決定性)
9
+ function range(len, offset) {
10
+ const p = [];
11
+ for (let i = 0; i < len; i++)
12
+ p.push(offset + i);
13
+ return p;
14
+ }
15
+ function prefix(query, data, space, factor) {
16
+ if (query.length === 0 || data.length === 0)
17
+ return null;
18
+ if (!data.startsWith(query))
19
+ return null;
20
+ return { intraScore: (query.length / data.length) * factor, space, offset: 0, len: query.length };
21
+ }
22
+ function substring(query, data, space, factor, minLen) {
23
+ if (query.length < minLen || data.length === 0)
24
+ return null;
25
+ const idx = data.indexOf(query);
26
+ if (idx <= 0)
27
+ return null; // 0 = 前方一致(別サブマッチが担当)、<0 = 非一致
28
+ return { intraScore: (query.length / data.length) * factor, space, offset: idx, len: query.length };
29
+ }
30
+ export const tier1Exact = (q, e) => {
31
+ let best = null;
32
+ // strict > により、同点では先に評価した(=優先順が上の)候補が残る
33
+ const consider = (c) => {
34
+ if (c !== null && (best === null || c.intraScore > best.intraScore))
35
+ best = c;
36
+ };
37
+ const kana = e.kana.text;
38
+ const kunrei = e.kunrei?.text ?? '';
39
+ const hepburn = e.hepburn?.text ?? '';
40
+ // 1. かな前方一致
41
+ consider(prefix(q.kana, kana, 'kana', KANA_PREFIX));
42
+ // 2. かな部分一致(かなは1文字でも可)
43
+ consider(substring(q.kana, kana, 'kana', KANA_SUBSTRING, 1));
44
+ // 3. romaji 前方一致(訓令 → ヘボン。前方は最小長条件なし)
45
+ if (q.kunrei !== null)
46
+ consider(prefix(q.kunrei, kunrei, 'kunrei', ROMAJI_PREFIX));
47
+ if (q.hepburn !== null)
48
+ consider(prefix(q.hepburn, hepburn, 'hepburn', ROMAJI_PREFIX * HEPBURN_PENALTY));
49
+ // 4. romaji 部分一致(訓令 → ヘボン。クエリ romaji 2文字以上)
50
+ if (q.kunrei !== null)
51
+ consider(substring(q.kunrei, kunrei, 'kunrei', ROMAJI_SUBSTRING, 2));
52
+ if (q.hepburn !== null)
53
+ consider(substring(q.hepburn, hepburn, 'hepburn', ROMAJI_SUBSTRING * HEPBURN_PENALTY, 2));
54
+ if (best === null)
55
+ return null;
56
+ const c = best;
57
+ return { tier: 1, intraScore: c.intraScore, space: c.space, positions: range(c.len, c.offset) };
58
+ };
59
+ //# sourceMappingURL=tier1-exact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier1-exact.js","sourceRoot":"","sources":["../../src/tiers/tier1-exact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Matcher } from './types.js';
2
+ export declare const tier2Flexible: Matcher;
3
+ //# sourceMappingURL=tier2-flexible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier2-flexible.d.ts","sourceRoot":"","sources":["../../src/tiers/tier2-flexible.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,YAAY,CAAC;AA+JjD,eAAO,MAAM,aAAa,EAAE,OA2B3B,CAAC"}
@@ -0,0 +1,169 @@
1
+ // tier 2: 柔軟マッチ層(spec 4.2)。クエリがデータの subsequence(順序保存・飛び石)。
2
+ // 旧 subsequence + acronym + vowel-stripped の統合。
3
+ // 線形存在チェック → 位置選択 DP(境界/連続を優先)→ rate ベース intraScore。
4
+ // DP 定数(spec 4.2、【調整対象】)
5
+ const MATCH = 16;
6
+ const GAP_START = -3;
7
+ const GAP_EXTEND = -1;
8
+ const BOUNDARY = 8;
9
+ const CONSECUTIVE = 4;
10
+ const FIRST_CHAR = 2;
11
+ // intraScore 重み(spec 4.2、【調整対象】)
12
+ const W_BOUNDARY = 0.55;
13
+ const W_CONTINUITY = 0.3;
14
+ const W_START = 0.15;
15
+ const MIN_LEN = 2;
16
+ const NEG = -1e9; // -Infinity 相当のセンチネル(Int32 スクラッチ用。実スコアは到達不能)
17
+ // モジュールレベルのフラット 2D スクラッチ(dp / matched)を再利用し確保を廃す。
18
+ // JS は単一スレッド・同期実行のため安全。
19
+ let dpBuf = new Int32Array(0);
20
+ let matchedBuf = new Uint8Array(0);
21
+ function ensureScratch(size) {
22
+ if (dpBuf.length < size) {
23
+ dpBuf = new Int32Array(size);
24
+ matchedBuf = new Uint8Array(size);
25
+ }
26
+ }
27
+ /** O(N) 線形走査で subsequence の存在判定(DP コスト回避の前段) */
28
+ function isSubsequence(q, t) {
29
+ let qi = 0;
30
+ for (let ti = 0; ti < t.length && qi < q.length; ti++) {
31
+ if (q[qi] === t[ti])
32
+ qi++;
33
+ }
34
+ return qi === q.length;
35
+ }
36
+ /**
37
+ * 位置選択 DP(spec 4.2)。q が t の subsequence のとき、境界・連続を優先する
38
+ * 割り付けの採用位置列(t 上の昇順インデックス)を返す。非 subsequence は null。
39
+ * DP スコアは位置選択にのみ使い、intraScore には用いない。
40
+ */
41
+ function selectPositions(q, t, boundaries) {
42
+ const M = q.length;
43
+ const N = t.length;
44
+ if (M === 0 || N === 0)
45
+ return null;
46
+ if (!isSubsequence(q, t))
47
+ return null;
48
+ const cols = N + 1;
49
+ ensureScratch((M + 1) * cols);
50
+ const dp = dpBuf;
51
+ const matched = matchedBuf;
52
+ for (let j = 0; j <= N; j++) {
53
+ dp[j] = 0; // 行0: データ先頭の読み飛ばしは無料
54
+ matched[j] = 0;
55
+ }
56
+ for (let i = 1; i <= M; i++) {
57
+ const row = i * cols;
58
+ const prow = (i - 1) * cols;
59
+ const qi = q[i - 1];
60
+ dp[row] = NEG; // 列0(i≥1)は無効
61
+ matched[row] = 0;
62
+ for (let j = 1; j <= N; j++) {
63
+ let best = NEG;
64
+ let bestMatched = 0;
65
+ // skip: t[j-1] を使わない
66
+ const prevSkip = dp[row + j - 1];
67
+ if (prevSkip > NEG) {
68
+ best = prevSkip + (matched[row + j - 1] ? GAP_START : GAP_EXTEND);
69
+ bestMatched = 0;
70
+ }
71
+ // match: q[i-1] を t[j-1] に割り付け
72
+ const diag = dp[prow + j - 1];
73
+ if (qi === t[j - 1] && diag > NEG) {
74
+ let bonus = 0;
75
+ if (boundaries.has(j - 1))
76
+ bonus += BOUNDARY;
77
+ if (matched[prow + j - 1])
78
+ bonus += CONSECUTIVE;
79
+ if (i === 1)
80
+ bonus += FIRST_CHAR;
81
+ const ms = diag + MATCH + bonus;
82
+ if (ms >= best) {
83
+ // 同点は match 側
84
+ best = ms;
85
+ bestMatched = 1;
86
+ }
87
+ }
88
+ dp[row + j] = best;
89
+ matched[row + j] = bestMatched;
90
+ }
91
+ }
92
+ // 末尾の余りは無料 → dp[M][j] 最大の j(= 最後にマッチした位置)
93
+ const mrow = M * cols;
94
+ let bestJ = -1;
95
+ let bestScore = NEG;
96
+ for (let j = M; j <= N; j++) {
97
+ if (dp[mrow + j] > bestScore) {
98
+ bestScore = dp[mrow + j];
99
+ bestJ = j;
100
+ }
101
+ }
102
+ if (bestJ < 0 || bestScore === NEG)
103
+ return null;
104
+ const positions = [];
105
+ let ci = M;
106
+ let cj = bestJ;
107
+ while (ci > 0 && cj > 0) {
108
+ if (matched[ci * cols + cj]) {
109
+ positions.push(cj - 1);
110
+ ci--;
111
+ cj--;
112
+ }
113
+ else {
114
+ cj--;
115
+ }
116
+ }
117
+ positions.reverse();
118
+ return positions;
119
+ }
120
+ /** 採用位置列から intraScore を算出(spec 4.2) */
121
+ function scoreFromPositions(positions, queryLen, dataLen, boundaries) {
122
+ let boundaryHits = 0;
123
+ for (const p of positions)
124
+ if (boundaries.has(p))
125
+ boundaryHits++;
126
+ const boundaryRate = boundaryHits / queryLen;
127
+ let longest = 1;
128
+ let cur = 1;
129
+ for (let k = 1; k < positions.length; k++) {
130
+ if (positions[k] === positions[k - 1] + 1) {
131
+ cur++;
132
+ if (cur > longest)
133
+ longest = cur;
134
+ }
135
+ else {
136
+ cur = 1;
137
+ }
138
+ }
139
+ const continuity = longest / queryLen;
140
+ const startTerm = 1 - positions[0] / dataLen;
141
+ return W_BOUNDARY * boundaryRate + W_CONTINUITY * continuity + W_START * startTerm;
142
+ }
143
+ export const tier2Flexible = (q, e) => {
144
+ let best = null;
145
+ // 評価順 かな > 訓令 > ヘボン。strict > で同点は先順位が残る(spec 5章)
146
+ const consider = (qStr, qMask, t, dMask, boundaries, space) => {
147
+ if (qStr === null || qStr.length < MIN_LEN || t.length === 0)
148
+ return;
149
+ // 前置フィルタ: subsequence はクエリ全文字がデータに存在する必要(衝突は安全側)
150
+ if ((qMask & ~dMask) !== 0)
151
+ return;
152
+ const positions = selectPositions(qStr, t, boundaries);
153
+ if (positions === null)
154
+ return;
155
+ const intraScore = scoreFromPositions(positions, qStr.length, t.length, boundaries);
156
+ if (best === null || intraScore > best.intraScore)
157
+ best = { intraScore, space, positions };
158
+ };
159
+ consider(q.kana, q.kanaMask, e.kana.text, e.kanaMask, e.kanaBoundaries, 'kana');
160
+ if (e.kunrei)
161
+ consider(q.kunrei, q.kunreiMask, e.kunrei.text, e.kunreiMask, e.kunrei.boundaries, 'kunrei');
162
+ if (e.hepburn)
163
+ consider(q.hepburn, q.hepburnMask, e.hepburn.text, e.hepburnMask, e.hepburn.boundaries, 'hepburn');
164
+ if (best === null)
165
+ return null;
166
+ const c = best;
167
+ return { tier: 2, intraScore: c.intraScore, space: c.space, positions: c.positions };
168
+ };
169
+ //# sourceMappingURL=tier2-flexible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier2-flexible.js","sourceRoot":"","sources":["../../src/tiers/tier2-flexible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Matcher } from './types.js';
2
+ export declare const tier3Typo: Matcher;
3
+ //# sourceMappingURL=tier3-typo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier3-typo.d.ts","sourceRoot":"","sources":["../../src/tiers/tier3-typo.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,YAAY,CAAC;AAwEjD,eAAO,MAAM,SAAS,EAAE,OAsBvB,CAAC"}
@@ -0,0 +1,95 @@
1
+ // tier 3: 誤字許容層(spec 4.3)。中間の置換・挿入・削除・転置を救う。
2
+ // OSA(restricted Damerau-Levenshtein)の prefix 距離 — データ末尾の余りは無料。
3
+ // 空間ごとに maxDist を計測。romaji 空間は有効方式から1つ(訓令優先)。
4
+ // positions は返さない(tier 3 は matches 非対象、spec 6章)。
5
+ import { popcount } from '../charmask.js';
6
+ const MIN_LEN = 2;
7
+ function maxDistFor(len) {
8
+ return Math.max(1, Math.ceil(len / 3));
9
+ }
10
+ // モジュールレベルのスクラッチ(フラット 2D)。エントリごとの確保を廃し GC 圧を消す。
11
+ // JS は単一スレッド・同期実行のため再利用は安全。
12
+ let osaBuf = new Int32Array(0);
13
+ function osaScratch(size) {
14
+ if (osaBuf.length < size)
15
+ osaBuf = new Int32Array(size);
16
+ return osaBuf;
17
+ }
18
+ /**
19
+ * OSA prefix 距離。q を t の任意の prefix に合わせる最小編集距離(末尾余り無料)。
20
+ * 行最小 > maxDist で早期打ち切り。最終 j 走査は [m-maxDist, m+maxDist] の窓のみ
21
+ * (窓外は |i-j| 由来で必ず maxDist 超過)。dp はフラット Int32 スクラッチを再利用。
22
+ */
23
+ function osaPrefixDistance(q, t, maxDist) {
24
+ const m = q.length;
25
+ const n = t.length;
26
+ if (m === 0)
27
+ return 0;
28
+ if (n + maxDist < m)
29
+ return maxDist + 1; // 長さ差だけで超過
30
+ const cols = n + 1;
31
+ const dp = osaScratch((m + 1) * cols);
32
+ for (let j = 0; j <= n; j++)
33
+ dp[j] = j; // 行0
34
+ for (let i = 1; i <= m; i++) {
35
+ const row = i * cols;
36
+ const prow = (i - 1) * cols;
37
+ const pprow = (i - 2) * cols;
38
+ dp[row] = i; // 列0
39
+ const qi = q[i - 1];
40
+ const qim1 = i > 1 ? q[i - 2] : '';
41
+ let rowMin = Infinity;
42
+ for (let j = 1; j <= n; j++) {
43
+ const cost = qi === t[j - 1] ? 0 : 1;
44
+ let v = Math.min(dp[prow + j] + 1, // 削除
45
+ dp[row + j - 1] + 1, // 挿入
46
+ dp[prow + j - 1] + cost);
47
+ if (i > 1 && j > 1 && qi === t[j - 2] && qim1 === t[j - 1]) {
48
+ v = Math.min(v, dp[pprow + j - 2] + 1); // 転置
49
+ }
50
+ dp[row + j] = v;
51
+ if (v < rowMin)
52
+ rowMin = v;
53
+ }
54
+ if (rowMin > maxDist)
55
+ return maxDist + 1; // 早期打ち切り
56
+ }
57
+ // prefix 距離 = q を t の任意 prefix に合わせた最小。窓外は maxDist 超過のため走査不要
58
+ const mrow = m * cols;
59
+ const lo = Math.max(0, m - maxDist);
60
+ const hi = Math.min(n, m + maxDist);
61
+ let best = dp[mrow + lo];
62
+ for (let j = lo + 1; j <= hi; j++)
63
+ if (dp[mrow + j] < best)
64
+ best = dp[mrow + j];
65
+ return best;
66
+ }
67
+ export const tier3Typo = (q, e) => {
68
+ let best = null;
69
+ const consider = (query, qMask, data, dMask, space) => {
70
+ if (query === null || query.length < MIN_LEN || data.length === 0)
71
+ return;
72
+ const maxDist = maxDistFor(query.length);
73
+ // 前置フィルタ: データに無いクエリ文字1つにつき編集≥1。衝突は count を過小評価し安全側
74
+ if (popcount(qMask & ~dMask) > maxDist)
75
+ return;
76
+ const d = osaPrefixDistance(query, data, maxDist);
77
+ if (d > maxDist)
78
+ return;
79
+ const intraScore = 1 - d / (maxDist + 1);
80
+ if (best === null || intraScore > best.intraScore)
81
+ best = { intraScore, space };
82
+ };
83
+ // かな空間
84
+ consider(q.kana, q.kanaMask, e.kana.text, e.kanaMask, 'kana');
85
+ // romaji 空間は有効方式から1つ(訓令優先、訓令無効なら ヘボン)
86
+ if (e.kunrei && q.kunrei !== null)
87
+ consider(q.kunrei, q.kunreiMask, e.kunrei.text, e.kunreiMask, 'kunrei');
88
+ else if (e.hepburn && q.hepburn !== null)
89
+ consider(q.hepburn, q.hepburnMask, e.hepburn.text, e.hepburnMask, 'hepburn');
90
+ if (best === null)
91
+ return null;
92
+ const c = best;
93
+ return { tier: 3, intraScore: c.intraScore, space: c.space, positions: null };
94
+ };
95
+ //# sourceMappingURL=tier3-typo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier3-typo.js","sourceRoot":"","sources":["../../src/tiers/tier3-typo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Matcher } from './types.js';
2
+ export declare const tier4Structural: Matcher;
3
+ //# sourceMappingURL=tier4-structural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier4-structural.d.ts","sourceRoot":"","sources":["../../src/tiers/tier4-structural.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAU1C,eAAO,MAAM,eAAe,EAAE,OAgB7B,CAAC"}
@@ -0,0 +1,29 @@
1
+ // tier 4: 構造類似層(spec 4.4、デフォルト OFF)。文字順が大きく崩れた入力の最終救済。
2
+ // bigram 集合の Tversky 類似度(α=0.8)。閾値未満は非マッチ。
3
+ // bigram は遅延生成(maxTier:4 が per-call で要否不明、spec 判断メモ)。
4
+ // positions は返さない(tier 4 は matches 非対象、spec 6章)。
5
+ import { ensureQueryBigrams } from '../query.js';
6
+ import { ensureBigrams } from '../entry.js';
7
+ const ALPHA = 0.8; // クエリ側にしかない bigram の罰則(重い)
8
+ const BETA = 0.2; // データ側にしかない bigram の罰則(軽い)
9
+ const THRESHOLD = 0.3;
10
+ export const tier4Structural = (q, e) => {
11
+ const qb = ensureQueryBigrams(q);
12
+ const db = ensureBigrams(e);
13
+ if (qb.size === 0 || db.size === 0)
14
+ return null;
15
+ let inter = 0;
16
+ for (const b of qb)
17
+ if (db.has(b))
18
+ inter++;
19
+ const qOnly = qb.size - inter;
20
+ const dOnly = db.size - inter;
21
+ const denom = inter + ALPHA * qOnly + BETA * dOnly;
22
+ if (denom === 0)
23
+ return null;
24
+ const tversky = inter / denom;
25
+ if (tversky < THRESHOLD)
26
+ return null;
27
+ return { tier: 4, intraScore: tversky, space: 'kana', positions: null };
28
+ };
29
+ //# sourceMappingURL=tier4-structural.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier4-structural.js","sourceRoot":"","sources":["../../src/tiers/tier4-structural.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,2CAA2C;AAC3C,sDAAsD;AACtD,iDAAiD;AAKjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,2BAA2B;AAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,2BAA2B;AAC7C,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,CAAC,MAAM,eAAe,GAAY,CAAC,CAAkB,EAAE,CAAa,EAAE,EAAE;IAC5E,MAAM,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;IAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;IAE9B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IACnD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC;IAC9B,IAAI,OAAO,GAAG,SAAS;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { NormalizedQuery } from '../query.js';
2
+ import type { IndexEntry } from '../entry.js';
3
+ /** 照合空間。matches 逆変換(M8)がどの空間の位置かを判別する */
4
+ export type Space = 'kana' | 'kunrei' | 'hepburn';
5
+ /** 1 tier の照合結果。null = 非マッチ */
6
+ export interface TierMatch {
7
+ readonly tier: 1 | 2 | 3 | 4;
8
+ /** tier 内相対スコア(0–1、大きいほど良い) */
9
+ readonly intraScore: number;
10
+ /** 一致した空間 */
11
+ readonly space: Space;
12
+ /** space 内の一致文字位置(tier 1/2 のみ。tier 3/4 は null)。matches 逆変換の入力 */
13
+ readonly positions: readonly number[] | null;
14
+ }
15
+ /** q・e は bigram 遅延キャッシュのため mutable で受ける */
16
+ export type Matcher = (q: NormalizedQuery, e: IndexEntry) => TierMatch | null;
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tiers/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,yCAAyC;AACzC,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,aAAa;IACb,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC9C;AAED,2CAA2C;AAC3C,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,UAAU,KAAK,SAAS,GAAG,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ // tier matcher の共通インターフェース(spec 4章)。
2
+ // pipeline は tier 昇順の Matcher 配列を first-match-wins で走査する。
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tiers/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,0DAA0D"}
@@ -0,0 +1,2 @@
1
+ export declare function toKana(input: string): string;
2
+ //# sourceMappingURL=to-kana.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-kana.d.ts","sourceRoot":"","sources":["../src/to-kana.ts"],"names":[],"mappings":"AAMA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C"}
@@ -0,0 +1,8 @@
1
+ // クエリ側のローマ字→かな変換(spec 2.2)。vendor の薄いラッパ。
2
+ // 出力はひらがな(カタカナ化は normalize step5 が担当)。記号はリテラル維持、
3
+ // 末尾の単独 n は ん に確定、変換できない英字(子音のみ等)はそのまま残る。
4
+ import { romajiToKana } from './vendor/wanakana/romaji-to-kana.js';
5
+ export function toKana(input) {
6
+ return romajiToKana(input);
7
+ }
8
+ //# sourceMappingURL=to-kana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-kana.js","sourceRoot":"","sources":["../src/to-kana.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,iDAAiD;AACjD,0CAA0C;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { RomajiOption } from './romaji/convert.js';
2
+ import type { SeparatorConfig } from './expand.js';
3
+ export type { RomajiOption } from './romaji/convert.js';
4
+ export type { SeparatorConfig } from './expand.js';
5
+ /** Index 構築時オプション(構築後は変更不可) */
6
+ export interface IndexOptions<T> {
7
+ /** item から検索対象文字列を取り出す。T[] のとき必須(オーバーロードで強制) */
8
+ getText?: (item: T) => string;
9
+ /** ローマ字並列の方式。default 'both' */
10
+ romaji?: RomajiOption;
11
+ /** 区切り文字展開。default false */
12
+ separatorExpansion?: SeparatorConfig;
13
+ }
14
+ /** 検索時オプション(per-call 上書き可) */
15
+ export interface SearchOptions {
16
+ /** 返却件数上限。default 無制限 */
17
+ limit?: number;
18
+ /** 実行する tier 上限。default 3(4=Tversky はオプトイン) */
19
+ maxTier?: 1 | 2 | 3 | 4;
20
+ /** この score 未満を除外。default 0 */
21
+ minScore?: number;
22
+ /** matches(ハイライト用区間)を含める。default false */
23
+ includeMatches?: boolean;
24
+ }
25
+ /** 検索結果1件 */
26
+ export interface SearchResult<T> {
27
+ item: T;
28
+ /** items 内の位置 */
29
+ refIndex: number;
30
+ /** 0–1、高いほど良い */
31
+ score: number;
32
+ /** マッチした層 */
33
+ tier: 1 | 2 | 3 | 4;
34
+ /** 元文字列上の一致区間 [start, end)(includeMatches 時かつ tier 1/2 のみ) */
35
+ matches?: readonly [number, number][];
36
+ }
37
+ /** 構築済み Index */
38
+ export interface SearchIndex<T> {
39
+ search(query: string, options?: SearchOptions): SearchResult<T>[];
40
+ readonly size: number;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,+BAA+B;AAC/B,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC9B,+BAA+B;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4BAA4B;IAC5B,kBAAkB,CAAC,EAAE,eAAe,CAAC;CACtC;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,aAAa;AACb,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CACvC;AAED,iBAAiB;AACjB,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // 公開型(design.md シグネチャ)。
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wBAAwB"}