@yamato-daiwa/automation 0.7.0-alpha.6 → 0.7.0

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 (2) hide show
  1. package/EntryPoint.js +394 -258
  2. package/package.json +15 -16
package/EntryPoint.js CHANGED
@@ -34,7 +34,7 @@ function revisionHash(data) {
34
34
  \***********************/
35
35
  /***/ ((module) => {
36
36
 
37
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@yamato-daiwa/automation","version":"0.7.0-alpha.6","description":"The project building tool with declarative YAML configuration specializing on Pug, Stylus and TypeScript as source code languages.","keywords":["build","pug","stylus","tool","typescript"],"engines":{"node":">=20.0.0"},"bin":{"yda":"Executable"},"files":["EntryPoint.js"],"dependencies":{"@eslint-community/eslint-plugin-eslint-comments":"4.5.0","@stylistic/eslint-plugin":"4.4.1","@typescript-eslint/eslint-plugin":"8.33.1","@typescript-eslint/parser":"8.33.1","@vue/compiler-sfc":"3.5.16","@webdiscus/pug-loader":"2.11.1","@yamato-daiwa/es-extensions":"1.8.0-experimental.0","@yamato-daiwa/es-extensions-nodejs":"1.8.0-experimental.0","@yamato-daiwa/style_guides":"0.7.0","autoprefixer":"10.4.21","browser-sync":"3.0.4","css-loader":"7.1.2","cssnano":"7.0.7","dotenv":"16.5.0","eslint":"9.28.0","eslint-plugin-import":"2.31.0","eslint-plugin-n":"17.19.0","eslint-plugin-react":"7.37.5","eslint-plugin-vue":"9.33.0","eslint-plugin-vue-pug":"0.6.2","fork-ts-checker-webpack-plugin":"7.3.0","gulp":"4.0.2","gulp-data":"1.3.1","gulp-if":"3.0.0","gulp-imagemin":"7.1.0","gulp-nodemon":"2.5.0","gulp-plumber":"1.2.1","gulp-postcss":"10.0.0","gulp-pug":"5.0.0","gulp-sourcemaps":"3.0.0","gulp-stylus":"3.0.1","htmlnano":"2.1.2","imagemin-pngquant":"9.0.2","js-beautify":"1.15.4","json5-loader":"4.0.1","nanoid":"5.1.5","node-html-parser":"7.0.1","node-notifier":"10.0.1","pa11y":"9.0.0","probe-image-size":"7.2.3","pug-lint":"2.7.0","pug3-ast-loader":"0.0.0","puppeteer":"24.10.0","require-from-string":"2.0.2","rev-hash":"4.1.0","stlint":"1.0.65","stream-combiner2":"1.1.1","style-loader":"4.0.0","stylus":"0.63.0","stylus-loader":"8.1.1","ts-loader":"9.5.2","vinyl":"2.2.1","vnu-jar":"24.10.17","vue-loader":"17.4.2","vue-style-loader":"4.1.3","vue-tsc":"2.2.10","webpack":"5.99.9","webpack-node-externals":"3.0.0","webpack-stream":"7.0.0","worker-loader":"3.0.8","yaml-loader":"0.8.1"},"devDependencies":{"@types/browser-sync":"2.29.0","@types/cssnano":"5.0.0","@types/gulp":"4.0.17","@types/gulp-if":"3.0.4","@types/gulp-imagemin":"7.0.3","@types/gulp-nodemon":"0.0.37","@types/gulp-plumber":"0.0.37","@types/gulp-postcss":"8.0.6","@types/gulp-sourcemaps":"0.0.38","@types/gulp-stylus":"2.7.8","@types/js-beautify":"1.14.3","@types/node":"22.15.30","@types/node-notifier":"8.0.5","@types/pa11y":"5.3.7","@types/probe-image-size":"7.2.5","@types/pug":"2.0.10","@types/require-from-string":"1.2.3","@types/vnu-jar":"17.11.2","@types/webpack-node-externals":"3.0.4","@types/webpack-stream":"3.2.15","eslint-webpack-plugin":"4.2.0","ts-node":"10.9.2","typescript":"5.8.3","webpack-cli":"6.0.1"},"scripts":{"Incremental Development Building":"webpack --mode development","Production Building":"webpack --mode production","Linting":"eslint Source"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/TokugawaTakeshi/Yamato-Daiwa-Automation.git"},"homepage":"https://automation.yamato-daiwa.com/","funding":"https://github.com/TokugawaTakeshi/Yamato-Daiwa-Automation?sponsor=1","bugs":{"url":"https://github.com/TokugawaTakeshi/Yamato-Daiwa-Automation/issues","email":"tokugawa.takesi@gmail.com"}}');
37
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@yamato-daiwa/automation","version":"0.7.0","description":"The project building tool with declarative YAML configuration specializing on Pug, Stylus and TypeScript as source code languages.","keywords":["build","pug","stylus","tool","typescript"],"engines":{"node":">=20.0.0"},"bin":{"yda":"Executable"},"files":["EntryPoint.js"],"dependencies":{"@eslint-community/eslint-plugin-eslint-comments":"4.5.0","@stylistic/eslint-plugin":"5.2.2","@typescript-eslint/eslint-plugin":"8.38.0","@typescript-eslint/parser":"8.38.0","@vue/compiler-sfc":"3.5.18","@webdiscus/pug-loader":"2.11.1","@yamato-daiwa/es-extensions":"1.8.0-rc.1","@yamato-daiwa/es-extensions-nodejs":"1.8.0-rc.1","@yamato-daiwa/style_guides":"0.8.1","autoprefixer":"10.4.21","browser-sync":"3.0.4","css-loader":"7.1.2","cssnano":"7.1.0","dotenv":"16.5.0","eslint":"9.32.0","eslint-plugin-import":"2.32.0","eslint-plugin-n":"17.21.3","eslint-plugin-react":"7.37.5","eslint-plugin-vue":"9.33.0","eslint-plugin-vue-pug":"0.6.2","gulp":"4.0.2","gulp-data":"1.3.1","gulp-if":"3.0.0","gulp-imagemin":"7.1.0","gulp-nodemon":"2.5.0","gulp-plumber":"1.2.1","gulp-postcss":"10.0.0","gulp-pug":"5.0.0","gulp-sourcemaps":"3.0.0","gulp-stylus":"3.0.1","htmlnano":"2.1.2","imagemin-pngquant":"9.0.2","js-beautify":"1.15.4","json5-loader":"4.0.1","nanoid":"5.1.5","node-html-parser":"7.0.1","node-notifier":"10.0.1","pa11y":"9.0.0","probe-image-size":"7.2.3","pug-lint":"2.7.0","pug3-ast-loader":"0.0.0","puppeteer":"24.10.0","require-from-string":"2.0.2","rev-hash":"4.1.0","stlint":"1.0.65","stream-combiner2":"1.1.1","style-loader":"4.0.0","stylus":"0.63.0","stylus-loader":"8.1.1","ts-loader":"9.5.2","vinyl":"2.2.1","vnu-jar":"24.10.17","vue-loader":"17.4.2","vue-style-loader":"4.1.3","vue-tsc":"3.0.5","webpack":"5.101.0","webpack-node-externals":"3.0.0","webpack-stream":"7.0.0","worker-loader":"3.0.8","yaml-loader":"0.8.1"},"devDependencies":{"@types/browser-sync":"2.29.0","@types/cssnano":"5.0.0","@types/gulp":"4.0.17","@types/gulp-if":"3.0.5","@types/gulp-imagemin":"7.0.3","@types/gulp-nodemon":"0.0.37","@types/gulp-plumber":"0.0.37","@types/gulp-postcss":"8.0.6","@types/gulp-sourcemaps":"0.0.38","@types/gulp-stylus":"2.7.8","@types/js-beautify":"1.14.3","@types/node":"22.15.30","@types/node-notifier":"8.0.5","@types/pa11y":"5.3.7","@types/probe-image-size":"7.2.5","@types/pug":"2.0.10","@types/require-from-string":"1.2.3","@types/vnu-jar":"17.11.2","@types/webpack-node-externals":"3.0.4","@types/webpack-stream":"3.2.15","eslint-webpack-plugin":"4.2.0","ts-node":"10.9.2","typescript":"5.8.3","webpack-cli":"6.0.1"},"scripts":{"Incremental Development Building":"webpack --mode development","Production Building":"webpack --mode production","Linting":"eslint Source"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/TokugawaTakeshi/Yamato-Daiwa-Automation.git"},"homepage":"https://automation.yamato-daiwa.com/","funding":"https://github.com/TokugawaTakeshi/Yamato-Daiwa-Automation?sponsor=1","bugs":{"url":"https://github.com/TokugawaTakeshi/Yamato-Daiwa-Automation/issues","email":"tokugawa.takesi@gmail.com"}}');
38
38
 
39
39
  /***/ }),
40
40
 
@@ -227,6 +227,7 @@ const ProjectBuildingMasterConfigRepresentative_1 = __importDefault(__webpack_re
227
227
  /* ─── Tasks Runners ──────────────────────────────────────────────────────────────────────────────────────────────── */
228
228
  const MarkupProcessor_1 = __importDefault(__webpack_require__(/*! @MarkupProcessing/MarkupProcessor */ "./ProjectBuilding/SourceCodeProcessing/Markup/MarkupProcessor.ts"));
229
229
  const MarkupSourceCodeLinter_1 = __importDefault(__webpack_require__(/*! @MarkupProcessing/Subtasks/Linting/MarkupSourceCodeLinter */ "./ProjectBuilding/SourceCodeProcessing/Markup/Subtasks/Linting/MarkupSourceCodeLinter.ts"));
230
+ const TypeScriptTypesChecker_1 = __importDefault(__webpack_require__(/*! @ECMA_ScriptProcessing/Subtasks/TypeScriptTypesChecker */ "./ProjectBuilding/SourceCodeProcessing/ECMA_Script/Subtasks/TypeScriptTypesChecker.ts"));
230
231
  const CompiledTypeScriptImporterForPug_1 = __importDefault(__webpack_require__(/*! @MarkupProcessing/Subtasks/CompiledTypeScriptImporterForPug */ "./ProjectBuilding/SourceCodeProcessing/Markup/Subtasks/CompiledTypeScriptImporterForPug.ts"));
231
232
  const JavaScriptImporterForPug_1 = __importDefault(__webpack_require__(/*! @MarkupProcessing/Subtasks/JavaScriptImporterForPug */ "./ProjectBuilding/SourceCodeProcessing/Markup/Subtasks/JavaScriptImporterForPug.ts"));
232
233
  const StylesProcessor_1 = __importDefault(__webpack_require__(/*! @StylesProcessing/StylesProcessor */ "./ProjectBuilding/SourceCodeProcessing/Styles/StylesProcessor.ts"));
@@ -247,7 +248,7 @@ const FilesMasterWatcher_1 = __importDefault(__webpack_require__(/*! @ProjectBui
247
248
  const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "@yamato-daiwa/es-extensions");
248
249
  class ProjectBuilder {
249
250
  static buildProject({ consumingProjectRootDirectoryAbsolutePath, projectBuildingConfig__fromConsole, rawConfigFromFile }) {
250
- const rawDataProcessingResult = es_extensions_1.RawObjectDataProcessor.process(rawConfigFromFile, ProjectBuildingConfig__FromFile__RawValid_1.default.propertiesSpecification);
251
+ const rawDataProcessingResult = es_extensions_1.RawObjectDataProcessor.process(rawConfigFromFile, ProjectBuildingConfig__FromFile__RawValid_1.default.propertiesSpecification, { processingApproach: es_extensions_1.RawObjectDataProcessor.ProcessingApproaches.assemblingOfNewObject });
251
252
  if (rawDataProcessingResult.isRawDataInvalid) {
252
253
  es_extensions_1.Logger.throwErrorAndLog({
253
254
  errorInstance: new es_extensions_1.InvalidConfigError({
@@ -269,6 +270,7 @@ class ProjectBuilder {
269
270
  const GULP_TASK_NAME = "BUILD_PROJECT";
270
271
  gulp_1.default.task(GULP_TASK_NAME, gulp_1.default.parallel([
271
272
  MarkupSourceCodeLinter_1.default.provideLintingIfMust(masterConfigRepresentative),
273
+ TypeScriptTypesChecker_1.default.provideCheckingIfMust(masterConfigRepresentative),
272
274
  ECMA_ScriptSourceCodeLinter_1.default.provideLintingIfMust(masterConfigRepresentative),
273
275
  gulp_1.default.series([
274
276
  gulp_1.default.parallel([
@@ -5312,8 +5314,8 @@ const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
5312
5314
  const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "@yamato-daiwa/es-extensions");
5313
5315
  const es_extensions_nodejs_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions-nodejs */ "@yamato-daiwa/es-extensions-nodejs");
5314
5316
  class PlainCopyingRawSettingsNormalizer {
5315
- static normalize({ plainCopyingSettings__fromFile__rawValid, commonSettings__normalized }) {
5316
- const explicitlySpecifiedActualFilesGroupsIDs = commonSettings__normalized.tasksAndSourceFilesSelection?.plainCopying ?? [];
5317
+ static normalize({ plainCopyingSettings__fromFile__rawValid, commonSettings__normalized: { tasksAndSourceFilesSelection, projectRootDirectoryAbsolutePath, projectBuildingMode } }) {
5318
+ const explicitlySpecifiedActualFilesGroupsIDs = tasksAndSourceFilesSelection?.plainCopying ?? [];
5317
5319
  const filesGroups = {};
5318
5320
  for (const [filesGroupID, filesGroup__rawValid__fromFile] of Object.entries(plainCopyingSettings__fromFile__rawValid.filesGroups)) {
5319
5321
  if (explicitlySpecifiedActualFilesGroupsIDs.length > 0 &&
@@ -5322,27 +5324,29 @@ class PlainCopyingRawSettingsNormalizer {
5322
5324
  }
5323
5325
  const aliasName = filesGroup__rawValid__fromFile.aliasName ?? filesGroupID;
5324
5326
  if ("sourceFileRelativePath" in filesGroup__rawValid__fromFile) {
5325
- const filesSingularGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile = filesGroup__rawValid__fromFile.buildingModeDependent[commonSettings__normalized.projectBuildingMode];
5327
+ const filesSingularGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile = filesGroup__rawValid__fromFile.buildingModeDependent[projectBuildingMode];
5326
5328
  if ((0, es_extensions_1.isUndefined)(filesSingularGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile)) {
5327
5329
  continue;
5328
5330
  }
5329
5331
  filesGroups[filesGroupID] = PlainCopyingRawSettingsNormalizer.normalizeFilesSingularGroupSettings({
5330
- projectRootDirectoryAbsolutePath: commonSettings__normalized.projectRootDirectoryAbsolutePath,
5332
+ projectRootDirectoryAbsolutePath,
5331
5333
  sourceFileRelativePath: filesGroup__rawValid__fromFile.sourceFileRelativePath,
5332
5334
  aliasName,
5333
5335
  filesSingularGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile
5334
5336
  });
5335
5337
  }
5336
5338
  else {
5337
- const filesPluralGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile = filesGroup__rawValid__fromFile.buildingModeDependent[commonSettings__normalized.projectBuildingMode];
5339
+ const filesPluralGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile = filesGroup__rawValid__fromFile.buildingModeDependent[projectBuildingMode];
5338
5340
  if ((0, es_extensions_1.isUndefined)(filesPluralGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile)) {
5339
5341
  continue;
5340
5342
  }
5341
5343
  filesGroups[filesGroupID] = PlainCopyingRawSettingsNormalizer.normalizeFilesPluralGroupSettings({
5342
- projectRootDirectoryAbsolutePath: commonSettings__normalized.projectRootDirectoryAbsolutePath,
5344
+ projectRootDirectoryAbsolutePath,
5343
5345
  sourceTopDirectoryRelativePath: filesGroup__rawValid__fromFile.sourceTopDirectoryRelativePath,
5344
5346
  fileNameLastExtensions: filesGroup__rawValid__fromFile.fileNameLastExtensions,
5345
5347
  aliasName,
5348
+ excludedSubdirectoriesPathsRelativeToAssetsGroupSourceTopDirectory: filesGroup__rawValid__fromFile.excludeSubdirectoriesRelativePaths,
5349
+ excludedFilesPathsRelativeToAssetsGroupSourceTopDirectory: filesGroup__rawValid__fromFile.excludeFilesRelativePaths,
5346
5350
  filesPluralGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile
5347
5351
  });
5348
5352
  }
@@ -5384,7 +5388,7 @@ class PlainCopyingRawSettingsNormalizer {
5384
5388
  outputFileAbsolutePath
5385
5389
  };
5386
5390
  }
5387
- static normalizeFilesPluralGroupSettings({ projectRootDirectoryAbsolutePath, sourceTopDirectoryRelativePath, fileNameLastExtensions, aliasName, filesPluralGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile }) {
5391
+ static normalizeFilesPluralGroupSettings({ projectRootDirectoryAbsolutePath, sourceTopDirectoryRelativePath, fileNameLastExtensions, excludedSubdirectoriesPathsRelativeToAssetsGroupSourceTopDirectory = [], excludedFilesPathsRelativeToAssetsGroupSourceTopDirectory = [], aliasName, filesPluralGroupSettingsActualForCurrentProjectBuildingMode__rawValid__fromFile }) {
5388
5392
  const sourceTopDirectoryAbsolutePath = es_extensions_nodejs_1.ImprovedPath.joinPathSegments([projectRootDirectoryAbsolutePath, sourceTopDirectoryRelativePath], { alwaysForwardSlashSeparators: true });
5389
5393
  const outputTopDirectoryAbsolutePath = es_extensions_nodejs_1.ImprovedPath.joinPathSegments([
5390
5394
  projectRootDirectoryAbsolutePath,
@@ -5395,7 +5399,9 @@ class PlainCopyingRawSettingsNormalizer {
5395
5399
  es_extensions_nodejs_1.ImprovedGlob.buildAllFilesInCurrentDirectoryAndBelowGlobSelector({
5396
5400
  basicDirectoryPath: sourceTopDirectoryAbsolutePath,
5397
5401
  fileNamesExtensions: fileNameLastExtensions
5398
- })
5402
+ }),
5403
+ ...excludedSubdirectoriesPathsRelativeToAssetsGroupSourceTopDirectory.map((excludedSubdirectoryPathRelativeToAssetsGroupSourceTopDirectory) => es_extensions_nodejs_1.ImprovedGlob.buildExcludingOfDirectoryWithSubdirectoriesGlobSelector(es_extensions_nodejs_1.ImprovedPath.joinPathSegments([sourceTopDirectoryAbsolutePath, excludedSubdirectoryPathRelativeToAssetsGroupSourceTopDirectory], { alwaysForwardSlashSeparators: true }))),
5404
+ ...excludedFilesPathsRelativeToAssetsGroupSourceTopDirectory.map((excludedFilePathRelativeToAssetsGroupSourceTopDirectory) => es_extensions_nodejs_1.ImprovedGlob.includingGlobSelectorToExcludingOne(es_extensions_nodejs_1.ImprovedPath.joinPathSegments([sourceTopDirectoryAbsolutePath, excludedFilePathRelativeToAssetsGroupSourceTopDirectory], { alwaysForwardSlashSeparators: true })))
5399
5405
  ], { alwaysForwardSlashSeparators: true })) {
5400
5406
  const outputDirectoryAbsolutePath = OutputDirectoryPathTransformationsSettingsRepresentative_1.default.transform(es_extensions_nodejs_1.ImprovedPath.joinPathSegments([
5401
5407
  outputTopDirectoryAbsolutePath,
@@ -5414,7 +5420,7 @@ class PlainCopyingRawSettingsNormalizer {
5414
5420
  const outputFileNameWithExtensions = PlainCopyingRawSettingsNormalizer.computeOutputFileNameWithExtensions({
5415
5421
  initialFileNameWithExtensions: (0, es_extensions_1.extractFileNameWithAllExtensionsFromPath)({
5416
5422
  targetPath: sourceFileAbsolutePath,
5417
- mustThrowErrorIfLastPathSegmentHasNoDots: true
5423
+ mustThrowErrorIfLastPathSegmentHasNoDots: false
5418
5424
  }),
5419
5425
  sourceTopDirectoryAbsolutePath,
5420
5426
  sourceFileAbsolutePath,
@@ -5623,6 +5629,30 @@ var PlainCopyingSettings__FromFile__RawValid;
5623
5629
  minimalCharactersCount: 1
5624
5630
  }
5625
5631
  },
5632
+ $excludeSubdirectoriesRelativePaths: {
5633
+ newName: "excludeSubdirectoriesRelativePaths",
5634
+ type: Array,
5635
+ isUndefinedForbidden: false,
5636
+ isNullForbidden: true,
5637
+ areUndefinedElementsForbidden: true,
5638
+ areNullElementsForbidden: true,
5639
+ element: {
5640
+ type: String,
5641
+ minimalCharactersCount: 1
5642
+ }
5643
+ },
5644
+ $excludeFilesRelativePaths: {
5645
+ newName: "excludeFilesRelativePaths",
5646
+ type: Array,
5647
+ isUndefinedForbidden: false,
5648
+ isNullForbidden: true,
5649
+ areUndefinedElementsForbidden: true,
5650
+ areNullElementsForbidden: true,
5651
+ element: {
5652
+ type: String,
5653
+ minimalCharactersCount: 1
5654
+ }
5655
+ },
5626
5656
  $buildingModeDependent: {
5627
5657
  newName: "buildingModeDependent",
5628
5658
  type: es_extensions_1.RawObjectDataProcessor.ValuesTypesIDs.associativeArray,
@@ -6262,6 +6292,13 @@ class ProjectBuildingMasterConfigRepresentative {
6262
6292
  get isProductionBuildingMode() {
6263
6293
  return this.commonSettings.projectBuildingMode === ConsumingProjectBuildingModes_1.default.production;
6264
6294
  }
6295
+ get isProductionLikeBuildingMode() {
6296
+ return [
6297
+ ConsumingProjectBuildingModes_1.default.testing,
6298
+ ConsumingProjectBuildingModes_1.default.staging,
6299
+ ConsumingProjectBuildingModes_1.default.production
6300
+ ].includes(this.commonSettings.projectBuildingMode);
6301
+ }
6265
6302
  /* --- Tasks execution requirement -------------------------------------------------------------------------------- */
6266
6303
  /* eslint-disable @stylistic/brace-style -- In this case the Allman style provides symmetry. */
6267
6304
  get mustProcessMarkup() {
@@ -7033,7 +7070,7 @@ class ECMA_ScriptLogicProcessor {
7033
7070
  this.projectBuildingMasterConfigRepresentative = masterConfigRepresentative;
7034
7071
  const webpackConfigurationsForExistingEntryPoints = [];
7035
7072
  const entryPointsSourceFilesAbsolutePathsAndWebpackConfigurationNamesMap = new Map();
7036
- for (const [index, ECMA_ScriptLogicEntryPointsGroupSettings] of Array.from(this.ECMA_ScriptLogicProcessingConfigRepresentative.relevantEntryPointsGroupsSettings.values()).entries()) {
7073
+ for (const ECMA_ScriptLogicEntryPointsGroupSettings of this.ECMA_ScriptLogicProcessingConfigRepresentative.relevantEntryPointsGroupsSettings.values()) {
7037
7074
  const entryPointsSourceFilesAbsolutePaths = es_extensions_nodejs_1.ImprovedGlob.getFilesAbsolutePathsSynchronously(ECMA_ScriptLogicEntryPointsGroupSettings.sourceFilesGlobSelectors, { alwaysForwardSlashSeparators: true });
7038
7075
  if (entryPointsSourceFilesAbsolutePaths.length === 0) {
7039
7076
  es_extensions_1.Logger.logWarning({
@@ -7047,8 +7084,7 @@ class ECMA_ScriptLogicProcessor {
7047
7084
  entryPointsSourceFilesAbsolutePaths,
7048
7085
  ECMA_ScriptLogicEntryPointsGroupSettings,
7049
7086
  ECMA_ScriptLogicProcessingConfigRepresentative: this.ECMA_ScriptLogicProcessingConfigRepresentative,
7050
- masterConfigRepresentative: this.projectBuildingMasterConfigRepresentative,
7051
- mustProvideTypeScriptTypeChecking: index === 0
7087
+ masterConfigRepresentative: this.projectBuildingMasterConfigRepresentative
7052
7088
  }));
7053
7089
  (0, es_extensions_1.addEntriesToMap)({
7054
7090
  targetMap: entryPointsSourceFilesAbsolutePathsAndWebpackConfigurationNamesMap,
@@ -7688,6 +7724,138 @@ class LocalDevelopmentServerOrchestrator {
7688
7724
  exports["default"] = LocalDevelopmentServerOrchestrator;
7689
7725
 
7690
7726
 
7727
+ /***/ }),
7728
+
7729
+ /***/ "./ProjectBuilding/SourceCodeProcessing/ECMA_Script/Subtasks/TypeScriptTypesChecker.ts":
7730
+ /*!*********************************************************************************************!*\
7731
+ !*** ./ProjectBuilding/SourceCodeProcessing/ECMA_Script/Subtasks/TypeScriptTypesChecker.ts ***!
7732
+ \*********************************************************************************************/
7733
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
7734
+
7735
+
7736
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7737
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7738
+ };
7739
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
7740
+ /* ─── Source Files Watcher ───────────────────────────────────────────────────────────────────────────────────────── */
7741
+ const ECMA_ScriptSourceFilesWatcher_1 = __importDefault(__webpack_require__(/*! @ECMA_ScriptProcessing/ECMA_ScriptSourceFilesWatcher */ "./ProjectBuilding/SourceCodeProcessing/ECMA_Script/ECMA_ScriptSourceFilesWatcher.ts"));
7742
+ /* ─── Applied Utils ─────────────────────────────────────────────────────────────────────────────────────────────── */
7743
+ const VoidPromiseReturningFunction_1 = __webpack_require__(/*! @Utils/VoidPromiseReturningFunction */ "./Utils/VoidPromiseReturningFunction.ts");
7744
+ /* ─── Generals Utils ─────────────────────────────────────────────────────────────────────────────────────────────── */
7745
+ const child_process_1 = __importDefault(__webpack_require__(/*! child_process */ "child_process"));
7746
+ const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
7747
+ const es_extensions_nodejs_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions-nodejs */ "@yamato-daiwa/es-extensions-nodejs");
7748
+ const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "@yamato-daiwa/es-extensions");
7749
+ const node_notifier_1 = __importDefault(__webpack_require__(/*! node-notifier */ "node-notifier"));
7750
+ class TypeScriptTypesChecker {
7751
+ static WAITING_FOR_NEXT_EVENT_WITH_RELATED_FILES__SECONDS = 1;
7752
+ /* [ Theory ] 120 columns is about the half of the 1920x1080 screen. */
7753
+ static DISPLAYING_MAXIMAL_COLUMNS_COUNT_IN_LOG = 120;
7754
+ vueTSC_ExecutableFileAbsolutePath;
7755
+ projectBuildingMasterConfigRepresentative;
7756
+ ecmaScriptLogicProcessingSettingsRepresentative;
7757
+ waitingForNextWithRelatedFiles = null;
7758
+ static provideCheckingIfMust(projectBuildingMasterConfigRepresentative) {
7759
+ const ecmaScriptLogicProcessingSettingsRepresentative = projectBuildingMasterConfigRepresentative.ECMA_ScriptLogicProcessingSettingsRepresentative;
7760
+ if ((0, es_extensions_1.isUndefined)(ecmaScriptLogicProcessingSettingsRepresentative)) {
7761
+ return VoidPromiseReturningFunction_1.voidPromiseReturningFunction;
7762
+ }
7763
+ const selfInstance = new TypeScriptTypesChecker({
7764
+ projectBuildingMasterConfigRepresentative,
7765
+ ecmaScriptLogicProcessingSettingsRepresentative
7766
+ });
7767
+ return selfInstance.checkTypes.bind(selfInstance);
7768
+ }
7769
+ constructor({ projectBuildingMasterConfigRepresentative, ecmaScriptLogicProcessingSettingsRepresentative }) {
7770
+ this.projectBuildingMasterConfigRepresentative = projectBuildingMasterConfigRepresentative;
7771
+ this.ecmaScriptLogicProcessingSettingsRepresentative = ecmaScriptLogicProcessingSettingsRepresentative;
7772
+ if (this.projectBuildingMasterConfigRepresentative.mustProvideIncrementalBuilding) {
7773
+ ECMA_ScriptSourceFilesWatcher_1.default.initializeIfRequiredAndGetInstance({
7774
+ projectBuildingMasterConfigRepresentative: this.projectBuildingMasterConfigRepresentative,
7775
+ ecmaScriptLogicProcessingSettingsRepresentative: this.ecmaScriptLogicProcessingSettingsRepresentative
7776
+ }).
7777
+ addOnAnyEventRelatedWithActualFilesHandler({
7778
+ handlerID: "ON_ANY_EVENT_RELATED_WITH_ACTUAL_FILES_HANDLER--BY_TYPE_SCRIPT_TYPES_CHECKER",
7779
+ handler: this.onAnyEventRelatedWithActualFiles.bind(this)
7780
+ });
7781
+ }
7782
+ const vueTSC_ExecutableFileAbsolutePath = TypeScriptTypesChecker.
7783
+ getAbsolutePathOfExistingVueTSC_ExecutableFile__alwaysForwardSlashesPathSeparators(projectBuildingMasterConfigRepresentative.consumingProjectRootDirectoryAbsolutePath);
7784
+ if ((0, es_extensions_1.isNull)(vueTSC_ExecutableFileAbsolutePath)) {
7785
+ es_extensions_1.Logger.throwErrorAndLog({
7786
+ errorInstance: new es_extensions_1.UnexpectedEventError("File to \"vue-tsc\" executable not found"),
7787
+ title: es_extensions_1.UnexpectedEventError.localization.defaultTitle,
7788
+ occurrenceLocation: "TypeScriptTypesChecker.constructor(compoundParameter)"
7789
+ });
7790
+ }
7791
+ this.vueTSC_ExecutableFileAbsolutePath = vueTSC_ExecutableFileAbsolutePath;
7792
+ }
7793
+ onAnyEventRelatedWithActualFiles() {
7794
+ clearTimeout((0, es_extensions_1.nullToUndefined)(this.waitingForNextWithRelatedFiles));
7795
+ this.waitingForNextWithRelatedFiles = setTimeout(() => {
7796
+ this.checkTypes().catch(es_extensions_1.Logger.logPromiseError);
7797
+ }, (0, es_extensions_1.secondsToMilliseconds)(TypeScriptTypesChecker.WAITING_FOR_NEXT_EVENT_WITH_RELATED_FILES__SECONDS));
7798
+ }
7799
+ async checkTypes() {
7800
+ return new Promise((resolve, reject) => {
7801
+ child_process_1.default.exec(`node ${this.vueTSC_ExecutableFileAbsolutePath} --noEmit`, { encoding: "utf-8" }, (error, stdout) => {
7802
+ if ((0, es_extensions_1.isNotNull)(error)) {
7803
+ es_extensions_1.Logger.logErrorLikeMessage({
7804
+ title: "TypeScript Type Checking, Error(s) Detected",
7805
+ description: "The source code is including the TypeScript error(s).\n" +
7806
+ (this.projectBuildingMasterConfigRepresentative.isProductionLikeBuildingMode ?
7807
+ "Is is unacceptable for production-like modes thus the project building will be terminated." : "") +
7808
+ `${"-".repeat(TypeScriptTypesChecker.DISPLAYING_MAXIMAL_COLUMNS_COUNT_IN_LOG)}\n` +
7809
+ stdout
7810
+ });
7811
+ node_notifier_1.default.notify({
7812
+ title: "TypeScript Types Checking, Errors Detected",
7813
+ message: "Please check your terminal for the details."
7814
+ });
7815
+ if (this.projectBuildingMasterConfigRepresentative.isProductionLikeBuildingMode) {
7816
+ reject(error);
7817
+ return;
7818
+ }
7819
+ resolve();
7820
+ return;
7821
+ }
7822
+ es_extensions_1.Logger.logSuccess({
7823
+ title: "TypeScript Type Checking, No Errors Found",
7824
+ description: "The source TypeScript is valid. Keep it up!"
7825
+ });
7826
+ resolve();
7827
+ });
7828
+ });
7829
+ }
7830
+ static getAbsolutePathOfExistingVueTSC_ExecutableFile__alwaysForwardSlashesPathSeparators(consumingProjectRootDirectoryAbsolutePath) {
7831
+ for (const vueTSC_ExecutableFileAbsolutePath__alwaysForwardSlashesPathSeparators of [
7832
+ es_extensions_nodejs_1.ImprovedPath.joinPathSegments([
7833
+ consumingProjectRootDirectoryAbsolutePath,
7834
+ "node_modules",
7835
+ ".bin",
7836
+ "vue-tsc.js"
7837
+ ], { alwaysForwardSlashSeparators: true }),
7838
+ es_extensions_nodejs_1.ImprovedPath.joinPathSegments([
7839
+ consumingProjectRootDirectoryAbsolutePath,
7840
+ "node_modules",
7841
+ "@yamato-daiwa",
7842
+ "automation",
7843
+ "node_modules",
7844
+ "vue-tsc",
7845
+ "bin",
7846
+ "vue-tsc.js"
7847
+ ], { alwaysForwardSlashSeparators: true })
7848
+ ]) {
7849
+ if (fs_1.default.existsSync(vueTSC_ExecutableFileAbsolutePath__alwaysForwardSlashesPathSeparators)) {
7850
+ return vueTSC_ExecutableFileAbsolutePath__alwaysForwardSlashesPathSeparators;
7851
+ }
7852
+ }
7853
+ return null;
7854
+ }
7855
+ }
7856
+ exports["default"] = TypeScriptTypesChecker;
7857
+
7858
+
7691
7859
  /***/ }),
7692
7860
 
7693
7861
  /***/ "./ProjectBuilding/SourceCodeProcessing/ECMA_Script/Utils/ECMA_ScriptLogicEntryPointsSourceFilesAbsolutePathsAndOutputFilesActualPathsMapGenerator.ts":
@@ -7805,7 +7973,6 @@ const TypeScriptSpecialist_1 = __importDefault(__webpack_require__(/*! @ThirdPar
7805
7973
  /* ─── Applied Utils ──────────────────────────────────────────────────────────────────────────────────────────────── */
7806
7974
  const webpack_1 = __importDefault(__webpack_require__(/*! webpack */ "webpack"));
7807
7975
  const vue_loader_1 = __webpack_require__(/*! vue-loader */ "vue-loader");
7808
- const fork_ts_checker_webpack_plugin_1 = __importDefault(__webpack_require__(/*! fork-ts-checker-webpack-plugin */ "fork-ts-checker-webpack-plugin"));
7809
7976
  const webpack_node_externals_1 = __importDefault(__webpack_require__(/*! webpack-node-externals */ "webpack-node-externals"));
7810
7977
  /* ─── General Utils ──────────────────────────────────────────────────────────────────────────────────────────────── */
7811
7978
  const path_1 = __importDefault(__webpack_require__(/*! path */ "path"));
@@ -7816,7 +7983,7 @@ class WebpackConfigGenerator {
7816
7983
  static cachedTypeScriptConfigurations = {};
7817
7984
  /* [ Approach ] Although the parameter is excessive, its properties are been pre-computed externally for other needs,
7818
7985
  * so no need to compute them again. */
7819
- static generateWebpackConfigurationForEntryPointsGroupWithExistingFiles({ entryPointsSourceFilesAbsolutePaths, ECMA_ScriptLogicEntryPointsGroupSettings: entryPointsGroupSettings, ECMA_ScriptLogicProcessingConfigRepresentative, masterConfigRepresentative, mustProvideTypeScriptTypeChecking }) {
7986
+ static generateWebpackConfigurationForEntryPointsGroupWithExistingFiles({ entryPointsSourceFilesAbsolutePaths, ECMA_ScriptLogicEntryPointsGroupSettings: entryPointsGroupSettings, ECMA_ScriptLogicProcessingConfigRepresentative, masterConfigRepresentative }) {
7820
7987
  /* [ Reference ] https://webpack.js.org/configuration/entry-context/#context */
7821
7988
  const sourceFilesTopDirectoryAbsolutePath = entryPointsGroupSettings.sourceFilesTopDirectoryAbsolutePath;
7822
7989
  /** @see https://webpack.js.org/configuration/entry-context/#entry */
@@ -7840,7 +8007,6 @@ class WebpackConfigGenerator {
7840
8007
  const willPugLibraryBeBuilt = entryPointsGroupSettings.distributing?.exposingOfExportsFromEntryPoints.mustExpose === true &&
7841
8008
  entryPointsGroupSettings.targetRuntime.type === SupportedECMA_ScriptRuntimesTypes.pug;
7842
8009
  const distributingSettings = entryPointsGroupSettings.distributing;
7843
- // TODO Is entryPointsGroupSettings.directoriesAliasesAndCorrespondingAbsolutePathsMap related
7844
8010
  return {
7845
8011
  name: entryPointsGroupSettings.ID,
7846
8012
  /* [ Webpack theory ] In this case, path separators must be operating system dependent, otherwise following error
@@ -7883,7 +8049,7 @@ class WebpackConfigGenerator {
7883
8049
  "window" : "module";
7884
8050
  case SupportedECMA_ScriptRuntimesTypes.nodeJS: return "commonjs";
7885
8051
  case SupportedECMA_ScriptRuntimesTypes.pug: return "umd";
7886
- default: {
8052
+ case SupportedECMA_ScriptRuntimesTypes.webWorker: {
7887
8053
  es_extensions_1.Logger.throwErrorAndLog({
7888
8054
  errorInstance: new es_extensions_1.UnexpectedEventError("The web worker could not be the library, while the computing of 'output.library.type' has been " +
7889
8055
  "requested"),
@@ -7929,6 +8095,8 @@ class WebpackConfigGenerator {
7929
8095
  loader: "ts-loader",
7930
8096
  options: {
7931
8097
  configFile: entryPointsGroupSettings.typeScriptConfigurationFileAbsolutePath,
8098
+ /* [ Performance Optimization ] Type checking is been executed externally and once for all files. */
8099
+ transpileOnly: false,
7932
8100
  /* [ Theory ] This option allows TypeScript to process the code extracted from a single file component.
7933
8101
  * [ Reference ] https://github.com/Microsoft/TypeScript-Vue-Starter#single-file-components */
7934
8102
  appendTsSuffixTo: [/\.vue$/u]
@@ -8058,24 +8226,6 @@ class WebpackConfigGenerator {
8058
8226
  __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false
8059
8227
  } : null
8060
8228
  }),
8061
- /* < === Temporary ========================================================================================== */
8062
- ...mustProvideTypeScriptTypeChecking ?
8063
- [
8064
- new fork_ts_checker_webpack_plugin_1.default({
8065
- typescript: {
8066
- /* [ Theory ] Webpack's "context" is default, but generally "tsconfig.json" could be not in same directory */
8067
- configFile: entryPointsGroupSettings.typeScriptConfigurationFileAbsolutePath,
8068
- extensions: {
8069
- vue: {
8070
- enabled: true,
8071
- compiler: "@vue/compiler-sfc"
8072
- }
8073
- }
8074
- }
8075
- })
8076
- ] :
8077
- [],
8078
- /* === Temporary > ========================================================================================== */
8079
8229
  new vue_loader_1.VueLoaderPlugin()
8080
8230
  ],
8081
8231
  optimization: {
@@ -8626,7 +8776,7 @@ const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "
8626
8776
  var MarkupProcessingSettings__FromFile__RawValid;
8627
8777
  (function (MarkupProcessingSettings__FromFile__RawValid) {
8628
8778
  /* ━━━ Properties Specification ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
8629
- function generateLocalizationPropertiesSpecification(additionalPropertiesSpecification = {}) {
8779
+ function generateLocalizationPropertiesSpecification({ forEntryPointsGroups }) {
8630
8780
  return {
8631
8781
  newName: "localization",
8632
8782
  type: Object,
@@ -8682,28 +8832,92 @@ var MarkupProcessingSettings__FromFile__RawValid;
8682
8832
  $localeConstantValue: {
8683
8833
  newName: "localeConstantValue",
8684
8834
  type: String,
8685
- isUndefinedForbidden: false,
8835
+ undefinedForbiddenIf: {
8836
+ predicate: ({ targetPropertyDotSeparatedPath, rawData__full }) => (0, es_extensions_1.isNotUndefined)((0, es_extensions_1.getObjectPropertySafely)(rawData__full, [
8837
+ /* eslint-disable-next-line @typescript-eslint/no-magic-numbers --
8838
+ * 3 referees to last three elements in paths like
8839
+ * $projectBuilding.$markupProcessing.$entryPointsGroups.Pages.$localization.
8840
+ * $locales.english.$localeConstantValue */
8841
+ ...(0, es_extensions_1.splitString)(targetPropertyDotSeparatedPath, ".").slice(0, -3),
8842
+ "$localeConstantName"
8843
+ ])),
8844
+ descriptionForLogging: "`$projectBuilding.$markupProcessing." +
8845
+ (forEntryPointsGroups ? "$entryPointsGroups.NNN" : "$common") +
8846
+ ".$localization.$localeConstantName` is defined"
8847
+ },
8686
8848
  isNullForbidden: true,
8687
8849
  minimalCharactersCount: 1
8688
8850
  },
8689
8851
  $keyInLocalizedStringResourcesObject: {
8690
8852
  newName: "keyInLocalizedStringResourcesObject",
8691
8853
  type: String,
8692
- isUndefinedForbidden: false,
8854
+ undefinedForbiddenIf: {
8855
+ predicate: ({ targetPropertyDotSeparatedPath, rawData__full }) => (0, es_extensions_1.isNotUndefined)((0, es_extensions_1.getObjectPropertySafely)(rawData__full, [
8856
+ /* eslint-disable-next-line @typescript-eslint/no-magic-numbers --
8857
+ * 3 referees to last three elements in paths like
8858
+ * $projectBuilding.$markupProcessing.$entryPointsGroups.Pages.$localization.$locales.
8859
+ * english.$localeConstantValue */
8860
+ ...(0, es_extensions_1.splitString)(targetPropertyDotSeparatedPath, ".").slice(0, -3),
8861
+ "$stringResourcesFileRelativePath"
8862
+ ])),
8863
+ descriptionForLogging: "`$projectBuilding.$markupProcessing." +
8864
+ (forEntryPointsGroups ? "$entryPointsGroups.NNN" : "$common") +
8865
+ ".$localization.$stringResourcesFileRelativePath` is defined"
8866
+ },
8693
8867
  isNullForbidden: true,
8694
8868
  minimalCharactersCount: 1
8695
8869
  },
8696
8870
  $valueOfConstantForInterpolationToLangHTML_Attribute: {
8697
8871
  newName: "valueOfConstantForInterpolationToLangHTML_Attribute",
8698
8872
  type: String,
8699
- isUndefinedForbidden: false,
8873
+ undefinedForbiddenIf: {
8874
+ predicate: ({ targetPropertyDotSeparatedPath, rawData__full }) => (0, es_extensions_1.isNotUndefined)((0, es_extensions_1.getObjectPropertySafely)(rawData__full, [
8875
+ /* eslint-disable-next-line @typescript-eslint/no-magic-numbers --
8876
+ * 3 referees to last three elements in paths like
8877
+ * $projectBuilding.$markupProcessing.$entryPointsGroups.Pages.$localization.$locales.
8878
+ * english.$localeConstantValue */
8879
+ ...(0, es_extensions_1.splitString)(targetPropertyDotSeparatedPath, ".").slice(0, -3),
8880
+ "$nameOfConstantForInterpolationToLangHTML_Attribute"
8881
+ ])),
8882
+ descriptionForLogging: "`$projectBuilding.$markupProcessing." +
8883
+ (forEntryPointsGroups ? "$entryPointsGroups.NNN" : "$common") +
8884
+ ".$localization.$nameOfConstantForInterpolationToLangHTML_Attribute` is defined"
8885
+ },
8700
8886
  isNullForbidden: true,
8701
8887
  minimalCharactersCount: 1
8702
8888
  }
8703
8889
  }
8704
8890
  }
8705
8891
  },
8706
- ...additionalPropertiesSpecification
8892
+ ...forEntryPointsGroups ?
8893
+ {
8894
+ $excludedFilesPathsRelativeToSourcesFilesTopDirectory: {
8895
+ newName: "excludedFilesPathsRelativeToSourcesFilesTopDirectory",
8896
+ type: Array,
8897
+ isUndefinedForbidden: false,
8898
+ isNullForbidden: true,
8899
+ areUndefinedElementsForbidden: true,
8900
+ areNullElementsForbidden: true,
8901
+ element: {
8902
+ type: String,
8903
+ minimalCharactersCount: 1
8904
+ }
8905
+ }
8906
+ } :
8907
+ {
8908
+ $excludedFilesPathsRelativeRelativeToProjectRootDirectory: {
8909
+ newName: "excludedFilesPathsRelativeRelativeToProjectRootDirectory",
8910
+ type: Array,
8911
+ isUndefinedForbidden: false,
8912
+ isNullForbidden: true,
8913
+ areUndefinedElementsForbidden: true,
8914
+ areNullElementsForbidden: true,
8915
+ element: {
8916
+ type: String,
8917
+ minimalCharactersCount: 1
8918
+ }
8919
+ }
8920
+ }
8707
8921
  }
8708
8922
  };
8709
8923
  }
@@ -8716,20 +8930,7 @@ var MarkupProcessingSettings__FromFile__RawValid;
8716
8930
  isUndefinedForbidden: false,
8717
8931
  mustTransformNullToUndefined: true,
8718
8932
  properties: {
8719
- $localization: generateLocalizationPropertiesSpecification({
8720
- $excludedFilesPathsRelativeRelativeToProjectRootDirectory: {
8721
- newName: "excludedFilesPathsRelativeRelativeToProjectRootDirectory",
8722
- type: Array,
8723
- isUndefinedForbidden: false,
8724
- isNullForbidden: true,
8725
- areUndefinedElementsForbidden: true,
8726
- areNullElementsForbidden: true,
8727
- element: {
8728
- type: String,
8729
- minimalCharactersCount: 1
8730
- }
8731
- }
8732
- }),
8933
+ $localization: generateLocalizationPropertiesSpecification({ forEntryPointsGroups: false }),
8733
8934
  $buildingModeDependent: {
8734
8935
  newName: "buildingModeDependent",
8735
8936
  type: es_extensions_1.RawObjectDataProcessor.ValuesTypesIDs.associativeArray,
@@ -8927,20 +9128,7 @@ var MarkupProcessingSettings__FromFile__RawValid;
8927
9128
  isUndefinedForbidden: false,
8928
9129
  isNullForbidden: true
8929
9130
  },
8930
- $localization: generateLocalizationPropertiesSpecification({
8931
- $excludedFilesPathsRelativeToSourcesFilesTopDirectory: {
8932
- newName: "excludedFilesPathsRelativeToSourcesFilesTopDirectory",
8933
- type: Array,
8934
- isUndefinedForbidden: false,
8935
- isNullForbidden: true,
8936
- areUndefinedElementsForbidden: true,
8937
- areNullElementsForbidden: true,
8938
- element: {
8939
- type: String,
8940
- minimalCharactersCount: 1
8941
- }
8942
- }
8943
- }),
9131
+ $localization: generateLocalizationPropertiesSpecification({ forEntryPointsGroups: true }),
8944
9132
  $HTML_Validation: {
8945
9133
  newName: "HTML_Validation",
8946
9134
  type: Object,
@@ -10446,19 +10634,20 @@ const HTML_ValidatorLocalization_english_1 = __importDefault(__webpack_require__
10446
10634
  const vnu_jar_1 = __importDefault(__webpack_require__(/*! vnu-jar */ "vnu-jar"));
10447
10635
  const DotYDA_DirectoryManager_1 = __importDefault(__webpack_require__(/*! @Utils/DotYDA_DirectoryManager */ "./Utils/DotYDA_DirectoryManager.ts"));
10448
10636
  /* ─── Generals Utils ─────────────────────────────────────────────────────────────────────────────────────────────── */
10449
- const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
10450
10637
  const node_child_process_1 = __importDefault(__webpack_require__(/*! node:child_process */ "node:child_process"));
10451
10638
  const node_notifier_1 = __importDefault(__webpack_require__(/*! node-notifier */ "node-notifier"));
10452
10639
  const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "@yamato-daiwa/es-extensions");
10453
10640
  const es_extensions_nodejs_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions-nodejs */ "@yamato-daiwa/es-extensions-nodejs");
10454
10641
  const nanoid_1 = __webpack_require__(/*! nanoid */ "nanoid");
10455
10642
  const Stopwatch_1 = __importDefault(__webpack_require__(/*! @UtilsIncubator/Stopwatch */ "./UtilsIncubator/Stopwatch.ts"));
10456
- const deleteFilesFromDirectory_1 = __importDefault(__webpack_require__(/*! @UtilsIncubator/@yamato-daiwa/es-extensions-nodejs/ImprovedFileSystem/deleteFilesFromDirectory */ "./UtilsIncubator/@yamato-daiwa/es-extensions-nodejs/ImprovedFileSystem/deleteFilesFromDirectory.ts"));
10457
10643
  class HTML_Validator {
10458
10644
  /* ━━━ Fields ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
10459
10645
  static selfSingleInstance = null;
10460
10646
  /* ─── Work Variables ───────────────────────────────────────────────────────────────────────────────────────────── */
10461
- queuedFilesMetadata = [];
10647
+ /* [ Approach ]
10648
+ * Although "queue" usually means the order, here is order does not matter unlike the files' uniqueness that is why
10649
+ * set instead of simple Array used. */
10650
+ queuedFilesMetadata = new Set();
10462
10651
  consumingProjectRootDirectoryAbsolutePath;
10463
10652
  /* ─── Raw Validations Results Specification (Third-party Library Dependent) ────────────────────────────────────── */
10464
10653
  /** @description
@@ -10674,7 +10863,7 @@ class HTML_Validator {
10674
10863
  HTML_Validator.
10675
10864
  getExpectedToBeInitializedSelfSingleInstance().
10676
10865
  queuedFilesMetadata.
10677
- push(targetFileMetadata);
10866
+ add(targetFileMetadata);
10678
10867
  }
10679
10868
  static validateQueuedFilesButReportAll() {
10680
10869
  HTML_Validator.
@@ -10710,7 +10899,7 @@ class HTML_Validator {
10710
10899
  if (!(error instanceof es_extensions_nodejs_1.FileNotFoundError)) {
10711
10900
  es_extensions_1.Logger.logError({
10712
10901
  errorType: "CachedDataRetrievingFailure",
10713
- ...HTML_Validator.localization.cachedPreviousValidationsResultsDataRetrievingFailure({
10902
+ ...HTML_Validator.localization.cachedPreviousValidationsResultsDataRetrievingErrorLog({
10714
10903
  cachedValidationsResultsFileAbsolutePath: this.absolutePathOfCachedValidationsResultsFile
10715
10904
  }),
10716
10905
  occurrenceLocation: "HTML_Validator.retrieveCachedPastValidationsResultsFromFileIfItExists" +
@@ -10738,7 +10927,6 @@ class HTML_Validator {
10738
10927
  /* ━━━ Private Methods ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
10739
10928
  /* ─── Validation ───────────────────────────────────────────────────────────────────────────────────────────────── */
10740
10929
  async validateQueuedFilesButReportAll() {
10741
- const validationsResults = (0, es_extensions_1.createMapBasedOnOtherMap)(this.cachedValidationsResults, (filePathRelativeToConsumingProjectRootDirectory__forwardSlashesSeparatorsOnly, { issues }) => [filePathRelativeToConsumingProjectRootDirectory__forwardSlashesSeparatorsOnly, issues]);
10742
10930
  /* [ Approach ]
10743
10931
  * To get readable logs with code fragment, the original output HTML files can not be used because they possibly
10744
10932
  * contains the minified HTML code.
@@ -10767,13 +10955,7 @@ class HTML_Validator {
10767
10955
  if (cachedValidationsResultsForCurrentFile?.contentMD5Checksum === HTML_ContentMD5_Hash) {
10768
10956
  continue;
10769
10957
  }
10770
- // ━━━ TODO ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
10771
- // TODO По возмоности, вместо validationsResults используй this.cachedValidationsResults
10772
- // Возможно в итоге окажется, что validationsResults больше не нужна.
10773
- // В противном случае потребуется комментарий о том, зачем эта переменная нужна вдобавок к this.cachedValidationsResults
10774
- // Очистка устаревших данных из validationsResults не объясняет, почему эта переменная нужна.
10775
- // Что мешает удалить эти данные раз из this.cachedValidationsResults, если данные всё равно устарели?
10776
- validationsResults.delete(originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly);
10958
+ this.cachedValidationsResults.delete(originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly);
10777
10959
  cachedHTML_CodeExplodedToLinesByRelativePathsOfOriginalHTML_Files.set(originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly, (0, es_extensions_1.splitString)(formattedHTML_Content, "\n"));
10778
10960
  const formattedTemporaryHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly = es_extensions_nodejs_1.ImprovedPath.joinPathSegments([
10779
10961
  this.pathRelativeToConsumingProjectRootOfParentDirectoryOfTemporaryFormattedHTML_Files,
@@ -10794,17 +10976,19 @@ class HTML_Validator {
10794
10976
  if (this.logging.validationStart) {
10795
10977
  es_extensions_1.Logger.logInfo(HTML_Validator.localization.validationStartedInfoLog);
10796
10978
  }
10797
- const validationTimeMeasuringStopwatch = new Stopwatch_1.default().startOrRestart();
10798
10979
  /* [ Theory ] If pass no files to Nu HTML Checker, it will fail with the error. */
10799
10980
  if (formattedTemporaryHTML_FilesPathsRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly.length === 0) {
10800
- HTML_Validator.reportValidationsResults(validationsResults);
10981
+ HTML_Validator.reportValidationsResults({
10982
+ validationsResults: this.cachedValidationsResults,
10983
+ validationPeriod__seconds: 0
10984
+ });
10801
10985
  return;
10802
10986
  }
10987
+ const validationTimeMeasuringStopwatch = new Stopwatch_1.default().startOrRestart();
10803
10988
  const rawValidationsResults = await HTML_Validator.getRawValidationsResultsFromNuHTML_Checker(formattedTemporaryHTML_FilesPathsRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly);
10804
- (0, deleteFilesFromDirectory_1.default)({
10989
+ es_extensions_nodejs_1.ImprovedFileSystem.removeFilesFromDirectory({
10805
10990
  directoryPath__absoluteOrRelative: this.absolutePathOfParentDirectoryOfTemporaryFormattedHTML_Files,
10806
- synchronously: true,
10807
- mustThrowErrorIfSomeFileCanNotBeDeleted: false
10991
+ synchronously: true
10808
10992
  });
10809
10993
  const rawValidationsResultsInspectionOutput = es_extensions_1.RawObjectDataProcessor.process(rawValidationsResults, HTML_Validator.validationsResultsSpecification);
10810
10994
  if (rawValidationsResultsInspectionOutput.isRawDataInvalid) {
@@ -10813,8 +10997,7 @@ class HTML_Validator {
10813
10997
  errorType: es_extensions_1.UnexpectedEventError.NAME,
10814
10998
  title: es_extensions_1.UnexpectedEventError.localization.defaultTitle,
10815
10999
  description: "The Nu HTML Checker does not much with expected one.\n" +
10816
- es_extensions_1.RawObjectDataProcessor.
10817
- formatValidationErrorsList(rawValidationsResultsInspectionOutput.validationErrorsMessages),
11000
+ es_extensions_1.RawObjectDataProcessor.formatValidationErrorsList(rawValidationsResultsInspectionOutput.validationErrorsMessages),
10818
11001
  occurrenceLocation: "HTML_Validator.validateQueuedFilesButReportAll()",
10819
11002
  mustOutputIf: true
10820
11003
  });
@@ -10825,30 +11008,33 @@ class HTML_Validator {
10825
11008
  * The `messages` property is the array of objects each of which has `message` string property.
10826
11009
  * There are could be multiple objects for single file thus sorting by files required first. */
10827
11010
  for (const rawValidationIssue of rawValidationsResultsInspectionOutput.processedData.messages) {
10828
- const filePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly = (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(temporaryFormattedHTML_FilesEncodedURIsAndOriginalHTML_FilesRelativePathsCorrespondence, rawValidationIssue.url);
10829
- relativeToConsumingProjectRootPathsOfOriginalHTML_FilesWillBeValidated__forwardSlashesSeparatorsOnly.delete(filePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly);
10830
- const issuesOfCurrentFile = validationsResults.get(filePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly);
11011
+ const originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly = (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(temporaryFormattedHTML_FilesEncodedURIsAndOriginalHTML_FilesRelativePathsCorrespondence, rawValidationIssue.url);
11012
+ relativeToConsumingProjectRootPathsOfOriginalHTML_FilesWillBeValidated__forwardSlashesSeparatorsOnly.delete(originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly);
11013
+ /* [ Approach ] In the first pass for each file, the value will be undefined. */
11014
+ const issuesOfCurrentFile = this.cachedValidationsResults.
11015
+ get(originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly)?.
11016
+ issues;
10831
11017
  if ((0, es_extensions_1.isUndefined)(issuesOfCurrentFile)) {
10832
- validationsResults.set(filePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly, [
10833
- HTML_Validator.normalizeRawValidationIssue(rawValidationIssue, (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(cachedHTML_CodeExplodedToLinesByRelativePathsOfOriginalHTML_Files, filePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly))
10834
- ]);
11018
+ this.cachedValidationsResults.set(originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly, {
11019
+ contentMD5Checksum: (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(MD5_HashesOfHTML_ContentByRelativePathsOfOriginalHTML_Files, originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly),
11020
+ issues: [
11021
+ HTML_Validator.normalizeRawValidationIssue(rawValidationIssue, (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(cachedHTML_CodeExplodedToLinesByRelativePathsOfOriginalHTML_Files, originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly))
11022
+ ]
11023
+ });
10835
11024
  continue;
10836
11025
  }
10837
- issuesOfCurrentFile.push(HTML_Validator.normalizeRawValidationIssue(rawValidationIssue, (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(cachedHTML_CodeExplodedToLinesByRelativePathsOfOriginalHTML_Files, filePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly)));
11026
+ issuesOfCurrentFile.push(HTML_Validator.normalizeRawValidationIssue(rawValidationIssue, (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(cachedHTML_CodeExplodedToLinesByRelativePathsOfOriginalHTML_Files, originalHTML_FilePathRelativeToConsumingProjectRoot__forwardSlashesSeparatorsOnly)));
10838
11027
  }
10839
11028
  for (const relativeToConsumingProjectRootPathOfOriginalValidHTML_Files__forwardSlashesSeparatorsOnly of relativeToConsumingProjectRootPathsOfOriginalHTML_FilesWillBeValidated__forwardSlashesSeparatorsOnly) {
10840
- validationsResults.set(relativeToConsumingProjectRootPathOfOriginalValidHTML_Files__forwardSlashesSeparatorsOnly, []);
11029
+ this.cachedValidationsResults.set(relativeToConsumingProjectRootPathOfOriginalValidHTML_Files__forwardSlashesSeparatorsOnly, {
11030
+ issues: [],
11031
+ contentMD5Checksum: (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(MD5_HashesOfHTML_ContentByRelativePathsOfOriginalHTML_Files, relativeToConsumingProjectRootPathOfOriginalValidHTML_Files__forwardSlashesSeparatorsOnly)
11032
+ });
10841
11033
  }
10842
- validationTimeMeasuringStopwatch.stop();
10843
- HTML_Validator.reportValidationsResults(validationsResults);
10844
- this.cachedValidationsResults = (0, es_extensions_1.createMapBasedOnOtherMap)(validationsResults, (filePathRelativeToConsumingProjectRootDirectory__forwardSlashesSeparatorsOnly, issues) => [
10845
- filePathRelativeToConsumingProjectRootDirectory__forwardSlashesSeparatorsOnly,
10846
- {
10847
- issues,
10848
- contentMD5Checksum: (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(MD5_HashesOfHTML_ContentByRelativePathsOfOriginalHTML_Files, filePathRelativeToConsumingProjectRootDirectory__forwardSlashesSeparatorsOnly)
10849
- }
10850
- ]);
11034
+ const { seconds: validationPeriod__seconds } = validationTimeMeasuringStopwatch.stop();
11035
+ HTML_Validator.reportValidationsResults({ validationsResults: this.cachedValidationsResults, validationPeriod__seconds });
10851
11036
  this.writeCacheToFile();
11037
+ this.queuedFilesMetadata.clear();
10852
11038
  }
10853
11039
  static async getRawValidationsResultsFromNuHTML_Checker(targetFilesPathRelativeToConsumingProjectRoot__forwardSlashesPathSeparators) {
10854
11040
  return new Promise((resolve, reject) => {
@@ -10950,64 +11136,74 @@ class HTML_Validator {
10950
11136
  };
10951
11137
  }
10952
11138
  /* ─── Reporting ────────────────────────────────────────────────────────────────────────────────────────────────── */
10953
- static reportValidationsResults(validationsResults) {
10954
- // TODO Alphabet order
11139
+ static reportValidationsResults({ validationsResults, validationPeriod__seconds }) {
11140
+ const filesPathsRelativeToConsumingProjectRootSortedByAlphabet__forwardPathSeparatorsOnly = Array.from(validationsResults.keys()).sort();
10955
11141
  let hasAtLeastOneFileWithInvalidHTML = false;
10956
11142
  const hasEachFileIssues = new Map();
10957
11143
  const formattedIssuesForEachFile = new Map();
10958
- for (const [fileRelativePath__forwardPathSeparatorsOnly, issues] of validationsResults.entries()) {
10959
- hasEachFileIssues.set(fileRelativePath__forwardPathSeparatorsOnly, issues.length > 0);
10960
- if (issues.length > 0) {
11144
+ for (const [filePathRelativeToConsumingProjectRoot__forwardPathSeparatorsOnly, { issues }] of validationsResults.entries()) {
11145
+ const hasCurrentFileHTML_ValidityIssues = issues.length > 0;
11146
+ hasEachFileIssues.set(filePathRelativeToConsumingProjectRoot__forwardPathSeparatorsOnly, hasCurrentFileHTML_ValidityIssues);
11147
+ if (hasCurrentFileHTML_ValidityIssues) {
10961
11148
  hasAtLeastOneFileWithInvalidHTML = true;
10962
- formattedIssuesForEachFile.set(fileRelativePath__forwardPathSeparatorsOnly, HTML_Validator.formatValidationResultForSingleFile(issues));
11149
+ formattedIssuesForEachFile.set(filePathRelativeToConsumingProjectRoot__forwardPathSeparatorsOnly, HTML_Validator.formatValidationResultForSingleFile(issues));
10963
11150
  }
10964
11151
  }
10965
11152
  const summary = `${(0, es_extensions_1.surroundLabelByOrnament)({
10966
- label: " Summary ",
11153
+ label: HTML_Validator.localization.validityIssuesDetectedErrorLog.headings.summary,
10967
11154
  ornamentPatten: "━",
11155
+ characterForIndentationAroundLabel: " ",
10968
11156
  prependedPartCharactersCount: 3,
10969
11157
  totalCharactersCount: HTML_Validator.DISPLAYING_MAXIMAL_COLUMNS_COUNT_IN_LOG
10970
11158
  })}\n` +
10971
- Array.from(hasEachFileIssues.entries()).
10972
- map(([fileRelativePath__forwardPathSeparatorsOnly, hasAtLeastOneIssue]) => `${hasAtLeastOneIssue ? "❌" : "✅"} ${fileRelativePath__forwardPathSeparatorsOnly}`).
11159
+ filesPathsRelativeToConsumingProjectRootSortedByAlphabet__forwardPathSeparatorsOnly.
11160
+ map((fileRelativePath__forwardPathSeparatorsOnly) => `${(0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(hasEachFileIssues, fileRelativePath__forwardPathSeparatorsOnly) ?
11161
+ "❌" : "✅"} ` +
11162
+ fileRelativePath__forwardPathSeparatorsOnly).
10973
11163
  join("\n");
10974
11164
  const detailedReport = `${(0, es_extensions_1.surroundLabelByOrnament)({
10975
- label: " Details ",
11165
+ label: HTML_Validator.localization.validityIssuesDetectedErrorLog.headings.details,
10976
11166
  ornamentPatten: "━",
11167
+ characterForIndentationAroundLabel: " ",
10977
11168
  prependedPartCharactersCount: 3,
10978
11169
  totalCharactersCount: HTML_Validator.DISPLAYING_MAXIMAL_COLUMNS_COUNT_IN_LOG
10979
11170
  })}\n` +
10980
- Array.from(formattedIssuesForEachFile.entries()).
10981
- map(([fileRelativePath__forwardPathSeparatorsOnly, formattedIssues]) => `${(0, es_extensions_1.surroundLabelByOrnament)({
10982
- label: ` ${fileRelativePath__forwardPathSeparatorsOnly} `,
11171
+ filesPathsRelativeToConsumingProjectRootSortedByAlphabet__forwardPathSeparatorsOnly.
11172
+ filter((fileRelativePath__forwardPathSeparatorsOnly) => formattedIssuesForEachFile.has(fileRelativePath__forwardPathSeparatorsOnly)).
11173
+ map((fileRelativePath__forwardPathSeparatorsOnly) => `${(0, es_extensions_1.surroundLabelByOrnament)({
11174
+ label: fileRelativePath__forwardPathSeparatorsOnly,
11175
+ characterForIndentationAroundLabel: "",
10983
11176
  ornamentPatten: "─",
10984
11177
  prependedPartCharactersCount: 3,
10985
11178
  totalCharactersCount: HTML_Validator.DISPLAYING_MAXIMAL_COLUMNS_COUNT_IN_LOG
10986
11179
  })}\n` +
10987
- formattedIssues).
11180
+ (0, es_extensions_1.getExpectedToBeNonUndefinedMapValue)(formattedIssuesForEachFile, fileRelativePath__forwardPathSeparatorsOnly)).
10988
11181
  join("\n");
10989
11182
  if (hasAtLeastOneFileWithInvalidHTML) {
10990
11183
  es_extensions_1.Logger.logErrorLikeMessage({
10991
- title: "HTML Validation, Issue(s) Detected",
10992
- description: `${summary}\n\n${detailedReport}`
11184
+ title: HTML_Validator.localization.validityIssuesDetectedErrorLog.title,
11185
+ description: `${summary}\n\n` +
11186
+ `${detailedReport}\n` +
11187
+ HTML_Validator.localization.validityIssuesDetectedErrorLog.generateSecondsElapsedSentence({ validationPeriod__seconds })
10993
11188
  });
10994
- node_notifier_1.default.notify(HTML_Validator.localization.issuesFoundToastNotification);
11189
+ node_notifier_1.default.notify(HTML_Validator.localization.validityIssuesDetectedToastNotification);
10995
11190
  return;
10996
11191
  }
10997
11192
  es_extensions_1.Logger.logSuccess({
10998
- title: "HTML Validation, All Valid",
10999
- description: "All HTML files (except excluded ones if any) contains valid HTML. " +
11000
- "The following files has been checked.\n" +
11001
- Array.from(validationsResults.keys()).
11193
+ title: HTML_Validator.localization.validationFinishedWithoutIssuesSuccessLog.title,
11194
+ description: HTML_Validator.localization.validationFinishedWithoutIssuesSuccessLog.generateDescription({
11195
+ validationPeriod__seconds,
11196
+ preFormattedErrorsMessages: Array.from(validationsResults.keys()).
11002
11197
  map((fileRelativePath__forwardPathSeparatorsOnly) => `● ${fileRelativePath__forwardPathSeparatorsOnly}`).
11003
11198
  join("\n")
11199
+ })
11004
11200
  });
11005
11201
  }
11006
11202
  /* ─── Formatting ───────────────────────────────────────────────────────────────────────────────────────────────── */
11007
11203
  static formatValidationResultForSingleFile(issues) {
11008
11204
  const formattedIssues = [];
11009
11205
  for (const [index, issue] of issues.entries()) {
11010
- /* [ Desired output example ]
11206
+ /* [ Desired Output Example ]
11011
11207
 
11012
11208
  === Issue No. 5 =================================================================================================
11013
11209
  <div class="NewsFeed"></div><a><span></span><a>Foo<div></div><a>bar</a></a>
@@ -11023,6 +11219,7 @@ class HTML_Validator {
11023
11219
  `${(0, es_extensions_1.surroundLabelByOrnament)({
11024
11220
  label: HTML_Validator.localization.generateIssueNumberLabel({ issueNumber: index + 1 }),
11025
11221
  ornamentPatten: "┄",
11222
+ characterForIndentationAroundLabel: " ",
11026
11223
  prependedPartCharactersCount: 3,
11027
11224
  totalCharactersCount: HTML_Validator.DISPLAYING_MAXIMAL_COLUMNS_COUNT_IN_LOG
11028
11225
  })}\n`,
@@ -11041,13 +11238,11 @@ class HTML_Validator {
11041
11238
  return HTML_Validator.localization.issuesTypesTitles.grossViolation;
11042
11239
  case HTML_Validator.NormalizedValidationsResults.Issue.Types.info:
11043
11240
  return HTML_Validator.localization.issuesTypesTitles.recommendationDisregard;
11044
- default:
11045
- return HTML_Validator.localization.issuesTypesTitles.other;
11046
11241
  }
11047
11242
  })()})\n`,
11048
- ...((0, es_extensions_1.isNotUndefined)(issue.lineNumber__numerationFrom1) &&
11243
+ ...(0, es_extensions_1.isNotUndefined)(issue.lineNumber__numerationFrom1) &&
11049
11244
  (0, es_extensions_1.isNotUndefined)(issue.startingColumnNumber__numerationFrom1) &&
11050
- (0, es_extensions_1.isNotUndefined)(issue.endingColumnNumber__numerationFrom1)) ?
11245
+ (0, es_extensions_1.isNotUndefined)(issue.endingColumnNumber__numerationFrom1) ?
11051
11246
  [
11052
11247
  HTML_Validator.localization.generateIssueOccurrenceLocationIndication({
11053
11248
  lineNumber: issue.lineNumber__numerationFrom1,
@@ -11064,21 +11259,25 @@ class HTML_Validator {
11064
11259
  static computeAbsolutePathOfCachedValidationsResultsFileActualForCurrentProjectBuildingMode({ parentDirectoryAbsolutePath, projectBuildingSelectiveExecutionID, consumingProjectBuildingMode }) {
11065
11260
  return es_extensions_nodejs_1.ImprovedPath.joinPathSegments([
11066
11261
  parentDirectoryAbsolutePath,
11067
- `${HTML_Validator.CACHED_VALIDATIONS_RESULTS_FILE_CONSTANT_NAME_PART}.${(0, es_extensions_1.insertSubstring)(projectBuildingSelectiveExecutionID, { modifier: (specifiedProjectBuildingSelectiveExecutionID) => `${specifiedProjectBuildingSelectiveExecutionID}.` })}${(0, es_extensions_1.toLowerCamelCase)(consumingProjectBuildingMode)}.json`
11262
+ [
11263
+ `${HTML_Validator.CACHED_VALIDATIONS_RESULTS_FILE_CONSTANT_NAME_PART}.`,
11264
+ ...(0, es_extensions_1.isUndefined)(projectBuildingSelectiveExecutionID) ? [] : [`${projectBuildingSelectiveExecutionID}.`],
11265
+ `${(0, es_extensions_1.toLowerCamelCase)(consumingProjectBuildingMode)}.json`
11266
+ ].join(".")
11068
11267
  ]);
11069
11268
  }
11070
11269
  writeCacheToFile() {
11071
- es_extensions_nodejs_1.ImprovedFileSystem.createDirectory({
11072
- targetPath: this.absolutePathOfParentDirectoryOfCachedValidationsResultsFile,
11073
- mustThrowErrorIfTargetDirectoryExists: false,
11074
- synchronously: true
11075
- });
11270
+ /* [ Maintainability ] Keep this variable for easier debugging. */
11076
11271
  const cachedValidationsResultsFileContent = Array.from(this.cachedValidationsResults.entries()).
11077
11272
  reduce((accumulatingValue, [filePathRelativeToConsumingProjectRootDirectory, cachedValidationRawResultsForSpecificFile]) => {
11078
11273
  accumulatingValue[filePathRelativeToConsumingProjectRootDirectory] = cachedValidationRawResultsForSpecificFile;
11079
11274
  return accumulatingValue;
11080
11275
  }, {});
11081
- fs_1.default.writeFileSync(this.absolutePathOfCachedValidationsResultsFile, JSON.stringify(cachedValidationsResultsFileContent, null, 2));
11276
+ es_extensions_nodejs_1.ImprovedFileSystem.writeFileToPossiblyNotExistingDirectory({
11277
+ filePath: this.absolutePathOfParentDirectoryOfCachedValidationsResultsFile,
11278
+ content: JSON.stringify(cachedValidationsResultsFileContent, null, 2),
11279
+ synchronously: true
11280
+ });
11082
11281
  }
11083
11282
  /* ━━━ Routines ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
11084
11283
  static getExpectedToBeInitializedSelfSingleInstance() {
@@ -11102,17 +11301,15 @@ class HTML_Validator {
11102
11301
  (function (Types) {
11103
11302
  Types["info"] = "info";
11104
11303
  Types["error"] = "error";
11105
- Types["nonDocumentError"] = "non-document-error";
11106
- Types["networkError"] = "network-error";
11107
11304
  })(Types = Issue.Types || (Issue.Types = {}));
11108
- let Subtypes;
11109
- (function (Subtypes) {
11110
- Subtypes["warning"] = "warning";
11111
- Subtypes["fatal"] = "fatal";
11112
- Subtypes["io"] = "io";
11113
- Subtypes["schema"] = "schema";
11114
- Subtypes["internal"] = "internal";
11115
- })(Subtypes = Issue.Subtypes || (Issue.Subtypes = {}));
11305
+ let SubTypes;
11306
+ (function (SubTypes) {
11307
+ SubTypes["warning"] = "warning";
11308
+ SubTypes["fatal"] = "fatal";
11309
+ SubTypes["io"] = "io";
11310
+ SubTypes["schema"] = "schema";
11311
+ SubTypes["internal"] = "internal";
11312
+ })(SubTypes = Issue.SubTypes || (Issue.SubTypes = {}));
11116
11313
  })(Issue = NormalizedValidationsResults.Issue || (NormalizedValidationsResults.Issue = {}));
11117
11314
  })(NormalizedValidationsResults = HTML_Validator.NormalizedValidationsResults || (HTML_Validator.NormalizedValidationsResults = {}));
11118
11315
  })(HTML_Validator || (HTML_Validator = {}));
@@ -11130,7 +11327,7 @@ exports["default"] = HTML_Validator;
11130
11327
 
11131
11328
  Object.defineProperty(exports, "__esModule", ({ value: true }));
11132
11329
  const HTML_ValidatorLocalization__english = {
11133
- cachedPreviousValidationsResultsDataRetrievingFailure: ({ cachedValidationsResultsFileAbsolutePath }) => ({
11330
+ cachedPreviousValidationsResultsDataRetrievingErrorLog: ({ cachedValidationsResultsFileAbsolutePath }) => ({
11134
11331
  title: "Cached Previous Validations Data Retrieving Failure",
11135
11332
  description: "Unable to read and/or parse the existing HTML validation cache file " +
11136
11333
  `"${cachedValidationsResultsFileAbsolutePath}".`
@@ -11139,12 +11336,27 @@ const HTML_ValidatorLocalization__english = {
11139
11336
  title: "HTML Code Validation Started",
11140
11337
  description: "Validating the output HTML files..."
11141
11338
  },
11142
- // ━━━ TODO ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
11143
- issuesFoundToastNotification: {
11144
- title: "HTML validation, issue(s) found",
11145
- message: "W3C rules violations and / or recommendations neglect detected. Check the console for the details."
11339
+ validityIssuesDetectedErrorLog: {
11340
+ title: "HTML Validation, Issue(s) Detected",
11341
+ headings: {
11342
+ summary: "Summary",
11343
+ details: "Details"
11344
+ },
11345
+ generateSecondsElapsedSentence: ({ validationPeriod__seconds }) => `Seconds elapsed: ${validationPeriod__seconds}`
11146
11346
  },
11147
- generateIssueNumberLabel: ({ issueNumber }) => ` Issue No. ${issueNumber} `,
11347
+ validityIssuesDetectedToastNotification: {
11348
+ title: "HTML Validation, Issue(s) Detected",
11349
+ message: "W3C rules violations and / or recommendations neglect detected. " +
11350
+ "Check the console for the details."
11351
+ },
11352
+ validationFinishedWithoutIssuesSuccessLog: {
11353
+ title: "HTML Validation, All Valid",
11354
+ generateDescription: ({ validationPeriod__seconds, preFormattedErrorsMessages }) => "All HTML files (except excluded ones if any) contains valid HTML. " +
11355
+ "The following files has been checked:\n" +
11356
+ `${preFormattedErrorsMessages}\n` +
11357
+ `Seconds elapsed: ${validationPeriod__seconds}`
11358
+ },
11359
+ generateIssueNumberLabel: ({ issueNumber }) => `Issue No. ${issueNumber}`,
11148
11360
  generateIssueOccurrenceLocationIndication: ({ lineNumber, startingColumnNumber, lastColumnNumber }) => `At line ${lineNumber}, columns ${startingColumnNumber}-${lastColumnNumber}`,
11149
11361
  issuesTypesTitles: {
11150
11362
  grossViolation: "Gross violation",
@@ -12103,7 +12315,6 @@ const SourceCodeProcessingRawSettingsNormalizer_1 = __importDefault(__webpack_re
12103
12315
  const RoutingSettingsNormalizer_1 = __importDefault(__webpack_require__(/*! @MarkupProcessing/RawSettingsNormalizer/RoutingSettingsNormalizer */ "./ProjectBuilding/SourceCodeProcessing/Markup/RawSettingsNormalizer/RoutingSettingsNormalizer.ts"));
12104
12316
  /* ─── Utils ──────────────────────────────────────────────────────────────────────────────────────────────────────── */
12105
12317
  const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "@yamato-daiwa/es-extensions");
12106
- const removeMultipleElementsFromSetByPredicate_1 = __importDefault(__webpack_require__(/*! @UtilsIncubator/Set/removeMultipleElementsFromSetByPredicate */ "./UtilsIncubator/Set/removeMultipleElementsFromSetByPredicate.ts"));
12107
12318
  const isSubdirectory_1 = __importDefault(__webpack_require__(/*! @UtilsIncubator/NodeJS/isSubdirectory */ "./UtilsIncubator/NodeJS/isSubdirectory.ts"));
12108
12319
  const es_extensions_nodejs_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions-nodejs */ "@yamato-daiwa/es-extensions-nodejs");
12109
12320
  /* ─── Localization ───────────────────────────────────────────────────────────────────────────────────────────────── */
@@ -12149,7 +12360,6 @@ class MarkupProcessingRawSettingsNormalizer extends SourceCodeProcessingRawSetti
12149
12360
  pagesVariations: dataHoldingSelfInstance.normalizeStaticPreviewPagesVariationsSettings(),
12150
12361
  importsFromStaticDataFiles: dataHoldingSelfInstance.normalizeImportsFromStaticDataFiles()
12151
12362
  },
12152
- /* TODO Replace value of `absolutePathsOfSectioningToCache`. https://trello.com/c/RJfFF7oh */
12153
12363
  ...(0, es_extensions_1.isNotUndefined)(markupProcessingSettings__fromFile__rawValid.routing) ? {
12154
12364
  routing: {
12155
12365
  variable: markupProcessingSettings__fromFile__rawValid.routing.variable,
@@ -12526,7 +12736,7 @@ class MarkupProcessingRawSettingsNormalizer extends SourceCodeProcessingRawSetti
12526
12736
  excludedFilesPathsRelativeToSourcesFilesTopDirectory?.
12527
12737
  map((excludedFilePathRelativeRelativeToSourcesFileTopDirectory) => es_extensions_nodejs_1.ImprovedPath.joinPathSegments([sourceFilesTopDirectoryAbsolutePath, excludedFilePathRelativeRelativeToSourcesFileTopDirectory], { alwaysForwardSlashSeparators: true })) ??
12528
12738
  []).
12529
- concat(Array.from((0, removeMultipleElementsFromSetByPredicate_1.default)({
12739
+ concat(Array.from((0, es_extensions_1.removeMultipleElementsFromSetByPredicate)({
12530
12740
  targetSet: this.unusedCommonlyExcludedFromLocalizationEntryPointsSourceFilesAbsolutePaths,
12531
12741
  predicate: (commonlyExcludedFromLocalizationEntryPointsSourceFileAbsolutePath) => (0, isSubdirectory_1.default)({
12532
12742
  whichPath: commonlyExcludedFromLocalizationEntryPointsSourceFileAbsolutePath,
@@ -12625,7 +12835,7 @@ const markupProcessingRawSettingsNormalizerLocalization__english = {
12625
12835
  `paths has not been specified for the "${consumingProjectBuildingMode}" building mode. ` +
12626
12836
  "The resources references will be resolved to relative paths instead. " +
12627
12837
  "If you wish these references be resolved to relative path, set \"$projectBuilding.$markupProcessing.$common." +
12628
- "$buildingModeDependent.[PROJECT_BUILDING_MODE].$mustResolveResourceReferencesToRelativePaths\" " +
12838
+ "$buildingModeDependent.[PROJECT_BUILDING_MODE].$mustResolveResourcesPointersToRelativePaths\" " +
12629
12839
  `to true for the "${consumingProjectBuildingMode}" building mode.`
12630
12840
  }),
12631
12841
  generateStaticPreviewStateDependentPagesVariationsSpecificationFileReadingFailedMessage: (templateVariables) => "Failed to read the static preview state dependent pages variations specification file at " +
@@ -15844,6 +16054,21 @@ class VinylFileClass extends vinyl_1.default {
15844
16054
  exports["default"] = VinylFileClass;
15845
16055
 
15846
16056
 
16057
+ /***/ }),
16058
+
16059
+ /***/ "./Utils/VoidPromiseReturningFunction.ts":
16060
+ /*!***********************************************!*\
16061
+ !*** ./Utils/VoidPromiseReturningFunction.ts ***!
16062
+ \***********************************************/
16063
+ /***/ ((__unused_webpack_module, exports) => {
16064
+
16065
+
16066
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
16067
+ exports.voidPromiseReturningFunction = void 0;
16068
+ const voidPromiseReturningFunction = async () => Promise.resolve();
16069
+ exports.voidPromiseReturningFunction = voidPromiseReturningFunction;
16070
+
16071
+
15847
16072
  /***/ }),
15848
16073
 
15849
16074
  /***/ "./Utils/createImmediatelyEndingEmptyStream.ts":
@@ -15883,59 +16108,6 @@ function extractStringifiedContentFromVinylFile(targetFile) {
15883
16108
  }
15884
16109
 
15885
16110
 
15886
- /***/ }),
15887
-
15888
- /***/ "./UtilsIncubator/@yamato-daiwa/es-extensions-nodejs/ImprovedFileSystem/deleteFilesFromDirectory.ts":
15889
- /*!**********************************************************************************************************!*\
15890
- !*** ./UtilsIncubator/@yamato-daiwa/es-extensions-nodejs/ImprovedFileSystem/deleteFilesFromDirectory.ts ***!
15891
- \**********************************************************************************************************/
15892
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
15893
-
15894
-
15895
- var __importDefault = (this && this.__importDefault) || function (mod) {
15896
- return (mod && mod.__esModule) ? mod : { "default": mod };
15897
- };
15898
- Object.defineProperty(exports, "__esModule", ({ value: true }));
15899
- exports["default"] = deleteFilesFromDirectory;
15900
- const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
15901
- const promises_1 = __importDefault(__webpack_require__(/*! fs/promises */ "fs/promises"));
15902
- const es_extensions_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions */ "@yamato-daiwa/es-extensions");
15903
- const es_extensions_nodejs_1 = __webpack_require__(/*! @yamato-daiwa/es-extensions-nodejs */ "@yamato-daiwa/es-extensions-nodejs");
15904
- function deleteFilesFromDirectory({ directoryPath__absoluteOrRelative, targetFileNamesExtensions, mustThrowErrorIfSomeFileCanNotBeDeleted, synchronously }) {
15905
- const targetFilesAbsolutePaths = es_extensions_nodejs_1.ImprovedGlob.getFilesAbsolutePathsSynchronously([
15906
- es_extensions_nodejs_1.ImprovedGlob.buildAllFilesInCurrentDirectoryAndBelowGlobSelector({
15907
- basicDirectoryPath: directoryPath__absoluteOrRelative,
15908
- fileNamesExtensions: targetFileNamesExtensions
15909
- })
15910
- ]);
15911
- if (synchronously) {
15912
- for (const targetFilesAbsolutePath of targetFilesAbsolutePaths) {
15913
- try {
15914
- fs_1.default.unlinkSync(targetFilesAbsolutePath);
15915
- }
15916
- catch (error) {
15917
- if (mustThrowErrorIfSomeFileCanNotBeDeleted) {
15918
- es_extensions_1.Logger.throwErrorAndLog({
15919
- errorType: "FileDeletingFailure",
15920
- title: "File Deleting Failed",
15921
- description: `The error has occurred during deleting of the file with path "${targetFilesAbsolutePath}".`,
15922
- occurrenceLocation: "deleteFilesFromDirectory(compoundParameter)",
15923
- innerError: error
15924
- });
15925
- }
15926
- }
15927
- }
15928
- return;
15929
- }
15930
- return new Promise((resolve, reject) => {
15931
- Promise.
15932
- all(targetFilesAbsolutePaths.map(async (targetFilesAbsolutePath) => promises_1.default.unlink(targetFilesAbsolutePath))).
15933
- then(resolve).
15934
- catch(reject);
15935
- });
15936
- }
15937
-
15938
-
15939
16111
  /***/ }),
15940
16112
 
15941
16113
  /***/ "./UtilsIncubator/NodeJS/isSubdirectory.ts":
@@ -15957,32 +16129,6 @@ function isSubdirectory({ whichPath, ofWhichPath }) {
15957
16129
  }
15958
16130
 
15959
16131
 
15960
- /***/ }),
15961
-
15962
- /***/ "./UtilsIncubator/Set/removeMultipleElementsFromSetByPredicate.ts":
15963
- /*!************************************************************************!*\
15964
- !*** ./UtilsIncubator/Set/removeMultipleElementsFromSetByPredicate.ts ***!
15965
- \************************************************************************/
15966
- /***/ ((__unused_webpack_module, exports) => {
15967
-
15968
-
15969
- Object.defineProperty(exports, "__esModule", ({ value: true }));
15970
- exports["default"] = removeMultipleElementsFromSetByPredicate;
15971
- function removeMultipleElementsFromSetByPredicate({ targetSet, predicate }) {
15972
- const removedElements = [];
15973
- for (const element of targetSet) {
15974
- if (predicate(element)) {
15975
- targetSet.delete(element);
15976
- removedElements.push(element);
15977
- }
15978
- }
15979
- return {
15980
- updatedSet: targetSet,
15981
- removedElements
15982
- };
15983
- }
15984
-
15985
-
15986
16132
  /***/ }),
15987
16133
 
15988
16134
  /***/ "./UtilsIncubator/Stopwatch.ts":
@@ -16113,6 +16259,16 @@ module.exports = require("browser-sync");
16113
16259
 
16114
16260
  /***/ }),
16115
16261
 
16262
+ /***/ "child_process":
16263
+ /*!********************************!*\
16264
+ !*** external "child_process" ***!
16265
+ \********************************/
16266
+ /***/ ((module) => {
16267
+
16268
+ module.exports = require("child_process");
16269
+
16270
+ /***/ }),
16271
+
16116
16272
  /***/ "cssnano":
16117
16273
  /*!**************************!*\
16118
16274
  !*** external "cssnano" ***!
@@ -16143,16 +16299,6 @@ module.exports = require("eslint");
16143
16299
 
16144
16300
  /***/ }),
16145
16301
 
16146
- /***/ "fork-ts-checker-webpack-plugin":
16147
- /*!*************************************************!*\
16148
- !*** external "fork-ts-checker-webpack-plugin" ***!
16149
- \*************************************************/
16150
- /***/ ((module) => {
16151
-
16152
- module.exports = require("fork-ts-checker-webpack-plugin");
16153
-
16154
- /***/ }),
16155
-
16156
16302
  /***/ "fs":
16157
16303
  /*!*********************!*\
16158
16304
  !*** external "fs" ***!
@@ -16163,16 +16309,6 @@ module.exports = require("fs");
16163
16309
 
16164
16310
  /***/ }),
16165
16311
 
16166
- /***/ "fs/promises":
16167
- /*!******************************!*\
16168
- !*** external "fs/promises" ***!
16169
- \******************************/
16170
- /***/ ((module) => {
16171
-
16172
- module.exports = require("fs/promises");
16173
-
16174
- /***/ }),
16175
-
16176
16312
  /***/ "gulp":
16177
16313
  /*!***********************!*\
16178
16314
  !*** external "gulp" ***!
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yamato-daiwa/automation",
3
- "version": "0.7.0-alpha.6",
3
+ "version": "0.7.0",
4
4
  "description": "The project building tool with declarative YAML configuration specializing on Pug, Stylus and TypeScript as source code languages.",
5
5
  "keywords": [
6
6
  "build",
@@ -20,26 +20,25 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "@eslint-community/eslint-plugin-eslint-comments": "4.5.0",
23
- "@stylistic/eslint-plugin": "4.4.1",
24
- "@typescript-eslint/eslint-plugin": "8.33.1",
25
- "@typescript-eslint/parser": "8.33.1",
26
- "@vue/compiler-sfc": "3.5.16",
23
+ "@stylistic/eslint-plugin": "5.2.2",
24
+ "@typescript-eslint/eslint-plugin": "8.38.0",
25
+ "@typescript-eslint/parser": "8.38.0",
26
+ "@vue/compiler-sfc": "3.5.18",
27
27
  "@webdiscus/pug-loader": "2.11.1",
28
- "@yamato-daiwa/es-extensions": "1.8.0-experimental.0",
29
- "@yamato-daiwa/es-extensions-nodejs": "1.8.0-experimental.0",
30
- "@yamato-daiwa/style_guides": "0.7.0",
28
+ "@yamato-daiwa/es-extensions": "1.8.0-rc.1",
29
+ "@yamato-daiwa/es-extensions-nodejs": "1.8.0-rc.1",
30
+ "@yamato-daiwa/style_guides": "0.8.1",
31
31
  "autoprefixer": "10.4.21",
32
32
  "browser-sync": "3.0.4",
33
33
  "css-loader": "7.1.2",
34
- "cssnano": "7.0.7",
34
+ "cssnano": "7.1.0",
35
35
  "dotenv": "16.5.0",
36
- "eslint": "9.28.0",
37
- "eslint-plugin-import": "2.31.0",
38
- "eslint-plugin-n": "17.19.0",
36
+ "eslint": "9.32.0",
37
+ "eslint-plugin-import": "2.32.0",
38
+ "eslint-plugin-n": "17.21.3",
39
39
  "eslint-plugin-react": "7.37.5",
40
40
  "eslint-plugin-vue": "9.33.0",
41
41
  "eslint-plugin-vue-pug": "0.6.2",
42
- "fork-ts-checker-webpack-plugin": "7.3.0",
43
42
  "gulp": "4.0.2",
44
43
  "gulp-data": "1.3.1",
45
44
  "gulp-if": "3.0.0",
@@ -74,8 +73,8 @@
74
73
  "vnu-jar": "24.10.17",
75
74
  "vue-loader": "17.4.2",
76
75
  "vue-style-loader": "4.1.3",
77
- "vue-tsc": "2.2.10",
78
- "webpack": "5.99.9",
76
+ "vue-tsc": "3.0.5",
77
+ "webpack": "5.101.0",
79
78
  "webpack-node-externals": "3.0.0",
80
79
  "webpack-stream": "7.0.0",
81
80
  "worker-loader": "3.0.8",
@@ -85,7 +84,7 @@
85
84
  "@types/browser-sync": "2.29.0",
86
85
  "@types/cssnano": "5.0.0",
87
86
  "@types/gulp": "4.0.17",
88
- "@types/gulp-if": "3.0.4",
87
+ "@types/gulp-if": "3.0.5",
89
88
  "@types/gulp-imagemin": "7.0.3",
90
89
  "@types/gulp-nodemon": "0.0.37",
91
90
  "@types/gulp-plumber": "0.0.37",