-
Notifications
You must be signed in to change notification settings - Fork 60.3k
/
create-graphql-files.js
executable file
·114 lines (94 loc) · 3.51 KB
/
create-graphql-files.js
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env node
// [start-readme]
//
// This script creates the static GraphQL files for a new version.
//
// [end-readme]
import fs from 'fs/promises'
import path from 'path'
import { program } from 'commander'
import mkdirp from 'mkdirp'
import { allVersions } from '../../lib/all-versions.js'
const graphqlStaticDir = path.join(process.cwd(), 'src/graphql/data')
const graphqlDataDir = path.join(process.cwd(), 'data/graphql')
program
.description('Create GraphQL files in src/graphql/data based on an existing version.')
.option(
'-n, --newVersion <version>',
'The version to copy the files to. Must be in <plan@release> format.'
)
.option(
'-o, --oldVersion <version>',
'The version to copy the files from. Must be in <plan@release> format.'
)
.parse(process.argv)
const newVersion = program.opts().newVersion
const oldVersion = program.opts().oldVersion
if (!(newVersion && oldVersion)) {
console.log('Error! You must provide --newVersion and --oldVersion.')
process.exit(1)
}
if (
!(Object.keys(allVersions).includes(newVersion) && Object.keys(allVersions).includes(oldVersion))
) {
console.log(
'Error! You must provide the full name of a currently supported version, e.g., [email protected].'
)
process.exit(1)
}
const newVersionId = allVersions[newVersion].miscVersionName
const oldVersionId = allVersions[oldVersion].miscVersionName
// copy the schema file wholesale (there are separate schema files per version)
const newSchemaFile = path.join(graphqlStaticDir, `schema-${newVersionId}.json`)
const oldSchemaFile = path.join(graphqlStaticDir, `schema-${oldVersionId}.json`)
await fs.copyFile(oldSchemaFile, newSchemaFile)
// check that it worked
try {
await fs.readFile(newSchemaFile)
} catch (e) {
console.log(`Error! Can't find ${newSchemaFile}.`)
process.exit(1)
}
// the other files are objects with versions as keys, so we need to require them
const previewsFile = path.join(graphqlStaticDir, 'previews.json')
const changesFile = path.join(graphqlStaticDir, 'upcoming-changes.json')
const previews = JSON.parse(await fs.readFile(previewsFile))
const changes = JSON.parse(await fs.readFile(changesFile))
previews[newVersionId] = previews[oldVersionId]
changes[newVersionId] = changes[oldVersionId]
// check that it worked
if (!Object.keys(previews).includes(newVersionId)) {
console.log(`Error! Can't find ${newVersionId} in ${previewsFile}.`)
process.exit(1)
}
if (!Object.keys(changes).includes(newVersionId)) {
console.log(`Error! Can't find ${newVersionId} in ${changesFile}.`)
process.exit(1)
}
// write the new files
await fs.writeFile(previewsFile, JSON.stringify(previews, null, 2))
await fs.writeFile(changesFile, JSON.stringify(changes, null, 2))
// now create the new version directory in data/graphql
const srcDir = path.join(graphqlDataDir, oldVersionId)
const destDir = path.join(graphqlDataDir, newVersionId)
await mkdirp(destDir)
// copy the files
const files = await fs.readdir(srcDir)
for (const file of files) {
const srcFile = path.join(srcDir, file)
const destFile = path.join(destDir, file)
await fs.copyFile(srcFile, destFile)
}
// check that it worked
try {
const destDirResult = await fs.readdir(destDir)
if (!destDirResult.length) {
console.log(`Error! The directory created at ${destDir} is empty.`)
process.exit(1)
}
} catch (e) {
console.log(`Error! A new directory was not successfully created at ${destDir}.`)
process.exit(1)
}
// print success message
console.log(`Done! Copied ${oldVersion} GraphQL files to ${newVersion} files.`)