@openneuro/server 4.20.5 → 4.20.6-alpha.3

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 (185) hide show
  1. package/package.json +4 -6
  2. package/src/__mocks__/{config.js → config.ts} +5 -5
  3. package/src/app.ts +32 -31
  4. package/src/cache/item.ts +6 -7
  5. package/src/cache/types.ts +8 -8
  6. package/src/{config.js → config.ts} +6 -6
  7. package/src/datalad/__tests__/changelog.spec.ts +83 -0
  8. package/src/datalad/__tests__/dataset.spec.ts +109 -0
  9. package/src/datalad/__tests__/description.spec.ts +141 -0
  10. package/src/datalad/__tests__/files.spec.ts +77 -0
  11. package/src/datalad/__tests__/pagination.spec.ts +136 -0
  12. package/src/datalad/__tests__/{snapshots.spec.js → snapshots.spec.ts} +17 -17
  13. package/src/datalad/{analytics.js → analytics.ts} +4 -4
  14. package/src/datalad/{changelog.js → changelog.ts} +17 -14
  15. package/src/datalad/{dataset.js → dataset.ts} +95 -93
  16. package/src/datalad/{description.js → description.ts} +37 -37
  17. package/src/datalad/draft.ts +38 -0
  18. package/src/datalad/files.ts +26 -20
  19. package/src/datalad/{pagination.js → pagination.ts} +47 -47
  20. package/src/datalad/{readme.js → readme.ts} +13 -11
  21. package/src/datalad/{reexporter.js → reexporter.ts} +4 -4
  22. package/src/datalad/{snapshots.js → snapshots.ts} +56 -62
  23. package/src/datalad/{upload.js → upload.ts} +7 -5
  24. package/src/elasticsearch/elastic-client.ts +11 -0
  25. package/src/elasticsearch/reindex-dataset.ts +7 -7
  26. package/src/graphql/__tests__/__snapshots__/permissions.spec.ts.snap +5 -0
  27. package/src/graphql/__tests__/{comment.spec.js → comment.spec.ts} +17 -17
  28. package/src/graphql/__tests__/permissions.spec.ts +113 -0
  29. package/src/graphql/{permissions.js → permissions.ts} +14 -14
  30. package/src/graphql/resolvers/__tests__/brainlife.spec.ts +11 -11
  31. package/src/graphql/resolvers/__tests__/{dataset-search.spec.js → dataset-search.spec.ts} +25 -23
  32. package/src/graphql/resolvers/__tests__/dataset.spec.ts +175 -0
  33. package/src/graphql/resolvers/__tests__/derivatives.spec.ts +19 -19
  34. package/src/graphql/resolvers/__tests__/importRemoteDataset.spec.ts +20 -20
  35. package/src/graphql/resolvers/__tests__/permssions.spec.ts +35 -0
  36. package/src/graphql/resolvers/__tests__/snapshots.spec.ts +59 -0
  37. package/src/graphql/resolvers/__tests__/user.spec.ts +18 -0
  38. package/src/graphql/resolvers/brainlife.ts +4 -4
  39. package/src/graphql/resolvers/cache.ts +4 -4
  40. package/src/graphql/resolvers/{comment.js → comment.ts} +16 -16
  41. package/src/graphql/resolvers/{dataset-search.js → dataset-search.ts} +45 -43
  42. package/src/graphql/resolvers/{dataset.js → dataset.ts} +38 -52
  43. package/src/graphql/resolvers/datasetType.ts +3 -3
  44. package/src/graphql/resolvers/derivatives.ts +11 -11
  45. package/src/graphql/resolvers/description.ts +18 -0
  46. package/src/graphql/resolvers/{draft.js → draft.ts} +13 -13
  47. package/src/graphql/resolvers/{flaggedFiles.js → flaggedFiles.ts} +4 -4
  48. package/src/graphql/resolvers/{follow.js → follow.ts} +1 -1
  49. package/src/graphql/resolvers/git.ts +3 -3
  50. package/src/graphql/resolvers/history.ts +13 -0
  51. package/src/graphql/resolvers/importRemoteDataset.ts +12 -11
  52. package/src/graphql/resolvers/index.ts +25 -0
  53. package/src/graphql/resolvers/{issues.js → issues.ts} +9 -9
  54. package/src/graphql/resolvers/metadata.ts +8 -8
  55. package/src/graphql/resolvers/{mutation.js → mutation.ts} +26 -26
  56. package/src/graphql/resolvers/{newsletter.js → newsletter.ts} +2 -2
  57. package/src/graphql/resolvers/permissions.ts +15 -21
  58. package/src/graphql/resolvers/publish.ts +17 -0
  59. package/src/graphql/resolvers/query.ts +21 -0
  60. package/src/graphql/resolvers/{readme.js → readme.ts} +3 -3
  61. package/src/graphql/resolvers/{reexporter.js → reexporter.ts} +2 -2
  62. package/src/graphql/resolvers/relation.ts +5 -5
  63. package/src/graphql/resolvers/{reset.js → reset.ts} +2 -2
  64. package/src/graphql/resolvers/reviewer.ts +4 -4
  65. package/src/graphql/resolvers/{snapshots.js → snapshots.ts} +49 -49
  66. package/src/graphql/resolvers/{stars.js → stars.ts} +1 -1
  67. package/src/graphql/resolvers/summary.ts +3 -3
  68. package/src/graphql/resolvers/{upload.js → upload.ts} +5 -5
  69. package/src/graphql/resolvers/{user.js → user.ts} +16 -18
  70. package/src/graphql/resolvers/{validation.js → validation.ts} +12 -14
  71. package/src/graphql/{schema.js → schema.ts} +4 -6
  72. package/src/graphql/utils/{file.js → file.ts} +2 -2
  73. package/src/handlers/{comments.js → comments.ts} +11 -11
  74. package/src/handlers/{config.js → config.ts} +1 -1
  75. package/src/handlers/{datalad.js → datalad.ts} +22 -22
  76. package/src/handlers/{doi.js → doi.ts} +6 -6
  77. package/src/handlers/reviewer.ts +6 -6
  78. package/src/handlers/{sitemap.js → sitemap.ts} +19 -19
  79. package/src/handlers/stars.ts +11 -10
  80. package/src/handlers/{subscriptions.js → subscriptions.ts} +17 -16
  81. package/src/handlers/{users.js → users.ts} +3 -3
  82. package/src/libs/__tests__/apikey.spec.ts +25 -0
  83. package/src/libs/__tests__/datalad-service.spec.ts +27 -0
  84. package/src/libs/__tests__/{dataset.spec.js → dataset.spec.ts} +9 -9
  85. package/src/libs/{apikey.js → apikey.ts} +5 -5
  86. package/src/libs/authentication/__tests__/jwt.spec.ts +59 -0
  87. package/src/libs/authentication/{crypto.js → crypto.ts} +16 -16
  88. package/src/libs/authentication/google.ts +18 -0
  89. package/src/libs/authentication/jwt.ts +40 -33
  90. package/src/libs/authentication/{orcid.js → orcid.ts} +11 -11
  91. package/src/libs/authentication/{passport.js → passport.ts} +45 -30
  92. package/src/libs/authentication/{states.js → states.ts} +17 -20
  93. package/src/libs/{counter.js → counter.ts} +1 -1
  94. package/src/libs/{datalad-service.js → datalad-service.ts} +4 -4
  95. package/src/libs/dataset.ts +9 -0
  96. package/src/libs/doi/__tests__/__snapshots__/doi.spec.ts.snap +17 -0
  97. package/src/libs/doi/__tests__/doi.spec.ts +25 -0
  98. package/src/libs/doi/__tests__/normalize.spec.ts +19 -19
  99. package/src/libs/doi/{index.js → index.ts} +27 -21
  100. package/src/libs/doi/normalize.ts +2 -2
  101. package/src/libs/email/__tests__/index.spec.ts +14 -14
  102. package/src/libs/email/index.ts +4 -4
  103. package/src/libs/email/templates/__tests__/comment-created.spec.ts +12 -12
  104. package/src/libs/email/templates/__tests__/dataset-deleted.spec.ts +6 -6
  105. package/src/libs/email/templates/__tests__/owner-unsubscribed.spec.ts +6 -6
  106. package/src/libs/email/templates/__tests__/snapshot-created.spec.ts +9 -9
  107. package/src/libs/email/templates/__tests__/snapshot-reminder.spec.ts +7 -7
  108. package/src/libs/email/templates/comment-created.ts +2 -1
  109. package/src/libs/email/templates/dataset-deleted.ts +2 -1
  110. package/src/libs/email/templates/dataset-import-failed.ts +2 -1
  111. package/src/libs/email/templates/dataset-imported.ts +2 -1
  112. package/src/libs/email/templates/owner-unsubscribed.ts +2 -1
  113. package/src/libs/email/templates/snapshot-created.ts +2 -1
  114. package/src/libs/email/templates/snapshot-reminder.ts +2 -1
  115. package/src/libs/{notifications.js → notifications.ts} +100 -113
  116. package/src/libs/{orcid.js → orcid.ts} +20 -20
  117. package/src/libs/{redis.js → redis.ts} +6 -6
  118. package/src/models/__tests__/ingestDataset.spec.ts +15 -15
  119. package/src/models/analytics.ts +2 -2
  120. package/src/models/badAnnexObject.ts +6 -6
  121. package/src/models/comment.ts +10 -10
  122. package/src/models/counter.ts +2 -2
  123. package/src/models/dataset.ts +16 -16
  124. package/src/models/deletion.ts +3 -3
  125. package/src/models/deprecatedSnapshot.ts +2 -2
  126. package/src/models/doi.ts +2 -2
  127. package/src/models/file.ts +2 -2
  128. package/src/models/ingestDataset.ts +4 -4
  129. package/src/models/issue.ts +2 -2
  130. package/src/models/key.ts +2 -2
  131. package/src/models/mailgunIdentifier.ts +2 -2
  132. package/src/models/metadata.ts +3 -3
  133. package/src/models/newsletter.ts +3 -3
  134. package/src/models/notification.ts +2 -2
  135. package/src/models/permission.ts +4 -4
  136. package/src/models/reviewer.ts +7 -7
  137. package/src/models/snapshot.ts +2 -2
  138. package/src/models/stars.ts +6 -6
  139. package/src/models/subscription.ts +2 -2
  140. package/src/models/summary.ts +2 -2
  141. package/src/models/upload.ts +3 -3
  142. package/src/models/user.ts +4 -4
  143. package/src/{routes.js → routes.ts} +62 -62
  144. package/src/server.ts +9 -9
  145. package/src/utils/__tests__/datasetOrSnapshot.spec.ts +25 -25
  146. package/src/utils/__tests__/validateUrl.spec.ts +10 -10
  147. package/src/utils/datasetOrSnapshot.ts +2 -2
  148. package/src/utils/validateUrl.ts +1 -1
  149. package/src/datalad/__tests__/changelog.spec.js +0 -82
  150. package/src/datalad/__tests__/dataset.spec.js +0 -109
  151. package/src/datalad/__tests__/description.spec.js +0 -137
  152. package/src/datalad/__tests__/files.spec.js +0 -75
  153. package/src/datalad/__tests__/pagination.spec.js +0 -136
  154. package/src/datalad/draft.js +0 -37
  155. package/src/elasticsearch/elastic-client.js +0 -11
  156. package/src/graphql/__tests__/permissions.spec.js +0 -107
  157. package/src/graphql/pubsub.js +0 -5
  158. package/src/graphql/resolvers/__tests__/dataset.spec.js +0 -175
  159. package/src/graphql/resolvers/__tests__/permssions.spec.js +0 -34
  160. package/src/graphql/resolvers/__tests__/snapshots.spec.js +0 -58
  161. package/src/graphql/resolvers/__tests__/user.spec.js +0 -17
  162. package/src/graphql/resolvers/description.js +0 -29
  163. package/src/graphql/resolvers/history.js +0 -11
  164. package/src/graphql/resolvers/index.js +0 -25
  165. package/src/graphql/resolvers/publish.js +0 -17
  166. package/src/graphql/resolvers/query.js +0 -21
  167. package/src/graphql/resolvers/subscriptions.js +0 -81
  168. package/src/graphql/utils/publish-draft-update.js +0 -13
  169. package/src/libs/__tests__/apikey.spec.js +0 -24
  170. package/src/libs/__tests__/datalad-service.spec.js +0 -26
  171. package/src/libs/authentication/__tests__/jwt.spec.js +0 -23
  172. package/src/libs/authentication/globus.js +0 -11
  173. package/src/libs/authentication/google.js +0 -19
  174. package/src/libs/bidsId.js +0 -68
  175. package/src/libs/dataset.js +0 -9
  176. package/src/libs/doi/__tests__/doi.spec.js +0 -24
  177. package/src/libs/redis-pubsub.js +0 -5
  178. package/src/libs/request.js +0 -155
  179. package/src/libs/scitran.js +0 -25
  180. package/src/libs/subscription-server.js +0 -20
  181. package/src/libs/testing-utils.js +0 -17
  182. package/src/persistent/datasets/.gitignore +0 -3
  183. package/src/persistent/temp/.gitignore +0 -3
  184. /package/src/libs/__mocks__/{notifications.js → notifications.ts} +0 -0
  185. /package/src/libs/authentication/{verifyUser.js → verifyUser.ts} +0 -0
@@ -0,0 +1,136 @@
1
+ import { vi } from "vitest"
2
+ vi.mock("ioredis")
3
+ import * as pagination from "../pagination.js"
4
+ import { connect, Types } from "mongoose"
5
+ import Dataset from "../../models/dataset"
6
+ const ObjectID = Types.ObjectId
7
+
8
+ const base64 = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/
9
+
10
+ describe("pagination model operations", () => {
11
+ describe("enumToMongoSort()", () => {
12
+ it("should convert enum strings to -1 or 1 values", () => {
13
+ expect(
14
+ pagination.enumToMongoSort({
15
+ created: "descending",
16
+ name: "ascending",
17
+ }),
18
+ ).toEqual({ created: -1, name: 1 })
19
+ })
20
+ })
21
+ describe("apiCursor()", () => {
22
+ it("returns base64 string", () => {
23
+ expect(pagination.apiCursor(new ObjectID(5))).toMatch(base64)
24
+ })
25
+ })
26
+ describe("applyCursorToEdges()", () => {
27
+ it("returns the correct shape matching Relay connections", () => {
28
+ const res = pagination.applyCursorToEdges(
29
+ [{ _id: "123" }, { _id: "234" }, { _id: "345" }],
30
+ 0,
31
+ )
32
+ expect(res).toEqual([
33
+ { cursor: "eyJvZmZzZXQiOjB9", node: { _id: "123" } },
34
+ { cursor: "eyJvZmZzZXQiOjF9", node: { _id: "234" } },
35
+ { cursor: "eyJvZmZzZXQiOjJ9", node: { _id: "345" } },
36
+ ])
37
+ })
38
+ })
39
+ describe("datasetsConnection()", () => {
40
+ beforeAll(async () => {
41
+ await connect(globalThis.__MONGO_URI__)
42
+ const ds = new Dataset({
43
+ _id: new ObjectID("5bef51a1ed211400c08e5524"),
44
+ id: "ds001001",
45
+ created: new Date("2018-11-16T23:24:17.203Z"),
46
+ modified: new Date("2018-11-16T23:24:25.050Z"),
47
+ uploader: "f8d5a57c-879a-40e6-b151-e34c4a28ff70",
48
+ revision: "262a8e610e32b5766cbf669acc71911c1ece7126",
49
+ })
50
+ await ds.save()
51
+ })
52
+ it("returns a connection shaped result", async () => {
53
+ const res = await pagination.datasetsConnection({
54
+ orderBy: { created: "ascending" },
55
+ limit: 5,
56
+ first: 10,
57
+ })([])
58
+ expect(res).toHaveProperty("pageInfo")
59
+ expect(res).toHaveProperty("edges")
60
+ })
61
+ })
62
+ describe("maxLimit()", () => {
63
+ it("should be within range 1-100", () => {
64
+ expect(pagination.maxLimit(0)).toBe(1)
65
+ expect(pagination.maxLimit(101)).toBe(100)
66
+ })
67
+ it("does not error with negative values", () => {
68
+ expect(pagination.maxLimit(-10)).toBe(1)
69
+ })
70
+ })
71
+ describe("sortAggregate()", () => {
72
+ it("should return natural sort for orderBy: created", () => {
73
+ expect(
74
+ pagination.sortAggregate({ orderBy: { created: "ascending" } }),
75
+ ).toEqual([{ $sort: { _id: 1 } }])
76
+ })
77
+ it("does not throw an error with no orderBy", () => {
78
+ expect(pagination.sortAggregate({})).toEqual([])
79
+ })
80
+ it("should return -1 for descending sorts", () => {
81
+ expect(
82
+ pagination.sortAggregate({ orderBy: { created: "descending" } }),
83
+ ).toEqual([{ $sort: { _id: -1 } }])
84
+ })
85
+ it('includes "name" for name sorts', () => {
86
+ expect(
87
+ pagination.sortAggregate({ orderBy: { name: "descending" } }),
88
+ ).toEqual([{ $sort: { name: -1 } }])
89
+ })
90
+ it("returns a lookup and count stage for stars", () => {
91
+ const agg = pagination.sortAggregate({ orderBy: { stars: "ascending" } })
92
+ expect(agg[0]).toHaveProperty("$lookup")
93
+ expect(agg[1]).toHaveProperty("$addFields")
94
+ // Ends with count sort
95
+ expect(agg.slice(-1)).toEqual([{ $sort: { starsCount: 1 } }])
96
+ })
97
+ it("returns a lookup and count stage for subscriptions", () => {
98
+ const agg = pagination.sortAggregate({
99
+ orderBy: { subscriptions: "descending" },
100
+ })
101
+ expect(agg[0]).toHaveProperty("$lookup")
102
+ expect(agg[1]).toHaveProperty("$addFields")
103
+ // Ends with count sort
104
+ expect(agg.slice(-1)).toEqual([{ $sort: { subscriptionsCount: -1 } }])
105
+ })
106
+ it("returns a lookup and no count stage for downloads", () => {
107
+ const agg = pagination.sortAggregate({
108
+ orderBy: { downloads: "ascending" },
109
+ })
110
+ // Ends with count sort
111
+ expect(agg.slice(-1)).toEqual([{ $sort: { downloads: 1 } }])
112
+ })
113
+ it("returns a lookup and no count stage for views", () => {
114
+ const agg = pagination.sortAggregate({
115
+ orderBy: { views: "ascending" },
116
+ })
117
+ // Ends with count sort
118
+ expect(agg.slice(-1)).toEqual([{ $sort: { views: 1 } }])
119
+ })
120
+ it("does not explode with all sorts", () => {
121
+ const agg = pagination.sortAggregate({
122
+ orderBy: {
123
+ created: "ascending",
124
+ name: "ascending",
125
+ uploader: "ascending",
126
+ stars: "ascending",
127
+ downloads: "ascending",
128
+ subscriptions: "ascending",
129
+ },
130
+ })
131
+ expect(agg).toHaveLength(6)
132
+ // Final stage should always be a sort
133
+ expect(agg.slice(-1)[0]).toHaveProperty("$sort")
134
+ })
135
+ })
136
+ })
@@ -1,14 +1,14 @@
1
- import { vi } from 'vitest'
2
- vi.mock('ioredis')
3
- import request from 'superagent'
4
- import { createDataset } from '../dataset.js'
5
- import { createSnapshot } from '../snapshots.js'
6
- import { getDatasetWorker } from '../../libs/datalad-service'
7
- import { connect } from 'mongoose'
1
+ import { vi } from "vitest"
2
+ vi.mock("ioredis")
3
+ import request from "superagent"
4
+ import { createDataset } from "../dataset"
5
+ import { createSnapshot } from "../snapshots"
6
+ import { getDatasetWorker } from "../../libs/datalad-service"
7
+ import { connect } from "mongoose"
8
8
 
9
9
  // Mock requests to Datalad service
10
- vi.mock('superagent')
11
- vi.mock('../../libs/redis.js', () => ({
10
+ vi.mock("superagent")
11
+ vi.mock("../../libs/redis.js", () => ({
12
12
  redis: {
13
13
  del: vi.fn(),
14
14
  },
@@ -17,17 +17,17 @@ vi.mock('../../libs/redis.js', () => ({
17
17
  },
18
18
  }))
19
19
  // Mock draft files calls
20
- vi.mock('../draft.js', () => ({
20
+ vi.mock("../draft.ts", () => ({
21
21
  updateDatasetRevision: () => () => Promise.resolve(),
22
22
  }))
23
- vi.mock('../../config.js')
24
- vi.mock('../../libs/notifications.js')
23
+ vi.mock("../../config.ts")
24
+ vi.mock("../../libs/notifications.ts")
25
25
 
26
- describe('snapshot model operations', () => {
27
- describe('createSnapshot()', () => {
28
- it('posts to the DataLad /datasets/{dsId}/snapshots/{snapshot} endpoint', async () => {
29
- const user = { id: '1234' }
30
- const tag = 'snapshot'
26
+ describe("snapshot model operations", () => {
27
+ describe("createSnapshot()", () => {
28
+ it("posts to the DataLad /datasets/{dsId}/snapshots/{snapshot} endpoint", async () => {
29
+ const user = { id: "1234" }
30
+ const tag = "snapshot"
31
31
  await connect(globalThis.__MONGO_URI__)
32
32
  const { id: dsId } = await createDataset(user.id, user, {
33
33
  affirmedDefaced: true,
@@ -1,5 +1,5 @@
1
- import Analytics from '../models/analytics'
2
- import Dataset from '../models/dataset'
1
+ import Analytics from "../models/analytics"
2
+ import Dataset from "../models/dataset"
3
3
 
4
4
  /**
5
5
  * Update a dataset's analytics count
@@ -8,7 +8,7 @@ import Dataset from '../models/dataset'
8
8
  * @param {'views'|'downloads'} type
9
9
  */
10
10
  export const trackAnalytics = async (datasetId, tag, type) => {
11
- if (type === 'views') {
11
+ if (type === "views") {
12
12
  return Dataset.updateOne(
13
13
  {
14
14
  id: datasetId,
@@ -22,7 +22,7 @@ export const trackAnalytics = async (datasetId, tag, type) => {
22
22
  upsert: true,
23
23
  },
24
24
  ).exec()
25
- } else if (type === 'downloads') {
25
+ } else if (type === "downloads") {
26
26
  return Dataset.updateOne(
27
27
  {
28
28
  id: datasetId,
@@ -1,12 +1,13 @@
1
- import format from 'date-fns/format'
2
- import { addFileString, commitFiles } from './dataset.js'
3
- import { getDatasetWorker } from '../libs/datalad-service'
1
+ import format from "date-fns/format"
2
+ import { addFileString, commitFiles } from "./dataset"
3
+ import { getDatasetWorker } from "../libs/datalad-service"
4
4
 
5
5
  /**
6
6
  * Matches a CPAN changelog version line
7
7
  * @param {string} line
8
8
  */
9
- export const matchCpanVersion = line => /^(\S+) (\d{4}-\d{2}-\d{2})$/.exec(line)
9
+ export const matchCpanVersion = (line) =>
10
+ /^(\S+) (\d{4}-\d{2}-\d{2})$/.exec(line)
10
11
 
11
12
  /**
12
13
  * Returns start and end indexes for the version being modified
@@ -32,7 +33,7 @@ export const findVersion = (changeLines, tag) => {
32
33
  } else {
33
34
  // First version didn't match, try again excluding lines we've searched
34
35
  return findVersion(changeLines.slice(start + 1), tag).map(
35
- x => x + start + 1,
36
+ (x) => x + start + 1,
36
37
  )
37
38
  }
38
39
  }
@@ -54,14 +55,14 @@ export const spliceChangelog = (changelog, tag, date, changes) => {
54
55
  // this way we can always add it back after editing
55
56
  const changelogLines = changelog ? changelog.trimRight().split(/\r?\n/) : []
56
57
  const [start, length] = findVersion(changelogLines, tag)
57
- const formattedChanges = changes.map(change => ` - ${change}`)
58
+ const formattedChanges = changes.map((change) => ` - ${change}`)
58
59
  formattedChanges.unshift(`${tag} ${date}`)
59
- if (typeof start !== 'undefined' && typeof length !== 'undefined') {
60
+ if (typeof start !== "undefined" && typeof length !== "undefined") {
60
61
  changelogLines.splice(start, length, ...formattedChanges)
61
62
  } else {
62
63
  changelogLines.unshift(...formattedChanges)
63
64
  }
64
- return changelogLines.join('\n') + '\n'
65
+ return changelogLines.join("\n") + "\n"
65
66
  }
66
67
 
67
68
  /**
@@ -70,9 +71,11 @@ export const spliceChangelog = (changelog, tag, date, changes) => {
70
71
  * @param {string} revision Git name for the requested ref
71
72
  */
72
73
  export const changesUrl = (datasetId, revision) => {
73
- return `http://${getDatasetWorker(
74
- datasetId,
75
- )}/datasets/${datasetId}/snapshots/${revision}/files/CHANGES`
74
+ return `http://${
75
+ getDatasetWorker(
76
+ datasetId,
77
+ )
78
+ }/datasets/${datasetId}/snapshots/${revision}/files/CHANGES`
76
79
  }
77
80
 
78
81
  /**
@@ -82,15 +85,15 @@ export const changesUrl = (datasetId, revision) => {
82
85
  * @param {string[]} changes
83
86
  */
84
87
  export const updateChanges = async (datasetId, tag, changes, user) => {
85
- const currentChangesReq = await fetch(changesUrl(datasetId, 'HEAD'))
88
+ const currentChangesReq = await fetch(changesUrl(datasetId, "HEAD"))
86
89
  const currentChanges = await currentChangesReq.text()
87
- const changeLogDate = format(new Date(), 'YYYY-MM-DD')
90
+ const changeLogDate = format(new Date(), "YYYY-MM-DD")
88
91
  const updatedChangelog = spliceChangelog(
89
92
  currentChanges,
90
93
  tag,
91
94
  changeLogDate,
92
95
  changes,
93
96
  )
94
- await addFileString(datasetId, 'CHANGES', 'text/plain', updatedChangelog)
97
+ await addFileString(datasetId, "CHANGES", "text/plain", updatedChangelog)
95
98
  return commitFiles(datasetId, user)
96
99
  }