70 lines
2.0 KiB
JavaScript
Executable File
70 lines
2.0 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const fs = require('fs/promises');
|
|
const path = require('path');
|
|
const assert = require('assert');
|
|
|
|
const ROOT_DIR = path.join(__dirname, '../../');
|
|
const GRAPHQL_SCHEMA = path.join(ROOT_DIR, 'tmp/tests/graphql/gitlab_schema.json');
|
|
const POSSIBLE_TYPES_REL = 'app/assets/javascripts/graphql_shared/possible_types.json';
|
|
const POSSIBLE_TYPES = path.join(ROOT_DIR, POSSIBLE_TYPES_REL);
|
|
|
|
function extractTypes(schema) {
|
|
return Object.fromEntries(
|
|
// eslint-disable-next-line no-underscore-dangle
|
|
schema.data.__schema.types
|
|
.filter((type) => type.possibleTypes)
|
|
.map(({ name, possibleTypes }) => [name, possibleTypes.map((subtype) => subtype.name)]),
|
|
);
|
|
}
|
|
|
|
async function main() {
|
|
let schema;
|
|
try {
|
|
schema = JSON.parse(await fs.readFile(GRAPHQL_SCHEMA, 'utf-8'));
|
|
} catch (e) {
|
|
console.error(
|
|
'Could not read the GraphQL Schema, make sure to run: bundle exec rake gitlab:graphql:schema:dump',
|
|
);
|
|
throw e;
|
|
}
|
|
|
|
const possibleTypes = extractTypes(schema);
|
|
|
|
if (process.argv.includes('--check')) {
|
|
const previousTypes = JSON.parse(await fs.readFile(POSSIBLE_TYPES, 'utf-8'));
|
|
|
|
assert.deepStrictEqual(
|
|
previousTypes,
|
|
possibleTypes,
|
|
`
|
|
${POSSIBLE_TYPES_REL} needs to be regenerated, please run:
|
|
node scripts/frontend/graphql_possible_types_extraction.js --write
|
|
and commit the changes!
|
|
`,
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (process.argv.includes('--write')) {
|
|
const stringifiedPossibleTypes = JSON.stringify(possibleTypes, null, 2);
|
|
await fs.writeFile(POSSIBLE_TYPES, `${stringifiedPossibleTypes}\n`);
|
|
console.log(`Successfully updated ${POSSIBLE_TYPES_REL}`);
|
|
return;
|
|
}
|
|
|
|
throw new Error(`
|
|
ERROR: Please use the script correctly:
|
|
Usage: graphql_possible_types_extraction [options]
|
|
|
|
Options:
|
|
--check Check whether there are new Interface or Union types
|
|
--write Generate new possible types
|
|
`);
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.warn(error.message);
|
|
process.exitCode = 1;
|
|
});
|