/
index.ts
92 lines (77 loc) · 1.75 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
* This module holds NPM asset resolving based on GitHub blob.
*/
import gql from 'graphql-tag'
import { pathOr, pipe, propOr, toPairs, zipObj, map, omit, when } from 'ramda'
const typeDefs = gql`
type NPMDependency {
id: String!
name: String!
version: String!
}
type NPMPackage {
id: String!
name: String!
version: String!
dependencies: [NPMDependency]!
}
extend type Repository {
npmPackage: NPMPackage
}
`
interface INPMPackage {
id?: string
name: string
version: string
}
const NPMPackage = {
id: ({ id, name }: INPMPackage): string => {
if (!id && !name) {
throw new Error('NPMPackage::id must resolve to a valid value.')
}
return id || name
},
dependencies: pipe(
propOr({}, 'dependencies'),
// @ts-ignore
toPairs,
map(zipObj(['name', 'version']))
),
}
const NPMDependency = {
id: ({ name, version }: INPMPackage) => {
if (!name) {
throw new Error('NPMDependency::id must have a name available.')
}
if (!version) {
throw new Error('NPMDependency::id must have a version available.')
}
return `${name}@${version}`
},
// @TODO: deprecated?
package: omit(['version']),
}
const Repository = {
/**
* Resolves the package.json data of a repository, using GitHub "object" API.
*/
npmPackage: {
fragment: `
... on Repository {
npmPackageJSON: object(expression: "HEAD:package.json") {
... on Blob {
text
}
}
}
`,
resolve: pipe(
// @ts-ignore
pathOr(null, ['npmPackageJSON', 'text']),
// @ts-ignore
when(Boolean, JSON.parse)
),
},
}
const resolvers = { NPMPackage, NPMDependency, Repository }
export default { typeDefs, resolvers }