@inlang/sdk 0.4.0 → 0.5.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/dist/adapter/solidAdapter.d.ts +2 -2
- package/dist/adapter/solidAdapter.d.ts.map +1 -1
- package/dist/adapter/solidAdapter.js +2 -2
- package/dist/adapter/solidAdapter.test.js +68 -78
- package/dist/api.d.ts +10 -6
- package/dist/api.d.ts.map +1 -1
- package/dist/api.test-d.d.ts +2 -0
- package/dist/api.test-d.d.ts.map +1 -0
- package/dist/api.test-d.js +4 -0
- package/dist/createMessageLintReportsQuery.d.ts +2 -2
- package/dist/createMessageLintReportsQuery.d.ts.map +1 -1
- package/dist/createMessageLintReportsQuery.js +11 -11
- package/dist/createMessagesQuery.js +1 -1
- package/dist/errors.d.ts +3 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/lint/message/lintMessages.d.ts +3 -7
- package/dist/lint/message/lintMessages.d.ts.map +1 -1
- package/dist/lint/message/lintMessages.test.js +38 -36
- package/dist/lint/message/lintSingleMessage.d.ts +3 -7
- package/dist/lint/message/lintSingleMessage.d.ts.map +1 -1
- package/dist/lint/message/lintSingleMessage.js +10 -10
- package/dist/lint/message/lintSingleMessage.test.js +71 -65
- package/dist/{openInlangProject.d.ts → loadProject.d.ts} +3 -3
- package/dist/loadProject.d.ts.map +1 -0
- package/dist/{openInlangProject.js → loadProject.js} +70 -66
- package/dist/loadProject.test.d.ts +2 -0
- package/dist/loadProject.test.d.ts.map +1 -0
- package/dist/{openInlangProject.test.js → loadProject.test.js} +160 -176
- package/dist/parseConfig.d.ts +2 -2
- package/dist/parseConfig.d.ts.map +1 -1
- package/dist/parseConfig.js +3 -3
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.js +1 -1
- package/dist/resolve-modules/plugins/errors.d.ts +1 -1
- package/dist/resolve-modules/plugins/errors.d.ts.map +1 -1
- package/dist/resolve-modules/plugins/resolvePlugins.js +15 -15
- package/dist/resolve-modules/plugins/resolvePlugins.test.js +55 -94
- package/dist/resolve-modules/plugins/types.d.ts +1 -1
- package/dist/resolve-modules/plugins/types.d.ts.map +1 -1
- package/dist/resolve-modules/plugins/types.test.js +10 -14
- package/dist/resolve-modules/resolveModules.d.ts.map +1 -1
- package/dist/resolve-modules/resolveModules.js +9 -9
- package/dist/resolve-modules/resolveModules.test.js +28 -42
- package/dist/resolve-modules/types.d.ts +3 -3
- package/dist/resolve-modules/types.d.ts.map +1 -1
- package/dist/versionedInterfaces.d.ts +1 -1
- package/dist/versionedInterfaces.d.ts.map +1 -1
- package/dist/versionedInterfaces.js +1 -1
- package/package.json +2 -2
- package/src/adapter/solidAdapter.test.ts +77 -87
- package/src/adapter/solidAdapter.ts +4 -4
- package/src/api.test-d.ts +8 -0
- package/src/api.ts +10 -6
- package/src/createMessageLintReportsQuery.ts +15 -20
- package/src/createMessagesQuery.ts +1 -1
- package/src/errors.ts +6 -6
- package/src/index.ts +4 -4
- package/src/lint/message/lintMessages.test.ts +38 -36
- package/src/lint/message/lintMessages.ts +3 -11
- package/src/lint/message/lintSingleMessage.test.ts +71 -65
- package/src/lint/message/lintSingleMessage.ts +13 -21
- package/src/{openInlangProject.test.ts → loadProject.test.ts} +165 -181
- package/src/{openInlangProject.ts → loadProject.ts} +81 -82
- package/src/parseConfig.ts +5 -3
- package/src/resolve-modules/message-lint-rules/resolveMessageLintRules.ts +1 -1
- package/src/resolve-modules/plugins/errors.ts +1 -1
- package/src/resolve-modules/plugins/resolvePlugins.test.ts +55 -94
- package/src/resolve-modules/plugins/resolvePlugins.ts +19 -19
- package/src/resolve-modules/plugins/types.test.ts +11 -15
- package/src/resolve-modules/plugins/types.ts +1 -1
- package/src/resolve-modules/resolveModules.test.ts +29 -43
- package/src/resolve-modules/resolveModules.ts +11 -9
- package/src/resolve-modules/types.ts +3 -3
- package/src/versionedInterfaces.ts +1 -1
- package/dist/openInlangProject.d.ts.map +0 -1
- package/dist/openInlangProject.test.d.ts +0 -2
- package/dist/openInlangProject.test.d.ts.map +0 -1
package/src/api.ts
CHANGED
|
@@ -6,13 +6,15 @@ import type {
|
|
|
6
6
|
MessageLintRule,
|
|
7
7
|
Message,
|
|
8
8
|
Plugin,
|
|
9
|
-
|
|
9
|
+
ProjectSettings,
|
|
10
10
|
MessageLintReport,
|
|
11
11
|
} from "./versionedInterfaces.js"
|
|
12
12
|
import type { ResolvedPluginApi } from "./resolve-modules/plugins/types.js"
|
|
13
13
|
|
|
14
14
|
export type InstalledPlugin = {
|
|
15
|
-
|
|
15
|
+
id: Plugin["id"]
|
|
16
|
+
displayName: Plugin["displayName"]
|
|
17
|
+
description: Plugin["description"]
|
|
16
18
|
/**
|
|
17
19
|
* The module which the plugin is installed from.
|
|
18
20
|
*/
|
|
@@ -21,12 +23,14 @@ export type InstalledPlugin = {
|
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
export type InstalledMessageLintRule = {
|
|
24
|
-
|
|
26
|
+
id: MessageLintRule["id"]
|
|
27
|
+
displayName: MessageLintRule["displayName"]
|
|
28
|
+
description: MessageLintRule["description"]
|
|
25
29
|
/**
|
|
26
30
|
* The module which the lint rule is installed from.
|
|
27
31
|
*/
|
|
28
32
|
module: string
|
|
29
|
-
|
|
33
|
+
level: MessageLintLevel
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
export type InlangProject = {
|
|
@@ -38,8 +42,8 @@ export type InlangProject = {
|
|
|
38
42
|
((typeof ModuleResolutionError)[keyof typeof ModuleResolutionError] | Error)[]
|
|
39
43
|
>
|
|
40
44
|
customApi: Subscribable<ResolvedPluginApi["customApi"]>
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
settings: Subscribable<ProjectSettings>
|
|
46
|
+
setSettings: (config: ProjectSettings) => Result<void, RuntimeError.ProjectSettingsInvalidError>
|
|
43
47
|
query: {
|
|
44
48
|
messages: MessageQueryApi
|
|
45
49
|
messageLintReports: MessageLintReportsQueryApi
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import { createEffect } from "./reactivity/solid.js"
|
|
2
|
-
import { createSubscribable } from "./
|
|
2
|
+
import { createSubscribable } from "./loadProject.js"
|
|
3
3
|
import type { InlangProject, InstalledMessageLintRule, MessageLintReportsQueryApi } from "./api.js"
|
|
4
|
-
import type {
|
|
4
|
+
import type { ProjectSettings } from "@inlang/project-settings"
|
|
5
5
|
import type { resolveModules } from "./resolve-modules/index.js"
|
|
6
|
-
import type {
|
|
7
|
-
JSONObject,
|
|
8
|
-
MessageLintReport,
|
|
9
|
-
MessageLintRule,
|
|
10
|
-
Message,
|
|
11
|
-
} from "./versionedInterfaces.js"
|
|
6
|
+
import type { MessageLintReport, Message } from "./versionedInterfaces.js"
|
|
12
7
|
import { lintSingleMessage } from "./lint/index.js"
|
|
13
8
|
import { ReactiveMap } from "./reactivity/map.js"
|
|
14
9
|
|
|
@@ -17,7 +12,7 @@ import { ReactiveMap } from "./reactivity/map.js"
|
|
|
17
12
|
*/
|
|
18
13
|
export function createMessageLintReportsQuery(
|
|
19
14
|
messages: () => Array<Message> | undefined,
|
|
20
|
-
|
|
15
|
+
settings: () => ProjectSettings,
|
|
21
16
|
installedMessageLintRules: () => Array<InstalledMessageLintRule>,
|
|
22
17
|
resolvedModules: () => Awaited<ReturnType<typeof resolveModules>> | undefined,
|
|
23
18
|
): InlangProject["query"]["messageLintReports"] {
|
|
@@ -25,25 +20,25 @@ export function createMessageLintReportsQuery(
|
|
|
25
20
|
const index = new ReactiveMap<MessageLintReport["messageId"], MessageLintReport[]>()
|
|
26
21
|
|
|
27
22
|
createEffect(() => {
|
|
28
|
-
const msgs = messages()
|
|
29
|
-
const conf = config()
|
|
30
23
|
const modules = resolvedModules()
|
|
24
|
+
const _messages = messages()
|
|
25
|
+
const _settings = settings()
|
|
31
26
|
|
|
32
|
-
if (
|
|
27
|
+
if (_messages && _settings && modules) {
|
|
33
28
|
// console.log("new calculation")
|
|
34
29
|
// index.clear()
|
|
35
|
-
for (const message of
|
|
30
|
+
for (const message of _messages) {
|
|
36
31
|
// TODO: only lint changed messages and update arrays selectively
|
|
37
32
|
|
|
38
33
|
lintSingleMessage({
|
|
39
34
|
rules: modules.messageLintRules,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
messages:
|
|
35
|
+
settings: {
|
|
36
|
+
..._settings,
|
|
37
|
+
messageLintRuleLevels: Object.fromEntries(
|
|
38
|
+
installedMessageLintRules().map((rule) => [rule.id, rule.level]),
|
|
39
|
+
),
|
|
40
|
+
},
|
|
41
|
+
messages: _messages,
|
|
47
42
|
message: message,
|
|
48
43
|
}).then((report) => {
|
|
49
44
|
if (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Message } from "@inlang/message"
|
|
2
2
|
import { ReactiveMap } from "./reactivity/map.js"
|
|
3
3
|
import { createEffect } from "./reactivity/solid.js"
|
|
4
|
-
import { createSubscribable } from "./
|
|
4
|
+
import { createSubscribable } from "./loadProject.js"
|
|
5
5
|
import type { InlangProject, MessageQueryApi } from "./api.js"
|
|
6
6
|
|
|
7
7
|
/**
|
package/src/errors.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
export class
|
|
1
|
+
export class ProjectSettingsInvalidError extends Error {
|
|
2
2
|
constructor(message: string, options: ErrorOptions) {
|
|
3
3
|
super(message, options)
|
|
4
|
-
this.name = "
|
|
4
|
+
this.name = "ProjectSettingsInvalidError"
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export class
|
|
8
|
+
export class ProjectSettingsFileJSONSyntaxError extends Error {
|
|
9
9
|
constructor(message: string, options: ErrorOptions) {
|
|
10
10
|
super(message, options)
|
|
11
|
-
this.name = "
|
|
11
|
+
this.name = "ProjectSettingsFileJSONSyntaxError"
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export class
|
|
15
|
+
export class ProjectSettingsFileNotFoundError extends Error {
|
|
16
16
|
constructor(message: string, options: ErrorOptions) {
|
|
17
17
|
super(message, options)
|
|
18
|
-
this.name = "
|
|
18
|
+
this.name = "ProjectSettingsFileNotFoundError"
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
package/src/index.ts
CHANGED
|
@@ -12,13 +12,13 @@ export type {
|
|
|
12
12
|
Subscribable,
|
|
13
13
|
} from "./api.js"
|
|
14
14
|
export { type ImportFunction, createImport } from "./resolve-modules/index.js"
|
|
15
|
-
export {
|
|
15
|
+
export { loadProject } from "./loadProject.js"
|
|
16
16
|
export { solidAdapter, type InlangProjectWithSolidAdapter } from "./adapter/solidAdapter.js"
|
|
17
17
|
export { createMessagesQuery } from "./createMessagesQuery.js"
|
|
18
18
|
export {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
ProjectSettingsFileJSONSyntaxError,
|
|
20
|
+
ProjectSettingsFileNotFoundError,
|
|
21
|
+
ProjectSettingsInvalidError,
|
|
22
22
|
PluginLoadMessagesError,
|
|
23
23
|
PluginSaveMessagesError,
|
|
24
24
|
} from "./errors.js"
|
|
@@ -4,21 +4,17 @@ import type { MessageLintReport, MessageLintRule } from "@inlang/message-lint-ru
|
|
|
4
4
|
import type { Message } from "@inlang/message"
|
|
5
5
|
|
|
6
6
|
const lintRule1 = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
message: vi.fn(),
|
|
7
|
+
id: "messageLintRule.x.1",
|
|
8
|
+
displayName: { en: "" },
|
|
9
|
+
description: { en: "" },
|
|
10
|
+
run: vi.fn(),
|
|
13
11
|
} satisfies MessageLintRule
|
|
14
12
|
|
|
15
13
|
const lintRule2 = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
},
|
|
21
|
-
message: vi.fn(),
|
|
14
|
+
id: "messageLintRule.x.2",
|
|
15
|
+
displayName: { en: "" },
|
|
16
|
+
description: { en: "" },
|
|
17
|
+
run: vi.fn(),
|
|
22
18
|
} satisfies MessageLintRule
|
|
23
19
|
|
|
24
20
|
const message1 = { id: "m1" } as Message
|
|
@@ -34,50 +30,54 @@ describe("lintMessages", async () => {
|
|
|
34
30
|
|
|
35
31
|
test("it should await all messages", async () => {
|
|
36
32
|
let called = 0
|
|
37
|
-
lintRule2.
|
|
33
|
+
lintRule2.run.mockImplementation(async () => {
|
|
38
34
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
39
35
|
called++
|
|
40
36
|
})
|
|
41
37
|
|
|
42
38
|
await lintMessages({
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
[
|
|
39
|
+
settings: {
|
|
40
|
+
sourceLanguageTag: "en",
|
|
41
|
+
languageTags: [],
|
|
42
|
+
modules: [],
|
|
43
|
+
messageLintRuleLevels: {
|
|
44
|
+
[lintRule1.id]: "warning",
|
|
45
|
+
[lintRule2.id]: "warning",
|
|
46
|
+
},
|
|
46
47
|
},
|
|
47
|
-
ruleSettings: {},
|
|
48
|
-
sourceLanguageTag: "en",
|
|
49
|
-
languageTags: [],
|
|
50
48
|
messages,
|
|
51
49
|
rules: [lintRule1, lintRule2],
|
|
52
50
|
})
|
|
53
51
|
|
|
54
|
-
expect(lintRule1.
|
|
52
|
+
expect(lintRule1.run).toHaveBeenCalledTimes(3)
|
|
55
53
|
expect(called).toBe(3)
|
|
56
54
|
})
|
|
57
55
|
|
|
58
56
|
test("it should process all messages and rules in parallel", async () => {
|
|
59
57
|
const fn = vi.fn()
|
|
60
58
|
|
|
61
|
-
lintRule1.
|
|
59
|
+
lintRule1.run.mockImplementation(async ({ message }) => {
|
|
62
60
|
fn("r1", "before", message.id)
|
|
63
61
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
64
62
|
fn("r1", "after", message.id)
|
|
65
63
|
})
|
|
66
|
-
lintRule2.
|
|
64
|
+
lintRule2.run.mockImplementation(async ({ message }) => {
|
|
67
65
|
fn("r2", "before", message.id)
|
|
68
66
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
69
67
|
fn("r2", "after", message.id)
|
|
70
68
|
})
|
|
71
69
|
|
|
72
70
|
await lintMessages({
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
[
|
|
71
|
+
settings: {
|
|
72
|
+
sourceLanguageTag: "en",
|
|
73
|
+
languageTags: [],
|
|
74
|
+
modules: [],
|
|
75
|
+
messageLintRuleLevels: {
|
|
76
|
+
[lintRule1.id]: "warning",
|
|
77
|
+
[lintRule2.id]: "warning",
|
|
78
|
+
},
|
|
76
79
|
},
|
|
77
|
-
ruleSettings: {},
|
|
78
80
|
rules: [lintRule1, lintRule2],
|
|
79
|
-
sourceLanguageTag: "en",
|
|
80
|
-
languageTags: [],
|
|
81
81
|
messages,
|
|
82
82
|
})
|
|
83
83
|
|
|
@@ -97,21 +97,23 @@ describe("lintMessages", async () => {
|
|
|
97
97
|
})
|
|
98
98
|
|
|
99
99
|
test("it should not abort the linting process when errors occur", async () => {
|
|
100
|
-
lintRule1.
|
|
100
|
+
lintRule1.run.mockImplementation(({ report }) => {
|
|
101
101
|
report({} as MessageLintReport)
|
|
102
102
|
})
|
|
103
|
-
lintRule2.
|
|
103
|
+
lintRule2.run.mockImplementation(() => {
|
|
104
104
|
throw new Error("error")
|
|
105
105
|
})
|
|
106
106
|
|
|
107
107
|
const { data, errors } = await lintMessages({
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
[
|
|
108
|
+
settings: {
|
|
109
|
+
sourceLanguageTag: "en",
|
|
110
|
+
languageTags: [],
|
|
111
|
+
modules: [],
|
|
112
|
+
messageLintRuleLevels: {
|
|
113
|
+
[lintRule1.id]: "warning",
|
|
114
|
+
[lintRule2.id]: "warning",
|
|
115
|
+
},
|
|
111
116
|
},
|
|
112
|
-
ruleSettings: {},
|
|
113
|
-
sourceLanguageTag: "en",
|
|
114
|
-
languageTags: [],
|
|
115
117
|
messages,
|
|
116
118
|
rules: [lintRule1, lintRule2],
|
|
117
119
|
})
|
|
@@ -1,19 +1,11 @@
|
|
|
1
1
|
import type { Message } from "@inlang/message"
|
|
2
2
|
import { lintSingleMessage } from "./lintSingleMessage.js"
|
|
3
3
|
import type { MessagedLintRuleThrowedError } from "./errors.js"
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
MessageLintLevel,
|
|
8
|
-
MessageLintReport,
|
|
9
|
-
MessageLintRule,
|
|
10
|
-
} from "@inlang/message-lint-rule"
|
|
4
|
+
import type { MessageLintReport, MessageLintRule } from "@inlang/message-lint-rule"
|
|
5
|
+
import type { ProjectSettings } from "@inlang/project-settings"
|
|
11
6
|
|
|
12
7
|
export const lintMessages = async (args: {
|
|
13
|
-
|
|
14
|
-
languageTags: LanguageTag[]
|
|
15
|
-
ruleSettings: Record<MessageLintRule["meta"]["id"], JSONObject>
|
|
16
|
-
ruleLevels: Record<MessageLintRule["meta"]["id"], MessageLintLevel>
|
|
8
|
+
settings: ProjectSettings & Required<Pick<ProjectSettings, "messageLintRuleLevels">>
|
|
17
9
|
rules: MessageLintRule[]
|
|
18
10
|
messages: Message[]
|
|
19
11
|
}): Promise<{ data: MessageLintReport[]; errors: MessagedLintRuleThrowedError[] }> => {
|
|
@@ -5,21 +5,17 @@ import type { Message } from "@inlang/message"
|
|
|
5
5
|
import { tryCatch } from "@inlang/result"
|
|
6
6
|
|
|
7
7
|
const lintRule1 = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
},
|
|
13
|
-
message: vi.fn(),
|
|
8
|
+
id: "messageLintRule.r.1",
|
|
9
|
+
displayName: "",
|
|
10
|
+
description: "",
|
|
11
|
+
run: vi.fn(),
|
|
14
12
|
} satisfies MessageLintRule
|
|
15
13
|
|
|
16
14
|
const lintRule2 = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
},
|
|
22
|
-
message: vi.fn(),
|
|
15
|
+
id: "messageLintRule.r.2",
|
|
16
|
+
displayName: "",
|
|
17
|
+
description: "",
|
|
18
|
+
run: vi.fn(),
|
|
23
19
|
} satisfies MessageLintRule
|
|
24
20
|
|
|
25
21
|
const message1 = {} as Message
|
|
@@ -35,14 +31,16 @@ describe("lintSingleMessage", async () => {
|
|
|
35
31
|
// the lint function is un-opinionated and does not set a default level.
|
|
36
32
|
// opinionated users like the inlang instance can very well set a default level (separation of concerns)
|
|
37
33
|
test("it should throw if a lint level is not provided for a given lint rule", async () => {
|
|
38
|
-
lintRule1.
|
|
34
|
+
lintRule1.run.mockImplementation(({ report }) => report({} as MessageLintReport))
|
|
39
35
|
|
|
40
36
|
const result = await tryCatch(() =>
|
|
41
37
|
lintSingleMessage({
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
settings: {
|
|
39
|
+
sourceLanguageTag: "en",
|
|
40
|
+
languageTags: ["en"],
|
|
41
|
+
messageLintRuleLevels: {},
|
|
42
|
+
modules: [],
|
|
43
|
+
},
|
|
46
44
|
messages,
|
|
47
45
|
message: message1,
|
|
48
46
|
rules: [lintRule1],
|
|
@@ -53,15 +51,17 @@ describe("lintSingleMessage", async () => {
|
|
|
53
51
|
})
|
|
54
52
|
|
|
55
53
|
test("it should override the default lint level", async () => {
|
|
56
|
-
lintRule1.
|
|
54
|
+
lintRule1.run.mockImplementation(({ report }) => report({} as MessageLintReport))
|
|
57
55
|
|
|
58
56
|
const reports = await lintSingleMessage({
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
settings: {
|
|
58
|
+
sourceLanguageTag: "en",
|
|
59
|
+
languageTags: ["en"],
|
|
60
|
+
modules: [],
|
|
61
|
+
messageLintRuleLevels: {
|
|
62
|
+
[lintRule1.id]: "error",
|
|
63
|
+
},
|
|
61
64
|
},
|
|
62
|
-
ruleSettings: {},
|
|
63
|
-
sourceLanguageTag: "en",
|
|
64
|
-
languageTags: ["en"],
|
|
65
65
|
messages,
|
|
66
66
|
message: message1,
|
|
67
67
|
rules: [lintRule1],
|
|
@@ -70,20 +70,20 @@ describe("lintSingleMessage", async () => {
|
|
|
70
70
|
})
|
|
71
71
|
|
|
72
72
|
test("it should pass the correct settings", async () => {
|
|
73
|
-
const settings = {
|
|
73
|
+
const settings = {
|
|
74
|
+
sourceLanguageTag: "en",
|
|
75
|
+
languageTags: ["en"],
|
|
76
|
+
modules: [],
|
|
77
|
+
messageLintRuleLevels: {
|
|
78
|
+
[lintRule1.id as any]: "warning",
|
|
79
|
+
},
|
|
80
|
+
}
|
|
74
81
|
|
|
75
82
|
const fn = vi.fn()
|
|
76
|
-
lintRule1.
|
|
83
|
+
lintRule1.run.mockImplementation(({ settings }) => fn(settings))
|
|
77
84
|
|
|
78
85
|
await lintSingleMessage({
|
|
79
|
-
|
|
80
|
-
[lintRule1.meta.id]: "warning",
|
|
81
|
-
},
|
|
82
|
-
ruleSettings: {
|
|
83
|
-
[lintRule1.meta.id]: settings,
|
|
84
|
-
},
|
|
85
|
-
sourceLanguageTag: "en",
|
|
86
|
-
languageTags: ["en"],
|
|
86
|
+
settings,
|
|
87
87
|
messages,
|
|
88
88
|
message: message1,
|
|
89
89
|
rules: [lintRule1],
|
|
@@ -96,22 +96,24 @@ describe("lintSingleMessage", async () => {
|
|
|
96
96
|
test("it should await all rules", async () => {
|
|
97
97
|
let m1Called = false
|
|
98
98
|
let m2Called = false
|
|
99
|
-
lintRule1.
|
|
99
|
+
lintRule1.run.mockImplementation(() => {
|
|
100
100
|
m1Called = true
|
|
101
101
|
})
|
|
102
|
-
lintRule2.
|
|
102
|
+
lintRule2.run.mockImplementation(async () => {
|
|
103
103
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
104
104
|
m2Called = true
|
|
105
105
|
})
|
|
106
106
|
|
|
107
107
|
await lintSingleMessage({
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
settings: {
|
|
109
|
+
sourceLanguageTag: "en",
|
|
110
|
+
languageTags: ["en"],
|
|
111
|
+
modules: [],
|
|
112
|
+
messageLintRuleLevels: {
|
|
113
|
+
[lintRule1.id]: "warning",
|
|
114
|
+
[lintRule2.id]: "warning",
|
|
115
|
+
},
|
|
111
116
|
},
|
|
112
|
-
ruleSettings: {},
|
|
113
|
-
sourceLanguageTag: "en",
|
|
114
|
-
languageTags: ["en"],
|
|
115
117
|
messages,
|
|
116
118
|
message: message1,
|
|
117
119
|
rules: [lintRule1, lintRule2],
|
|
@@ -124,54 +126,58 @@ describe("lintSingleMessage", async () => {
|
|
|
124
126
|
test("it should process all rules in parallel", async () => {
|
|
125
127
|
const fn = vi.fn()
|
|
126
128
|
|
|
127
|
-
lintRule1.
|
|
128
|
-
fn(lintRule1.
|
|
129
|
+
lintRule1.run.mockImplementation(async () => {
|
|
130
|
+
fn(lintRule1.id, "before")
|
|
129
131
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
130
|
-
fn(lintRule1.
|
|
132
|
+
fn(lintRule1.id, "after")
|
|
131
133
|
})
|
|
132
|
-
lintRule2.
|
|
133
|
-
fn(lintRule2.
|
|
134
|
+
lintRule2.run.mockImplementation(async () => {
|
|
135
|
+
fn(lintRule2.id, "before")
|
|
134
136
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
135
|
-
fn(lintRule2.
|
|
137
|
+
fn(lintRule2.id, "after")
|
|
136
138
|
})
|
|
137
139
|
|
|
138
140
|
await lintSingleMessage({
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
141
|
+
settings: {
|
|
142
|
+
sourceLanguageTag: "en",
|
|
143
|
+
languageTags: ["en"],
|
|
144
|
+
modules: [],
|
|
145
|
+
messageLintRuleLevels: {
|
|
146
|
+
[lintRule1.id]: "warning",
|
|
147
|
+
[lintRule2.id]: "warning",
|
|
148
|
+
},
|
|
142
149
|
},
|
|
143
|
-
ruleSettings: {},
|
|
144
|
-
sourceLanguageTag: "en",
|
|
145
|
-
languageTags: ["en"],
|
|
146
150
|
messages,
|
|
147
151
|
message: message1,
|
|
148
152
|
rules: [lintRule1, lintRule2],
|
|
149
153
|
})
|
|
150
154
|
|
|
151
155
|
expect(fn).toHaveBeenCalledTimes(4)
|
|
152
|
-
expect(fn).toHaveBeenNthCalledWith(1, lintRule1.
|
|
153
|
-
expect(fn).toHaveBeenNthCalledWith(2, lintRule2.
|
|
154
|
-
expect(fn).toHaveBeenNthCalledWith(3, lintRule1.
|
|
155
|
-
expect(fn).toHaveBeenNthCalledWith(4, lintRule2.
|
|
156
|
+
expect(fn).toHaveBeenNthCalledWith(1, lintRule1.id, "before")
|
|
157
|
+
expect(fn).toHaveBeenNthCalledWith(2, lintRule2.id, "before")
|
|
158
|
+
expect(fn).toHaveBeenNthCalledWith(3, lintRule1.id, "after")
|
|
159
|
+
expect(fn).toHaveBeenNthCalledWith(4, lintRule2.id, "after")
|
|
156
160
|
})
|
|
157
161
|
|
|
158
162
|
test("it should not abort the linting process when errors occur", async () => {
|
|
159
|
-
lintRule1.
|
|
163
|
+
lintRule1.run.mockImplementation(() => {
|
|
160
164
|
throw new Error("error")
|
|
161
165
|
})
|
|
162
166
|
|
|
163
|
-
lintRule2.
|
|
167
|
+
lintRule2.run.mockImplementation(({ report }) => {
|
|
164
168
|
report({} as MessageLintReport)
|
|
165
169
|
})
|
|
166
170
|
|
|
167
171
|
const result = await lintSingleMessage({
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
172
|
+
settings: {
|
|
173
|
+
sourceLanguageTag: "en",
|
|
174
|
+
languageTags: ["en"],
|
|
175
|
+
modules: [],
|
|
176
|
+
messageLintRuleLevels: {
|
|
177
|
+
[lintRule1.id]: "warning",
|
|
178
|
+
[lintRule2.id]: "warning",
|
|
179
|
+
},
|
|
171
180
|
},
|
|
172
|
-
ruleSettings: {},
|
|
173
|
-
sourceLanguageTag: "en",
|
|
174
|
-
languageTags: ["en"],
|
|
175
181
|
messages,
|
|
176
182
|
message: message1,
|
|
177
183
|
rules: [lintRule1, lintRule2],
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
MessageLintLevel,
|
|
3
|
-
MessageLintRule,
|
|
4
|
-
MessageLintReport,
|
|
5
|
-
} from "@inlang/message-lint-rule"
|
|
1
|
+
import type { MessageLintRule, MessageLintReport } from "@inlang/message-lint-rule"
|
|
6
2
|
import type { Message } from "@inlang/message"
|
|
7
3
|
import { MessagedLintRuleThrowedError } from "./errors.js"
|
|
8
|
-
import type {
|
|
9
|
-
import type { JSONObject } from "@inlang/json-types"
|
|
4
|
+
import type { ProjectSettings } from "@inlang/project-settings"
|
|
10
5
|
|
|
11
6
|
/**
|
|
12
7
|
* Lint a single message.
|
|
@@ -14,10 +9,7 @@ import type { JSONObject } from "@inlang/json-types"
|
|
|
14
9
|
* - the lint rule levels defaults to `warning`.
|
|
15
10
|
*/
|
|
16
11
|
export const lintSingleMessage = async (args: {
|
|
17
|
-
|
|
18
|
-
languageTags: LanguageTag[]
|
|
19
|
-
ruleSettings: Record<MessageLintRule["meta"]["id"], JSONObject>
|
|
20
|
-
ruleLevels: Record<MessageLintRule["meta"]["id"], MessageLintLevel>
|
|
12
|
+
settings: ProjectSettings & Required<Pick<ProjectSettings, "messageLintRuleLevels">>
|
|
21
13
|
rules: MessageLintRule[]
|
|
22
14
|
messages: Message[]
|
|
23
15
|
message: Message
|
|
@@ -26,30 +18,30 @@ export const lintSingleMessage = async (args: {
|
|
|
26
18
|
const errors: MessagedLintRuleThrowedError[] = []
|
|
27
19
|
|
|
28
20
|
const promises = args.rules.map(async (rule) => {
|
|
29
|
-
const
|
|
30
|
-
const settings = args.ruleSettings?.[ruleId] ?? {}
|
|
31
|
-
const level = args.ruleLevels?.[ruleId]
|
|
21
|
+
const level = args.settings.messageLintRuleLevels?.[rule.id]
|
|
32
22
|
|
|
33
23
|
if (level === undefined) {
|
|
34
|
-
throw Error("No lint level provided for lint rule: " +
|
|
24
|
+
throw Error("No lint level provided for lint rule: " + rule.id)
|
|
35
25
|
}
|
|
36
26
|
|
|
37
27
|
try {
|
|
38
|
-
await rule.
|
|
39
|
-
|
|
40
|
-
settings,
|
|
28
|
+
await rule.run({
|
|
29
|
+
message: args.message,
|
|
30
|
+
settings: args.settings,
|
|
41
31
|
report: (reportArgs) => {
|
|
42
32
|
reports.push({
|
|
43
|
-
ruleId,
|
|
33
|
+
ruleId: rule.id,
|
|
44
34
|
level,
|
|
45
|
-
|
|
35
|
+
messageId: reportArgs.messageId,
|
|
36
|
+
languageTag: reportArgs.languageTag,
|
|
37
|
+
body: reportArgs.body,
|
|
46
38
|
})
|
|
47
39
|
},
|
|
48
40
|
})
|
|
49
41
|
} catch (error) {
|
|
50
42
|
errors.push(
|
|
51
43
|
new MessagedLintRuleThrowedError(
|
|
52
|
-
`Lint rule '${
|
|
44
|
+
`Lint rule '${rule.id}' throwed while linting message "${args.message.id}".`,
|
|
53
45
|
{ cause: error },
|
|
54
46
|
),
|
|
55
47
|
)
|