airbnb/caravel

View on GitHub
superset-frontend/packages/generator-superset/generators/plugin-chart/index.js

Summary

Maintainability
A
3 hrs
Test Coverage
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/* eslint-disable sort-keys */

const Generator = require('yeoman-generator');
// eslint-disable-next-line lodash/import-scope
const kebabCase = require('lodash/kebabCase');
// eslint-disable-next-line lodash/import-scope
const startCase = require('lodash/startCase');
// eslint-disable-next-line lodash/import-scope
const camelCase = require('lodash/camelCase');
// eslint-disable-next-line lodash/import-scope
const upperFirst = require('lodash/upperFirst');

module.exports = class extends Generator {
  async prompting() {
    this.option('skipInstall');

    this.answers = await this.prompt([
      {
        type: 'input',
        name: 'packageName',
        message: 'Package name:',
        // Default to current folder name, e.g. superset-plugin-chart-hello-world
        default: kebabCase(this.appname),
      },
      {
        type: 'input',
        name: 'pluginName',
        message: 'Plugin name:',
        // Hello World
        default: startCase(
          camelCase(this.appname.replace('superset plugin chart', '').trim()),
        ),
      },
      {
        type: 'input',
        name: 'description',
        message: 'Description:',
        // Superset Plugin Chart Hello World
        default: upperFirst(startCase(this.appname)),
      },
      {
        type: 'list',
        name: 'chartType',
        message: 'What type of chart would you like?',
        choices: [
          {
            name: 'Regular chart',
            value: 'regular',
          },
          {
            name: 'Time-series chart',
            value: 'timeseries',
          },
        ],
      },
    ]);
  }

  writing() {
    // SupersetPluginChartHelloWorld
    const packageLabel = upperFirst(camelCase(this.answers.packageName));

    const params = {
      ...this.answers,
      packageLabel,
    };

    [
      ['gitignore.erb', '.gitignore'],
      ['babel.config.erb', 'babel.config.js'],
      ['jest.config.erb', 'jest.config.js'],
      ['package.erb', 'package.json'],
      ['package-lock.erb', 'package-lock.json'],
      ['README.erb', 'README.md'],
      ['tsconfig.json', 'tsconfig.json'],
      ['src/index.erb', 'src/index.ts'],
      ['src/plugin/buildQuery.erb', 'src/plugin/buildQuery.ts'],
      ['src/plugin/controlPanel.erb', 'src/plugin/controlPanel.ts'],
      ['src/plugin/index.erb', 'src/plugin/index.ts'],
      ['src/plugin/transformProps.erb', 'src/plugin/transformProps.ts'],
      ['src/types.erb', 'src/types.ts'],
      ['src/MyChart.erb', `src/${packageLabel}.tsx`],
      ['test/index.erb', 'test/index.test.ts'],
      [
        'test/__mocks__/mockExportString.js',
        'test/__mocks__/mockExportString.js',
      ],
      ['test/plugin/buildQuery.test.erb', 'test/plugin/buildQuery.test.ts'],
      [
        'test/plugin/transformProps.test.erb',
        'test/plugin/transformProps.test.ts',
      ],
    ].forEach(([src, dest]) => {
      this.fs.copyTpl(
        this.templatePath(src),
        this.destinationPath(dest),
        params,
      );
    });

    ['types/external.d.ts', 'src/images/thumbnail.png'].forEach(file => {
      this.fs.copy(this.templatePath(file), this.destinationPath(file));
    });
  }
};