@inlang/sdk 0.34.2 → 0.34.4

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.
@@ -2,20 +2,72 @@
2
2
  import { describe, it, expect } from "vitest";
3
3
  import { createMessagesQuery } from "./createMessagesQuery.js";
4
4
  import { createEffect, createRoot, createSignal } from "./reactivity/solid.js";
5
+ import { Message } from "@inlang/message";
5
6
  import { createMessage } from "./test-utilities/createMessage.js";
7
+ import { createNodeishMemoryFs } from "@lix-js/fs";
6
8
  const createChangeListener = async (cb) => createEffect(cb);
7
9
  const nextTick = () => new Promise((resolve) => setTimeout(resolve, 0));
8
- describe("create", () => {
9
- it("should create a message", () => {
10
- const query = createMessagesQuery(() => []);
10
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
11
+ const awaitableCreateMessageQuery = async (_messages) => {
12
+ const fs = createNodeishMemoryFs();
13
+ const settings = {
14
+ sourceLanguageTag: "en",
15
+ languageTags: ["en"],
16
+ modules: ["plugin.js", "lintRule.js"],
17
+ messageLintRuleLevels: {
18
+ "messageLintRule.project.missingTranslation": "error",
19
+ },
20
+ "plugin.project.i18next": {
21
+ pathPattern: "./examples/example01/{languageTag}.json",
22
+ variableReferencePattern: ["{", "}"],
23
+ },
24
+ };
25
+ let messages = _messages();
26
+ const resolvedModules = {
27
+ meta: [],
28
+ plugins: [],
29
+ messageLintRules: [],
30
+ resolvedPluginApi: {
31
+ loadMessages: (() => {
32
+ return messages;
33
+ }),
34
+ saveMessages: ((newMessages) => {
35
+ messages = newMessages;
36
+ }),
37
+ customApi: {},
38
+ },
39
+ errors: [],
40
+ };
41
+ return new Promise((res, rej) => {
42
+ const query = createMessagesQuery({
43
+ projectPath: "",
44
+ nodeishFs: fs,
45
+ settings: () => settings,
46
+ resolvedModules: () => resolvedModules,
47
+ onInitialMessageLoadResult: (error) => {
48
+ if (error) {
49
+ rej(error);
50
+ }
51
+ else {
52
+ res(query);
53
+ }
54
+ },
55
+ onLoadMessageResult: () => { },
56
+ onSaveMessageResult: () => { },
57
+ });
58
+ });
59
+ };
60
+ describe("create", async () => {
61
+ it("should create a message", async () => {
62
+ const query = await awaitableCreateMessageQuery(() => []);
11
63
  expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
12
64
  const mockMessage = createMessage("first-message", { en: "Hello World" });
13
65
  const created = query.create({ data: mockMessage });
14
66
  expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
15
67
  expect(created).toBe(true);
16
68
  });
17
- it("query.getByDefaultAlias should return a message with a default alias", () => {
18
- const query = createMessagesQuery(() => []);
69
+ it("query.getByDefaultAlias should return a message with a default alias", async () => {
70
+ const query = await awaitableCreateMessageQuery(() => []);
19
71
  expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
20
72
  const mockMessage = createMessage("first-message", { en: "Hello World" });
21
73
  mockMessage.alias = { default: "first-message-alias" };
@@ -24,8 +76,10 @@ describe("create", () => {
24
76
  expect(query.getByDefaultAlias("first-message-alias")).toEqual(mockMessage);
25
77
  expect(created).toBe(true);
26
78
  });
27
- it("should return false if message with id already exists", () => {
28
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
79
+ it("should return false if message with id already exists", async () => {
80
+ const query = await awaitableCreateMessageQuery(() => [
81
+ createMessage("first-message", { en: "Hello World" }),
82
+ ]);
29
83
  expect(query.get({ where: { id: "first-message" } })).toBeDefined();
30
84
  const mockMessage = createMessage("first-message", { en: "Some Text" });
31
85
  query.create({ data: mockMessage });
@@ -33,21 +87,30 @@ describe("create", () => {
33
87
  expect(created).toBe(false);
34
88
  });
35
89
  });
36
- describe("get", () => {
37
- it("should return undefined if a message does not exist", () => {
38
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
90
+ describe("get", async () => {
91
+ it("should return undefined if a message does not exist", async () => {
92
+ const query = await awaitableCreateMessageQuery(() => [
93
+ createMessage("first-message", { en: "Hello World" }),
94
+ ]);
39
95
  const message = query.get({ where: { id: "none-existent-message" } });
40
96
  expect(message).toBeUndefined();
41
97
  });
42
- it("should return an object, not an array", () => {
43
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
98
+ it("should return an object, not an array", async () => {
99
+ const query = await awaitableCreateMessageQuery(() => [
100
+ createMessage("first-message", { en: "Hello World" }),
101
+ ]);
102
+ expect(query.get({ where: { id: "first-message" } })).toBeDefined();
103
+ const mockMessageInit = createMessage("first-message", { en: "Hello World" });
104
+ query.create({ data: mockMessageInit });
44
105
  const message = query.get({ where: { id: "first-message" } });
45
106
  expect(message).toBeDefined();
46
107
  expect(Array.isArray(message)).toBe(false);
47
108
  });
48
109
  // todo: improve the readonly type
49
- it.skip("mutating the returned value should not affect subsequent return values", () => {
50
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
110
+ it.skip("mutating the returned value should not affect subsequent return values", async () => {
111
+ const query = await awaitableCreateMessageQuery(() => [
112
+ createMessage("first-message", { en: "Hello World" }),
113
+ ]);
51
114
  const message1 = query.get({ where: { id: "first-message" } });
52
115
  message1.variants.find((v) => v.languageTag === "en").pattern[0].value =
53
116
  "Hello World 2";
@@ -56,14 +119,14 @@ describe("get", () => {
56
119
  expect(message2.variants.find((v) => v.languageTag === "en").pattern[0].value).toBe("Hello World");
57
120
  });
58
121
  });
59
- describe("getAll", () => {
60
- it("should return an empty array if no messages exist", () => {
61
- const query = createMessagesQuery(() => []);
122
+ describe("getAll", async () => {
123
+ it("should return an empty array if no messages exist", async () => {
124
+ const query = await awaitableCreateMessageQuery(() => []);
62
125
  const messages = query.getAll();
63
126
  expect(Object.values(messages)).toEqual([]);
64
127
  });
65
- it("should return all message objects", () => {
66
- const query = createMessagesQuery(() => []);
128
+ it("should return all message objects", async () => {
129
+ const query = await awaitableCreateMessageQuery(() => []);
67
130
  const mockMessage1 = createMessage("first-message", { en: "Hello World" });
68
131
  const mockMessage2 = createMessage("second-message", { en: "Hello World 2" });
69
132
  query.create({ data: mockMessage1 });
@@ -72,8 +135,10 @@ describe("getAll", () => {
72
135
  expect(Object.values(messages)).toEqual([mockMessage1, mockMessage2]);
73
136
  });
74
137
  // todo: improve the readonly type
75
- it.skip("mutating the returned value should not affect subsequent return values", () => {
76
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
138
+ it.skip("mutating the returned value should not affect subsequent return values", async () => {
139
+ const query = await awaitableCreateMessageQuery(() => [
140
+ createMessage("first-message", { en: "Hello World" }),
141
+ ]);
77
142
  const messages1 = query.getAll();
78
143
  Object.values(messages1)[0].variants.find((v) => v.languageTag === "en")
79
144
  .pattern[0].value = "Hello World 2";
@@ -81,34 +146,41 @@ describe("getAll", () => {
81
146
  .pattern[0].value).toBe("Hello World");
82
147
  });
83
148
  });
84
- describe("update", () => {
85
- it("should update a message", () => {
86
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
149
+ describe("update", async () => {
150
+ it("should update a message", async () => {
151
+ const query = await awaitableCreateMessageQuery(() => [
152
+ createMessage("first-message", { en: "Hello World" }),
153
+ ]);
87
154
  expect(query.get({ where: { id: "first-message" } })).toBeDefined();
88
155
  const mockMessage = createMessage("first-message", { en: "Hello World 2" });
89
156
  const updated = query.update({ where: { id: "first-message" }, data: mockMessage });
90
157
  expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
91
158
  expect(updated).toBe(true);
92
159
  });
93
- it("should return false if message with id does not exist exists", () => {
94
- const query = createMessagesQuery(() => []);
160
+ it("should return false if message with id does not exist exists", async () => {
161
+ const query = await awaitableCreateMessageQuery(() => []);
95
162
  expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
96
163
  const mockMessage = createMessage("first-message", { en: "Hello World" });
97
164
  const updated = query.update({ where: { id: "first-message" }, data: mockMessage });
98
165
  expect(updated).toBe(false);
99
166
  });
100
167
  });
101
- describe("upsert", () => {
102
- it("should create a message if not present yet", () => {
103
- const query = createMessagesQuery(() => []);
168
+ describe("upsert", async () => {
169
+ it("should create a message if not present yet", async () => {
170
+ const query = await awaitableCreateMessageQuery(() => []);
104
171
  expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
105
172
  const mockMessage = createMessage("first-message", { en: "Hello World" });
106
173
  const upserted = query.upsert({ where: { id: "first-message" }, data: mockMessage });
107
174
  expect(query.get({ where: { id: "first-message" } })).toEqual(mockMessage);
108
175
  expect(upserted).toBe(true);
109
176
  });
110
- it("should update message if id already exists", () => {
111
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
177
+ it("should update message if id already exists", async () => {
178
+ const query = await awaitableCreateMessageQuery(() => [
179
+ createMessage("first-message", { en: "Hello World" }),
180
+ ]);
181
+ expect(query.get({ where: { id: "first-message" } })).toBeDefined();
182
+ const mockMessageInit = createMessage("first-message", { en: "Hello World" });
183
+ query.create({ data: mockMessageInit });
112
184
  expect(query.get({ where: { id: "first-message" } })).toBeDefined();
113
185
  const mockMessage = createMessage("first-message", { en: "Hello World 2" });
114
186
  const upserted = query.upsert({ where: { id: "first-message" }, data: mockMessage });
@@ -116,26 +188,28 @@ describe("upsert", () => {
116
188
  expect(upserted).toBe(true);
117
189
  });
118
190
  });
119
- describe("delete", () => {
120
- it("should delete a message", () => {
121
- const query = createMessagesQuery(() => [createMessage("first-message", { en: "Hello World" })]);
191
+ describe("delete", async () => {
192
+ it("should delete a message", async () => {
193
+ const query = await awaitableCreateMessageQuery(() => [
194
+ createMessage("first-message", { en: "Hello World" }),
195
+ ]);
122
196
  expect(query.get({ where: { id: "first-message" } })).toBeDefined();
123
197
  const deleted = query.delete({ where: { id: "first-message" } });
124
198
  expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
125
199
  expect(deleted).toBe(true);
126
200
  });
127
- it("should return false if message with id does not exist", () => {
128
- const query = createMessagesQuery(() => []);
201
+ it("should return false if message with id does not exist", async () => {
202
+ const query = await awaitableCreateMessageQuery(() => []);
129
203
  expect(query.get({ where: { id: "first-message" } })).toBeUndefined();
130
204
  const deleted = query.delete({ where: { id: "first-message" } });
131
205
  expect(deleted).toBe(false);
132
206
  });
133
207
  });
134
- describe("reactivity", () => {
135
- describe("get", () => {
208
+ describe("reactivity", async () => {
209
+ describe("get", async () => {
136
210
  it("should react to `create`", async () => {
137
211
  await createRoot(async () => {
138
- const query = createMessagesQuery(() => []);
212
+ const query = await awaitableCreateMessageQuery(() => []);
139
213
  // eslint-disable-next-line unicorn/no-null
140
214
  let message = null;
141
215
  await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
@@ -149,7 +223,9 @@ describe("reactivity", () => {
149
223
  });
150
224
  it("should react to `update`", async () => {
151
225
  await createRoot(async () => {
152
- const query = createMessagesQuery(() => [createMessage("1", { en: "before" })]);
226
+ const query = await awaitableCreateMessageQuery(() => [
227
+ createMessage("1", { en: "before" }),
228
+ ]);
153
229
  let message;
154
230
  await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
155
231
  expect(message).toBeDefined();
@@ -162,7 +238,7 @@ describe("reactivity", () => {
162
238
  });
163
239
  it("should react to `upsert`", async () => {
164
240
  await createRoot(async () => {
165
- const query = createMessagesQuery(() => []);
241
+ const query = await awaitableCreateMessageQuery(() => []);
166
242
  let message;
167
243
  await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
168
244
  expect(message).toBeUndefined();
@@ -177,7 +253,7 @@ describe("reactivity", () => {
177
253
  });
178
254
  it("should react to `delete`", async () => {
179
255
  await createRoot(async () => {
180
- const query = createMessagesQuery(() => [createMessage("1", { en: "" })]);
256
+ const query = await awaitableCreateMessageQuery(() => [createMessage("1", { en: "" })]);
181
257
  let message;
182
258
  await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
183
259
  expect(message).toBeDefined();
@@ -185,28 +261,12 @@ describe("reactivity", () => {
185
261
  expect(message).toBeUndefined();
186
262
  });
187
263
  });
188
- it("should react to changes to the input `messages`", async () => {
189
- const [messages, setMessages] = createSignal([]);
190
- const query = createMessagesQuery(messages);
191
- // eslint-disable-next-line unicorn/no-null
192
- let message = null;
193
- await createChangeListener(() => (message = query.get({ where: { id: "1" } })));
194
- expect(message).toBeUndefined();
195
- query.create({ data: createMessage("1", { en: "before" }) });
196
- expect(message).toBeDefined();
197
- expect((message.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
198
- .value).toBe("before");
199
- setMessages([createMessage("1", { en: "after" })]);
200
- expect(message).toBeDefined();
201
- expect((message.variants.find((variant) => variant.languageTag === "en")?.pattern[0])
202
- .value).toBe("after");
203
- });
204
264
  });
205
- describe("subscribe", () => {
206
- describe("get", () => {
265
+ describe("subscribe", async () => {
266
+ describe("get", async () => {
207
267
  it("should subscribe to `create`", async () => {
208
268
  await createRoot(async () => {
209
- const query = createMessagesQuery(() => []);
269
+ const query = await awaitableCreateMessageQuery(() => []);
210
270
  // eslint-disable-next-line unicorn/no-null
211
271
  let message = null;
212
272
  query.get.subscribe({ where: { id: "1" } }, (v) => {
@@ -219,10 +279,10 @@ describe("reactivity", () => {
219
279
  });
220
280
  });
221
281
  });
222
- describe("getByDefaultAlias", () => {
282
+ describe("getByDefaultAlias", async () => {
223
283
  it("should subscribe to `create`", async () => {
224
284
  await createRoot(async () => {
225
- const query = createMessagesQuery(() => []);
285
+ const query = await awaitableCreateMessageQuery(() => []);
226
286
  // eslint-disable-next-line unicorn/no-null
227
287
  let message = null;
228
288
  query.getByDefaultAlias.subscribe("message-alias", (v) => {
@@ -238,10 +298,10 @@ describe("reactivity", () => {
238
298
  });
239
299
  });
240
300
  });
241
- describe("getAll", () => {
301
+ describe("getAll", async () => {
242
302
  it("should react to `create`", async () => {
243
303
  await createRoot(async () => {
244
- const query = createMessagesQuery(() => []);
304
+ const query = await awaitableCreateMessageQuery(() => []);
245
305
  let messages = undefined;
246
306
  await createChangeListener(() => (messages = query.getAll()));
247
307
  expect(Object.values(messages)).toHaveLength(0);
@@ -255,7 +315,9 @@ describe("reactivity", () => {
255
315
  });
256
316
  it("should react to `update`", async () => {
257
317
  await createRoot(async () => {
258
- const query = createMessagesQuery(() => [createMessage("1", { en: "before" })]);
318
+ const query = await awaitableCreateMessageQuery(() => [
319
+ createMessage("1", { en: "before" }),
320
+ ]);
259
321
  let messages = undefined;
260
322
  await createChangeListener(() => (messages = query.getAll()));
261
323
  expect(Object.values(messages)).toHaveLength(1);
@@ -269,7 +331,7 @@ describe("reactivity", () => {
269
331
  });
270
332
  it("should react to `upsert`", async () => {
271
333
  await createRoot(async () => {
272
- const query = createMessagesQuery(() => []);
334
+ const query = await awaitableCreateMessageQuery(() => []);
273
335
  let messages = undefined;
274
336
  await createChangeListener(() => (messages = query.getAll()));
275
337
  expect(Object.values(messages)).toHaveLength(0);
@@ -284,7 +346,7 @@ describe("reactivity", () => {
284
346
  });
285
347
  it("should react to `delete`", async () => {
286
348
  await createRoot(async () => {
287
- const query = createMessagesQuery(() => [
349
+ const query = await awaitableCreateMessageQuery(() => [
288
350
  createMessage("1", { en: "" }),
289
351
  createMessage("2", { en: "" }),
290
352
  createMessage("3", { en: "" }),
@@ -303,26 +365,9 @@ describe("reactivity", () => {
303
365
  expect(Object.values(messages)).toHaveLength(0);
304
366
  });
305
367
  });
306
- it("should react to changes to the input `messages`", async () => {
307
- const [inputMessages, setMessages] = createSignal([
308
- createMessage("1", { en: "before" }),
309
- ]);
310
- const query = createMessagesQuery(inputMessages);
311
- let messages = undefined;
312
- await createChangeListener(() => (messages = query.getAll()));
313
- expect(Object.values(messages)).toHaveLength(1);
314
- query.create({ data: createMessage("2", { en: "" }) });
315
- expect(Object.values(messages)).toHaveLength(2);
316
- expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
317
- .pattern[0].value).toBe("before");
318
- setMessages([createMessage("1", { en: "after" })]);
319
- expect(Object.values(messages)).toHaveLength(1);
320
- expect(Object.values(messages)[0].variants.find((variant) => variant.languageTag === "en")
321
- .pattern[0].value).toBe("after");
322
- });
323
368
  it("should not mutate messages signal outside the query when using the query", async () => {
324
369
  const [inputMessages] = createSignal([createMessage("1", { en: "before" })]);
325
- const query = createMessagesQuery(inputMessages);
370
+ const query = await awaitableCreateMessageQuery(inputMessages);
326
371
  let messages = undefined;
327
372
  await createChangeListener(() => (messages = query.getAll()));
328
373
  expect(Object.values(messages)).toHaveLength(1);
@@ -333,8 +378,8 @@ describe("reactivity", () => {
333
378
  });
334
379
  it("instances should not share state", async () => {
335
380
  await createRoot(async () => {
336
- const query1 = createMessagesQuery(() => [createMessage("1", { en: "before" })]);
337
- const query2 = createMessagesQuery(() => []);
381
+ const query1 = await awaitableCreateMessageQuery(() => [createMessage("1", { en: "before" })]);
382
+ const query2 = await awaitableCreateMessageQuery(() => []);
338
383
  // eslint-disable-next-line unicorn/no-null
339
384
  let message1 = null;
340
385
  await createChangeListener(() => (message1 = query1.get({ where: { id: "1" } })));
@@ -8,5 +8,6 @@ import type { NodeishFilesystem } from "@lix-js/fs";
8
8
  export declare const createNodeishFsWithWatcher: (args: {
9
9
  nodeishFs: NodeishFilesystem;
10
10
  updateMessages: () => void;
11
+ abortController: AbortController;
11
12
  }) => NodeishFilesystem;
12
13
  //# sourceMappingURL=createNodeishFsWithWatcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createNodeishFsWithWatcher.d.ts","sourceRoot":"","sources":["../src/createNodeishFsWithWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,SAAU;IAChD,SAAS,EAAE,iBAAiB,CAAA;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAA;CAC1B,KAAG,iBAiDH,CAAA"}
1
+ {"version":3,"file":"createNodeishFsWithWatcher.d.ts","sourceRoot":"","sources":["../src/createNodeishFsWithWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,SAAU;IAChD,SAAS,EAAE,iBAAiB,CAAA;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,eAAe,EAAE,eAAe,CAAA;CAChC,KAAG,iBAgDH,CAAA"}
@@ -7,11 +7,11 @@
7
7
  export const createNodeishFsWithWatcher = (args) => {
8
8
  const pathList = [];
9
9
  const makeWatcher = (path) => {
10
- const abortController = new AbortController();
10
+ ;
11
11
  (async () => {
12
12
  try {
13
13
  const watcher = args.nodeishFs.watch(path, {
14
- signal: abortController.signal,
14
+ signal: args.abortController.signal,
15
15
  persistent: false,
16
16
  });
17
17
  if (watcher) {
@@ -4,11 +4,13 @@ import { createNodeishFsWithWatcher } from "./createNodeishFsWithWatcher.js";
4
4
  describe("watcher", () => {
5
5
  it("should trigger the update function when file changes", async () => {
6
6
  let counter = 0;
7
+ const abortController = new AbortController();
7
8
  const fs = createNodeishFsWithWatcher({
8
9
  nodeishFs: createNodeishMemoryFs(),
9
10
  updateMessages: () => {
10
11
  counter++;
11
12
  },
13
+ abortController,
12
14
  });
13
15
  // establish watcher
14
16
  await fs.writeFile("file.txt", "a");
@@ -28,5 +30,11 @@ describe("watcher", () => {
28
30
  await new Promise((resolve) => setTimeout(resolve, 0));
29
31
  //check if update function was called
30
32
  expect(counter).toBe(2);
33
+ abortController.abort();
34
+ // change file
35
+ await fs.writeFile("file.txt", "b");
36
+ await new Promise((resolve) => setTimeout(resolve, 0));
37
+ //check if update function was called - should not since signalled
38
+ expect(counter).toBe(2);
31
39
  });
32
40
  });
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,qBAAa,0BAA2B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;CAI1D;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACzC,OAAO,EAAE;QAAE,MAAM,EAAE,UAAU,EAAE,CAAA;KAAE;CAU7C;AAED,qBAAa,kCAAmC,SAAQ,KAAK;gBAChD,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAOnE;AAED,qBAAa,gCAAiC,SAAQ,KAAK;gBAC9C,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAIpE;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAIrD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAIrD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAOtF;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAOtF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,qBAAa,0BAA2B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;CAI1D;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACzC,OAAO,EAAE;QAAE,MAAM,EAAE,UAAU,EAAE,CAAA;KAAE;CAW7C;AAYD,qBAAa,kCAAmC,SAAQ,KAAK;gBAChD,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAOnE;AAED,qBAAa,gCAAiC,SAAQ,KAAK;gBAC9C,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAIpE;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAIrD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAIrD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAOtF;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAAE;CAOtF"}
package/dist/errors.js CHANGED
@@ -7,13 +7,23 @@ export class LoadProjectInvalidArgument extends Error {
7
7
  export class ProjectSettingsInvalidError extends Error {
8
8
  constructor(options) {
9
9
  // TODO: beatufiy ValueErrors
10
- super(`The project settings are invalid:\n\n${options.errors
10
+ super(`The project settings are invalid:
11
+ ${options.errors
11
12
  .filter((error) => error.path)
12
- .map((error) => `"${error.path}":\n\n${error.message}`)
13
+ .map(FormatProjectSettingsError)
13
14
  .join("\n")}`);
14
15
  this.name = "ProjectSettingsInvalidError";
15
16
  }
16
17
  }
18
+ function FormatProjectSettingsError(error) {
19
+ let msg = `${error.message} at ${error.path}`;
20
+ if (error.path.startsWith("/modules/")) {
21
+ msg += `
22
+ value = "${error.value}"
23
+ - ${error.schema.allOf.map((o) => `${o.description ?? ""}`).join("\n- ")}`;
24
+ }
25
+ return msg;
26
+ }
17
27
  export class ProjectSettingsFileJSONSyntaxError extends Error {
18
28
  constructor(options) {
19
29
  super(`The settings file at "${options.path}" is not a valid JSON file:\n\n${options.cause}`, options);
@@ -1 +1 @@
1
- {"version":3,"file":"loadProject.d.ts","sourceRoot":"","sources":["../src/loadProject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EAGb,YAAY,EACZ,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,4BAA4B,CAAA;AAwBhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAmChD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,cAAc,CAAA;CACxB,GAAG,OAAO,CAAC,aAAa,CAAC,CAuXzB;AAsHD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAQtE"}
1
+ {"version":3,"file":"loadProject.d.ts","sourceRoot":"","sources":["../src/loadProject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EAGb,YAAY,EACZ,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,4BAA4B,CAAA;AAkBhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAahD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,cAAc,CAAA;CACxB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiOzB;AA+GD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAQtE"}