@inlang/sdk 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/adapter/solidAdapter.d.ts +2 -2
  2. package/dist/adapter/solidAdapter.d.ts.map +1 -1
  3. package/dist/adapter/solidAdapter.js +2 -2
  4. package/dist/adapter/solidAdapter.test.js +68 -78
  5. package/dist/api.d.ts +10 -6
  6. package/dist/api.d.ts.map +1 -1
  7. package/dist/api.test-d.d.ts +2 -0
  8. package/dist/api.test-d.d.ts.map +1 -0
  9. package/dist/api.test-d.js +4 -0
  10. package/dist/createMessageLintReportsQuery.d.ts +2 -2
  11. package/dist/createMessageLintReportsQuery.d.ts.map +1 -1
  12. package/dist/createMessageLintReportsQuery.js +11 -11
  13. package/dist/createMessagesQuery.js +1 -1
  14. package/dist/errors.d.ts +3 -3
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +6 -6
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -2
  20. package/dist/lint/message/lintMessages.d.ts +3 -7
  21. package/dist/lint/message/lintMessages.d.ts.map +1 -1
  22. package/dist/lint/message/lintMessages.test.js +38 -36
  23. package/dist/lint/message/lintSingleMessage.d.ts +3 -7
  24. package/dist/lint/message/lintSingleMessage.d.ts.map +1 -1
  25. package/dist/lint/message/lintSingleMessage.js +10 -10
  26. package/dist/lint/message/lintSingleMessage.test.js +71 -65
  27. package/dist/{openInlangProject.d.ts → loadProject.d.ts} +3 -3
  28. package/dist/loadProject.d.ts.map +1 -0
  29. package/dist/{openInlangProject.js → loadProject.js} +70 -66
  30. package/dist/loadProject.test.d.ts +2 -0
  31. package/dist/loadProject.test.d.ts.map +1 -0
  32. package/dist/{openInlangProject.test.js → loadProject.test.js} +160 -176
  33. package/dist/parseConfig.d.ts +2 -2
  34. package/dist/parseConfig.d.ts.map +1 -1
  35. package/dist/parseConfig.js +3 -3
  36. package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.js +1 -1
  37. package/dist/resolve-modules/plugins/errors.d.ts +1 -1
  38. package/dist/resolve-modules/plugins/errors.d.ts.map +1 -1
  39. package/dist/resolve-modules/plugins/resolvePlugins.js +15 -15
  40. package/dist/resolve-modules/plugins/resolvePlugins.test.js +55 -94
  41. package/dist/resolve-modules/plugins/types.d.ts +1 -1
  42. package/dist/resolve-modules/plugins/types.d.ts.map +1 -1
  43. package/dist/resolve-modules/plugins/types.test.js +10 -14
  44. package/dist/resolve-modules/resolveModules.d.ts.map +1 -1
  45. package/dist/resolve-modules/resolveModules.js +9 -9
  46. package/dist/resolve-modules/resolveModules.test.js +28 -42
  47. package/dist/resolve-modules/types.d.ts +3 -3
  48. package/dist/resolve-modules/types.d.ts.map +1 -1
  49. package/dist/versionedInterfaces.d.ts +1 -1
  50. package/dist/versionedInterfaces.d.ts.map +1 -1
  51. package/dist/versionedInterfaces.js +1 -1
  52. package/package.json +2 -2
  53. package/src/adapter/solidAdapter.test.ts +77 -87
  54. package/src/adapter/solidAdapter.ts +4 -4
  55. package/src/api.test-d.ts +8 -0
  56. package/src/api.ts +10 -6
  57. package/src/createMessageLintReportsQuery.ts +15 -20
  58. package/src/createMessagesQuery.ts +1 -1
  59. package/src/errors.ts +6 -6
  60. package/src/index.ts +4 -4
  61. package/src/lint/message/lintMessages.test.ts +38 -36
  62. package/src/lint/message/lintMessages.ts +3 -11
  63. package/src/lint/message/lintSingleMessage.test.ts +71 -65
  64. package/src/lint/message/lintSingleMessage.ts +13 -21
  65. package/src/{openInlangProject.test.ts → loadProject.test.ts} +165 -181
  66. package/src/{openInlangProject.ts → loadProject.ts} +81 -82
  67. package/src/parseConfig.ts +5 -3
  68. package/src/resolve-modules/message-lint-rules/resolveMessageLintRules.ts +1 -1
  69. package/src/resolve-modules/plugins/errors.ts +1 -1
  70. package/src/resolve-modules/plugins/resolvePlugins.test.ts +55 -94
  71. package/src/resolve-modules/plugins/resolvePlugins.ts +19 -19
  72. package/src/resolve-modules/plugins/types.test.ts +11 -15
  73. package/src/resolve-modules/plugins/types.ts +1 -1
  74. package/src/resolve-modules/resolveModules.test.ts +29 -43
  75. package/src/resolve-modules/resolveModules.ts +11 -9
  76. package/src/resolve-modules/types.ts +3 -3
  77. package/src/versionedInterfaces.ts +1 -1
  78. package/dist/openInlangProject.d.ts.map +0 -1
  79. package/dist/openInlangProject.test.d.ts +0 -2
  80. 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
- ProjectConfig,
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
- meta: Plugin["meta"]
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
- meta: MessageLintRule["meta"]
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
- lintLevel: MessageLintLevel
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
- config: Subscribable<ProjectConfig | undefined>
42
- setConfig: (config: ProjectConfig) => Result<void, RuntimeError.InvalidConfigError>
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 "./openInlangProject.js"
2
+ import { createSubscribable } from "./loadProject.js"
3
3
  import type { InlangProject, InstalledMessageLintRule, MessageLintReportsQueryApi } from "./api.js"
4
- import type { ProjectConfig } from "@inlang/project-config"
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
- config: () => ProjectConfig | undefined,
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 (msgs && conf && modules) {
27
+ if (_messages && _settings && modules) {
33
28
  // console.log("new calculation")
34
29
  // index.clear()
35
- for (const message of msgs) {
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
- ruleSettings: conf.settings as Record<MessageLintRule["meta"]["id"], JSONObject>,
41
- ruleLevels: Object.fromEntries(
42
- installedMessageLintRules().map((rule) => [rule.meta.id, rule.lintLevel]),
43
- ),
44
- sourceLanguageTag: conf.sourceLanguageTag,
45
- languageTags: conf.languageTags,
46
- messages: msgs,
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 "./openInlangProject.js"
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 InvalidConfigError extends Error {
1
+ export class ProjectSettingsInvalidError extends Error {
2
2
  constructor(message: string, options: ErrorOptions) {
3
3
  super(message, options)
4
- this.name = "InvalidConfigError"
4
+ this.name = "ProjectSettingsInvalidError"
5
5
  }
6
6
  }
7
7
 
8
- export class ProjectFileJSONSyntaxError extends Error {
8
+ export class ProjectSettingsFileJSONSyntaxError extends Error {
9
9
  constructor(message: string, options: ErrorOptions) {
10
10
  super(message, options)
11
- this.name = "ProjectFileJSONSyntaxError"
11
+ this.name = "ProjectSettingsFileJSONSyntaxError"
12
12
  }
13
13
  }
14
14
 
15
- export class ProjectFilePathNotFoundError extends Error {
15
+ export class ProjectSettingsFileNotFoundError extends Error {
16
16
  constructor(message: string, options: ErrorOptions) {
17
17
  super(message, options)
18
- this.name = "ProjectFilePathNotFoundError"
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 { openInlangProject } from "./openInlangProject.js"
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
- ProjectFilePathNotFoundError,
20
- ProjectFileJSONSyntaxError,
21
- InvalidConfigError,
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
- meta: {
8
- id: "messageLintRule.x.1",
9
- displayName: { en: "" },
10
- description: { en: "" },
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
- meta: {
17
- id: "messageLintRule.x.2",
18
- displayName: { en: "" },
19
- description: { en: "" },
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.message.mockImplementation(async () => {
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
- ruleLevels: {
44
- [lintRule1.meta.id]: "warning",
45
- [lintRule2.meta.id]: "warning",
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.message).toHaveBeenCalledTimes(3)
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.message.mockImplementation(async ({ message }) => {
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.message.mockImplementation(async ({ message }) => {
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
- ruleLevels: {
74
- [lintRule1.meta.id]: "warning",
75
- [lintRule2.meta.id]: "warning",
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.message.mockImplementation(({ report }) => {
100
+ lintRule1.run.mockImplementation(({ report }) => {
101
101
  report({} as MessageLintReport)
102
102
  })
103
- lintRule2.message.mockImplementation(() => {
103
+ lintRule2.run.mockImplementation(() => {
104
104
  throw new Error("error")
105
105
  })
106
106
 
107
107
  const { data, errors } = await lintMessages({
108
- ruleLevels: {
109
- [lintRule1.meta.id]: "warning",
110
- [lintRule2.meta.id]: "warning",
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 { LanguageTag } from "@inlang/language-tag"
5
- import type { JSONObject } from "@inlang/json-types"
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
- sourceLanguageTag: LanguageTag
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
- meta: {
9
- id: "messageLintRule.r.1",
10
- displayName: { en: "" },
11
- description: { en: "" },
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
- meta: {
18
- id: "messageLintRule.r.2",
19
- displayName: { en: "" },
20
- description: { en: "" },
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.message.mockImplementation(({ report }) => report({} as MessageLintReport))
34
+ lintRule1.run.mockImplementation(({ report }) => report({} as MessageLintReport))
39
35
 
40
36
  const result = await tryCatch(() =>
41
37
  lintSingleMessage({
42
- ruleLevels: {},
43
- ruleSettings: {},
44
- sourceLanguageTag: "en",
45
- languageTags: ["en"],
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.message.mockImplementation(({ report }) => report({} as MessageLintReport))
54
+ lintRule1.run.mockImplementation(({ report }) => report({} as MessageLintReport))
57
55
 
58
56
  const reports = await lintSingleMessage({
59
- ruleLevels: {
60
- [lintRule1.meta.id]: "error",
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.message.mockImplementation(({ settings }) => fn(settings))
83
+ lintRule1.run.mockImplementation(({ settings }) => fn(settings))
77
84
 
78
85
  await lintSingleMessage({
79
- ruleLevels: {
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.message.mockImplementation(() => {
99
+ lintRule1.run.mockImplementation(() => {
100
100
  m1Called = true
101
101
  })
102
- lintRule2.message.mockImplementation(async () => {
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
- ruleLevels: {
109
- [lintRule1.meta.id]: "warning",
110
- [lintRule2.meta.id]: "warning",
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.message.mockImplementation(async () => {
128
- fn(lintRule1.meta.id, "before")
129
+ lintRule1.run.mockImplementation(async () => {
130
+ fn(lintRule1.id, "before")
129
131
  await new Promise((resolve) => setTimeout(resolve, 0))
130
- fn(lintRule1.meta.id, "after")
132
+ fn(lintRule1.id, "after")
131
133
  })
132
- lintRule2.message.mockImplementation(async () => {
133
- fn(lintRule2.meta.id, "before")
134
+ lintRule2.run.mockImplementation(async () => {
135
+ fn(lintRule2.id, "before")
134
136
  await new Promise((resolve) => setTimeout(resolve, 0))
135
- fn(lintRule2.meta.id, "after")
137
+ fn(lintRule2.id, "after")
136
138
  })
137
139
 
138
140
  await lintSingleMessage({
139
- ruleLevels: {
140
- [lintRule1.meta.id]: "warning",
141
- [lintRule2.meta.id]: "warning",
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.meta.id, "before")
153
- expect(fn).toHaveBeenNthCalledWith(2, lintRule2.meta.id, "before")
154
- expect(fn).toHaveBeenNthCalledWith(3, lintRule1.meta.id, "after")
155
- expect(fn).toHaveBeenNthCalledWith(4, lintRule2.meta.id, "after")
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.message.mockImplementation(() => {
163
+ lintRule1.run.mockImplementation(() => {
160
164
  throw new Error("error")
161
165
  })
162
166
 
163
- lintRule2.message.mockImplementation(({ report }) => {
167
+ lintRule2.run.mockImplementation(({ report }) => {
164
168
  report({} as MessageLintReport)
165
169
  })
166
170
 
167
171
  const result = await lintSingleMessage({
168
- ruleLevels: {
169
- [lintRule1.meta.id]: "warning",
170
- [lintRule2.meta.id]: "warning",
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 { LanguageTag } from "@inlang/language-tag"
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
- sourceLanguageTag: LanguageTag
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 ruleId = rule.meta.id
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: " + ruleId)
24
+ throw Error("No lint level provided for lint rule: " + rule.id)
35
25
  }
36
26
 
37
27
  try {
38
- await rule.message({
39
- ...args,
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
- ...reportArgs,
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 '${ruleId}' throwed while linting message "${args.message.id}".`,
44
+ `Lint rule '${rule.id}' throwed while linting message "${args.message.id}".`,
53
45
  { cause: error },
54
46
  ),
55
47
  )