@raketa-cloud/admin 1.8.10 → 1.8.12

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 +41 -18
  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
@@ -32,7 +32,12 @@ describe("Resource revision revert", () => {
32
32
 
33
33
  const result = await RevertsHandler.create(ctx);
34
34
 
35
- expect(mockRevert).toHaveBeenCalledWith(resourceId, version, "en", "article");
35
+ expect(mockRevert).toHaveBeenCalledWith(
36
+ resourceId,
37
+ version,
38
+ "en",
39
+ "article",
40
+ );
36
41
 
37
42
  expect(result).toEqual({
38
43
  redirect: `/en/articles/${resourceId}`,
@@ -57,7 +62,12 @@ describe("Resource revision revert", () => {
57
62
  await RevertsHandler.create(ctx);
58
63
  }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
59
64
 
60
- expect(mockRevert).toHaveBeenCalledWith(resourceId, version, "en", "article");
65
+ expect(mockRevert).toHaveBeenCalledWith(
66
+ resourceId,
67
+ version,
68
+ "en",
69
+ "article",
70
+ );
61
71
  });
62
72
 
63
73
  test("create failed with resource errors", async () => {
@@ -78,6 +88,11 @@ describe("Resource revision revert", () => {
78
88
  await RevertsHandler.create(ctx);
79
89
  }).rejects.toThrow(`Failed to start revision: ${JSON.stringify(errors)}`);
80
90
 
81
- expect(mockRevert).toHaveBeenCalledWith(resourceId, version, "en", "article");
91
+ expect(mockRevert).toHaveBeenCalledWith(
92
+ resourceId,
93
+ version,
94
+ "en",
95
+ "article",
96
+ );
82
97
  });
83
98
  });
@@ -70,7 +70,7 @@ describe("Resource revision tags settings", () => {
70
70
  categories: revision.categories.map((c) => c.id),
71
71
  settings: revision.settings,
72
72
  },
73
- "article"
73
+ "article",
74
74
  );
75
75
 
76
76
  expect(result).toEqual({
@@ -54,7 +54,7 @@ describe("Resource revision unlock", () => {
54
54
  }));
55
55
 
56
56
  await expect(UnlocksHandler.create(ctx)).rejects.toThrow(
57
- `Failed to unlock revision: ${JSON.stringify(errors)}`
57
+ `Failed to unlock revision: ${JSON.stringify(errors)}`,
58
58
  );
59
59
 
60
60
  expect(mockUnlock).toHaveBeenCalledWith(revision.id, "en", "article");
@@ -76,7 +76,7 @@ describe("Resource revision unlock", () => {
76
76
  }));
77
77
 
78
78
  await expect(UnlocksHandler.create(ctx)).rejects.toThrow(
79
- `Failed to unlock revision: ${JSON.stringify(resourceErrors)}`
79
+ `Failed to unlock revision: ${JSON.stringify(resourceErrors)}`,
80
80
  );
81
81
 
82
82
  expect(mockUnlock).toHaveBeenCalledWith(revision.id, "en", "article");
@@ -61,7 +61,7 @@ describe("Resource revision visuals settings", () => {
61
61
  layout: updateSettings.settings.layout,
62
62
  },
63
63
  },
64
- "article"
64
+ "article",
65
65
  );
66
66
 
67
67
  expect(result).toEqual({
@@ -57,7 +57,7 @@ describe("Resource revision WidgetHandler", () => {
57
57
  revision.id,
58
58
  "en",
59
59
  newWidgets,
60
- "article"
60
+ "article",
61
61
  );
62
62
  expect(mockFind).toHaveBeenCalledWith(revision.id, "en", "article");
63
63
  expect(mockSettings).toHaveBeenCalledWith("en");
@@ -103,7 +103,7 @@ describe("Resource revision WidgetHandler", () => {
103
103
  revision.id,
104
104
  "en",
105
105
  newWidgets,
106
- "article"
106
+ "article",
107
107
  );
108
108
  expect(mockFind).toHaveBeenCalledWith(revision.id, "en", "article");
109
109
 
@@ -33,7 +33,7 @@ describe("Resource ChangeHandler", () => {
33
33
  resource.id,
34
34
  49,
35
35
  "en",
36
- "article"
36
+ "article",
37
37
  );
38
38
 
39
39
  expect(result).toEqual({
@@ -52,6 +52,11 @@ describe("Resource ChangeHandler", () => {
52
52
  await ChangeHandler.show(ctx);
53
53
  }).rejects.toThrow("Missing article #42");
54
54
 
55
- expect(mockedGetChangePreview).toHaveBeenCalledWith("42", 49, "en", "article");
55
+ expect(mockedGetChangePreview).toHaveBeenCalledWith(
56
+ "42",
57
+ 49,
58
+ "en",
59
+ "article",
60
+ );
56
61
  });
57
62
  });
@@ -48,9 +48,7 @@ describe("Clone resource", () => {
48
48
 
49
49
  expect(async () => {
50
50
  await ClonesHandler.create(ctx);
51
- }).rejects.toThrow(
52
- `Error cloning article: ${JSON.stringify(errors)}`
53
- );
51
+ }).rejects.toThrow(`Error cloning article: ${JSON.stringify(errors)}`);
54
52
 
55
53
  expect(mockClone).toHaveBeenCalledWith(resource.id, "en", "article");
56
54
  });
@@ -53,13 +53,13 @@ describe("Resources ExportsHandler", () => {
53
53
  expect(mockedListAll).toHaveBeenCalledWith({}, "en", "article");
54
54
 
55
55
  expect(result.text).toContain(
56
- "id,type,locale,title,URL,visibility,created_at,updated_at"
56
+ "id,type,locale,title,URL,visibility,created_at,updated_at",
57
57
  );
58
58
  expect(result.text).toContain(
59
- "1,article,en,Resource 1,/resource-1,public,2024-01-01,2024-01-02"
59
+ "1,article,en,Resource 1,/resource-1,public,2024-01-01,2024-01-02",
60
60
  );
61
61
  expect(result.text).toContain(
62
- "2,article,en,Resource 2,/resource-2,private,2024-01-03,2024-01-04"
62
+ "2,article,en,Resource 2,/resource-2,private,2024-01-03,2024-01-04",
63
63
  );
64
64
 
65
65
  expect(result.headers).toEqual({
@@ -94,11 +94,11 @@ describe("Resources ExportsHandler", () => {
94
94
  expect(mockedListAll).toHaveBeenCalledWith(
95
95
  { locale: "es" },
96
96
  "es",
97
- "article"
97
+ "article",
98
98
  );
99
99
 
100
100
  expect(result.text).toContain(
101
- "1,article,es,Recurso 1,/recurso-1,public,2024-01-01,2024-01-02"
101
+ "1,article,es,Recurso 1,/recurso-1,public,2024-01-01,2024-01-02",
102
102
  );
103
103
  });
104
104
 
@@ -144,7 +144,7 @@ describe("Resources ExportsHandler", () => {
144
144
  const result = await ExportsHandler.index(ctx);
145
145
 
146
146
  expect(result.text).toBe(
147
- "id,type,locale,title,URL,visibility,created_at,updated_at,translations"
147
+ "id,type,locale,title,URL,visibility,created_at,updated_at,translations",
148
148
  );
149
149
  });
150
150
 
@@ -182,11 +182,11 @@ describe("Resources ExportsHandler", () => {
182
182
  expect(mockedListAll).toHaveBeenCalledWith(
183
183
  {},
184
184
  "en",
185
- "custom-resource-type"
185
+ "custom-resource-type",
186
186
  );
187
187
 
188
188
  expect(result.headers["Content-Disposition"]).toContain(
189
- "custom-resource-type_export.csv"
189
+ "custom-resource-type_export.csv",
190
190
  );
191
191
 
192
192
  global.Date.mockRestore();
@@ -56,7 +56,7 @@ describe("Resources History Handler", () => {
56
56
  jest.spyOn(ctx.client.resources, "find").mockImplementation(() => null);
57
57
 
58
58
  await expect(HistoryHandler.index(ctx)).rejects.toThrow(
59
- "Missing article #123"
59
+ "Missing article #123",
60
60
  );
61
61
  });
62
62
 
@@ -28,11 +28,7 @@ describe("Resources API Handler", () => {
28
28
 
29
29
  const result = await ResourcesAPIHandler.index(ctx);
30
30
 
31
- expect(mockedListAll).toHaveBeenCalledWith(
32
- { foo: "bar" },
33
- "en",
34
- "article"
35
- );
31
+ expect(mockedListAll).toHaveBeenCalledWith({ foo: "bar" }, "en", "article");
36
32
 
37
33
  expect(result).toEqual({
38
34
  json: { list: [resource] },
@@ -74,7 +74,7 @@ describe("Resources Handler", () => {
74
74
  categories: [],
75
75
  },
76
76
  "en",
77
- "article"
77
+ "article",
78
78
  );
79
79
 
80
80
  expect(result).toEqual({
@@ -141,7 +141,7 @@ describe("Resources Handler", () => {
141
141
  categories: [],
142
142
  },
143
143
  "en",
144
- "article"
144
+ "article",
145
145
  );
146
146
 
147
147
  expect(result).toEqual({
@@ -79,7 +79,7 @@ describe("Resources Handler", () => {
79
79
  },
80
80
  resource.id,
81
81
  "en",
82
- "article"
82
+ "article",
83
83
  );
84
84
 
85
85
  expect(result).toEqual({
@@ -29,9 +29,7 @@ describe("Resource Translations Handler", () => {
29
29
  });
30
30
  const ctx = buildCtx({}, resource);
31
31
 
32
- jest
33
- .spyOn(ctx.client.resources, "find")
34
- .mockImplementation(() => resource);
32
+ jest.spyOn(ctx.client.resources, "find").mockImplementation(() => resource);
35
33
 
36
34
  const result = await TranslationsHandler.create(ctx);
37
35
 
@@ -74,7 +72,7 @@ describe("Resource Translations Handler", () => {
74
72
  locales.map(() => ({
75
73
  resource: null,
76
74
  errors: translationErrors,
77
- }))
75
+ })),
78
76
  );
79
77
 
80
78
  const mockFormatErrors = jest
@@ -129,7 +127,7 @@ describe("Resource Translations Handler", () => {
129
127
  locales.map((locale) => ({
130
128
  resource: { id: `translated-resource-${locale}` },
131
129
  errors: null,
132
- }))
130
+ })),
133
131
  );
134
132
 
135
133
  const mockCreateRevisionBatch = jest
@@ -138,7 +136,7 @@ describe("Resource Translations Handler", () => {
138
136
  revisionInputs.map(({ locale }) => ({
139
137
  revision: { id: `revision-${locale}` },
140
138
  errors: null,
141
- }))
139
+ })),
142
140
  );
143
141
 
144
142
  const result = await TranslationsHandler.create(ctx);
@@ -155,13 +153,22 @@ describe("Resource Translations Handler", () => {
155
153
  visibility: "private",
156
154
  slug: resource.slug,
157
155
  }),
158
- "article"
156
+ "article",
157
+ undefined,
159
158
  );
160
159
 
161
160
  expect(mockCreateRevisionBatch).toHaveBeenCalledTimes(1);
162
161
  expect(mockCreateRevisionBatch).toHaveBeenCalledWith([
163
- { resourceId: "translated-resource-fr", resourceType: "article", locale: "fr" },
164
- { resourceId: "translated-resource-es", resourceType: "article", locale: "es" },
162
+ {
163
+ resourceId: "translated-resource-fr",
164
+ resourceType: "article",
165
+ locale: "fr",
166
+ },
167
+ {
168
+ resourceId: "translated-resource-es",
169
+ resourceType: "article",
170
+ locale: "es",
171
+ },
165
172
  ]);
166
173
 
167
174
  expect(result).toEqual({
@@ -219,7 +226,8 @@ describe("Resource Translations Handler", () => {
219
226
  visibility: "private",
220
227
  slug: resource.slug,
221
228
  }),
222
- "article"
229
+ "article",
230
+ undefined,
223
231
  );
224
232
 
225
233
  expect(result).toEqual({
@@ -259,9 +267,7 @@ describe("Resource Translations Handler", () => {
259
267
 
260
268
  const ctx = buildCtx(params, resource);
261
269
 
262
- jest
263
- .spyOn(ctx.client.resources, "find")
264
- .mockImplementation(() => resource);
270
+ jest.spyOn(ctx.client.resources, "find").mockImplementation(() => resource);
265
271
 
266
272
  jest
267
273
  .spyOn(ctx.client.resources, "translateBatch")
@@ -288,7 +294,11 @@ describe("Resource Translations Handler", () => {
288
294
  const result = await TranslationsHandler.create(ctx);
289
295
 
290
296
  expect(mockCreateRevisionBatch).toHaveBeenCalledWith([
291
- { resourceId: "translated-resource-fr", resourceType: "article", locale: "fr" },
297
+ {
298
+ resourceId: "translated-resource-fr",
299
+ resourceType: "article",
300
+ locale: "fr",
301
+ },
292
302
  ]);
293
303
  expect(mockFormatErrors).toHaveBeenCalledWith(revisionErrors);
294
304
 
@@ -77,7 +77,7 @@ describe("Resource translation form", () => {
77
77
  .mockImplementation(() => null);
78
78
 
79
79
  await expect(TranslationsHandler.create_form(ctx)).rejects.toThrow(
80
- "Cannot find article with id 42"
80
+ "Cannot find article with id 42",
81
81
  );
82
82
 
83
83
  expect(mockFind).toHaveBeenCalledWith("42", "en", "article");
@@ -62,17 +62,17 @@ describe("Resource Translations Handler", () => {
62
62
  expect(mockedRevisions).toHaveBeenCalledWith(
63
63
  "fr-resource-id",
64
64
  "fr",
65
- "article"
65
+ "article",
66
66
  );
67
67
  expect(mockedRevisions).toHaveBeenCalledWith(
68
68
  "es-resource-id",
69
69
  "es",
70
- "article"
70
+ "article",
71
71
  );
72
72
  expect(mockedList).toHaveBeenCalledWith(
73
73
  { translations: "fr:fr-resource-id;es:es-resource-id" },
74
74
  "en",
75
- "article"
75
+ "article",
76
76
  );
77
77
 
78
78
  expect(result).toEqual({
@@ -51,7 +51,7 @@ describe("Resource change url", () => {
51
51
  destination: `/en/blog/${updateSettings.slug}`,
52
52
  httpResponseCode: 301,
53
53
  note: "Created with changed URL for a article",
54
- }
54
+ },
55
55
  );
56
56
 
57
57
  expect(result).toEqual({
@@ -74,9 +74,7 @@ describe("Resource change url", () => {
74
74
  .spyOn(ctx.client.resources, "updateSlug")
75
75
  .mockImplementation(() => ({
76
76
  resource: null,
77
- errors: [
78
- { codes: [], key: "slug", message: "has already been taken" },
79
- ],
77
+ errors: [{ codes: [], key: "slug", message: "has already been taken" }],
80
78
  }));
81
79
 
82
80
  const result = await URLsHandler.create(ctx);
@@ -87,7 +85,7 @@ describe("Resource change url", () => {
87
85
  updateSettings.slug,
88
86
  "en",
89
87
  "article",
90
- null
88
+ null,
91
89
  );
92
90
 
93
91
  expect(result).toEqual({
@@ -137,7 +135,7 @@ describe("Resource change url", () => {
137
135
  destination: `/en/blog/${updateSettings.slug}`,
138
136
  httpResponseCode: 301,
139
137
  note: "Created with changed URL for a article",
140
- }
138
+ },
141
139
  );
142
140
 
143
141
  expect(result).toEqual({
@@ -5,7 +5,7 @@ describe("AuthHelper", () => {
5
5
  test("parses JWT token correctly", () => {
6
6
  const payload = { user: "test", exp: 1735689600 };
7
7
  const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
8
- "base64"
8
+ "base64",
9
9
  );
10
10
  const mockToken = `header.${encodedPayload}.signature`;
11
11
 
@@ -19,7 +19,7 @@ describe("AuthHelper", () => {
19
19
  const futureTime = Math.floor(Date.now() / 1000) + 3600;
20
20
  const payload = { exp: futureTime };
21
21
  const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
22
- "base64"
22
+ "base64",
23
23
  );
24
24
  const mockToken = `header.${encodedPayload}.signature`;
25
25
 
@@ -31,7 +31,7 @@ describe("AuthHelper", () => {
31
31
  const pastTime = Math.floor(Date.now() / 1000) - 3600;
32
32
  const payload = { exp: pastTime };
33
33
  const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
34
- "base64"
34
+ "base64",
35
35
  );
36
36
  const mockToken = `header.${encodedPayload}.signature`;
37
37
 
@@ -42,7 +42,7 @@ describe("AuthHelper", () => {
42
42
  test("returns false for token without exp", () => {
43
43
  const payload = { user: "test" };
44
44
  const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
45
- "base64"
45
+ "base64",
46
46
  );
47
47
  const mockToken = `header.${encodedPayload}.signature`;
48
48
 
@@ -59,15 +59,14 @@ describe("AuthHelper", () => {
59
59
 
60
60
  const result2 = AuthHelper.verifyJWT(invalidToken2);
61
61
  expect(result2).toBe(false);
62
- })
63
-
62
+ });
64
63
  });
65
64
 
66
65
  describe("isAuthenticated", () => {
67
66
  test("returns true for allowed paths", () => {
68
67
  expect(AuthHelper.isAuthenticated({ path: "/login" })).toBe(true);
69
68
  expect(
70
- AuthHelper.isAuthenticated({ path: "/auth/google/callback" })
69
+ AuthHelper.isAuthenticated({ path: "/auth/google/callback" }),
71
70
  ).toBe(true);
72
71
  expect(AuthHelper.isAuthenticated({ path: "/remote/verify" })).toBe(true);
73
72
  });
@@ -76,7 +75,7 @@ describe("AuthHelper", () => {
76
75
  const futureTime = Math.floor(Date.now() / 1000) + 3600;
77
76
  const payload = { exp: futureTime };
78
77
  const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
79
- "base64"
78
+ "base64",
80
79
  );
81
80
  const mockToken = `header.${encodedPayload}.signature`;
82
81
 
@@ -84,7 +83,7 @@ describe("AuthHelper", () => {
84
83
  AuthHelper.isAuthenticated({
85
84
  path: "/protected",
86
85
  token: mockToken,
87
- })
86
+ }),
88
87
  ).toBe(true);
89
88
  });
90
89
 
@@ -92,7 +91,7 @@ describe("AuthHelper", () => {
92
91
  const pastTime = Math.floor(Date.now() / 1000) - 3600;
93
92
  const payload = { exp: pastTime };
94
93
  const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
95
- "base64"
94
+ "base64",
96
95
  );
97
96
  const mockToken = `header.${encodedPayload}.signature`;
98
97
 
@@ -100,7 +99,7 @@ describe("AuthHelper", () => {
100
99
  AuthHelper.isAuthenticated({
101
100
  path: "/protected",
102
101
  token: mockToken,
103
- })
102
+ }),
104
103
  ).toBe(false);
105
104
  });
106
105
 
@@ -108,7 +107,7 @@ describe("AuthHelper", () => {
108
107
  expect(
109
108
  AuthHelper.isAuthenticated({
110
109
  path: "/protected",
111
- })
110
+ }),
112
111
  ).toBe(false);
113
112
  });
114
113
  });
@@ -208,8 +208,8 @@ describe("CSVExportHelper", () => {
208
208
  updatedAt: "2024-01-02",
209
209
  translations: {
210
210
  es: {},
211
- de: {}
212
- }
211
+ de: {},
212
+ },
213
213
  },
214
214
  ];
215
215
  const headers = [...CSVExportHelper.standardHeaders];
@@ -363,7 +363,7 @@ describe("CSVExportHelper", () => {
363
363
  "visibility",
364
364
  "created_at",
365
365
  "updated_at",
366
- "translations"
366
+ "translations",
367
367
  ]);
368
368
  });
369
369
  });
@@ -20,7 +20,7 @@ describe("FormBuilder", () => {
20
20
  <div class="mb-4">
21
21
  <label for="f_resource_title">Title</label>
22
22
  <input type="text" name="resource[title]" value="Test content" id="f_resource_title" />
23
- </div>`)
23
+ </div>`),
24
24
  );
25
25
  });
26
26
 
@@ -35,7 +35,7 @@ describe("FormBuilder", () => {
35
35
  resource: {
36
36
  title: "Can't be blank",
37
37
  },
38
- }
38
+ },
39
39
  );
40
40
 
41
41
  const result = form.field("resource.title");
@@ -46,7 +46,7 @@ describe("FormBuilder", () => {
46
46
  <label for="f_resource_title">Title</label>
47
47
  <input type="text" name="resource[title]" value="Test content" id="f_resource_title" />
48
48
  <span class="text-red-600">Can't be blank</span>
49
- </div>`)
49
+ </div>`),
50
50
  );
51
51
  });
52
52
 
@@ -64,8 +64,8 @@ describe("FormBuilder", () => {
64
64
  `<div class="mb-4">
65
65
  <label for="f_resource_email">Electronic mail</label>
66
66
  <input type="text" name="resource[email]" value="john@example.com" id="f_resource_email" />
67
- </div>`
68
- )
67
+ </div>`,
68
+ ),
69
69
  );
70
70
  });
71
71
 
@@ -83,8 +83,8 @@ describe("FormBuilder", () => {
83
83
  `<div class="mb-4">
84
84
  <label for="f_resource_description">Description</label>
85
85
  <textarea name="resource[description]" id="f_resource_description">Lorem ipsum dolor...</textarea>
86
- </div>`
87
- )
86
+ </div>`,
87
+ ),
88
88
  );
89
89
  });
90
90
 
@@ -109,8 +109,8 @@ describe("FormBuilder", () => {
109
109
  <input type="checkbox" value="yes" id="f_resource_description" name="resource[description]" />
110
110
  <label for="f_resource_description">Description</label>
111
111
  </div>
112
- </div>`
113
- )
112
+ </div>`,
113
+ ),
114
114
  );
115
115
  });
116
116
 
@@ -133,8 +133,8 @@ describe("FormBuilder", () => {
133
133
  <input type="checkbox" value="yes" id="f_resource_active" name="resource[active]" checked="checked" />
134
134
  <label for="f_resource_active">Active</label>
135
135
  </div>
136
- </div>`
137
- )
136
+ </div>`,
137
+ ),
138
138
  );
139
139
  });
140
140
 
@@ -162,8 +162,8 @@ describe("FormBuilder", () => {
162
162
  <option value="default" selected="selected">Default</option>
163
163
  <option value="headless">Headless</option>
164
164
  </select>
165
- </div>`
166
- )
165
+ </div>`,
166
+ ),
167
167
  );
168
168
  });
169
169
 
@@ -192,8 +192,8 @@ describe("FormBuilder", () => {
192
192
  <label ><input type="radio" name="resource[color]" value="blue" /> Blue</label>
193
193
  <label ><input type="radio" name="resource[color]" value="green" /> Green</label>
194
194
  </div>
195
- </div>`
196
- )
195
+ </div>`,
196
+ ),
197
197
  );
198
198
  });
199
199
 
@@ -223,8 +223,8 @@ describe("FormBuilder", () => {
223
223
  <label ><input type="checkbox" name="resource[color][]" value="green" /> Green</label>
224
224
  <input type="hidden" name="resource[color][]" value="" />
225
225
  </div>
226
- </div>`
227
- )
226
+ </div>`,
227
+ ),
228
228
  );
229
229
  });
230
230
 
@@ -283,7 +283,7 @@ describe("FormBuilder", () => {
283
283
  <option value="nofollow">No Follow</option>
284
284
  </select>
285
285
  </div>
286
- </fieldset>`)
286
+ </fieldset>`),
287
287
  );
288
288
  });
289
289
 
@@ -338,8 +338,8 @@ describe("FormBuilder", () => {
338
338
  <option value="nofollow">No Follow</option>
339
339
  </select>
340
340
  </div>
341
- </fieldset>`
342
- )
341
+ </fieldset>`,
342
+ ),
343
343
  );
344
344
  });
345
345
  });
@@ -350,7 +350,7 @@ describe("FormBuilder", () => {
350
350
  const result = form.submit("Save", { class: "btn-primary" });
351
351
 
352
352
  expect(normalizeHTML(result)).toEqual(
353
- '<button type="submit" class="btn-primary">Save</button>'
353
+ '<button type="submit" class="btn-primary">Save</button>',
354
354
  );
355
355
  });
356
356
  });