12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /*eslint-env node*/
- /*eslint import/no-nodejs-modules:0 */
- const fs = require('fs');
- const https = require('https');
- const path = require('path');
- const PLATFORMS_URL = 'https://docs.sentry.io/_platforms/_index.json';
- const DOCS_INDEX_PATH = 'src/sentry/integration-docs/_platforms.json';
- const alphaSortFromKey = keyExtractor => (a, b) =>
- keyExtractor(a).localeCompare(keyExtractor(b));
- const transformPlatformsToList = ({platforms}) =>
- Object.keys(platforms)
- .map(platformId => {
- const integrationMap = platforms[platformId];
- const integrations = Object.keys(integrationMap)
- .sort(alphaSortFromKey(key => integrationMap[key].name))
- .map(integrationId => {
- const {name, type, doc_link: link} = integrationMap[integrationId];
- const id =
- integrationId === '_self' ? platformId : `${platformId}-${integrationId}`;
- return {id, name, type, link};
- });
- return {
- id: platformId,
- name: integrationMap._self.name,
- integrations,
- };
- })
- .sort(alphaSortFromKey(item => item.name));
- function fetch(_compilation, callback) {
- https
- .get(PLATFORMS_URL, res => {
- res.setEncoding('utf8');
- let buffer = '';
- res
- .on('data', data => {
- buffer += data;
- })
- .on('end', () =>
- fs.writeFile(
- this.modulePath,
- JSON.stringify({
- platforms: transformPlatformsToList(JSON.parse(buffer)),
- }),
- callback
- )
- );
- })
- .on('error', callback);
- }
- class IntegrationDocsFetchPlugin {
- constructor({basePath}) {
- this.modulePath = path.join(basePath, DOCS_INDEX_PATH);
- this.hasRun = false;
- const moduleDir = path.dirname(this.modulePath);
- if (!fs.existsSync(moduleDir)) {
- fs.mkdirSync(moduleDir, {recursive: true});
- }
- }
- apply(compiler) {
- compiler.hooks.beforeRun.tapAsync('IntegrationDocsFetchPlugin', fetch.bind(this));
- compiler.hooks.watchRun.tapAsync(
- 'IntegrationDocsFetchPlugin',
- (compilation, callback) => {
- // Only run once when watching and only if it does not exist on fs
- if (this.hasRun || fs.existsSync(this.modulePath)) {
- callback();
- return;
- }
- fetch.call(this, compilation, callback);
- this.hasRun = true;
- }
- );
- }
- }
- module.exports = IntegrationDocsFetchPlugin;
|