takahitomiyamoto/heat-sfdx-tooling

View on GitHub
src/custom-calls/spec-apex/md/table.ts

Summary

Maintainability
D
1 day
Test Coverage
/* eslint-disable @typescript-eslint/no-explicit-any */

/**
 * table.ts
 */
import {
  getAnnotations,
  getModifiers,
  getInterfaceNames,
  getParentClass
} from './common';

export const TABLE_HEADER = {
  HEADER: [
    'Namespace',
    'Manageable State',
    'API Version',
    'Cyclic Redundancy Check',
    'Length of the Class without Comments'
  ],
  CLASS: ['Annotation', 'Modifier', 'Name', 'Parent Class', 'Interfaces'],
  TRIGGER: [
    'Before Insert',
    'Before Update',
    'Before Delete',
    'After Insert',
    'After Update',
    'After Delete',
    'After Undelete'
  ],
  APEX_DOC: ['Description'],
  CONSTRUCTORS: ['Annotation', 'Modifier', 'Name', 'Parameters'],
  EXTERNAL_REFERENCES: ['Namespace', 'Name', 'Variables', 'Methods'],
  PROPERTIES: ['Annotations', 'Modifier', 'Type', 'Name'],
  METHODS: ['Annotation', 'Modifier', 'Return Type', 'Name', 'Parameters']
};
const NO_DATA =
  '※ ApexDoc が存在しないか、該当する Signature が見つかりません。';

/**
 * @description createParameters
 * @param {*} parameters
 */
// TODO High: 可能ならparse.tsに
export const createParameters = (parameters: any) => {
  return !parameters
    ? []
    : parameters.map((param: any) => {
        return `${param.type} ${param.name}`;
      });
};

// ----------
// TableRow (table-row.ts)
// ----------
/**
 * @description createTableRow
 * @param {*} item
 */
const createTableRow = (item: any) => {
  const row = [];
  row.push(`${item.namespace}`);
  row.push(`${item.manageableState}`);
  row.push(`${item.apiVersion}`);
  return row;
};

/**
 * @description createClassTableRow
 * @param {*} item
 */
export const createClassTableRow = (item: any) => {
  const annotations = getAnnotations(item.annotations);
  const modifiers = getModifiers(item.modifiers);
  const parentClass = getParentClass(item.parentClass);
  const interfaces = getInterfaceNames(item.interfaces).join(', ');
  const className = item.name;

  const row = [];
  row.push(`${annotations}`);
  row.push(`${modifiers}`);
  row.push(`${className}`);
  row.push(`${parentClass}`);
  row.push(`${interfaces}`);
  return row;
};

/**
 * @description createTriggerTableRow
 * @param {*} item
 */
const createTriggerTableRow = (item: any) => {
  const row = [];
  row.push(`${item.usageBeforeInsert ? 'Y' : ''}`);
  row.push(`${item.usageBeforeUpdate ? 'Y' : ''}`);
  row.push(`${item.usageBeforeDelete ? 'Y' : ''}`);
  row.push(`${item.usageAfterInsert ? 'Y' : ''}`);
  row.push(`${item.usageAfterUpdate ? 'Y' : ''}`);
  row.push(`${item.usageAfterDelete ? 'Y' : ''}`);
  row.push(`${item.usageAfterUndelete ? 'Y' : ''}`);
  return row;
};

/**
 * @description createConstructorsTableRow
 * @param {*} item
 */
export const createConstructorsTableRow = (item: any) => {
  const annotations = getAnnotations(item.annotations);
  const modifiers = getModifiers(item.modifiers);
  const parameters = !item?.parameters?.length
    ? '-'
    : createParameters(item.parameters).join(',<br>');

  const row = [];
  row.push(`${annotations}`);
  row.push(`${modifiers}`);
  row.push(`${item.name}`);
  row.push(`${parameters}`);
  return row;
};

/**
 * @description createPropertyTableRow
 * @param {*} params
 */
export const createPropertyTableRow = (item: any) => {
  const annotations = getAnnotations(item.annotations);
  const modifiers = getModifiers(item.modifiers);

  const row = [];
  row.push(annotations);
  row.push(modifiers);
  row.push(item.type);
  row.push(item.name);
  return row;
};

// ----------
// TableRows (table-row.ts)
// ----------
/**
 * @description createTableRows
 * @param {*} params
 */
const createTableRows = (item: any, func: any) => {
  const rows = [];
  rows.push(func.createTableRow(item));
  return rows;
};

/**
 * @description createApexDocTableRows
 * @param {*} item
 */
const createApexDocTableRows = (item: any) => {
  const tags = item?.tags;
  if (!tags) {
    return [[NO_DATA]];
  }
  const descriptionTag = tags.filter((tag: any) => {
    return 'description' === tag.key;
  });

  const value = !descriptionTag?.length ? NO_DATA : descriptionTag[0].value;

  return [[value]];
};

/**
 * @description createConstructorsTableRows
 * @param {*} item
 * @param {*} func
 */
const createConstructorsTableRows = (item: any, func: any) => {
  // TODO High: リファクタリング
  return !item?.length
    ? [func.createTableRow(item)]
    : item.map((cons: any) => {
        return func.createTableRow(cons);
      });
};

// ----------
// Table
// ----------
/**
 * @description createTable
 * @param {*} params
 */
const createTable = (params: any) => {
  const rows = [];
  if (!params.func.createTableRows) {
    // rows.push(params.func.createTableRow(params.item));
    rows.push(params.func.createTableRow(params.items));
  } else {
    // rows.push(params.func.createTableRows(params.item, params.func));
    rows.push(params.func.createTableRows(params.items, params.func));
  }

  return {
    table: {
      headers: params.headers,
      rows: rows
    }
  };
};

/**
 * @description createHeaderTable
 * @param {*} params
 */
export const createHeaderTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.HEADER,
    func: {
      createTableRow: createTableRow
    }
  });
};

/**
 * @description createClassTable
 * @param {*} params
 */
export const createClassTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.CLASS,
    func: {
      createTableRow: createClassTableRow
    }
  });
};

/**
 * @description createTriggerTable
 * @param {*} params
 */
export const createTriggerTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.TRIGGER,
    func: {
      createTableRow: createTriggerTableRow
    }
  });
};

/**
 * @description createApexDocTable
 * @param {*} params
 */
export const createApexDocTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.APEX_DOC,
    func: {
      createTableRows: createApexDocTableRows
    }
  });
};

/**
 * @description createConstructorsTable
 * @param {*} params
 */
export const createConstructorsTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.CONSTRUCTORS,
    func: {
      createTableRow: createConstructorsTableRow,
      createTableRows: createConstructorsTableRows
    }
  });
};

/**
 * @description createExternalReferencesTable
 * @param {*} params
 */
export const createExternalReferencesTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.EXTERNAL_REFERENCES,
    func: {
      createTableRow: createTableRow,
      createTableRows: createTableRows
    }
  });
};

/**
 * @description createPropertiesTable
 * @param {*} params
 */
export const createPropertiesTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.PROPERTIES,
    func: {
      createTableRow: createPropertyTableRow,
      createTableRows: createTableRows
    }
  });
};

/**
 * @description createMethodsTable
 * @param {*} params
 */
export const createMethodsTable = (params: any) => {
  return createTable({
    item: params,
    headers: TABLE_HEADER.METHODS,
    func: {
      createTableRow: createTableRow
    }
  });
};

/**
 * @description createTableHeader
 * @param {*} params
 */
export const createTableHeader = (params: any) => {
  const rows = [];
  const _namespace = !params.item.namespace ? '-' : params.item.namespace;

  rows.push(`${_namespace}`);
  rows.push(`${params.item.manageableState}`);
  rows.push(`${params.item.apiVersion}`);
  rows.push(`${params.item.apexBodyCrc}`);
  rows.push(`${params.item.apexLengthWithoutComments}`);

  return {
    table: {
      headers: TABLE_HEADER.HEADER,
      rows: [rows]
    }
  };
};

/**
 * @description createTableHeaderApexDoc
 * @param {*} params
 */
export const createTableHeaderApexDoc = (params: any) => {
  // const tags = params.item?.tags;
  const tags = params.item?.body?.header[0]?.tags;

  if (!tags) {
    return {
      table: {
        headers: TABLE_HEADER.APEX_DOC,
        rows: [[NO_DATA]]
      }
    };
  }

  const descriptionTag = tags.filter((tag: any) => {
    return 'description' === tag.key;
  });
  const value = !descriptionTag?.length ? NO_DATA : descriptionTag[0].value;

  const rows = [];
  rows.push(value);

  return {
    table: {
      headers: TABLE_HEADER.APEX_DOC,
      rows: [rows]
    }
  };
};

/**
 * @description createTableSignatureClass
 * @param {*} params
 */
export const createTableSignatureClass = (params: any) => {
  const annotations = getAnnotations(params.item.annotations);
  const modifiers = getModifiers(params.item.modifiers);
  const parentClass = getParentClass(params.item.parentClass);
  const interfaces = getInterfaceNames(params.item.interfaces).join(', ');
  const className = params.item.name;

  const rows = [];
  rows.push(`${annotations}`);
  rows.push(`${modifiers}`);
  rows.push(`${className}`);
  rows.push(`${parentClass}`);
  rows.push(`${interfaces}`);

  return {
    table: {
      headers: TABLE_HEADER.CLASS,
      rows: [rows]
    }
  };
};

/**
 * @description createTableSignatureTrigger
 * @param {*} params
 */
export const createTableSignatureTrigger = (params: any) => {
  const rows = [];
  rows.push(`${params.item.usageBeforeInsert ? 'Y' : ''}`);
  rows.push(`${params.item.usageBeforeUpdate ? 'Y' : ''}`);
  rows.push(`${params.item.usageBeforeDelete ? 'Y' : ''}`);
  rows.push(`${params.item.usageAfterInsert ? 'Y' : ''}`);
  rows.push(`${params.item.usageAfterUpdate ? 'Y' : ''}`);
  rows.push(`${params.item.usageAfterDelete ? 'Y' : ''}`);
  rows.push(`${params.item.usageAfterUndelete ? 'Y' : ''}`);

  return {
    table: {
      headers: TABLE_HEADER.TRIGGER,
      rows: [rows]
    }
  };
};