@scandipwa/magento-scripts 1.14.1-alpha.10 → 1.14.1-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/lib/commands/logs.js +1 -0
  2. package/lib/commands/start.js +18 -5
  3. package/lib/config/dependencies-for-platforms.js +12 -2
  4. package/lib/config/docker.js +4 -3
  5. package/lib/config/get-port-config.js +2 -1
  6. package/lib/config/index.js +2 -1
  7. package/lib/config/php/extensions/libsodium.js +2 -1
  8. package/lib/config/scandipwa-versions.js +2 -2
  9. package/lib/config/system-config.js +34 -5
  10. package/lib/errors/known-error.js +15 -0
  11. package/lib/errors/unknown-error.js +15 -0
  12. package/lib/tasks/cli/create-bashrc-config.js +2 -1
  13. package/lib/tasks/composer/index.js +5 -3
  14. package/lib/tasks/composer/local-auth-json.js +4 -2
  15. package/lib/tasks/docker/network.js +2 -1
  16. package/lib/tasks/file-system/create-nginx-config.js +2 -1
  17. package/lib/tasks/file-system/create-php-config.js +2 -1
  18. package/lib/tasks/file-system/create-php-fpm-config.js +2 -1
  19. package/lib/tasks/file-system/create-php-storm-config.js +6 -5
  20. package/lib/tasks/file-system/create-ssl-terminator-config.js +5 -3
  21. package/lib/tasks/file-system/create-varnish-config.js +2 -23
  22. package/lib/tasks/file-system/create-vscode-config.js +3 -2
  23. package/lib/tasks/magento/enable-magento-composer-plugins.js +3 -2
  24. package/lib/tasks/magento/install-magento.js +7 -5
  25. package/lib/tasks/magento/setup-magento/flush-redis-config.js +2 -1
  26. package/lib/tasks/magento/setup-magento/index.js +3 -1
  27. package/lib/tasks/magento/setup-magento/install-magento.js +2 -1
  28. package/lib/tasks/magento/setup-magento/upgrade-magento.js +11 -1
  29. package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +41 -0
  30. package/lib/tasks/mysql/connect-to-mysql.js +2 -1
  31. package/lib/tasks/mysql/import-dump-to-mysql.js +4 -2
  32. package/lib/tasks/mysql/import-remote-db/index.js +2 -1
  33. package/lib/tasks/mysql/import-remote-db/ssh/index.js +2 -1
  34. package/lib/tasks/mysql/import-remote-db/ssh/regular-server.js +2 -1
  35. package/lib/tasks/php/bundled-extensions.js +28 -0
  36. package/lib/tasks/php/compile-options.js +18 -48
  37. package/lib/tasks/php/compile.js +4 -3
  38. package/lib/tasks/php/configure.js +7 -66
  39. package/lib/tasks/php/extensions/index.js +71 -0
  40. package/lib/tasks/php/index.js +7 -6
  41. package/lib/tasks/php/update-phpbrew.js +2 -1
  42. package/lib/tasks/php/validate-php.js +67 -0
  43. package/lib/tasks/php-fpm/start-php-fpm.js +2 -1
  44. package/lib/tasks/requirements/composer.js +5 -3
  45. package/lib/tasks/requirements/dependency/arch.js +2 -1
  46. package/lib/tasks/requirements/dependency/centos.js +2 -1
  47. package/lib/tasks/requirements/dependency/fedora.js +2 -1
  48. package/lib/tasks/requirements/docker/index.js +5 -4
  49. package/lib/tasks/requirements/docker/install.js +2 -1
  50. package/lib/tasks/requirements/docker/running-status.js +3 -2
  51. package/lib/tasks/requirements/docker/version.js +2 -1
  52. package/lib/tasks/requirements/node-version.js +2 -1
  53. package/lib/tasks/requirements/php-version.js +5 -3
  54. package/lib/tasks/requirements/phpbrew/index.js +2 -1
  55. package/lib/tasks/requirements/phpbrew/install.js +2 -1
  56. package/lib/tasks/requirements/phpbrew/version.js +2 -1
  57. package/lib/tasks/requirements/platform.js +3 -2
  58. package/lib/tasks/start.js +3 -1
  59. package/lib/tasks/theme/build-theme.js +2 -1
  60. package/lib/tasks/theme/install-theme.js +2 -1
  61. package/lib/tasks/theme/retrieve-theme-data.js +2 -1
  62. package/lib/tasks/theme/setup-persisted-query.js +2 -1
  63. package/lib/tasks/theme/setup-themes.js +2 -1
  64. package/lib/tasks/theme/symlink-theme.js +2 -1
  65. package/lib/util/analytics.js +337 -0
  66. package/lib/util/config-file-validator.js +2 -1
  67. package/lib/util/config-php-json.js +3 -2
  68. package/lib/util/env-php-json.js +3 -2
  69. package/lib/util/get-installed-magento-version.js +3 -2
  70. package/lib/util/get-jsonfile-data.js +2 -1
  71. package/lib/util/install-dependencies-task.js +4 -4
  72. package/lib/util/instance-metadata.js +2 -1
  73. package/lib/util/ip.js +45 -1
  74. package/lib/util/magento-task.js +20 -9
  75. package/lib/util/request.js +0 -0
  76. package/lib/util/resolve-configuration-with-overrides.js +2 -1
  77. package/lib/util/run-composer.js +3 -2
  78. package/lib/util/run-magento.js +3 -2
  79. package/lib/util/run-php.js +3 -2
  80. package/lib/util/wait-for-it.js +3 -2
  81. package/package.json +4 -3
@@ -1,4 +1,5 @@
1
1
  const dependenciesForPlatforms = require('../../../config/dependencies-for-platforms');
2
+ const UnknownError = require('../../../errors/unknown-error');
2
3
  const { execAsyncSpawn } = require('../../../util/exec-async-command');
3
4
  const installDependenciesTask = require('../../../util/install-dependencies-task');
4
5
 
@@ -15,7 +16,7 @@ const archDependenciesCheck = () => ({
15
16
  const result = pkg.match(pkgRegex);
16
17
 
17
18
  if (!result) {
18
- throw new Error(`Package without a version!\n\n${pkg}\n\nHOW?`);
19
+ throw new UnknownError(`Package without a version!\n\n${pkg}\n\nHOW?`);
19
20
  }
20
21
 
21
22
  return result[1];
@@ -11,9 +11,10 @@ const centosDependenciesCheck = () => ({
11
11
  const installedDependencies = (await execAsyncSpawn('yum list installed')).split('\n')
12
12
  .filter((pkg) => !pkg.toLowerCase().includes('installed packages'))
13
13
  .map((pkg) => pkg.match(/^(\S+)/i))
14
- .filter((pkg) => pkg)
14
+ .filter(Boolean)
15
15
  .map((pkg) => pkg[1])
16
16
  .map((pkg) => pkg.match(/^(\S+)\.\S+/i))
17
+ .filter(Boolean)
17
18
  .map((pkg) => pkg[1]);
18
19
 
19
20
  const dependenciesToInstall = dependenciesForPlatforms
@@ -11,9 +11,10 @@ const fedoraDependenciesCheck = () => ({
11
11
  const installedDependencies = (await execAsyncSpawn('yum list installed')).split('\n')
12
12
  .filter((pkg) => !pkg.toLowerCase().includes('installed packages'))
13
13
  .map((pkg) => pkg.match(/^(\S+)/i))
14
- .filter((pkg) => pkg)
14
+ .filter(Boolean)
15
15
  .map((pkg) => pkg[1])
16
16
  .map((pkg) => pkg.match(/^(\S+)\.\S+/i))
17
+ .filter(Boolean)
17
18
  .map((pkg) => pkg[1]);
18
19
 
19
20
  const dependenciesToInstall = dependenciesForPlatforms
@@ -1,5 +1,6 @@
1
1
  const logger = require('@scandipwa/scandipwa-dev-utils/logger');
2
2
  const os = require('os');
3
+ const KnownError = require('../../../errors/known-error');
3
4
  const { execAsyncSpawn } = require('../../../util/exec-async-command');
4
5
  const getIsWsl = require('../../../util/is-wsl');
5
6
  const installDocker = require('./install');
@@ -35,7 +36,7 @@ NOTE: After installation it's recommended to log out and log back in so your gro
35
36
  task: (ctx) => {
36
37
  task.title = `Using docker version ${ctx.dockerVersion}`;
37
38
 
38
- throw new Error(
39
+ throw new KnownError(
39
40
  `Docker is installed successfully!
40
41
  Please log out and log back to so your group membership is re-evaluated!
41
42
  Learn more here: ${ logger.style.link('https://docs.docker.com/engine/install/linux-postinstall/') }`
@@ -45,15 +46,15 @@ Learn more here: ${ logger.style.link('https://docs.docker.com/engine/install/li
45
46
  ]);
46
47
  }
47
48
 
48
- throw new Error('Docker is not installed!');
49
+ throw new KnownError('Docker is not installed!');
49
50
  } else if (isWsl) {
50
- throw new Error(
51
+ throw new KnownError(
51
52
  `You don't have Docker installed!
52
53
  Follow this instructions to install Docker on Windows:
53
54
  ${ logger.style.link('https://docs.create-magento-app.com/getting-started/prerequisites/windows-requirements#2-install-docker-desktop-for-windows') }`
54
55
  );
55
56
  } else {
56
- throw new Error(
57
+ throw new KnownError(
57
58
  `You don't have Docker installed!
58
59
  Follow this instructions to install Docker on Mac:
59
60
  ${ logger.style.link('https://docs.create-magento-app.com/getting-started/prerequisites/installation-on-macos#3-install-docker-for-mac') }`
@@ -2,6 +2,7 @@ const osPlatform = require('../../../util/os-platform');
2
2
  const { execCommandTask } = require('../../../util/exec-async-command');
3
3
  const installDependenciesTask = require('../../../util/install-dependencies-task');
4
4
  const executeSudoCommand = require('../../../util/execute-sudo-command');
5
+ const KnownError = require('../../../errors/known-error');
5
6
 
6
7
  const downloadDockerInstallScriptCommand = () => execCommandTask('curl -fsSL https://get.docker.com -o get-docker.sh');
7
8
  const runDockerInstallScriptCommand = () => executeSudoCommand('sudo sh get-docker.sh');
@@ -48,7 +49,7 @@ const installDocker = () => ({
48
49
  ]);
49
50
  }
50
51
  default: {
51
- throw new Error(`Docker is not installed!
52
+ throw new KnownError(`Docker is not installed!
52
53
  Your distro ${distro} is not supported by automatic installation.`);
53
54
  }
54
55
  }
@@ -1,4 +1,5 @@
1
1
  const os = require('os');
2
+ const KnownError = require('../../../errors/known-error');
2
3
  const { execAsyncSpawn } = require('../../../util/exec-async-command');
3
4
  const getIsWsl = require('../../../util/is-wsl');
4
5
  const pathExists = require('../../../util/path-exists');
@@ -31,7 +32,7 @@ const checkDockerStatusMacOS = () => ({
31
32
  let attempts = 0;
32
33
  while (!ready) {
33
34
  if (attempts > 24 && !ready) {
34
- throw new Error('Docker haven\'t started in 2 mins, exiting...');
35
+ throw new KnownError('Docker haven\'t started in 2 mins, exiting...');
35
36
  }
36
37
  try {
37
38
  const { code: startupCode } = await getDockerVersion();
@@ -67,7 +68,7 @@ const checkDockerStatusWSL = () => ({
67
68
  const { result, code } = await getDockerVersion();
68
69
 
69
70
  if (code !== 0 && result.includes('Is the docker daemon running?')) {
70
- throw new Error(`Docker is not running!
71
+ throw new KnownError(`Docker is not running!
71
72
 
72
73
  Please open Docker Desktop application for Windows and make sure that Docker is running. Then you can try again!`);
73
74
  }
@@ -1,3 +1,4 @@
1
+ const UnknownError = require('../../../errors/unknown-error');
1
2
  const { execAsyncSpawn } = require('../../../util/exec-async-command');
2
3
 
3
4
  /**
@@ -14,7 +15,7 @@ const getDockerVersion = () => ({
14
15
 
15
16
  ctx.dockerVersion = dockerVersion;
16
17
  } else {
17
- throw new Error(`Got unexpected result during Docker version retrieval!\n\n${ result }`);
18
+ throw new UnknownError(`Got unexpected result during Docker version retrieval!\n\n${ result }`);
18
19
  }
19
20
  }
20
21
  });
@@ -1,4 +1,5 @@
1
1
  const semver = require('semver');
2
+ const KnownError = require('../../errors/known-error');
2
3
 
3
4
  /**
4
5
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -9,7 +10,7 @@ const checkNodeVersion = () => ({
9
10
  const { node } = process.versions;
10
11
 
11
12
  if (!semver.gte(node, '12.0.0')) {
12
- throw new Error(
13
+ throw new KnownError(
13
14
  `Your Node.js version is out of date!
14
15
  You need to upgrade Node.js to at lease version 12 to work with this software!`
15
16
  );
@@ -3,6 +3,8 @@ const fs = require('fs');
3
3
  const path = require('path');
4
4
  const semver = require('semver');
5
5
  const phpbrewConfig = require('../../config/phpbrew');
6
+ const KnownError = require('../../errors/known-error');
7
+ const UnknownError = require('../../errors/unknown-error');
6
8
  const { execAsyncSpawn } = require('../../util/exec-async-command');
7
9
  const pathExists = require('../../util/path-exists');
8
10
  const compileOptions = require('../php/compile-options');
@@ -52,7 +54,7 @@ const installPHPForPHPBrew = () => ({
52
54
  }
53
55
  );
54
56
  } catch (e) {
55
- throw new Error(
57
+ throw new KnownError(
56
58
  `Failed to compile the required by PHPBrew PHP version.
57
59
  Tried compiling the PHP version ${ latestStablePHP74 }.
58
60
  Use your favorite search engine to resolve the issue.
@@ -79,10 +81,10 @@ export PHPBREW_PATH=${phpbrewConfig.homePath}/php/${phpbrewPHPName}/bin
79
81
  }
80
82
  );
81
83
  } catch (e) {
82
- throw new Error(`Something went wrong when trying to switch PHP to ${phpbrewPHPName}!\n\n${e}`);
84
+ throw new UnknownError(`Something went wrong when trying to switch PHP to ${phpbrewPHPName}!\n\n${e}`);
83
85
  }
84
86
 
85
- throw new Error(`You will need to restart your terminal and run ${logger.style.command('start')} again.
87
+ throw new KnownError(`You will need to restart your terminal and run ${logger.style.command('start')} again.
86
88
 
87
89
  You can use keyboard shortcut ${logger.style.command('CTRL+D')} to close terminal.`);
88
90
  },
@@ -1,4 +1,5 @@
1
1
  const logger = require('@scandipwa/scandipwa-dev-utils/logger');
2
+ const KnownError = require('../../../errors/known-error');
2
3
  const { execAsyncSpawn } = require('../../../util/exec-async-command');
3
4
  const installPHPBrew = require('./install');
4
5
  const getPHPBrewVersion = require('./version');
@@ -32,7 +33,7 @@ Do you want to install it automatically?`
32
33
  ]);
33
34
  }
34
35
 
35
- throw new Error(
36
+ throw new KnownError(
36
37
  `To install PHPBrew, you must first make sure the requirements are met.
37
38
  The requirements are available here: ${ logger.style.link('https://github.com/phpbrew/phpbrew/wiki/Requirement') }.
38
39
  Then, you can follow the installation instruction, here: ${ logger.style.link('https://phpbrew.github.io/phpbrew/#installation') }.
@@ -5,6 +5,7 @@ const { execAsyncSpawn } = require('../../../util/exec-async-command');
5
5
  const logger = require('@scandipwa/scandipwa-dev-utils/logger');
6
6
  const installDependenciesTask = require('../../../util/install-dependencies-task');
7
7
  const osPlatform = require('../../../util/os-platform');
8
+ const KnownError = require('../../../errors/known-error');
8
9
 
9
10
  /**
10
11
  * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
@@ -167,7 +168,7 @@ When you ready, press select Yes and installation will continue.`
167
168
  });
168
169
 
169
170
  if (!continueInstall) {
170
- throw new Error(`Add following string to your shells configuration file: ${logger.style.code('[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc')}
171
+ throw new KnownError(`Add following string to your shells configuration file: ${logger.style.code('[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc')}
171
172
 
172
173
  Then you can continue installation.`);
173
174
  }
@@ -1,3 +1,4 @@
1
+ const UnknownError = require('../../../errors/unknown-error');
1
2
  const { execAsyncSpawn } = require('../../../util/exec-async-command');
2
3
  const safeRegexExtract = require('../../../util/safe-regex-extract');
3
4
 
@@ -15,7 +16,7 @@ const getPHPBrewVersion = () => ({
15
16
  string: result,
16
17
  regex: /phpbrew - ([\d.]+)/i,
17
18
  onNoMatch: () => {
18
- throw new Error(`No phpbrew version found in phpbrew version output!\n\n${result}`);
19
+ throw new UnknownError(`No phpbrew version found in phpbrew version output!\n\n${result}`);
19
20
  }
20
21
  });
21
22
 
@@ -6,6 +6,7 @@ const { platforms, darwinMinimalVersion } = require('../../config');
6
6
  const dependencyCheck = require('./dependency');
7
7
  const { getArch } = require('../../util/arch');
8
8
  const getIsWsl = require('../../util/is-wsl');
9
+ const KnownError = require('../../errors/known-error');
9
10
 
10
11
  /**
11
12
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -16,14 +17,14 @@ const checkPlatform = () => ({
16
17
  const currentPlatform = os.platform();
17
18
 
18
19
  if (!platforms.includes(currentPlatform)) {
19
- throw new Error(
20
+ throw new KnownError(
20
21
  `Your current OS platform is ${ logger.style.misc(currentPlatform) }.
21
22
  Unfortunately, currently we only support ${ platforms.map((platform) => logger.style.misc(platform)).join(',') }.`
22
23
  );
23
24
  }
24
25
 
25
26
  if (macosVersion.isMacOS && !macosVersion.isGreaterThanOrEqualTo(darwinMinimalVersion)) {
26
- throw new Error(
27
+ throw new KnownError(
27
28
  'Please update your system!',
28
29
  `MacOS bellow version ${ logger.style.misc(darwinMinimalVersion) } is not supported.`
29
30
  );
@@ -30,6 +30,7 @@ const enableMagentoComposerPlugins = require('./magento/enable-magento-composer-
30
30
  const getIsWsl = require('../util/is-wsl');
31
31
  const checkForXDGOpen = require('../util/xdg-open-exists');
32
32
  const { getInstanceMetadata, constants: { WEB_LOCATION_TITLE } } = require('../util/instance-metadata');
33
+ const validatePHPInstallation = require('./php/validate-php');
33
34
 
34
35
  /**
35
36
  * @type {() => import('listr2').ListrTask<import('../../typings/context').ListrContext>}
@@ -113,6 +114,7 @@ const configureProject = () => ({
113
114
  })
114
115
  },
115
116
  configurePhp(),
117
+ validatePHPInstallation(),
116
118
  installPrestissimo(),
117
119
  installMagento(),
118
120
  enableMagentoComposerPlugins(),
@@ -189,7 +191,7 @@ const start = () => ({
189
191
  const instanceMetadata = getInstanceMetadata(ctx);
190
192
  const locationOnTheWeb = instanceMetadata.frontend.find(({ title }) => title === WEB_LOCATION_TITLE);
191
193
 
192
- openBrowser(locationOnTheWeb.text);
194
+ openBrowser(locationOnTheWeb.link);
193
195
  },
194
196
  options: {
195
197
  showTimer: false
@@ -3,6 +3,7 @@ const pathExists = require('../../util/path-exists');
3
3
  const { execAsyncSpawn } = require('../../util/exec-async-command');
4
4
  const logger = require('@scandipwa/scandipwa-dev-utils/logger');
5
5
  const matchFilesystem = require('../../util/match-filesystem');
6
+ const UnknownError = require('../../errors/unknown-error');
6
7
 
7
8
  /**
8
9
  * @type {(theme: import('../../../typings/theme').Theme) => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -26,7 +27,7 @@ const buildTheme = ({ themePath }) => ({
26
27
  }
27
28
  });
28
29
  } catch (e) {
29
- throw new Error(`We were unable to install theme dependencies in ${themePath} using ${logger.style.code(commandToInstallDependencies)} command!
30
+ throw new UnknownError(`We were unable to install theme dependencies in ${themePath} using ${logger.style.code(commandToInstallDependencies)} command!
30
31
  If you have ${logger.style.file('package-lock.json')} in theme directory make sure it's up to date with ${logger.style.file('package.json')} file content.`);
31
32
  }
32
33
  }
@@ -1,4 +1,5 @@
1
1
  const path = require('path');
2
+ const UnknownError = require('../../errors/unknown-error');
2
3
  const getJsonfileData = require('../../util/get-jsonfile-data');
3
4
  const runComposerCommand = require('../../util/run-composer');
4
5
 
@@ -24,7 +25,7 @@ const installTheme = (theme) => ({
24
25
  }
25
26
  });
26
27
  } catch (e) {
27
- throw new Error(
28
+ throw new UnknownError(
28
29
  `Unexpected error while installing theme.
29
30
  See ERROR log below.\n\n${e}`
30
31
  );
@@ -1,4 +1,5 @@
1
1
  const path = require('path');
2
+ const KnownError = require('../../errors/known-error');
2
3
  const getJsonfileData = require('../../util/get-jsonfile-data');
3
4
  const pathExists = require('../../util/path-exists');
4
5
 
@@ -26,7 +27,7 @@ const retrieveThemeData = (themePath) => ({
26
27
  const composerData = await getJsonfileData(path.join(absoluteThemePath, 'composer.json'));
27
28
 
28
29
  if (!composerData) {
29
- throw new Error(`composer.json file not found in "${themePath}"`);
30
+ throw new KnownError(`composer.json file not found in "${themePath}"`);
30
31
  }
31
32
 
32
33
  ctx.themePath = themePath;
@@ -1,4 +1,5 @@
1
1
  const path = require('path');
2
+ const UnknownError = require('../../errors/unknown-error');
2
3
  const envPhpToJson = require('../../util/env-php-json');
3
4
  const getJsonfileData = require('../../util/get-jsonfile-data');
4
5
  const runMagentoCommand = require('../../util/run-magento');
@@ -51,7 +52,7 @@ const persistedQuerySetup = () => ({
51
52
  magentoVersion
52
53
  });
53
54
  } catch (e) {
54
- throw new Error(
55
+ throw new UnknownError(
55
56
  `Unexpected error while setting redis for pq!.
56
57
  See ERROR log below.\n\n${e}`
57
58
  );
@@ -7,6 +7,7 @@ const setupPersistedQuery = require('./setup-persisted-query');
7
7
  const upgradeMagento = require('../magento/setup-magento/upgrade-magento');
8
8
  const disableFullPageCache = require('../magento/setup-magento/disable-full-page-cache');
9
9
  const buildTheme = require('./build-theme');
10
+ const KnownError = require('../../errors/known-error');
10
11
 
11
12
  /**
12
13
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -61,7 +62,7 @@ const setupThemes = () => ({
61
62
  const composerData = await getJsonfileData(path.join(absoluteThemePath, 'composer.json'));
62
63
 
63
64
  if (!composerData) {
64
- throw new Error(`composer.json file not found in "${themePath}"`);
65
+ throw new KnownError(`composer.json file not found in "${themePath}"`);
65
66
  }
66
67
 
67
68
  return {
@@ -1,4 +1,5 @@
1
1
  const path = require('path');
2
+ const UnknownError = require('../../errors/unknown-error');
2
3
  const getJsonfileData = require('../../util/get-jsonfile-data');
3
4
  const runComposerCommand = require('../../util/run-composer');
4
5
 
@@ -27,7 +28,7 @@ const symlinkTheme = (theme) => ({
27
28
  }
28
29
  });
29
30
  } catch (e) {
30
- throw new Error(
31
+ throw new UnknownError(
31
32
  `Unexpected error while configuring theme symbolic link.
32
33
  See ERROR log above.\n\n${e}`
33
34
  );