wongjiahau/ttap-web

View on GitHub
scripts/generate-state.js

Summary

Maintainability
A
0 mins
Test Coverage
#!/bin/node
//To use the hashbang above, you need to copy node.exe into
// C:\Program Files\Git\usr\bin
const shell = require("shelljs");
const prompt = require("prompt-sync")();
const targetDir = `${__dirname}/../ts/redux/reducers/`;
const fs = require("fs");
const decapitalized = (input) => {
  return input.charAt(0).toLowerCase() + input.slice(1);
};

const stateName = prompt("Enter the name of the state >> ");

//#region snippet
const snippet = `
import * as typeName from "type-name";
import {Action} from "../actions/action";
import {GenereteReducer} from "./generateReducer";

export interface I${stateName} {
    // properties...
}

export class ${stateName} implements I${stateName} {
    public constructor() {
        // initialization
    }
}

export abstract class ${stateName}Action extends Action < I${stateName} > {
    public StateName() {
        return typeName(new ${stateName}());
    }
}

export const ${stateName}Reducer = GenereteReducer(new ${stateName}());
`;
//#endregion

const fileName = targetDir + decapitalized(stateName) + ".ts";

fs.writeFile(fileName, snippet, function (err) {
  if (err) {
    return console.log(err);
  }
  shell.exec(`code ${fileName}`);
  console.log(`${fileName} is opened in VSCode`);
});

// append the new reducer to allReducer.ts
const allReducerFileName = __dirname + "/../ts/redux/reducers/allReducers.ts";
fs.readFile(allReducerFileName, (err, content) => {
  if (err) {
    return console.log(err);
  }
  const allReducerCode = content.toString();
  let result = insertCodeAt(
    allReducerCode,
    "// new-import",
    `import {${stateName}Reducer} from "./${decapitalized(stateName)}";
`
  );
  result = insertCodeAt(
    result,
    "// new-reducer",
    `${stateName}Reducer,
`
  );
  fs.writeFile(allReducerFileName, result, function (err) {
    if (err) {
      return console.log(err);
    }
    shell.exec(`code ${allReducerFileName}`);
    console.log(`allReducer.ts is appended with new reducer!`);
  });
});

function insertCodeAt(parent, atWhere, newChild) {
  const parts = parent.split(atWhere);
  const head = parts[0];
  const leg = parts[1];
  return head + newChild + atWhere + leg;
}