@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.
- package/package.json +4 -6
- package/src/__mocks__/{config.js → config.ts} +5 -5
- package/src/app.ts +32 -31
- package/src/cache/item.ts +6 -7
- package/src/cache/types.ts +8 -8
- package/src/{config.js → config.ts} +6 -6
- package/src/datalad/__tests__/changelog.spec.ts +83 -0
- package/src/datalad/__tests__/dataset.spec.ts +109 -0
- package/src/datalad/__tests__/description.spec.ts +141 -0
- package/src/datalad/__tests__/files.spec.ts +77 -0
- package/src/datalad/__tests__/pagination.spec.ts +136 -0
- package/src/datalad/__tests__/{snapshots.spec.js → snapshots.spec.ts} +17 -17
- package/src/datalad/{analytics.js → analytics.ts} +4 -4
- package/src/datalad/{changelog.js → changelog.ts} +17 -14
- package/src/datalad/{dataset.js → dataset.ts} +95 -93
- package/src/datalad/{description.js → description.ts} +37 -37
- package/src/datalad/draft.ts +38 -0
- package/src/datalad/files.ts +26 -20
- package/src/datalad/{pagination.js → pagination.ts} +47 -47
- package/src/datalad/{readme.js → readme.ts} +13 -11
- package/src/datalad/{reexporter.js → reexporter.ts} +4 -4
- package/src/datalad/{snapshots.js → snapshots.ts} +56 -62
- package/src/datalad/{upload.js → upload.ts} +7 -5
- package/src/elasticsearch/elastic-client.ts +11 -0
- package/src/elasticsearch/reindex-dataset.ts +7 -7
- package/src/graphql/__tests__/__snapshots__/permissions.spec.ts.snap +5 -0
- package/src/graphql/__tests__/{comment.spec.js → comment.spec.ts} +17 -17
- package/src/graphql/__tests__/permissions.spec.ts +113 -0
- package/src/graphql/{permissions.js → permissions.ts} +14 -14
- package/src/graphql/resolvers/__tests__/brainlife.spec.ts +11 -11
- package/src/graphql/resolvers/__tests__/{dataset-search.spec.js → dataset-search.spec.ts} +25 -23
- package/src/graphql/resolvers/__tests__/dataset.spec.ts +175 -0
- package/src/graphql/resolvers/__tests__/derivatives.spec.ts +19 -19
- package/src/graphql/resolvers/__tests__/importRemoteDataset.spec.ts +20 -20
- package/src/graphql/resolvers/__tests__/permssions.spec.ts +35 -0
- package/src/graphql/resolvers/__tests__/snapshots.spec.ts +59 -0
- package/src/graphql/resolvers/__tests__/user.spec.ts +18 -0
- package/src/graphql/resolvers/brainlife.ts +4 -4
- package/src/graphql/resolvers/cache.ts +4 -4
- package/src/graphql/resolvers/{comment.js → comment.ts} +16 -16
- package/src/graphql/resolvers/{dataset-search.js → dataset-search.ts} +45 -43
- package/src/graphql/resolvers/{dataset.js → dataset.ts} +38 -52
- package/src/graphql/resolvers/datasetType.ts +3 -3
- package/src/graphql/resolvers/derivatives.ts +11 -11
- package/src/graphql/resolvers/description.ts +18 -0
- package/src/graphql/resolvers/{draft.js → draft.ts} +13 -13
- package/src/graphql/resolvers/{flaggedFiles.js → flaggedFiles.ts} +4 -4
- package/src/graphql/resolvers/{follow.js → follow.ts} +1 -1
- package/src/graphql/resolvers/git.ts +3 -3
- package/src/graphql/resolvers/history.ts +13 -0
- package/src/graphql/resolvers/importRemoteDataset.ts +12 -11
- package/src/graphql/resolvers/index.ts +25 -0
- package/src/graphql/resolvers/{issues.js → issues.ts} +9 -9
- package/src/graphql/resolvers/metadata.ts +8 -8
- package/src/graphql/resolvers/{mutation.js → mutation.ts} +26 -26
- package/src/graphql/resolvers/{newsletter.js → newsletter.ts} +2 -2
- package/src/graphql/resolvers/permissions.ts +15 -21
- package/src/graphql/resolvers/publish.ts +17 -0
- package/src/graphql/resolvers/query.ts +21 -0
- package/src/graphql/resolvers/{readme.js → readme.ts} +3 -3
- package/src/graphql/resolvers/{reexporter.js → reexporter.ts} +2 -2
- package/src/graphql/resolvers/relation.ts +5 -5
- package/src/graphql/resolvers/{reset.js → reset.ts} +2 -2
- package/src/graphql/resolvers/reviewer.ts +4 -4
- package/src/graphql/resolvers/{snapshots.js → snapshots.ts} +49 -49
- package/src/graphql/resolvers/{stars.js → stars.ts} +1 -1
- package/src/graphql/resolvers/summary.ts +3 -3
- package/src/graphql/resolvers/{upload.js → upload.ts} +5 -5
- package/src/graphql/resolvers/{user.js → user.ts} +16 -18
- package/src/graphql/resolvers/{validation.js → validation.ts} +12 -14
- package/src/graphql/{schema.js → schema.ts} +4 -6
- package/src/graphql/utils/{file.js → file.ts} +2 -2
- package/src/handlers/{comments.js → comments.ts} +11 -11
- package/src/handlers/{config.js → config.ts} +1 -1
- package/src/handlers/{datalad.js → datalad.ts} +22 -22
- package/src/handlers/{doi.js → doi.ts} +6 -6
- package/src/handlers/reviewer.ts +6 -6
- package/src/handlers/{sitemap.js → sitemap.ts} +19 -19
- package/src/handlers/stars.ts +11 -10
- package/src/handlers/{subscriptions.js → subscriptions.ts} +17 -16
- package/src/handlers/{users.js → users.ts} +3 -3
- package/src/libs/__tests__/apikey.spec.ts +25 -0
- package/src/libs/__tests__/datalad-service.spec.ts +27 -0
- package/src/libs/__tests__/{dataset.spec.js → dataset.spec.ts} +9 -9
- package/src/libs/{apikey.js → apikey.ts} +5 -5
- package/src/libs/authentication/__tests__/jwt.spec.ts +59 -0
- package/src/libs/authentication/{crypto.js → crypto.ts} +16 -16
- package/src/libs/authentication/google.ts +18 -0
- package/src/libs/authentication/jwt.ts +40 -33
- package/src/libs/authentication/{orcid.js → orcid.ts} +11 -11
- package/src/libs/authentication/{passport.js → passport.ts} +45 -30
- package/src/libs/authentication/{states.js → states.ts} +17 -20
- package/src/libs/{counter.js → counter.ts} +1 -1
- package/src/libs/{datalad-service.js → datalad-service.ts} +4 -4
- package/src/libs/dataset.ts +9 -0
- package/src/libs/doi/__tests__/__snapshots__/doi.spec.ts.snap +17 -0
- package/src/libs/doi/__tests__/doi.spec.ts +25 -0
- package/src/libs/doi/__tests__/normalize.spec.ts +19 -19
- package/src/libs/doi/{index.js → index.ts} +27 -21
- package/src/libs/doi/normalize.ts +2 -2
- package/src/libs/email/__tests__/index.spec.ts +14 -14
- package/src/libs/email/index.ts +4 -4
- package/src/libs/email/templates/__tests__/comment-created.spec.ts +12 -12
- package/src/libs/email/templates/__tests__/dataset-deleted.spec.ts +6 -6
- package/src/libs/email/templates/__tests__/owner-unsubscribed.spec.ts +6 -6
- package/src/libs/email/templates/__tests__/snapshot-created.spec.ts +9 -9
- package/src/libs/email/templates/__tests__/snapshot-reminder.spec.ts +7 -7
- package/src/libs/email/templates/comment-created.ts +2 -1
- package/src/libs/email/templates/dataset-deleted.ts +2 -1
- package/src/libs/email/templates/dataset-import-failed.ts +2 -1
- package/src/libs/email/templates/dataset-imported.ts +2 -1
- package/src/libs/email/templates/owner-unsubscribed.ts +2 -1
- package/src/libs/email/templates/snapshot-created.ts +2 -1
- package/src/libs/email/templates/snapshot-reminder.ts +2 -1
- package/src/libs/{notifications.js → notifications.ts} +100 -113
- package/src/libs/{orcid.js → orcid.ts} +20 -20
- package/src/libs/{redis.js → redis.ts} +6 -6
- package/src/models/__tests__/ingestDataset.spec.ts +15 -15
- package/src/models/analytics.ts +2 -2
- package/src/models/badAnnexObject.ts +6 -6
- package/src/models/comment.ts +10 -10
- package/src/models/counter.ts +2 -2
- package/src/models/dataset.ts +16 -16
- package/src/models/deletion.ts +3 -3
- package/src/models/deprecatedSnapshot.ts +2 -2
- package/src/models/doi.ts +2 -2
- package/src/models/file.ts +2 -2
- package/src/models/ingestDataset.ts +4 -4
- package/src/models/issue.ts +2 -2
- package/src/models/key.ts +2 -2
- package/src/models/mailgunIdentifier.ts +2 -2
- package/src/models/metadata.ts +3 -3
- package/src/models/newsletter.ts +3 -3
- package/src/models/notification.ts +2 -2
- package/src/models/permission.ts +4 -4
- package/src/models/reviewer.ts +7 -7
- package/src/models/snapshot.ts +2 -2
- package/src/models/stars.ts +6 -6
- package/src/models/subscription.ts +2 -2
- package/src/models/summary.ts +2 -2
- package/src/models/upload.ts +3 -3
- package/src/models/user.ts +4 -4
- package/src/{routes.js → routes.ts} +62 -62
- package/src/server.ts +9 -9
- package/src/utils/__tests__/datasetOrSnapshot.spec.ts +25 -25
- package/src/utils/__tests__/validateUrl.spec.ts +10 -10
- package/src/utils/datasetOrSnapshot.ts +2 -2
- package/src/utils/validateUrl.ts +1 -1
- package/src/datalad/__tests__/changelog.spec.js +0 -82
- package/src/datalad/__tests__/dataset.spec.js +0 -109
- package/src/datalad/__tests__/description.spec.js +0 -137
- package/src/datalad/__tests__/files.spec.js +0 -75
- package/src/datalad/__tests__/pagination.spec.js +0 -136
- package/src/datalad/draft.js +0 -37
- package/src/elasticsearch/elastic-client.js +0 -11
- package/src/graphql/__tests__/permissions.spec.js +0 -107
- package/src/graphql/pubsub.js +0 -5
- package/src/graphql/resolvers/__tests__/dataset.spec.js +0 -175
- package/src/graphql/resolvers/__tests__/permssions.spec.js +0 -34
- package/src/graphql/resolvers/__tests__/snapshots.spec.js +0 -58
- package/src/graphql/resolvers/__tests__/user.spec.js +0 -17
- package/src/graphql/resolvers/description.js +0 -29
- package/src/graphql/resolvers/history.js +0 -11
- package/src/graphql/resolvers/index.js +0 -25
- package/src/graphql/resolvers/publish.js +0 -17
- package/src/graphql/resolvers/query.js +0 -21
- package/src/graphql/resolvers/subscriptions.js +0 -81
- package/src/graphql/utils/publish-draft-update.js +0 -13
- package/src/libs/__tests__/apikey.spec.js +0 -24
- package/src/libs/__tests__/datalad-service.spec.js +0 -26
- package/src/libs/authentication/__tests__/jwt.spec.js +0 -23
- package/src/libs/authentication/globus.js +0 -11
- package/src/libs/authentication/google.js +0 -19
- package/src/libs/bidsId.js +0 -68
- package/src/libs/dataset.js +0 -9
- package/src/libs/doi/__tests__/doi.spec.js +0 -24
- package/src/libs/redis-pubsub.js +0 -5
- package/src/libs/request.js +0 -155
- package/src/libs/scitran.js +0 -25
- package/src/libs/subscription-server.js +0 -20
- package/src/libs/testing-utils.js +0 -17
- package/src/persistent/datasets/.gitignore +0 -3
- package/src/persistent/temp/.gitignore +0 -3
- /package/src/libs/__mocks__/{notifications.js → notifications.ts} +0 -0
- /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
|
|
2
|
-
vi.mock(
|
|
3
|
-
import request from
|
|
4
|
-
import { createDataset } from
|
|
5
|
-
import { createSnapshot } from
|
|
6
|
-
import { getDatasetWorker } from
|
|
7
|
-
import { connect } from
|
|
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(
|
|
11
|
-
vi.mock(
|
|
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(
|
|
20
|
+
vi.mock("../draft.ts", () => ({
|
|
21
21
|
updateDatasetRevision: () => () => Promise.resolve(),
|
|
22
22
|
}))
|
|
23
|
-
vi.mock(
|
|
24
|
-
vi.mock(
|
|
23
|
+
vi.mock("../../config.ts")
|
|
24
|
+
vi.mock("../../libs/notifications.ts")
|
|
25
25
|
|
|
26
|
-
describe(
|
|
27
|
-
describe(
|
|
28
|
-
it(
|
|
29
|
-
const user = { id:
|
|
30
|
-
const tag =
|
|
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
|
|
2
|
-
import Dataset from
|
|
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 ===
|
|
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 ===
|
|
25
|
+
} else if (type === "downloads") {
|
|
26
26
|
return Dataset.updateOne(
|
|
27
27
|
{
|
|
28
28
|
id: datasetId,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import format from
|
|
2
|
-
import { addFileString, commitFiles } from
|
|
3
|
-
import { getDatasetWorker } from
|
|
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 =>
|
|
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 !==
|
|
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(
|
|
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://${
|
|
74
|
-
|
|
75
|
-
|
|
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,
|
|
88
|
+
const currentChangesReq = await fetch(changesUrl(datasetId, "HEAD"))
|
|
86
89
|
const currentChanges = await currentChangesReq.text()
|
|
87
|
-
const changeLogDate = format(new Date(),
|
|
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,
|
|
97
|
+
await addFileString(datasetId, "CHANGES", "text/plain", updatedChangelog)
|
|
95
98
|
return commitFiles(datasetId, user)
|
|
96
99
|
}
|