@inlang/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/adapter/solidAdapter.d.ts +32 -0
- package/dist/adapter/solidAdapter.d.ts.map +1 -0
- package/dist/adapter/solidAdapter.js +39 -0
- package/dist/adapter/solidAdapter.test.d.ts +2 -0
- package/dist/adapter/solidAdapter.test.d.ts.map +1 -0
- package/dist/adapter/solidAdapter.test.js +284 -0
- package/dist/api.d.ts +88 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +1 -0
- package/dist/createMessageLintReportsQuery.d.ts +9 -0
- package/dist/createMessageLintReportsQuery.d.ts.map +1 -0
- package/dist/createMessageLintReportsQuery.js +48 -0
- package/dist/createMessagesQuery.d.ts +7 -0
- package/dist/createMessagesQuery.d.ts.map +1 -0
- package/dist/createMessagesQuery.js +57 -0
- package/dist/createMessagesQuery.test.d.ts +2 -0
- package/dist/createMessagesQuery.test.d.ts.map +1 -0
- package/dist/createMessagesQuery.test.js +304 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/lint/index.d.ts +3 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +2 -0
- package/dist/lint/message/errors.d.ts +7 -0
- package/dist/lint/message/errors.d.ts.map +1 -0
- package/dist/lint/message/errors.js +9 -0
- package/dist/lint/message/lintMessages.d.ts +17 -0
- package/dist/lint/message/lintMessages.d.ts.map +1 -0
- package/dist/lint/message/lintMessages.js +12 -0
- package/dist/lint/message/lintMessages.test.d.ts +2 -0
- package/dist/lint/message/lintMessages.test.d.ts.map +1 -0
- package/dist/lint/message/lintMessages.test.js +105 -0
- package/dist/lint/message/lintSingleMessage.d.ts +23 -0
- package/dist/lint/message/lintSingleMessage.d.ts.map +1 -0
- package/dist/lint/message/lintSingleMessage.js +36 -0
- package/dist/lint/message/lintSingleMessage.test.d.ts +2 -0
- package/dist/lint/message/lintSingleMessage.test.d.ts.map +1 -0
- package/dist/lint/message/lintSingleMessage.test.js +155 -0
- package/dist/messages/errors.d.ts +13 -0
- package/dist/messages/errors.d.ts.map +1 -0
- package/dist/messages/errors.js +18 -0
- package/dist/messages/index.d.ts +3 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +2 -0
- package/dist/messages/variant.d.ts +46 -0
- package/dist/messages/variant.d.ts.map +1 -0
- package/dist/messages/variant.js +177 -0
- package/dist/messages/variant.test.d.ts +2 -0
- package/dist/messages/variant.test.d.ts.map +1 -0
- package/dist/messages/variant.test.js +379 -0
- package/dist/openInlangProject.d.ts +18 -0
- package/dist/openInlangProject.d.ts.map +1 -0
- package/dist/openInlangProject.js +226 -0
- package/dist/openInlangProject.test.d.ts +2 -0
- package/dist/openInlangProject.test.d.ts.map +1 -0
- package/dist/openInlangProject.test.js +627 -0
- package/dist/parseConfig.d.ts +8 -0
- package/dist/parseConfig.d.ts.map +1 -0
- package/dist/parseConfig.js +26 -0
- package/dist/reactivity/map.d.ts +66 -0
- package/dist/reactivity/map.d.ts.map +1 -0
- package/dist/reactivity/map.js +143 -0
- package/dist/reactivity/solid.d.ts +12 -0
- package/dist/reactivity/solid.d.ts.map +1 -0
- package/dist/reactivity/solid.js +13 -0
- package/dist/reactivity/trigger.d.ts +11 -0
- package/dist/reactivity/trigger.d.ts.map +1 -0
- package/dist/reactivity/trigger.js +46 -0
- package/dist/resolve-modules/errors.d.ts +34 -0
- package/dist/resolve-modules/errors.d.ts.map +1 -0
- package/dist/resolve-modules/errors.js +35 -0
- package/dist/resolve-modules/import.d.ts +35 -0
- package/dist/resolve-modules/import.d.ts.map +1 -0
- package/dist/resolve-modules/import.js +40 -0
- package/dist/resolve-modules/import.test.d.ts +2 -0
- package/dist/resolve-modules/import.test.d.ts.map +1 -0
- package/dist/resolve-modules/import.test.js +45 -0
- package/dist/resolve-modules/index.d.ts +3 -0
- package/dist/resolve-modules/index.d.ts.map +1 -0
- package/dist/resolve-modules/index.js +2 -0
- package/dist/resolve-modules/message-lint-rules/errors.d.ts +8 -0
- package/dist/resolve-modules/message-lint-rules/errors.d.ts.map +1 -0
- package/dist/resolve-modules/message-lint-rules/errors.js +8 -0
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.d.ts +9 -0
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.d.ts.map +1 -0
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.js +21 -0
- package/dist/resolve-modules/plugins/errors.d.ts +28 -0
- package/dist/resolve-modules/plugins/errors.d.ts.map +1 -0
- package/dist/resolve-modules/plugins/errors.js +44 -0
- package/dist/resolve-modules/plugins/resolvePlugins.d.ts +3 -0
- package/dist/resolve-modules/plugins/resolvePlugins.d.ts.map +1 -0
- package/dist/resolve-modules/plugins/resolvePlugins.js +108 -0
- package/dist/resolve-modules/plugins/resolvePlugins.test.d.ts +2 -0
- package/dist/resolve-modules/plugins/resolvePlugins.test.d.ts.map +1 -0
- package/dist/resolve-modules/plugins/resolvePlugins.test.js +289 -0
- package/dist/resolve-modules/plugins/types.d.ts +60 -0
- package/dist/resolve-modules/plugins/types.d.ts.map +1 -0
- package/dist/resolve-modules/plugins/types.js +1 -0
- package/dist/resolve-modules/plugins/types.test.d.ts +2 -0
- package/dist/resolve-modules/plugins/types.test.d.ts.map +1 -0
- package/dist/resolve-modules/plugins/types.test.js +49 -0
- package/dist/resolve-modules/resolveModules.d.ts +3 -0
- package/dist/resolve-modules/resolveModules.d.ts.map +1 -0
- package/dist/resolve-modules/resolveModules.js +70 -0
- package/dist/resolve-modules/resolveModules.test.d.ts +2 -0
- package/dist/resolve-modules/resolveModules.test.d.ts.map +1 -0
- package/dist/resolve-modules/resolveModules.test.js +143 -0
- package/dist/resolve-modules/types.d.ts +62 -0
- package/dist/resolve-modules/types.d.ts.map +1 -0
- package/dist/resolve-modules/types.js +1 -0
- package/dist/test-utilities/createMessage.d.ts +17 -0
- package/dist/test-utilities/createMessage.d.ts.map +1 -0
- package/dist/test-utilities/createMessage.js +16 -0
- package/dist/test-utilities/createMessage.test.d.ts +2 -0
- package/dist/test-utilities/createMessage.test.d.ts.map +1 -0
- package/dist/test-utilities/createMessage.test.js +91 -0
- package/dist/test-utilities/index.d.ts +2 -0
- package/dist/test-utilities/index.d.ts.map +1 -0
- package/dist/test-utilities/index.js +1 -0
- package/dist/versionedInterfaces.d.ts +8 -0
- package/dist/versionedInterfaces.d.ts.map +1 -0
- package/dist/versionedInterfaces.js +8 -0
- package/package.json +58 -0
- package/src/adapter/solidAdapter.test.ts +363 -0
- package/src/adapter/solidAdapter.ts +77 -0
- package/src/api.ts +86 -0
- package/src/createMessageLintReportsQuery.ts +77 -0
- package/src/createMessagesQuery.test.ts +435 -0
- package/src/createMessagesQuery.ts +64 -0
- package/src/errors.ts +46 -0
- package/src/index.ts +29 -0
- package/src/lint/index.ts +2 -0
- package/src/lint/message/errors.ts +9 -0
- package/src/lint/message/lintMessages.test.ts +122 -0
- package/src/lint/message/lintMessages.ts +33 -0
- package/src/lint/message/lintSingleMessage.test.ts +183 -0
- package/src/lint/message/lintSingleMessage.ts +62 -0
- package/src/messages/errors.ts +25 -0
- package/src/messages/index.ts +2 -0
- package/src/messages/variant.test.ts +444 -0
- package/src/messages/variant.ts +242 -0
- package/src/openInlangProject.test.ts +734 -0
- package/src/openInlangProject.ts +337 -0
- package/src/parseConfig.ts +33 -0
- package/src/reactivity/map.ts +135 -0
- package/src/reactivity/solid.ts +36 -0
- package/src/reactivity/trigger.ts +46 -0
- package/src/resolve-modules/errors.ts +39 -0
- package/src/resolve-modules/import.test.ts +58 -0
- package/src/resolve-modules/import.ts +69 -0
- package/src/resolve-modules/index.ts +2 -0
- package/src/resolve-modules/message-lint-rules/errors.ts +9 -0
- package/src/resolve-modules/message-lint-rules/resolveMessageLintRules.ts +24 -0
- package/src/resolve-modules/plugins/errors.ts +57 -0
- package/src/resolve-modules/plugins/resolvePlugins.test.ts +340 -0
- package/src/resolve-modules/plugins/resolvePlugins.ts +170 -0
- package/src/resolve-modules/plugins/types.test.ts +57 -0
- package/src/resolve-modules/plugins/types.ts +77 -0
- package/src/resolve-modules/resolveModules.test.ts +176 -0
- package/src/resolve-modules/resolveModules.ts +97 -0
- package/src/resolve-modules/types.ts +71 -0
- package/src/test-utilities/createMessage.test.ts +100 -0
- package/src/test-utilities/createMessage.ts +20 -0
- package/src/test-utilities/index.ts +1 -0
- package/src/versionedInterfaces.ts +9 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
|
+
import { describe, it, expect } from "vitest";
|
|
3
|
+
import { createMessagesQuery } from "./createMessagesQuery.js";
|
|
4
|
+
import { createEffect, createRoot, createSignal } from "./reactivity/solid.js";
|
|
5
|
+
import { createMessage } from "./test-utilities/createMessage.js";
|
|
6
|
+
const createChangeListener = async (cb) => createEffect(cb);
|
|
7
|
+
describe("create", () => {
|
|
8
|
+
it("should create a message", () => {
|
|
9
|
+
const query = createMessagesQuery(() => []);
|
|
10
|
+
expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
|
|
11
|
+
const mockMessage = createMessage("first-message", { en: "Hello World" });
|
|
12
|
+
const created = query.create({ data: mockMessage });
|
|
13
|
+
expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
|
|
14
|
+
expect(created).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("should return false if message with id already exists", () => {
|
|
17
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
18
|
+
expect(query.get({ where: { id: "first-message" } })).toBeDefined();
|
|
19
|
+
const mockMessage = createMessage("first-message", { en: "Some Text" });
|
|
20
|
+
query.create({ data: mockMessage });
|
|
21
|
+
const created = query.create({ data: mockMessage });
|
|
22
|
+
expect(created).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("get", () => {
|
|
26
|
+
it("should return undefined if a message does not exist", () => {
|
|
27
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
28
|
+
const message = query.get({ where: { id: "none-existent-message" } });
|
|
29
|
+
expect(message).toBeUndefined();
|
|
30
|
+
});
|
|
31
|
+
it("should return an object, not an array", () => {
|
|
32
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
33
|
+
const message = query.get({ where: { id: "first-message" } });
|
|
34
|
+
expect(message).toBeDefined();
|
|
35
|
+
expect(Array.isArray(message)).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
// todo: improve the readonly type
|
|
38
|
+
it.skip("mutating the returned value should not affect subsequent return values", () => {
|
|
39
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
40
|
+
const message1 = query.get({ where: { id: "first-message" } });
|
|
41
|
+
message1.variants.find((v) => v.languageTag === "en").pattern[0].value =
|
|
42
|
+
"Hello World 2";
|
|
43
|
+
const message2 = query.get({ where: { id: "first-message" } });
|
|
44
|
+
expect(message1.variants.find((v) => v.languageTag === "en").pattern[0].value).toBe("Hello World 2");
|
|
45
|
+
expect(message2.variants.find((v) => v.languageTag === "en").pattern[0].value).toBe("Hello World");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("getAll", () => {
|
|
49
|
+
it("should return an empty array if no messages exist", () => {
|
|
50
|
+
const query = createMessagesQuery(() => []);
|
|
51
|
+
const messages = query.getAll();
|
|
52
|
+
expect(Object.values(messages)).toEqual([]);
|
|
53
|
+
});
|
|
54
|
+
it("should return all message objects", () => {
|
|
55
|
+
const query = createMessagesQuery(() => []);
|
|
56
|
+
const mockMessage1 = createMessage("first-message", { en: "Hello World" });
|
|
57
|
+
const mockMessage2 = createMessage("second-message", { en: "Hello World 2" });
|
|
58
|
+
query.create({ data: mockMessage1 });
|
|
59
|
+
query.create({ data: mockMessage2 });
|
|
60
|
+
const messages = query.getAll();
|
|
61
|
+
expect(Object.values(messages)).toEqual([mockMessage1, mockMessage2]);
|
|
62
|
+
});
|
|
63
|
+
// todo: improve the readonly type
|
|
64
|
+
it.skip("mutating the returned value should not affect subsequent return values", () => {
|
|
65
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
66
|
+
const messages1 = query.getAll();
|
|
67
|
+
Object.values(messages1)[0].variants.find((v) => v.languageTag === "en")
|
|
68
|
+
.pattern[0].value = "Hello World 2";
|
|
69
|
+
expect(Object.values(query.getAll())[0].variants.find((v) => v.languageTag === "en")
|
|
70
|
+
.pattern[0].value).toBe("Hello World");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("update", () => {
|
|
74
|
+
it("should update a message", () => {
|
|
75
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
76
|
+
expect(query.get({ where: { id: "first-message" } })).toBeDefined();
|
|
77
|
+
const mockMessage = createMessage("first-message", { en: "Hello World 2" });
|
|
78
|
+
const updated = query.update({ where: { id: "first-message" }, data: mockMessage });
|
|
79
|
+
expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
|
|
80
|
+
expect(updated).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it("should return false if message with id does not exist exists", () => {
|
|
83
|
+
const query = createMessagesQuery(() => []);
|
|
84
|
+
expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
|
|
85
|
+
const mockMessage = createMessage("first-message", { en: "Hello World" });
|
|
86
|
+
const updated = query.update({ where: { id: "first-message" }, data: mockMessage });
|
|
87
|
+
expect(updated).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("upsert", () => {
|
|
91
|
+
it("should create a message if not present yet", () => {
|
|
92
|
+
const query = createMessagesQuery(() => []);
|
|
93
|
+
expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
|
|
94
|
+
const mockMessage = createMessage("first-message", { en: "Hello World" });
|
|
95
|
+
const upserted = query.upsert({ where: { id: "first-message" }, data: mockMessage });
|
|
96
|
+
expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
|
|
97
|
+
expect(upserted).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it("should update message if id already exists", () => {
|
|
100
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
101
|
+
expect(query.get({ where: { id: "first-message" } })).toBeDefined();
|
|
102
|
+
const mockMessage = createMessage("first-message", { en: "Hello World 2" });
|
|
103
|
+
const upserted = query.upsert({ where: { id: "first-message" }, data: mockMessage });
|
|
104
|
+
expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
|
|
105
|
+
expect(upserted).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("delete", () => {
|
|
109
|
+
it("should delete a message", () => {
|
|
110
|
+
const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
|
|
111
|
+
expect(query.get({ where: { id: "first-message" } })).toBeDefined();
|
|
112
|
+
const deleted = query.delete({ where: { id: "first-message" } });
|
|
113
|
+
expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
|
|
114
|
+
expect(deleted).toBe(true);
|
|
115
|
+
});
|
|
116
|
+
it("should return false if message with id does not exist", () => {
|
|
117
|
+
const query = createMessagesQuery(() => []);
|
|
118
|
+
expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
|
|
119
|
+
const deleted = query.delete({ where: { id: "first-message" } });
|
|
120
|
+
expect(deleted).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe("reactivity", () => {
|
|
124
|
+
describe("get", () => {
|
|
125
|
+
it("should react to `create`", async () => {
|
|
126
|
+
await createRoot(async () => {
|
|
127
|
+
const query = createMessagesQuery(() => []);
|
|
128
|
+
// eslint-disable-next-line unicorn/no-null
|
|
129
|
+
let message = null;
|
|
130
|
+
await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
|
|
131
|
+
expect(message).toBeUndefined();
|
|
132
|
+
query.create({ data: createMessage("1", { en: "before" }) });
|
|
133
|
+
expect(message).toBeDefined();
|
|
134
|
+
const anotherMessage = query.get({ where: { id: "1" } });
|
|
135
|
+
expect(anotherMessage).toBeDefined();
|
|
136
|
+
expect(message).toStrictEqual(anotherMessage);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
it("should react to `update`", async () => {
|
|
140
|
+
await createRoot(async () => {
|
|
141
|
+
const query = createMessagesQuery(() => [createMessage("1", { en: "before" })]);
|
|
142
|
+
let message;
|
|
143
|
+
await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
|
|
144
|
+
expect(message).toBeDefined();
|
|
145
|
+
expect((message?.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
|
|
146
|
+
.value).toBe("before");
|
|
147
|
+
query.update({ where: { id: "1" }, data: createMessage("1", { en: "after" }) });
|
|
148
|
+
expect((message?.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
|
|
149
|
+
.value).toBe("after");
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
it("should react to `upsert`", async () => {
|
|
153
|
+
await createRoot(async () => {
|
|
154
|
+
const query = createMessagesQuery(() => []);
|
|
155
|
+
let message;
|
|
156
|
+
await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
|
|
157
|
+
expect(message).toBeUndefined();
|
|
158
|
+
query.upsert({ where: { id: "1" }, data: createMessage("1", { en: "before" }) });
|
|
159
|
+
expect(message).toBeDefined();
|
|
160
|
+
expect((message?.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
|
|
161
|
+
.value).toBe("before");
|
|
162
|
+
query.upsert({ where: { id: "1" }, data: createMessage("1", { en: "after" }) });
|
|
163
|
+
expect((message?.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
|
|
164
|
+
.value).toBe("after");
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
it("should react to `delete`", async () => {
|
|
168
|
+
await createRoot(async () => {
|
|
169
|
+
const query = createMessagesQuery(() => [createMessage("1", { en: "" })]);
|
|
170
|
+
let message;
|
|
171
|
+
await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
|
|
172
|
+
expect(message).toBeDefined();
|
|
173
|
+
query.delete({ where: { id: "1" } });
|
|
174
|
+
expect(message).toBeUndefined();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
it("should react to changes to the input `messages`", async () => {
|
|
178
|
+
const [messages, setMessages] = createSignal([]);
|
|
179
|
+
const query = createMessagesQuery(messages);
|
|
180
|
+
// eslint-disable-next-line unicorn/no-null
|
|
181
|
+
let message = null;
|
|
182
|
+
await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
|
|
183
|
+
expect(message).toBeUndefined();
|
|
184
|
+
query.create({ data: createMessage("1", { en: "before" }) });
|
|
185
|
+
expect(message).toBeDefined();
|
|
186
|
+
expect((message.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
|
|
187
|
+
.value).toBe("before");
|
|
188
|
+
setMessages([createMessage("1", { en: "after" })]);
|
|
189
|
+
expect(message).toBeDefined();
|
|
190
|
+
expect((message.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
|
|
191
|
+
.value).toBe("after");
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe.todo("subscribe", () => {
|
|
195
|
+
// TODO: add tests for `subscribe`
|
|
196
|
+
});
|
|
197
|
+
describe("getAll", () => {
|
|
198
|
+
it("should react to `create`", async () => {
|
|
199
|
+
await createRoot(async () => {
|
|
200
|
+
const query = createMessagesQuery(() => []);
|
|
201
|
+
let messages = undefined;
|
|
202
|
+
await createChangeListener(() => (messages = query.getAll()));
|
|
203
|
+
expect(Object.values(messages)).toHaveLength(0);
|
|
204
|
+
query.create({ data: createMessage("1", { en: "before" }) });
|
|
205
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
206
|
+
query.create({ data: createMessage("2", { en: "before" }) });
|
|
207
|
+
expect(Object.values(messages)).toHaveLength(2);
|
|
208
|
+
query.create({ data: createMessage("3", { en: "before" }) });
|
|
209
|
+
expect(Object.values(messages)).toHaveLength(3);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
it("should react to `update`", async () => {
|
|
213
|
+
await createRoot(async () => {
|
|
214
|
+
const query = createMessagesQuery(() => [createMessage("1", { en: "before" })]);
|
|
215
|
+
let messages = undefined;
|
|
216
|
+
await createChangeListener(() => (messages = query.getAll()));
|
|
217
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
218
|
+
expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
|
|
219
|
+
.pattern[0].value).toBe("before");
|
|
220
|
+
query.update({ where: { id: "1" }, data: createMessage("1", { en: "after" }) });
|
|
221
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
222
|
+
expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
|
|
223
|
+
.pattern[0].value).toBe("after");
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
it("should react to `upsert`", async () => {
|
|
227
|
+
await createRoot(async () => {
|
|
228
|
+
const query = createMessagesQuery(() => []);
|
|
229
|
+
let messages = undefined;
|
|
230
|
+
await createChangeListener(() => (messages = query.getAll()));
|
|
231
|
+
expect(Object.values(messages)).toHaveLength(0);
|
|
232
|
+
query.upsert({ where: { id: "1" }, data: createMessage("1", { en: "before" }) });
|
|
233
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
234
|
+
expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
|
|
235
|
+
.pattern[0].value).toBe("before");
|
|
236
|
+
query.upsert({ where: { id: "1" }, data: createMessage("1", { en: "after" }) });
|
|
237
|
+
expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
|
|
238
|
+
.pattern[0].value).toBe("after");
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
it("should react to `delete`", async () => {
|
|
242
|
+
await createRoot(async () => {
|
|
243
|
+
const query = createMessagesQuery(() => [
|
|
244
|
+
createMessage("1", { en: "" }),
|
|
245
|
+
createMessage("2", { en: "" }),
|
|
246
|
+
createMessage("3", { en: "" }),
|
|
247
|
+
]);
|
|
248
|
+
let messages = undefined;
|
|
249
|
+
await createChangeListener(() => (messages = query.getAll()));
|
|
250
|
+
expect(Object.values(messages)).toHaveLength(3);
|
|
251
|
+
query.delete({ where: { id: "1" } });
|
|
252
|
+
expect(Object.values(messages)).toHaveLength(2);
|
|
253
|
+
// deleting the same id again should not have an effect
|
|
254
|
+
query.delete({ where: { id: "1" } });
|
|
255
|
+
expect(Object.values(messages)).toHaveLength(2);
|
|
256
|
+
query.delete({ where: { id: "2" } });
|
|
257
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
258
|
+
query.delete({ where: { id: "3" } });
|
|
259
|
+
expect(Object.values(messages)).toHaveLength(0);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
it("should react to changes to the input `messages`", async () => {
|
|
263
|
+
const [inputMessages, setMessages] = createSignal([
|
|
264
|
+
createMessage("1", { en: "before" }),
|
|
265
|
+
]);
|
|
266
|
+
const query = createMessagesQuery(inputMessages);
|
|
267
|
+
let messages = undefined;
|
|
268
|
+
await createChangeListener(() => (messages = query.getAll()));
|
|
269
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
270
|
+
query.create({ data: createMessage("2", { en: "" }) });
|
|
271
|
+
expect(Object.values(messages)).toHaveLength(2);
|
|
272
|
+
expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
|
|
273
|
+
.pattern[0].value).toBe("before");
|
|
274
|
+
setMessages([createMessage("1", { en: "after" })]);
|
|
275
|
+
expect(Object.values(messages)).toHaveLength(1);
|
|
276
|
+
expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
|
|
277
|
+
.pattern[0].value).toBe("after");
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
it("instances should not share state", async () => {
|
|
282
|
+
await createRoot(async () => {
|
|
283
|
+
const query1 = createMessagesQuery(() => [createMessage("1", { en: "before" })]);
|
|
284
|
+
const query2 = createMessagesQuery(() => []);
|
|
285
|
+
// eslint-disable-next-line unicorn/no-null
|
|
286
|
+
let message1 = null;
|
|
287
|
+
await createChangeListener(() => (message1 = query1.get({ where: { id: "1" } })));
|
|
288
|
+
// eslint-disable-next-line unicorn/no-null
|
|
289
|
+
let message2 = null;
|
|
290
|
+
await createChangeListener(() => (message2 = query2.get({ where: { id: "1" } })));
|
|
291
|
+
expect(message1).toBeDefined();
|
|
292
|
+
expect(message2).toBeUndefined();
|
|
293
|
+
query2.create({ data: createMessage("1", { en: "before" }) });
|
|
294
|
+
expect(message2).toBeDefined();
|
|
295
|
+
query1.update({ where: { id: "1" }, data: createMessage("1", { en: "after" }) });
|
|
296
|
+
expect(message1.variants.find((variant) => variant.languageTag === "en").pattern[0]
|
|
297
|
+
.value).toBe("after");
|
|
298
|
+
expect(message2.variants.find((variant) => variant.languageTag === "en").pattern[0]
|
|
299
|
+
.value).toBe("before");
|
|
300
|
+
query1.delete({ where: { id: "1" } });
|
|
301
|
+
expect(message1).toBeUndefined();
|
|
302
|
+
expect(message2).toBeDefined();
|
|
303
|
+
});
|
|
304
|
+
});
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class InvalidConfigError extends Error {
|
|
2
|
+
constructor(message: string, options: ErrorOptions);
|
|
3
|
+
}
|
|
4
|
+
export declare class ProjectFileJSONSyntaxError extends Error {
|
|
5
|
+
constructor(message: string, options: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
export declare class ProjectFilePathNotFoundError extends Error {
|
|
8
|
+
constructor(message: string, options: ErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
export declare class PluginSaveMessagesError extends Error {
|
|
11
|
+
constructor(message: string, options: ErrorOptions);
|
|
12
|
+
}
|
|
13
|
+
export declare class PluginLoadMessagesError extends Error {
|
|
14
|
+
constructor(message: string, options: ErrorOptions);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Error when no package provides the API to handle messages.
|
|
18
|
+
*/
|
|
19
|
+
export declare class NoPluginProvidesLoadOrSaveMessagesError extends Error {
|
|
20
|
+
constructor();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;CAIlD;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;CAIlD;AAED,qBAAa,4BAA6B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;CAIlD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;CAIlD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;CAIlD;AAED;;GAEG;AACH,qBAAa,uCAAwC,SAAQ,KAAK;;CAOjE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export class InvalidConfigError extends Error {
|
|
2
|
+
constructor(message, options) {
|
|
3
|
+
super(message, options);
|
|
4
|
+
this.name = "InvalidConfigError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class ProjectFileJSONSyntaxError extends Error {
|
|
8
|
+
constructor(message, options) {
|
|
9
|
+
super(message, options);
|
|
10
|
+
this.name = "ProjectFileJSONSyntaxError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ProjectFilePathNotFoundError extends Error {
|
|
14
|
+
constructor(message, options) {
|
|
15
|
+
super(message, options);
|
|
16
|
+
this.name = "ProjectFilePathNotFoundError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class PluginSaveMessagesError extends Error {
|
|
20
|
+
constructor(message, options) {
|
|
21
|
+
super(message, options);
|
|
22
|
+
this.name = "PluginSaveMessagesError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class PluginLoadMessagesError extends Error {
|
|
26
|
+
constructor(message, options) {
|
|
27
|
+
super(message, options);
|
|
28
|
+
this.name = "PluginLoadMessagesError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Error when no package provides the API to handle messages.
|
|
33
|
+
*/
|
|
34
|
+
export class NoPluginProvidesLoadOrSaveMessagesError extends Error {
|
|
35
|
+
constructor() {
|
|
36
|
+
super("It seems you did not install any plugin that handles messages. Please add one to make inlang work. See https://inlang.com/documentation/plugins/registry."); // TODO: check if link is correct
|
|
37
|
+
this.name = "NoPluginProvidesLoadOrSaveMessagesError";
|
|
38
|
+
}
|
|
39
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*! PUBLIC API FOR THE INLANG SDK.
|
|
3
|
+
*!
|
|
4
|
+
*! EXPORT AS LITTLE AS POSSIBLE TO MINIMIZE THE CHANCE OF BREAKING CHANGES.
|
|
5
|
+
*/
|
|
6
|
+
export type { InlangProject, InstalledMessageLintRule, InstalledPlugin, MessageQueryApi, Subscribable, } from "./api.js";
|
|
7
|
+
export { type ImportFunction, createImport } from "./resolve-modules/index.js";
|
|
8
|
+
export { openInlangProject } from "./openInlangProject.js";
|
|
9
|
+
export { solidAdapter, type InlangProjectWithSolidAdapter } from "./adapter/solidAdapter.js";
|
|
10
|
+
export { createMessagesQuery } from "./createMessagesQuery.js";
|
|
11
|
+
export { ProjectFilePathNotFoundError, ProjectFileJSONSyntaxError, InvalidConfigError, NoPluginProvidesLoadOrSaveMessagesError, PluginLoadMessagesError, PluginSaveMessagesError, } from "./errors.js";
|
|
12
|
+
export * from "./messages/variant.js";
|
|
13
|
+
export * from "./versionedInterfaces.js";
|
|
14
|
+
export { InlangModule } from "@inlang/module";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACX,aAAa,EACb,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,YAAY,GACZ,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,KAAK,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,KAAK,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACN,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,uCAAuC,EACvC,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,aAAa,CAAA;AAEpB,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*! PUBLIC API FOR THE INLANG SDK.
|
|
3
|
+
*!
|
|
4
|
+
*! EXPORT AS LITTLE AS POSSIBLE TO MINIMIZE THE CHANCE OF BREAKING CHANGES.
|
|
5
|
+
*/
|
|
6
|
+
export { createImport } from "./resolve-modules/index.js";
|
|
7
|
+
export { openInlangProject } from "./openInlangProject.js";
|
|
8
|
+
export { solidAdapter } from "./adapter/solidAdapter.js";
|
|
9
|
+
export { createMessagesQuery } from "./createMessagesQuery.js";
|
|
10
|
+
export { ProjectFilePathNotFoundError, ProjectFileJSONSyntaxError, InvalidConfigError, NoPluginProvidesLoadOrSaveMessagesError, PluginLoadMessagesError, PluginSaveMessagesError, } from "./errors.js";
|
|
11
|
+
export * from "./messages/variant.js";
|
|
12
|
+
export * from "./versionedInterfaces.js";
|
|
13
|
+
export { InlangModule } from "@inlang/module";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lint/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lint/message/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAInD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Message } from "@inlang/message";
|
|
2
|
+
import type { MessagedLintRuleThrowedError } from "./errors.js";
|
|
3
|
+
import type { LanguageTag } from "@inlang/language-tag";
|
|
4
|
+
import type { JSONObject } from "@inlang/json-types";
|
|
5
|
+
import type { MessageLintLevel, MessageLintReport, MessageLintRule } from "@inlang/message-lint-rule";
|
|
6
|
+
export declare const lintMessages: (args: {
|
|
7
|
+
sourceLanguageTag: LanguageTag;
|
|
8
|
+
languageTags: LanguageTag[];
|
|
9
|
+
ruleSettings: Record<MessageLintRule["meta"]["id"], JSONObject>;
|
|
10
|
+
ruleLevels: Record<MessageLintRule["meta"]["id"], MessageLintLevel>;
|
|
11
|
+
rules: MessageLintRule[];
|
|
12
|
+
messages: Message[];
|
|
13
|
+
}) => Promise<{
|
|
14
|
+
data: MessageLintReport[];
|
|
15
|
+
errors: MessagedLintRuleThrowedError[];
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=lintMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lintMessages.d.ts","sourceRoot":"","sources":["../../../src/lint/message/lintMessages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,MAAM,2BAA2B,CAAA;AAElC,eAAO,MAAM,YAAY,SAAgB;IACxC,iBAAiB,EAAE,WAAW,CAAA;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,YAAY,EAAE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;IAC/D,UAAU,EAAE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACnE,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAA;CACnB,KAAG,QAAQ;IAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAAC,MAAM,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAchF,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { lintSingleMessage } from "./lintSingleMessage.js";
|
|
2
|
+
export const lintMessages = async (args) => {
|
|
3
|
+
const promises = args.messages.map((message) => lintSingleMessage({
|
|
4
|
+
...args,
|
|
5
|
+
message,
|
|
6
|
+
}));
|
|
7
|
+
const results = await Promise.all(promises);
|
|
8
|
+
return {
|
|
9
|
+
data: results.flatMap((result) => result.data).filter(Boolean),
|
|
10
|
+
errors: results.flatMap((result) => result.errors).filter(Boolean),
|
|
11
|
+
};
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lintMessages.test.d.ts","sourceRoot":"","sources":["../../../src/lint/message/lintMessages.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { lintMessages } from "./lintMessages.js";
|
|
3
|
+
const lintRule1 = {
|
|
4
|
+
meta: {
|
|
5
|
+
id: "messageLintRule.x.1",
|
|
6
|
+
displayName: { en: "" },
|
|
7
|
+
description: { en: "" },
|
|
8
|
+
},
|
|
9
|
+
message: vi.fn(),
|
|
10
|
+
};
|
|
11
|
+
const lintRule2 = {
|
|
12
|
+
meta: {
|
|
13
|
+
id: "messageLintRule.x.2",
|
|
14
|
+
displayName: { en: "" },
|
|
15
|
+
description: { en: "" },
|
|
16
|
+
},
|
|
17
|
+
message: vi.fn(),
|
|
18
|
+
};
|
|
19
|
+
const message1 = { id: "m1" };
|
|
20
|
+
const message2 = { id: "m2" };
|
|
21
|
+
const message3 = { id: "m3" };
|
|
22
|
+
const messages = [message1, message2, message3];
|
|
23
|
+
describe("lintMessages", async () => {
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
vi.resetAllMocks();
|
|
26
|
+
});
|
|
27
|
+
test("it should await all messages", async () => {
|
|
28
|
+
let called = 0;
|
|
29
|
+
lintRule2.message.mockImplementation(async () => {
|
|
30
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
31
|
+
called++;
|
|
32
|
+
});
|
|
33
|
+
await lintMessages({
|
|
34
|
+
ruleLevels: {
|
|
35
|
+
[lintRule1.meta.id]: "warning",
|
|
36
|
+
[lintRule2.meta.id]: "warning",
|
|
37
|
+
},
|
|
38
|
+
ruleSettings: {},
|
|
39
|
+
sourceLanguageTag: "en",
|
|
40
|
+
languageTags: [],
|
|
41
|
+
messages,
|
|
42
|
+
rules: [lintRule1, lintRule2],
|
|
43
|
+
});
|
|
44
|
+
expect(lintRule1.message).toHaveBeenCalledTimes(3);
|
|
45
|
+
expect(called).toBe(3);
|
|
46
|
+
});
|
|
47
|
+
test("it should process all messages and rules in parallel", async () => {
|
|
48
|
+
const fn = vi.fn();
|
|
49
|
+
lintRule1.message.mockImplementation(async ({ message }) => {
|
|
50
|
+
fn("r1", "before", message.id);
|
|
51
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
52
|
+
fn("r1", "after", message.id);
|
|
53
|
+
});
|
|
54
|
+
lintRule2.message.mockImplementation(async ({ message }) => {
|
|
55
|
+
fn("r2", "before", message.id);
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
57
|
+
fn("r2", "after", message.id);
|
|
58
|
+
});
|
|
59
|
+
await lintMessages({
|
|
60
|
+
ruleLevels: {
|
|
61
|
+
[lintRule1.meta.id]: "warning",
|
|
62
|
+
[lintRule2.meta.id]: "warning",
|
|
63
|
+
},
|
|
64
|
+
ruleSettings: {},
|
|
65
|
+
rules: [lintRule1, lintRule2],
|
|
66
|
+
sourceLanguageTag: "en",
|
|
67
|
+
languageTags: [],
|
|
68
|
+
messages,
|
|
69
|
+
});
|
|
70
|
+
expect(fn).toHaveBeenCalledTimes(12);
|
|
71
|
+
expect(fn).toHaveBeenNthCalledWith(1, "r1", "before", "m1");
|
|
72
|
+
expect(fn).toHaveBeenNthCalledWith(2, "r2", "before", "m1");
|
|
73
|
+
expect(fn).toHaveBeenNthCalledWith(3, "r1", "before", "m2");
|
|
74
|
+
expect(fn).toHaveBeenNthCalledWith(4, "r2", "before", "m2");
|
|
75
|
+
expect(fn).toHaveBeenNthCalledWith(5, "r1", "before", "m3");
|
|
76
|
+
expect(fn).toHaveBeenNthCalledWith(6, "r2", "before", "m3");
|
|
77
|
+
expect(fn).toHaveBeenNthCalledWith(7, "r1", "after", "m1");
|
|
78
|
+
expect(fn).toHaveBeenNthCalledWith(8, "r2", "after", "m1");
|
|
79
|
+
expect(fn).toHaveBeenNthCalledWith(9, "r1", "after", "m2");
|
|
80
|
+
expect(fn).toHaveBeenNthCalledWith(10, "r2", "after", "m2");
|
|
81
|
+
expect(fn).toHaveBeenNthCalledWith(11, "r1", "after", "m3");
|
|
82
|
+
expect(fn).toHaveBeenNthCalledWith(12, "r2", "after", "m3");
|
|
83
|
+
});
|
|
84
|
+
test("it should not abort the linting process when errors occur", async () => {
|
|
85
|
+
lintRule1.message.mockImplementation(({ report }) => {
|
|
86
|
+
report({});
|
|
87
|
+
});
|
|
88
|
+
lintRule2.message.mockImplementation(() => {
|
|
89
|
+
throw new Error("error");
|
|
90
|
+
});
|
|
91
|
+
const { data, errors } = await lintMessages({
|
|
92
|
+
ruleLevels: {
|
|
93
|
+
[lintRule1.meta.id]: "warning",
|
|
94
|
+
[lintRule2.meta.id]: "warning",
|
|
95
|
+
},
|
|
96
|
+
ruleSettings: {},
|
|
97
|
+
sourceLanguageTag: "en",
|
|
98
|
+
languageTags: [],
|
|
99
|
+
messages,
|
|
100
|
+
rules: [lintRule1, lintRule2],
|
|
101
|
+
});
|
|
102
|
+
expect(data).toHaveLength(3);
|
|
103
|
+
expect(errors).toHaveLength(3);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MessageLintLevel, MessageLintRule, MessageLintReport } from "@inlang/message-lint-rule";
|
|
2
|
+
import type { Message } from "@inlang/message";
|
|
3
|
+
import { MessagedLintRuleThrowedError } from "./errors.js";
|
|
4
|
+
import type { LanguageTag } from "@inlang/language-tag";
|
|
5
|
+
import type { JSONObject } from "@inlang/json-types";
|
|
6
|
+
/**
|
|
7
|
+
* Lint a single message.
|
|
8
|
+
*
|
|
9
|
+
* - the lint rule levels defaults to `warning`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const lintSingleMessage: (args: {
|
|
12
|
+
sourceLanguageTag: LanguageTag;
|
|
13
|
+
languageTags: LanguageTag[];
|
|
14
|
+
ruleSettings: Record<MessageLintRule["meta"]["id"], JSONObject>;
|
|
15
|
+
ruleLevels: Record<MessageLintRule["meta"]["id"], MessageLintLevel>;
|
|
16
|
+
rules: MessageLintRule[];
|
|
17
|
+
messages: Message[];
|
|
18
|
+
message: Message;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
data: MessageLintReport[];
|
|
21
|
+
errors: MessagedLintRuleThrowedError[];
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=lintSingleMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lintSingleMessage.d.ts","sourceRoot":"","sources":["../../../src/lint/message/lintSingleMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAgB;IAC7C,iBAAiB,EAAE,WAAW,CAAA;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,YAAY,EAAE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;IAC/D,UAAU,EAAE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACnE,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CAChB;UAAmB,iBAAiB,EAAE;YAAU,4BAA4B,EAAE;EAsC9E,CAAA"}
|