@raketa-cloud/admin 1.8.10 → 1.8.11

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 (105) hide show
  1. package/dist/application.css +109 -0
  2. package/package.json +4 -2
  3. package/src/HonoAdapter.js +22 -13
  4. package/src/Logger.js +7 -8
  5. package/src/RaketaContext.js +1 -0
  6. package/src/cipher.js +2 -2
  7. package/src/cloud/ContentTasks.js +31 -0
  8. package/src/cloud/RaketaClient.js +1 -1
  9. package/src/cloud/Redirects.js +2 -2
  10. package/src/cloud/ResourceChanges.js +1 -1
  11. package/src/cloud/ResourceRevisions.js +2 -2
  12. package/src/cloud/Resources.js +28 -12
  13. package/src/cloud/Tags.js +4 -4
  14. package/src/cloud/documents/common.js +16 -0
  15. package/src/cloud/documents/contentTasksDocuments.js +59 -0
  16. package/src/cloud/documents/resourcesDocuments.js +12 -0
  17. package/src/filters.js +3 -3
  18. package/src/handlers/TagsHandler.js +2 -2
  19. package/src/handlers/_shared/getResourceUpdateDestination.js +1 -1
  20. package/src/handlers/categories/index.js +3 -3
  21. package/src/handlers/content_tasks/ContentTasksHandler.js +32 -0
  22. package/src/handlers/resource_revisions/LocksHandler.js +4 -1
  23. package/src/handlers/resources/ClonesHandler.js +1 -3
  24. package/src/handlers/resources/ExportsHandler.js +1 -5
  25. package/src/handlers/resources/ResourcesHandler.js +1 -1
  26. package/src/handlers/resources/TranslationsHandler.js +28 -19
  27. package/src/handlers/resources/URLsHandler.js +3 -1
  28. package/src/helpers/AuthHelper.js +1 -1
  29. package/src/helpers/FormBuilder.js +14 -14
  30. package/src/helpers/Pagination.js +5 -5
  31. package/src/helpers/historyUtils.js +3 -3
  32. package/src/helpers/utils.js +6 -1
  33. package/src/index.js +1 -0
  34. package/src/routeMember.js +9 -4
  35. package/src/routeNestedCollection.js +14 -29
  36. package/src/routeNestedMember.js +17 -6
  37. package/src/routeStandard.js +5 -1
  38. package/src/setupAuthentication.js +1 -1
  39. package/src/setupCloud.js +5 -0
  40. package/src/tests/Adapter.test.js +2 -2
  41. package/src/tests/HonoAdapter.coverage.test.js +44 -22
  42. package/src/tests/HonoAdapter.filter.test.js +28 -18
  43. package/src/tests/HonoAdapter.test.js +3 -3
  44. package/src/tests/RaketaClient.test.js +427 -413
  45. package/src/tests/RaketaContext.test.js +1 -1
  46. package/src/tests/buildResourcePath.test.js +1 -1
  47. package/src/tests/cipher.test.js +16 -16
  48. package/src/tests/filters.test.js +24 -24
  49. package/src/tests/handlers/RedirectsHandler.test/destroy.test.js +1 -1
  50. package/src/tests/handlers/TagsHandler.test/create.test.js +2 -2
  51. package/src/tests/handlers/TagsHandler.test/destroy.test.js +1 -1
  52. package/src/tests/handlers/TagsHandler.test/update.test.js +2 -2
  53. package/src/tests/handlers/categories/create.test.js +2 -2
  54. package/src/tests/handlers/categories/destroy.test.js +1 -1
  55. package/src/tests/handlers/content_tasks/ContentTasksHandler.test/index.test.js +161 -0
  56. package/src/tests/handlers/resource_revisions/CancelSchedulesHandler.test/create.test.js +2 -2
  57. package/src/tests/handlers/resource_revisions/CodeHandler.test/update.test.js +1 -1
  58. package/src/tests/handlers/resource_revisions/GeneralHandler.test/update.test.js +1 -1
  59. package/src/tests/handlers/resource_revisions/LocksHandler.test/create.test.js +5 -5
  60. package/src/tests/handlers/resource_revisions/LocksHandler.test/create_form.test.js +6 -2
  61. package/src/tests/handlers/resource_revisions/MetaHandler.test/update.test.js +1 -1
  62. package/src/tests/handlers/resource_revisions/PublishesHandler.test/create.test.js +5 -5
  63. package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/create.test.js +2 -2
  64. package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/destroy.test.js +1 -1
  65. package/src/tests/handlers/resource_revisions/RevertsHandler.test/create.test.js +18 -3
  66. package/src/tests/handlers/resource_revisions/TagHandler.test/update.test.js +1 -1
  67. package/src/tests/handlers/resource_revisions/UnlocksHandler.test/create.test.js +2 -2
  68. package/src/tests/handlers/resource_revisions/VisualHandler.test/update.test.js +1 -1
  69. package/src/tests/handlers/resource_revisions/WidgetHandler.test/update.test.js +2 -2
  70. package/src/tests/handlers/resources/ChangeHandler.test/show.test.js +7 -2
  71. package/src/tests/handlers/resources/ClonesHandler.test/create.test.js +1 -3
  72. package/src/tests/handlers/resources/ExportsHandler.test/index.test.js +8 -8
  73. package/src/tests/handlers/resources/HistoryHandler.test/index.test.js +1 -1
  74. package/src/tests/handlers/resources/ResourcesAPIHandler.test/index.test.js +1 -5
  75. package/src/tests/handlers/resources/ResourcesHandler.test/create.test.js +2 -2
  76. package/src/tests/handlers/resources/ResourcesHandler.test/show.test.js +1 -1
  77. package/src/tests/handlers/resources/TranslationsHandler.test/create.test.js +24 -14
  78. package/src/tests/handlers/resources/TranslationsHandler.test/create_form.test.js +1 -1
  79. package/src/tests/handlers/resources/TranslationsHandler.test/index.test.js +3 -3
  80. package/src/tests/handlers/resources/URLsHandler.test/create.test.js +4 -6
  81. package/src/tests/helpers/AuthHelper.test.js +11 -12
  82. package/src/tests/helpers/CSVExportHelper.test.js +3 -3
  83. package/src/tests/helpers/FormBuilder.test.js +21 -21
  84. package/src/tests/helpers/HTMLBuilder.test.js +4 -4
  85. package/src/tests/helpers/Inflector.test.js +1 -1
  86. package/src/tests/helpers/Pagination.test.js +1 -1
  87. package/src/tests/helpers/utils.test.js +46 -0
  88. package/src/tests/routeCategoriesModule.test.js +10 -5
  89. package/src/tests/routeCollection.test.js +1 -1
  90. package/src/tests/routeMember.test.js +2 -2
  91. package/src/tests/routeNestedCollection.test.js +3 -3
  92. package/src/tests/routeNestedMember.test.js +3 -3
  93. package/src/tests/routeResourceModule.test.js +15 -16
  94. package/src/tests/routeSettings.test.js +3 -3
  95. package/src/tests/routeStandard.test.js +27 -9
  96. package/src/tests/setupAuthentication.test.js +9 -6
  97. package/src/tests/support/factory.js +33 -0
  98. package/src/tests/utils.test.js +19 -19
  99. package/src/views/content_tasks/index.ejs +191 -0
  100. package/src/views/layouts/application.ejs +2 -1
  101. package/src/views/resources/_shared/_toolbar.ejs +33 -2
  102. package/src/views/resources/_shared/_translations_strip.ejs +71 -0
  103. package/src/views/resources/index.ejs +5 -0
  104. package/src/views/resources/show.ejs +1 -29
  105. package/src/views/resources/translations/create_form.ejs +13 -0
@@ -62,4 +62,4 @@ describe("RaketaContext", () => {
62
62
  expect(context.client).toEqual({ users: "usersClient" });
63
63
  expect(context.config).toEqual({ someConfig: true });
64
64
  });
65
- });
65
+ });
@@ -63,7 +63,7 @@ describe("buildResourcePath", () => {
63
63
  resourceType: "unknown",
64
64
  locale: "en",
65
65
  defaultLocale: "en",
66
- })
66
+ }),
67
67
  ).toThrow("Unknown resource type: unknown");
68
68
  });
69
69
  });
@@ -3,10 +3,10 @@ import { randomBytes } from "node:crypto";
3
3
 
4
4
  jest.mock("node:crypto", () => {
5
5
  const originalModule = jest.requireActual("node:crypto");
6
-
6
+
7
7
  // Mock implementation to make tests deterministic
8
8
  const mockIV = Buffer.from("0123456789abcdef0123456789abcdef", "hex");
9
-
9
+
10
10
  return {
11
11
  ...originalModule,
12
12
  randomBytes: jest.fn(() => mockIV),
@@ -19,39 +19,39 @@ jest.mock("node:crypto", () => {
19
19
  describe("cipher", () => {
20
20
  const mockConfig = {
21
21
  secrets: {
22
- crypto_secret: "test-secret-key"
23
- }
22
+ crypto_secret: "test-secret-key",
23
+ },
24
24
  };
25
-
25
+
26
26
  describe("encrypt", () => {
27
27
  test("encrypts plaintext string", () => {
28
28
  const plaintext = "sensitive data";
29
29
  const encrypted = cipher.encrypt(plaintext, mockConfig);
30
-
30
+
31
31
  // Check that the output has the expected format (IV:encryptedData)
32
32
  expect(encrypted).toContain(":");
33
33
  const [ivHex, encryptedData] = encrypted.split(":");
34
-
34
+
35
35
  // IV should be 32 hex characters (16 bytes)
36
36
  expect(ivHex.length).toBe(32);
37
37
  // Encrypted data should be present
38
38
  expect(encryptedData.length).toBeGreaterThan(0);
39
-
39
+
40
40
  // Verify randomBytes was called to generate an IV
41
41
  expect(randomBytes).toHaveBeenCalledWith(16);
42
42
  });
43
43
  });
44
-
44
+
45
45
  describe("decrypt", () => {
46
46
  test("decrypts encrypted string back to original plaintext", () => {
47
47
  const plaintext = "sensitive data to encrypt and decrypt";
48
48
  const encrypted = cipher.encrypt(plaintext, mockConfig);
49
49
  const decrypted = cipher.decrypt(encrypted, mockConfig);
50
-
50
+
51
51
  expect(decrypted).toBe(plaintext);
52
52
  });
53
53
  });
54
-
54
+
55
55
  test("encrypt and decrypt cycle works for complex data", () => {
56
56
  const complexData = JSON.stringify({
57
57
  id: 12345,
@@ -60,14 +60,14 @@ describe("cipher", () => {
60
60
  permissions: ["admin", "editor"],
61
61
  metadata: {
62
62
  lastLogin: "2024-05-15T12:30:00Z",
63
- browser: "Chrome"
64
- }
63
+ browser: "Chrome",
64
+ },
65
65
  });
66
-
66
+
67
67
  const encrypted = cipher.encrypt(complexData, mockConfig);
68
68
  const decrypted = cipher.decrypt(encrypted, mockConfig);
69
-
69
+
70
70
  expect(decrypted).toBe(complexData);
71
71
  expect(JSON.parse(decrypted)).toEqual(JSON.parse(complexData));
72
72
  });
73
- });
73
+ });
@@ -6,11 +6,11 @@ class MockHonoAdapter {
6
6
  this.globalBeforeFilters = [];
7
7
  this.globalAfterFilters = [];
8
8
  }
9
-
9
+
10
10
  setBeforeFilter(pattern, filter) {
11
11
  this.globalBeforeFilters.push({ pattern, filter });
12
12
  }
13
-
13
+
14
14
  setAfterFilter(pattern, filter) {
15
15
  this.globalAfterFilters.push({ pattern, filter });
16
16
  }
@@ -18,80 +18,80 @@ class MockHonoAdapter {
18
18
 
19
19
  describe("filters", () => {
20
20
  let adapter;
21
-
21
+
22
22
  beforeEach(() => {
23
23
  adapter = new MockHonoAdapter();
24
24
  });
25
-
25
+
26
26
  describe("setBeforeFilter", () => {
27
27
  test("adds before filter to adapter", () => {
28
28
  const pattern = /\/settings\/content/;
29
29
  const filter = () => ({ assigns: { foo: "bar" } });
30
-
30
+
31
31
  setBeforeFilter(adapter, pattern, filter);
32
-
32
+
33
33
  expect(adapter.globalBeforeFilters).toHaveLength(1);
34
34
  expect(adapter.globalBeforeFilters[0]).toEqual({
35
35
  pattern,
36
- filter
36
+ filter,
37
37
  });
38
38
  });
39
-
39
+
40
40
  test("can add multiple before filters", () => {
41
41
  const pattern1 = /\/settings\/content/;
42
42
  const filter1 = () => ({ assigns: { foo: "bar" } });
43
-
43
+
44
44
  const pattern2 = /\/pages/;
45
45
  const filter2 = () => ({ assigns: { baz: "qux" } });
46
-
46
+
47
47
  setBeforeFilter(adapter, pattern1, filter1);
48
48
  setBeforeFilter(adapter, pattern2, filter2);
49
-
49
+
50
50
  expect(adapter.globalBeforeFilters).toHaveLength(2);
51
51
  expect(adapter.globalBeforeFilters[0]).toEqual({
52
52
  pattern: pattern1,
53
- filter: filter1
53
+ filter: filter1,
54
54
  });
55
55
  expect(adapter.globalBeforeFilters[1]).toEqual({
56
56
  pattern: pattern2,
57
- filter: filter2
57
+ filter: filter2,
58
58
  });
59
59
  });
60
60
  });
61
-
61
+
62
62
  describe("setAfterFilter", () => {
63
63
  test("adds after filter to adapter", () => {
64
64
  const pattern = /\/settings\/content/;
65
65
  const filter = () => ({ assigns: { foo: "bar" } });
66
-
66
+
67
67
  setAfterFilter(adapter, pattern, filter);
68
-
68
+
69
69
  expect(adapter.globalAfterFilters).toHaveLength(1);
70
70
  expect(adapter.globalAfterFilters[0]).toEqual({
71
71
  pattern,
72
- filter
72
+ filter,
73
73
  });
74
74
  });
75
-
75
+
76
76
  test("can add multiple after filters", () => {
77
77
  const pattern1 = /\/settings\/content/;
78
78
  const filter1 = () => ({ assigns: { foo: "bar" } });
79
-
79
+
80
80
  const pattern2 = /\/pages/;
81
81
  const filter2 = () => ({ assigns: { baz: "qux" } });
82
-
82
+
83
83
  setAfterFilter(adapter, pattern1, filter1);
84
84
  setAfterFilter(adapter, pattern2, filter2);
85
-
85
+
86
86
  expect(adapter.globalAfterFilters).toHaveLength(2);
87
87
  expect(adapter.globalAfterFilters[0]).toEqual({
88
88
  pattern: pattern1,
89
- filter: filter1
89
+ filter: filter1,
90
90
  });
91
91
  expect(adapter.globalAfterFilters[1]).toEqual({
92
92
  pattern: pattern2,
93
- filter: filter2
93
+ filter: filter2,
94
94
  });
95
95
  });
96
96
  });
97
- });
97
+ });
@@ -45,7 +45,7 @@ describe("Redirects", () => {
45
45
  }));
46
46
 
47
47
  await expect(() => RedirectsHandler.destroy(ctx)).rejects.toMatch(
48
- "Failed to delete redirect #1."
48
+ "Failed to delete redirect #1.",
49
49
  );
50
50
 
51
51
  expect(mockDelete).toHaveBeenCalledWith(1);
@@ -36,7 +36,7 @@ describe("Tags Handler", () => {
36
36
  name: tag.name,
37
37
  slug: tag.slug,
38
38
  },
39
- "en"
39
+ "en",
40
40
  );
41
41
 
42
42
  expect(result).toEqual({
@@ -73,7 +73,7 @@ describe("Tags Handler", () => {
73
73
  name: tag.name,
74
74
  slug: tag.slug,
75
75
  },
76
- "en"
76
+ "en",
77
77
  );
78
78
 
79
79
  expect(mockedFormatErrors).toHaveBeenCalledWith(errors);
@@ -43,7 +43,7 @@ describe("Tags Handler", () => {
43
43
  }));
44
44
 
45
45
  expect(() => TagsHandler.destroy(ctx)).rejects.toMatch(
46
- "Failed to delete tag #1."
46
+ "Failed to delete tag #1.",
47
47
  );
48
48
 
49
49
  expect(mockedDelete).toHaveBeenCalledWith("1", "en");
@@ -42,7 +42,7 @@ describe("Tags Handler", () => {
42
42
  name: "Updated Tag",
43
43
  slug: "updated-tag",
44
44
  },
45
- "en"
45
+ "en",
46
46
  );
47
47
 
48
48
  expect(result).toEqual({
@@ -81,7 +81,7 @@ describe("Tags Handler", () => {
81
81
  name: "Updated Tag",
82
82
  slug: "updated-tag",
83
83
  },
84
- "en"
84
+ "en",
85
85
  );
86
86
 
87
87
  expect(mockedFormatErrors).toHaveBeenCalledWith(errors);
@@ -41,7 +41,7 @@ describe("Categories create", () => {
41
41
  settings: category.settings,
42
42
  },
43
43
  "en",
44
- "cat"
44
+ "cat",
45
45
  );
46
46
 
47
47
  expect(result).toEqual({
@@ -72,7 +72,7 @@ describe("Categories create", () => {
72
72
  settings: category.settings,
73
73
  },
74
74
  "en",
75
- "cat"
75
+ "cat",
76
76
  );
77
77
 
78
78
  expect(result).toEqual({
@@ -49,7 +49,7 @@ describe("Categories", () => {
49
49
  }));
50
50
 
51
51
  await expect(() => CategoriesHandler.destroy(ctx)).rejects.toEqual(
52
- "Failed to delete category #1."
52
+ "Failed to delete category #1.",
53
53
  );
54
54
 
55
55
  expect(mockDelete).toHaveBeenCalledWith(1, "en");
@@ -0,0 +1,161 @@
1
+ import ContentTasks from "../../../../cloud/ContentTasks";
2
+ import ContentTasksHandler from "../../../../handlers/content_tasks/ContentTasksHandler";
3
+ import Factory from "../../../support/factory";
4
+
5
+ describe("ContentTasksHandler", () => {
6
+ function buildCtx() {
7
+ return {
8
+ client: {
9
+ contentTasks: new ContentTasks(() => ({}), "token"),
10
+ },
11
+ query: { "f:locale": "en", "f:status": "IN_PROGRESS" },
12
+ locale: "en",
13
+ globalConfig: {
14
+ resourceRoutes: {
15
+ page: "pages",
16
+ author: "authors",
17
+ article: "articles",
18
+ "movie-type": "movie-types",
19
+ },
20
+ },
21
+ };
22
+ }
23
+
24
+ test("index - returns content tasks with editors and buildResourceUrl helper", async () => {
25
+ const contentTasks = [
26
+ Factory.build("contentTask", {
27
+ id: "1",
28
+ workflow: "lokalise",
29
+ resource: {
30
+ id: "123",
31
+ title: "Test Page",
32
+ locale: "en",
33
+ resourceType: "page",
34
+ },
35
+ }),
36
+ Factory.build("contentTask", {
37
+ id: "2",
38
+ workflow: "default",
39
+ resource: {
40
+ id: "456",
41
+ title: "Test Movie",
42
+ locale: "de",
43
+ resourceType: "movie-type",
44
+ },
45
+ }),
46
+ ];
47
+
48
+ const editors = [
49
+ Factory.build("editor", { id: "user1", name: "John Doe" }),
50
+ Factory.build("editor", { id: "user2", name: "Jane Smith" }),
51
+ ];
52
+
53
+ const ctx = buildCtx();
54
+
55
+ const mockedList = jest
56
+ .spyOn(ctx.client.contentTasks, "list")
57
+ .mockImplementation(() => ({
58
+ list: contentTasks,
59
+ pagination: { currentPage: 1, pagesCount: 1 },
60
+ }));
61
+
62
+ const mockedEditors = jest
63
+ .spyOn(ctx.client.contentTasks, "editors")
64
+ .mockImplementation(() => ({ list: editors }));
65
+
66
+ const result = await ContentTasksHandler.index(ctx);
67
+
68
+ expect(mockedList).toHaveBeenCalledWith({
69
+ "f:locale": "en",
70
+ "f:status": "IN_PROGRESS",
71
+ });
72
+ expect(mockedEditors).toHaveBeenCalled();
73
+
74
+ expect(result.assigns.items).toEqual({
75
+ list: contentTasks,
76
+ pagination: { currentPage: 1, pagesCount: 1 },
77
+ });
78
+ expect(result.assigns.editors).toEqual(editors);
79
+ expect(typeof result.assigns.buildResourceUrl).toBe("function");
80
+ });
81
+
82
+ test("index - throws error when resourceRoutes is missing", async () => {
83
+ const ctx = buildCtx();
84
+ ctx.globalConfig = {}; // No resourceRoutes
85
+
86
+ const mockedList = jest
87
+ .spyOn(ctx.client.contentTasks, "list")
88
+ .mockImplementation(() => ({ list: [], pagination: {} }));
89
+
90
+ const mockedEditors = jest
91
+ .spyOn(ctx.client.contentTasks, "editors")
92
+ .mockImplementation(() => ({ list: [] }));
93
+
94
+ await expect(ContentTasksHandler.index(ctx)).rejects.toThrow(
95
+ "Missing resourceRoutes in the admin config!",
96
+ );
97
+ });
98
+
99
+ test("buildResourceUrl helper - builds correct URL for standard resource", async () => {
100
+ const ctx = buildCtx();
101
+
102
+ const mockedList = jest
103
+ .spyOn(ctx.client.contentTasks, "list")
104
+ .mockImplementation(() => ({ list: [], pagination: {} }));
105
+
106
+ const mockedEditors = jest
107
+ .spyOn(ctx.client.contentTasks, "editors")
108
+ .mockImplementation(() => ({ list: [] }));
109
+
110
+ const result = await ContentTasksHandler.index(ctx);
111
+ const { buildResourceUrl } = result.assigns;
112
+
113
+ const resource = {
114
+ id: "123",
115
+ locale: "en",
116
+ resourceType: "page",
117
+ };
118
+
119
+ expect(buildResourceUrl(resource)).toBe("/en/pages/123");
120
+ });
121
+
122
+ test("buildResourceUrl helper - builds correct URL for custom route", async () => {
123
+ const ctx = buildCtx();
124
+
125
+ const mockedList = jest
126
+ .spyOn(ctx.client.contentTasks, "list")
127
+ .mockImplementation(() => ({ list: [], pagination: {} }));
128
+
129
+ const mockedEditors = jest
130
+ .spyOn(ctx.client.contentTasks, "editors")
131
+ .mockImplementation(() => ({ list: [] }));
132
+
133
+ const result = await ContentTasksHandler.index(ctx);
134
+ const { buildResourceUrl } = result.assigns;
135
+
136
+ const resource = {
137
+ id: "456",
138
+ locale: "de",
139
+ resourceType: "movie-type",
140
+ };
141
+
142
+ expect(buildResourceUrl(resource)).toBe("/de/movie-types/456");
143
+ });
144
+
145
+ test("buildResourceUrl helper - returns # for null resource", async () => {
146
+ const ctx = buildCtx();
147
+
148
+ const mockedList = jest
149
+ .spyOn(ctx.client.contentTasks, "list")
150
+ .mockImplementation(() => ({ list: [], pagination: {} }));
151
+
152
+ const mockedEditors = jest
153
+ .spyOn(ctx.client.contentTasks, "editors")
154
+ .mockImplementation(() => ({ list: [] }));
155
+
156
+ const result = await ContentTasksHandler.index(ctx);
157
+ const { buildResourceUrl } = result.assigns;
158
+
159
+ expect(buildResourceUrl(null)).toBe("#");
160
+ });
161
+ });
@@ -57,7 +57,7 @@ describe("Resource revision schedule cancel", () => {
57
57
  }));
58
58
 
59
59
  await expect(CancelSchedulesHandler.create(ctx)).rejects.toThrow(
60
- `Failed to cancel schedule for revision: ${JSON.stringify(errors)}`
60
+ `Failed to cancel schedule for revision: ${JSON.stringify(errors)}`,
61
61
  );
62
62
 
63
63
  expect(mockCancel).toHaveBeenCalledWith(revision.id, "en", "article");
@@ -82,7 +82,7 @@ describe("Resource revision schedule cancel", () => {
82
82
  }));
83
83
 
84
84
  await expect(CancelSchedulesHandler.create(ctx)).rejects.toThrow(
85
- `Failed to cancel schedule for revision: ${JSON.stringify(resourceErrors)}`
85
+ `Failed to cancel schedule for revision: ${JSON.stringify(resourceErrors)}`,
86
86
  );
87
87
 
88
88
  expect(mockCancel).toHaveBeenCalledWith(revision.id, "en", "article");
@@ -67,7 +67,7 @@ describe("Resource revision code settings", () => {
67
67
  },
68
68
  },
69
69
  },
70
- "article"
70
+ "article",
71
71
  );
72
72
 
73
73
  expect(result).toEqual({
@@ -69,7 +69,7 @@ describe("Resource revision general settings", () => {
69
69
  ...updateSettings.settings,
70
70
  },
71
71
  },
72
- "article"
72
+ "article",
73
73
  );
74
74
 
75
75
  expect(result).toEqual({
@@ -44,7 +44,7 @@ describe("Resource revision lock", () => {
44
44
  revision.id,
45
45
  "en",
46
46
  lockSettings.message,
47
- "article"
47
+ "article",
48
48
  );
49
49
 
50
50
  expect(result).toEqual({
@@ -77,7 +77,7 @@ describe("Resource revision lock", () => {
77
77
  revision.id,
78
78
  "en",
79
79
  lockSettings.message,
80
- "article"
80
+ "article",
81
81
  );
82
82
 
83
83
  expect(result).toEqual({
@@ -116,7 +116,7 @@ describe("Resource revision lock", () => {
116
116
  }));
117
117
 
118
118
  await expect(LocksHandler.create(ctx)).rejects.toThrow(
119
- `Failed to lock revision: ${JSON.stringify(resourceErrors)}`
119
+ `Failed to lock revision: ${JSON.stringify(resourceErrors)}`,
120
120
  );
121
121
 
122
122
  expect(mockFind).toHaveBeenCalledWith(revision.id, "en", "article");
@@ -124,7 +124,7 @@ describe("Resource revision lock", () => {
124
124
  revision.id,
125
125
  "en",
126
126
  lockSettings.message,
127
- "article"
127
+ "article",
128
128
  );
129
129
  });
130
130
 
@@ -137,7 +137,7 @@ describe("Resource revision lock", () => {
137
137
  .mockImplementation(() => null);
138
138
 
139
139
  await expect(LocksHandler.create(ctx)).rejects.toThrow(
140
- `Missing revision #42`
140
+ `Missing revision #42`,
141
141
  );
142
142
 
143
143
  expect(mockFind).toHaveBeenCalledWith(42, "en", "article");
@@ -51,9 +51,13 @@ describe("New resource revision lock", () => {
51
51
  .mockImplementation(() => null);
52
52
 
53
53
  await expect(LocksHandler.create_form(ctx)).rejects.toThrow(
54
- `Missing revision #${nonExistentRevision.id}`
54
+ `Missing revision #${nonExistentRevision.id}`,
55
55
  );
56
56
 
57
- expect(mockFind).toHaveBeenCalledWith(nonExistentRevision.id, "en", "article");
57
+ expect(mockFind).toHaveBeenCalledWith(
58
+ nonExistentRevision.id,
59
+ "en",
60
+ "article",
61
+ );
58
62
  });
59
63
  });
@@ -68,7 +68,7 @@ describe("Resource revision meta settings", () => {
68
68
  },
69
69
  },
70
70
  },
71
- "article"
71
+ "article",
72
72
  );
73
73
 
74
74
  expect(result).toEqual({
@@ -72,7 +72,7 @@ describe("Publish resource revision", () => {
72
72
  },
73
73
  }),
74
74
  },
75
- "article"
75
+ "article",
76
76
  );
77
77
 
78
78
  expect(result).toEqual({
@@ -115,7 +115,7 @@ describe("Publish resource revision", () => {
115
115
  {
116
116
  visibility: publishing.visibility,
117
117
  },
118
- "article"
118
+ "article",
119
119
  );
120
120
 
121
121
  expect(result).toEqual({
@@ -187,7 +187,7 @@ describe("Publish resource revision", () => {
187
187
  },
188
188
  }),
189
189
  },
190
- "article"
190
+ "article",
191
191
  );
192
192
 
193
193
  expect(result).toEqual({
@@ -233,7 +233,7 @@ describe("Publish resource revision", () => {
233
233
  {
234
234
  visibility: publishing.visibility,
235
235
  },
236
- "article"
236
+ "article",
237
237
  );
238
238
 
239
239
  expect(result).toEqual({
@@ -295,7 +295,7 @@ describe("Publish resource revision", () => {
295
295
  {
296
296
  visibility: publishing.visibility,
297
297
  },
298
- "article"
298
+ "article",
299
299
  );
300
300
 
301
301
  expect(result).toEqual({
@@ -63,7 +63,7 @@ describe("Resource revisions", () => {
63
63
  .mockResolvedValue({ revision: null, errors, resourceErrors: null });
64
64
 
65
65
  await expect(ResourceRevisionsHandler.create(ctx)).rejects.toThrow(
66
- `Failed to start revision: ${JSON.stringify(errors)}`
66
+ `Failed to start revision: ${JSON.stringify(errors)}`,
67
67
  );
68
68
  });
69
69
 
@@ -81,7 +81,7 @@ describe("Resource revisions", () => {
81
81
  });
82
82
 
83
83
  await expect(ResourceRevisionsHandler.create(ctx)).rejects.toThrow(
84
- `Failed to start revision: ${JSON.stringify(errors)}`
84
+ `Failed to start revision: ${JSON.stringify(errors)}`,
85
85
  );
86
86
  });
87
87
  });
@@ -49,7 +49,7 @@ describe("Resource revisions", () => {
49
49
  expect(async () => {
50
50
  await ResourceRevisionsHandler.destroy(ctx);
51
51
  }).rejects.toThrow(
52
- `Failed to delete revision#${1}: ${JSON.stringify(errors)}`
52
+ `Failed to delete revision#${1}: ${JSON.stringify(errors)}`,
53
53
  );
54
54
 
55
55
  expect(mockDelete).toHaveBeenCalledWith(1, "en", "article");