async installTemplate(force = false) {
    if (!force) {
      let pkgPath;
      let installedPkg;
      let packageVersion;

      try {
        installedPkg = getTemplateDetails(this.templateName, PACKAGE_JSON_FILENAME);
        pkgPath = installedPkg?.pkgPath;
        packageVersion = installedPkg?.version;
        log.debug(logMessage.templateSource(pkgPath));
        if (packageVersion) log.debug(logMessage.templateVersion(packageVersion));

        return {
          name: installedPkg.name,
          path: pkgPath
        };
      } catch (e) {
        log.debug(logMessage.packageNotAvailable(installedPkg), e);
        // We did our best. Proceed with installation...
      }
    }

    const debugMessage = force ? logMessage.TEMPLATE_INSTALL_FLAG_MSG : logMessage.TEMPLATE_INSTALL_DISK_MSG;
    log.debug(logMessage.installationDebugMessage(debugMessage));

    if (isFileSystemPath(this.templateName)) log.debug(logMessage.NPM_INSTALL_TRIGGER);

    const config = new Config({
      definitions,
      flatten,
      shorthands,
      npmPath
    });

    await config.load();

    const arbOptions = {...{path: ROOT_DIR}, ...config.flat};

    if (Object.keys(this.registry).length !== 0) {
      this.initialiseArbOptions(arbOptions);
    }
    const arb = new Arborist(arbOptions);

    try {
      const installResult = await arb.reify({
        add: [this.templateName],
        saveType: 'prod',
        save: false
      });

      const addResult = arb[Symbol.for('resolvedAdd')];
      if (!addResult) throw new Error('Unable to resolve the name of the added package. It was most probably not added to node_modules successfully');

      const packageName = addResult[0].name;
      const packageVersion = installResult.children.get(packageName).version;
      const packagePath = installResult.children.get(packageName).path;

      if (!isFileSystemPath(this.templateName)) log.debug(logMessage.templateSuccessfullyInstalled(packageName, packagePath));
      if (packageVersion) log.debug(logMessage.templateVersion(packageVersion));

      return {
        name: packageName,
        path: packagePath,
      };
    } catch (err) {
      throw new Error(`Installation failed: ${ err.message }`);
    }
  }
Downloads and installs a template and its dependencies

@param {Boolean} [force=false] Whether to force installation (and skip cache) or not.