@delali/narsil 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 (103) hide show
  1. package/LICENSE +201 -0
  2. package/dist/adapters/filesystem.d.ts +8 -0
  3. package/dist/adapters/filesystem.mjs +107 -0
  4. package/dist/adapters/indexeddb.d.ts +9 -0
  5. package/dist/adapters/indexeddb.mjs +153 -0
  6. package/dist/adapters/memory.d.ts +5 -0
  7. package/dist/adapters/memory.mjs +30 -0
  8. package/dist/adapters-XODT2F3h.d.ts +30 -0
  9. package/dist/chunk-5HXMVMSM.mjs +3147 -0
  10. package/dist/chunk-JKIBUPAY.mjs +42 -0
  11. package/dist/chunk-N37VMC62.mjs +18 -0
  12. package/dist/chunk-WYC635GI.mjs +335 -0
  13. package/dist/direct-executor-MQD7JRD4.mjs +3 -0
  14. package/dist/index.d.ts +386 -0
  15. package/dist/index.mjs +1099 -0
  16. package/dist/invalidation/broadcast-channel.d.ts +8 -0
  17. package/dist/invalidation/broadcast-channel.mjs +46 -0
  18. package/dist/invalidation/filesystem.d.ts +10 -0
  19. package/dist/invalidation/filesystem.mjs +159 -0
  20. package/dist/invalidation/noop.d.ts +5 -0
  21. package/dist/invalidation/noop.mjs +13 -0
  22. package/dist/language-ClUGLuoC.d.ts +13 -0
  23. package/dist/languages/arabic.d.ts +5 -0
  24. package/dist/languages/arabic.mjs +631 -0
  25. package/dist/languages/armenian.d.ts +5 -0
  26. package/dist/languages/armenian.mjs +306 -0
  27. package/dist/languages/bulgarian.d.ts +5 -0
  28. package/dist/languages/bulgarian.mjs +330 -0
  29. package/dist/languages/chinese.d.ts +5 -0
  30. package/dist/languages/chinese.mjs +250 -0
  31. package/dist/languages/dagbani.d.ts +5 -0
  32. package/dist/languages/dagbani.mjs +85 -0
  33. package/dist/languages/danish.d.ts +5 -0
  34. package/dist/languages/danish.mjs +224 -0
  35. package/dist/languages/dutch.d.ts +5 -0
  36. package/dist/languages/dutch.mjs +296 -0
  37. package/dist/languages/english.d.ts +5 -0
  38. package/dist/languages/english.mjs +1 -0
  39. package/dist/languages/ewe.d.ts +5 -0
  40. package/dist/languages/ewe.mjs +85 -0
  41. package/dist/languages/finnish.d.ts +5 -0
  42. package/dist/languages/finnish.mjs +536 -0
  43. package/dist/languages/french.d.ts +5 -0
  44. package/dist/languages/french.mjs +635 -0
  45. package/dist/languages/ga.d.ts +5 -0
  46. package/dist/languages/ga.mjs +69 -0
  47. package/dist/languages/german.d.ts +5 -0
  48. package/dist/languages/german.mjs +414 -0
  49. package/dist/languages/greek.d.ts +5 -0
  50. package/dist/languages/greek.mjs +888 -0
  51. package/dist/languages/hausa.d.ts +5 -0
  52. package/dist/languages/hausa.mjs +243 -0
  53. package/dist/languages/hindi.d.ts +5 -0
  54. package/dist/languages/hindi.mjs +333 -0
  55. package/dist/languages/hungarian.d.ts +5 -0
  56. package/dist/languages/hungarian.mjs +600 -0
  57. package/dist/languages/igbo.d.ts +5 -0
  58. package/dist/languages/igbo.mjs +96 -0
  59. package/dist/languages/indonesian.d.ts +5 -0
  60. package/dist/languages/indonesian.mjs +896 -0
  61. package/dist/languages/irish.d.ts +5 -0
  62. package/dist/languages/irish.mjs +268 -0
  63. package/dist/languages/italian.d.ts +5 -0
  64. package/dist/languages/italian.mjs +713 -0
  65. package/dist/languages/japanese.d.ts +5 -0
  66. package/dist/languages/japanese.mjs +210 -0
  67. package/dist/languages/nepali.d.ts +5 -0
  68. package/dist/languages/nepali.mjs +262 -0
  69. package/dist/languages/norwegian.d.ts +5 -0
  70. package/dist/languages/norwegian.mjs +274 -0
  71. package/dist/languages/portuguese.d.ts +5 -0
  72. package/dist/languages/portuguese.mjs +606 -0
  73. package/dist/languages/romanian.d.ts +5 -0
  74. package/dist/languages/romanian.mjs +634 -0
  75. package/dist/languages/russian.d.ts +5 -0
  76. package/dist/languages/russian.mjs +424 -0
  77. package/dist/languages/sanskrit.d.ts +5 -0
  78. package/dist/languages/sanskrit.mjs +155 -0
  79. package/dist/languages/serbian.d.ts +5 -0
  80. package/dist/languages/serbian.mjs +277 -0
  81. package/dist/languages/slovenian.d.ts +5 -0
  82. package/dist/languages/slovenian.mjs +522 -0
  83. package/dist/languages/spanish.d.ts +5 -0
  84. package/dist/languages/spanish.mjs +606 -0
  85. package/dist/languages/swahili.d.ts +5 -0
  86. package/dist/languages/swahili.mjs +212 -0
  87. package/dist/languages/swedish.d.ts +5 -0
  88. package/dist/languages/swedish.mjs +224 -0
  89. package/dist/languages/tamil.d.ts +5 -0
  90. package/dist/languages/tamil.mjs +186 -0
  91. package/dist/languages/turkish.d.ts +5 -0
  92. package/dist/languages/turkish.mjs +675 -0
  93. package/dist/languages/twi.d.ts +5 -0
  94. package/dist/languages/twi.mjs +84 -0
  95. package/dist/languages/ukrainian.d.ts +5 -0
  96. package/dist/languages/ukrainian.mjs +444 -0
  97. package/dist/languages/yoruba.d.ts +5 -0
  98. package/dist/languages/yoruba.mjs +103 -0
  99. package/dist/languages/zulu.d.ts +5 -0
  100. package/dist/languages/zulu.mjs +113 -0
  101. package/dist/workers/entry.d.ts +3 -0
  102. package/dist/workers/entry.mjs +106 -0
  103. package/package.json +87 -0
@@ -0,0 +1,8 @@
1
+ import { I as InvalidationAdapter } from '../adapters-XODT2F3h.js';
2
+
3
+ interface BroadcastChannelInvalidationConfig {
4
+ channelName?: string;
5
+ }
6
+ declare function createBroadcastChannelInvalidation(config?: BroadcastChannelInvalidationConfig): InvalidationAdapter;
7
+
8
+ export { type BroadcastChannelInvalidationConfig, createBroadcastChannelInvalidation };
@@ -0,0 +1,46 @@
1
+ // src/invalidation/broadcast-channel.ts
2
+ var DEFAULT_CHANNEL_NAME = "narsil-invalidation";
3
+ function isInvalidationEvent(data) {
4
+ if (typeof data !== "object" || data === null) {
5
+ return false;
6
+ }
7
+ const record = data;
8
+ return record.type === "partition" || record.type === "statistics";
9
+ }
10
+ function createBroadcastChannelInvalidation(config) {
11
+ const channelName = config?.channelName ?? DEFAULT_CHANNEL_NAME;
12
+ let channel = null;
13
+ function getChannel() {
14
+ if (channel !== null) {
15
+ return channel;
16
+ }
17
+ if (typeof BroadcastChannel === "undefined") {
18
+ throw new Error(
19
+ "BroadcastChannel is not available in this environment. Use a different invalidation adapter, or run in a browser or worker context that supports BroadcastChannel."
20
+ );
21
+ }
22
+ channel = new BroadcastChannel(channelName);
23
+ return channel;
24
+ }
25
+ return {
26
+ async publish(event) {
27
+ getChannel().postMessage(event);
28
+ },
29
+ async subscribe(fn) {
30
+ const ch = getChannel();
31
+ ch.onmessage = (e) => {
32
+ if (isInvalidationEvent(e.data)) {
33
+ fn(e.data);
34
+ }
35
+ };
36
+ },
37
+ async shutdown() {
38
+ if (channel !== null) {
39
+ channel.close();
40
+ channel = null;
41
+ }
42
+ }
43
+ };
44
+ }
45
+
46
+ export { createBroadcastChannelInvalidation };
@@ -0,0 +1,10 @@
1
+ import { I as InvalidationAdapter } from '../adapters-XODT2F3h.js';
2
+
3
+ interface FilesystemInvalidationConfig {
4
+ directory: string;
5
+ pollInterval?: number;
6
+ instanceId?: string;
7
+ }
8
+ declare function createFilesystemInvalidation(config: FilesystemInvalidationConfig): InvalidationAdapter;
9
+
10
+ export { type FilesystemInvalidationConfig, createFilesystemInvalidation };
@@ -0,0 +1,159 @@
1
+ // src/invalidation/filesystem.ts
2
+ var MARKER_MAX_AGE_MS = 6e4;
3
+ var DEFAULT_POLL_INTERVAL = 1e3;
4
+ function generateInstanceId() {
5
+ if (typeof globalThis.crypto !== "undefined" && typeof globalThis.crypto.randomUUID === "function") {
6
+ return globalThis.crypto.randomUUID();
7
+ }
8
+ return `inst-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
9
+ }
10
+ function isValidDirectory(directory) {
11
+ const normalized = directory.replace(/\\/g, "/");
12
+ if (normalized.includes("..")) {
13
+ return false;
14
+ }
15
+ return true;
16
+ }
17
+ function isInvalidationEvent(data) {
18
+ if (typeof data !== "object" || data === null) {
19
+ return false;
20
+ }
21
+ const record = data;
22
+ return record.type === "partition" || record.type === "statistics";
23
+ }
24
+ function createFilesystemInvalidation(config) {
25
+ if (!isValidDirectory(config.directory)) {
26
+ throw new Error(`Invalid directory path: path traversal detected in "${config.directory}"`);
27
+ }
28
+ const directory = config.directory;
29
+ const pollInterval = config.pollInterval ?? DEFAULT_POLL_INTERVAL;
30
+ const instanceId = config.instanceId ?? generateInstanceId();
31
+ if (instanceId.includes("/") || instanceId.includes("\\") || instanceId.includes("..") || instanceId.includes("\0")) {
32
+ throw new Error(`Invalid instanceId: "${instanceId}" contains path separator or traversal characters`);
33
+ }
34
+ let lastProcessedTimestamp = Date.now();
35
+ let pollTimer = null;
36
+ let handler = null;
37
+ async function ensureDirectory() {
38
+ const fs = await import('fs/promises');
39
+ try {
40
+ await fs.mkdir(directory, { recursive: true });
41
+ } catch {
42
+ }
43
+ }
44
+ async function processMarkerFiles() {
45
+ if (!handler) {
46
+ return;
47
+ }
48
+ const fs = await import('fs/promises');
49
+ const path = await import('path');
50
+ let files;
51
+ try {
52
+ files = await fs.readdir(directory);
53
+ } catch (err) {
54
+ if (err.code === "ENOENT") {
55
+ return;
56
+ }
57
+ throw err;
58
+ }
59
+ const jsonFiles = files.filter((f) => f.endsWith(".json")).sort();
60
+ const now = Date.now();
61
+ for (const file of jsonFiles) {
62
+ const filePath = path.join(directory, file);
63
+ let content;
64
+ try {
65
+ content = await fs.readFile(filePath, "utf-8");
66
+ } catch (err) {
67
+ if (err.code === "ENOENT") {
68
+ continue;
69
+ }
70
+ throw err;
71
+ }
72
+ let parsed;
73
+ try {
74
+ parsed = JSON.parse(content);
75
+ } catch {
76
+ try {
77
+ await fs.unlink(filePath);
78
+ } catch {
79
+ }
80
+ continue;
81
+ }
82
+ const writtenAt = typeof parsed.writtenAt === "number" ? parsed.writtenAt : 0;
83
+ if (writtenAt <= lastProcessedTimestamp) {
84
+ if (now - writtenAt > MARKER_MAX_AGE_MS) {
85
+ try {
86
+ await fs.unlink(filePath);
87
+ } catch {
88
+ }
89
+ }
90
+ continue;
91
+ }
92
+ if (parsed.instanceId === instanceId) {
93
+ if (now - writtenAt > MARKER_MAX_AGE_MS) {
94
+ try {
95
+ await fs.unlink(filePath);
96
+ } catch {
97
+ }
98
+ }
99
+ continue;
100
+ }
101
+ if (isInvalidationEvent(parsed)) {
102
+ handler(parsed);
103
+ }
104
+ if (writtenAt > lastProcessedTimestamp) {
105
+ lastProcessedTimestamp = writtenAt;
106
+ }
107
+ if (now - writtenAt > MARKER_MAX_AGE_MS) {
108
+ try {
109
+ await fs.unlink(filePath);
110
+ } catch {
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return {
116
+ async publish(event) {
117
+ await ensureDirectory();
118
+ const fs = await import('fs/promises');
119
+ const path = await import('path');
120
+ const timestamp = Date.now();
121
+ const filename = `${timestamp}-${instanceId}.json`;
122
+ const filePath = path.join(directory, filename);
123
+ const payload = JSON.stringify({ ...event, instanceId, writtenAt: timestamp });
124
+ await fs.writeFile(filePath, payload, "utf-8");
125
+ },
126
+ async subscribe(fn) {
127
+ handler = fn;
128
+ lastProcessedTimestamp = Date.now();
129
+ pollTimer = setInterval(() => {
130
+ processMarkerFiles().catch(() => {
131
+ });
132
+ }, pollInterval);
133
+ },
134
+ async shutdown() {
135
+ if (pollTimer !== null) {
136
+ clearInterval(pollTimer);
137
+ pollTimer = null;
138
+ }
139
+ handler = null;
140
+ const fs = await import('fs/promises');
141
+ const path = await import('path');
142
+ let files;
143
+ try {
144
+ files = await fs.readdir(directory);
145
+ } catch {
146
+ return;
147
+ }
148
+ const ownFiles = files.filter((f) => f.endsWith(`-${instanceId}.json`));
149
+ for (const file of ownFiles) {
150
+ try {
151
+ await fs.unlink(path.join(directory, file));
152
+ } catch {
153
+ }
154
+ }
155
+ }
156
+ };
157
+ }
158
+
159
+ export { createFilesystemInvalidation };
@@ -0,0 +1,5 @@
1
+ import { I as InvalidationAdapter } from '../adapters-XODT2F3h.js';
2
+
3
+ declare function createNoopInvalidation(): InvalidationAdapter;
4
+
5
+ export { createNoopInvalidation };
@@ -0,0 +1,13 @@
1
+ // src/invalidation/noop.ts
2
+ function createNoopInvalidation() {
3
+ return {
4
+ async publish() {
5
+ },
6
+ async subscribe() {
7
+ },
8
+ async shutdown() {
9
+ }
10
+ };
11
+ }
12
+
13
+ export { createNoopInvalidation };
@@ -0,0 +1,13 @@
1
+ interface LanguageModule {
2
+ name: string;
3
+ stemmer: ((token: string) => string) | null;
4
+ stopWords: Set<string>;
5
+ tokenizer?: TokenizerConfig;
6
+ }
7
+ interface TokenizerConfig {
8
+ splitPattern?: RegExp;
9
+ normalizeDiacritics?: boolean;
10
+ minTokenLength?: number;
11
+ }
12
+
13
+ export type { LanguageModule as L };
@@ -0,0 +1,5 @@
1
+ import { L as LanguageModule } from '../language-ClUGLuoC.js';
2
+
3
+ declare const arabic: LanguageModule;
4
+
5
+ export { arabic };