tnp-helpers 19.0.52 → 19.0.53

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 (99) hide show
  1. package/browser/README.md +24 -24
  2. package/browser/fesm2022/tnp-helpers.mjs +180 -7
  3. package/browser/fesm2022/tnp-helpers.mjs.map +1 -1
  4. package/browser/lib/base/classes/base-cli-worker/base-cli-worker.d.ts +4 -1
  5. package/browser/lib/base/classes/base-docker.d.ts +16 -0
  6. package/browser/lib/base/classes/base-git.d.ts +1 -0
  7. package/browser/lib/base/classes/base-project.d.ts +2 -0
  8. package/browser/lib/base/tcp-udp-ports/tcp-udp-ports.context.d.ts +1 -6
  9. package/browser/lib/build-info._auto-generated_.d.ts +1 -1
  10. package/browser/lib/utils.d.ts +41 -0
  11. package/browser/package.json +1 -1
  12. package/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.js +4 -2
  13. package/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.js.map +1 -1
  14. package/lib/base/classes/base-cli-worker/base-cli-worker.d.ts +4 -1
  15. package/lib/base/classes/base-cli-worker/base-cli-worker.js +33 -6
  16. package/lib/base/classes/base-cli-worker/base-cli-worker.js.map +1 -1
  17. package/lib/base/classes/base-command-line-feature.backend.d.ts +47 -0
  18. package/lib/base/classes/base-command-line-feature.backend.js +147 -0
  19. package/lib/base/classes/base-command-line-feature.backend.js.map +1 -0
  20. package/lib/base/classes/base-docker.d.ts +15 -0
  21. package/lib/base/classes/base-docker.js +57 -0
  22. package/lib/base/classes/base-docker.js.map +1 -0
  23. package/lib/base/classes/base-file-operations.d.ts +0 -0
  24. package/lib/base/classes/base-file-operations.js +5 -0
  25. package/lib/base/classes/base-file-operations.js.map +1 -0
  26. package/lib/base/classes/base-git.d.ts +1 -0
  27. package/lib/base/classes/base-git.js +4 -0
  28. package/lib/base/classes/base-git.js.map +1 -1
  29. package/lib/base/classes/base-global-command-line.backend.d.ts +5 -0
  30. package/lib/base/classes/base-global-command-line.backend.js +127 -31
  31. package/lib/base/classes/base-global-command-line.backend.js.map +1 -1
  32. package/lib/base/classes/base-project.d.ts +2 -0
  33. package/lib/base/classes/base-project.js +3 -0
  34. package/lib/base/classes/base-project.js.map +1 -1
  35. package/lib/base/classes/base-vscode.js +7 -1
  36. package/lib/base/classes/base-vscode.js.map +1 -1
  37. package/lib/base/tcp-udp-ports/not-assignable-port.entity.js +2 -2
  38. package/lib/base/tcp-udp-ports/ports.entity.d.ts +1 -1
  39. package/lib/base/tcp-udp-ports/tcp-udp-ports.context.d.ts +3 -8
  40. package/lib/build-info._auto-generated_.d.ts +1 -1
  41. package/lib/build-info._auto-generated_.js +1 -1
  42. package/lib/env/env.angular-node-app.d.ts +2 -0
  43. package/lib/env/env.angular-node-app.js +4 -2
  44. package/lib/env/env.angular-node-app.js.map +1 -1
  45. package/lib/env/env.docs-webapp.d.ts +2 -0
  46. package/lib/env/env.docs-webapp.js +4 -2
  47. package/lib/env/env.docs-webapp.js.map +1 -1
  48. package/lib/env/env.electron-app.d.ts +2 -0
  49. package/lib/env/env.electron-app.js +4 -2
  50. package/lib/env/env.electron-app.js.map +1 -1
  51. package/lib/env/env.mobile-app.d.ts +2 -0
  52. package/lib/env/env.mobile-app.js +4 -2
  53. package/lib/env/env.mobile-app.js.map +1 -1
  54. package/lib/env/env.npm-lib-and-cli-tool.d.ts +2 -0
  55. package/lib/env/env.npm-lib-and-cli-tool.js +4 -2
  56. package/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
  57. package/lib/env/env.vscode-plugin.d.ts +2 -0
  58. package/lib/env/env.vscode-plugin.js +4 -2
  59. package/lib/env/env.vscode-plugin.js.map +1 -1
  60. package/lib/helpers/for-backend/helpers-dependencies.backend.d.ts +3 -0
  61. package/lib/helpers/for-backend/helpers-dependencies.backend.js +34 -0
  62. package/lib/helpers/for-backend/helpers-dependencies.backend.js.map +1 -0
  63. package/lib/helpers/for-backend/helpers-file-folders.js +1 -1
  64. package/lib/helpers/for-backend/helpers-file-folders.js.map +1 -1
  65. package/lib/helpers/for-backend/helpers-git.backend.js +3 -4
  66. package/lib/helpers/for-backend/helpers-git.backend.js.map +1 -1
  67. package/lib/helpers/for-browser/angular.helper.js +2 -2
  68. package/lib/helpers/helpers-numbers.js.map +1 -1
  69. package/lib/old/base-component.js +2 -2
  70. package/lib/old/base-formly-component.js +2 -2
  71. package/lib/old/dual-component-ctrl.js +2 -2
  72. package/lib/utils.d.ts +41 -0
  73. package/lib/utils.js +124 -9
  74. package/lib/utils.js.map +1 -1
  75. package/lib/validators/validators-firedev.d.ts +3 -0
  76. package/lib/validators/validators-firedev.js +34 -0
  77. package/lib/validators/validators-firedev.js.map +1 -0
  78. package/lib/validators/validators-git.d.ts +3 -0
  79. package/lib/validators/validators-git.js +13 -0
  80. package/lib/validators/validators-git.js.map +1 -0
  81. package/lib/validators/validators-network.d.ts +3 -0
  82. package/lib/validators/validators-network.js +19 -0
  83. package/lib/validators/validators-network.js.map +1 -0
  84. package/lib/validators/validators.d.ts +6 -0
  85. package/lib/validators/validators.js +11 -0
  86. package/lib/validators/validators.js.map +1 -0
  87. package/package.json +1 -1
  88. package/tmp-environment.json +33 -0
  89. package/websql/README.md +24 -24
  90. package/websql/fesm2022/tnp-helpers.mjs +180 -7
  91. package/websql/fesm2022/tnp-helpers.mjs.map +1 -1
  92. package/websql/lib/base/classes/base-cli-worker/base-cli-worker.d.ts +4 -1
  93. package/websql/lib/base/classes/base-docker.d.ts +16 -0
  94. package/websql/lib/base/classes/base-git.d.ts +1 -0
  95. package/websql/lib/base/classes/base-project.d.ts +2 -0
  96. package/websql/lib/base/tcp-udp-ports/tcp-udp-ports.context.d.ts +1 -6
  97. package/websql/lib/build-info._auto-generated_.d.ts +1 -1
  98. package/websql/lib/utils.d.ts +41 -0
  99. package/websql/package.json +1 -1
@@ -1,9 +1,9 @@
1
1
  import { Subject } from 'rxjs';
2
- import { CoreModels, Utils, crossPlatformPath, _, CoreHelpers, Helpers as Helpers$1, UtilsTerminal, path, fse, chalk } from 'tnp-core/websql';
2
+ import { CoreModels, Utils, crossPlatformPath, path, _, CoreHelpers, UtilsTerminal, Helpers as Helpers$1, fse, chalk } from 'tnp-core/websql';
3
3
  import { isImportDeclaration, isNamedImports, isExportDeclaration, isNamedExports, createSourceFile, ScriptTarget, ScriptKind } from 'typescript';
4
+ import { CLASS } from 'typescript-class-helpers/websql';
4
5
  import * as fuzzy from 'fuzzy';
5
6
  import { Level } from 'ng2-logger/websql';
6
- import { CLASS } from 'typescript-class-helpers/websql';
7
7
  import { __decorate, __metadata, __param } from 'tslib';
8
8
  import { Taon, BaseContext } from 'taon/websql';
9
9
  import { config, folderName, fileName } from 'tnp-config/websql';
@@ -1513,6 +1513,8 @@ var UtilsQuickFixes;
1513
1513
  /* */
1514
1514
  /* */
1515
1515
  /* */
1516
+ /* */
1517
+ /* */
1516
1518
  return (void 0);
1517
1519
  };
1518
1520
  })(UtilsQuickFixes || (UtilsQuickFixes = {}));
@@ -1669,6 +1671,10 @@ var UtilsDotFile;
1669
1671
  /* */
1670
1672
  /* */
1671
1673
  /* */
1674
+ /* */
1675
+ /* */
1676
+ /* */
1677
+ /* */
1672
1678
  return (void 0);
1673
1679
  };
1674
1680
  //#endregion
@@ -1706,6 +1712,12 @@ var UtilsDotFile;
1706
1712
  /* */
1707
1713
  /* */
1708
1714
  /* */
1715
+ /* */
1716
+ /* */
1717
+ /* */
1718
+ /* */
1719
+ /* */
1720
+ /* */
1709
1721
  return (void 0);
1710
1722
  };
1711
1723
  //#endregion
@@ -1733,6 +1745,8 @@ var UtilsDotFile;
1733
1745
  /* */
1734
1746
  /* */
1735
1747
  /* */
1748
+ /* */
1749
+ /* */
1736
1750
  return (void 0);
1737
1751
  };
1738
1752
  //#endregion
@@ -2082,6 +2096,10 @@ var UtilsZip;
2082
2096
  /* */
2083
2097
  /* */
2084
2098
  /* */
2099
+ /* */
2100
+ /* */
2101
+ /* */
2102
+ /* */
2085
2103
  return (void 0);
2086
2104
  };
2087
2105
  // Unzip: `/some/path/folder.zip` → `/some/path/folder`
@@ -2560,6 +2578,120 @@ var UtilsPasswords;
2560
2578
  // })();
2561
2579
  })(UtilsPasswords || (UtilsPasswords = {}));
2562
2580
  //#endregion
2581
+ //#region utils filepath metadata
2582
+ var FilePathMetaData;
2583
+ (function (FilePathMetaData) {
2584
+ const TERMINATOR = 'xxxxx'; // terminates metadata block
2585
+ const KV_SEPARATOR = '...'; // key/value separator
2586
+ const PAIR_SEPARATOR = 'IxIxI'; // between pairs
2587
+ //#region embed data into filename
2588
+ /**
2589
+ * Embed metadata into filename while preserving the extension.
2590
+ *
2591
+ * Example:
2592
+ * embedData({ version: "1.2.3", envName: "__" }, "project.zip")
2593
+ * -> "version|-|1.2.3||--||envName|-|__|||project.zip"
2594
+ */
2595
+ function embedData(data, orgFilename, options) {
2596
+ options = options || {};
2597
+ const ext = path.extname(orgFilename);
2598
+ const base = path.basename(orgFilename, ext);
2599
+ const meta = Object.entries(data)
2600
+ .map(([key, value]) => `${key}${KV_SEPARATOR}${value ?? ''}`)
2601
+ .join(PAIR_SEPARATOR);
2602
+ return `${meta}${TERMINATOR}${options.skipAddingBasenameAtEnd ? '' : base}${ext}`;
2603
+ }
2604
+ FilePathMetaData.embedData = embedData;
2605
+ //#endregion
2606
+ //#region extract data from filename
2607
+ /**
2608
+ * Extract metadata from filename (reverse of embedData).
2609
+ *
2610
+ * Example:
2611
+ * extractData<{ version: string; env: string }>("myfile__version-1.2.3__env-prod.zip")
2612
+ * -> { version: "1.2.3", env: "prod" }
2613
+ */
2614
+ function extractData(filename) {
2615
+ const ext = path.extname(filename);
2616
+ const thereIsNoExt = ext.includes('|') || ext.includes('-');
2617
+ const base = thereIsNoExt ? filename : path.basename(filename, ext);
2618
+ // Everything BEFORE the FIRST TERMINATOR
2619
+ const idx = base.lastIndexOf(TERMINATOR);
2620
+ const metaPart = idx >= 0 ? base.substring(0, idx) : base;
2621
+ const data = {};
2622
+ let cursor = 0;
2623
+ while (cursor <= metaPart.length) {
2624
+ const sepIdx = metaPart.indexOf(PAIR_SEPARATOR, cursor);
2625
+ const segment = sepIdx === -1
2626
+ ? metaPart.substring(cursor)
2627
+ : metaPart.substring(cursor, sepIdx);
2628
+ if (segment) {
2629
+ const kvIdx = segment.indexOf(KV_SEPARATOR);
2630
+ if (kvIdx > -1) {
2631
+ const key = segment.substring(0, kvIdx);
2632
+ const value = segment.substring(kvIdx + KV_SEPARATOR.length);
2633
+ data[key] = value;
2634
+ }
2635
+ }
2636
+ if (sepIdx === -1)
2637
+ break;
2638
+ cursor = sepIdx + PAIR_SEPARATOR.length;
2639
+ }
2640
+ return data;
2641
+ }
2642
+ FilePathMetaData.extractData = extractData;
2643
+ //#endregion
2644
+ //#region get only metadata string
2645
+ FilePathMetaData.getOnlyMetadataString = (filename) => {
2646
+ const ext = path.extname(filename);
2647
+ const base = path.basename(filename, ext);
2648
+ const idx = base.lastIndexOf(TERMINATOR);
2649
+ if (idx === -1)
2650
+ return ''; // no terminator
2651
+ const metaPart = base.substring(0, idx);
2652
+ if (!metaPart.trim())
2653
+ return ''; // empty metadata
2654
+ return metaPart;
2655
+ };
2656
+ //#endregion
2657
+ })(FilePathMetaData || (FilePathMetaData = {}));
2658
+ //#endregion
2659
+ //#region utils cli
2660
+ /**
2661
+ * Easy way to connect CLI commands to cli class methods.
2662
+ *
2663
+ * Example:
2664
+ * in clic class
2665
+ * $FirstCli {
2666
+ *
2667
+ * @UtilsCliMethod.decorator('doSomething')
2668
+ * doSomething() {
2669
+ * console.log('doing something');
2670
+ * }
2671
+ * }
2672
+ *
2673
+ * UtilsCliMethod.getFrom($FirstCli.prototype.doSomething) // "firstcli:dosomething"
2674
+ *
2675
+ */
2676
+ var UtilsCliMethod;
2677
+ (function (UtilsCliMethod) {
2678
+ const CLI_METHOD_KEY = Symbol('cliMethod');
2679
+ UtilsCliMethod.decorator = (methodName) => {
2680
+ return (target, propertyKey, descriptor) => {
2681
+ // If name not given, fallback to property key
2682
+ Reflect.defineMetadata(CLI_METHOD_KEY, `${_.camelCase(CLASS.getName(target?.constructor)).toLowerCase()}` +
2683
+ `:${_.camelCase(methodName ?? propertyKey).toLowerCase()}`, descriptor.value);
2684
+ };
2685
+ };
2686
+ UtilsCliMethod.getFrom = (ClassPrototypeMethodFnHere, globalMethod = false) => {
2687
+ const fullCliMethodName = Reflect.getMetadata(CLI_METHOD_KEY, ClassPrototypeMethodFnHere);
2688
+ if (globalMethod) {
2689
+ return fullCliMethodName.split(':')[1];
2690
+ }
2691
+ return fullCliMethodName;
2692
+ };
2693
+ })(UtilsCliMethod || (UtilsCliMethod = {}));
2694
+ //#endregion
2563
2695
 
2564
2696
  class HelpersArrayObj {
2565
2697
  from(s) {
@@ -5458,7 +5590,9 @@ class BaseCliWorkerTerminalUI {
5458
5590
  async infoScreen(options) {
5459
5591
  options = options || {};
5460
5592
  while (true) {
5461
- Helpers$1.clearConsole();
5593
+ if (!UtilsTerminal.isVerboseModeTaon()) {
5594
+ UtilsTerminal.clearConsole();
5595
+ }
5462
5596
  await this.header();
5463
5597
  await this.infoMessageBelowHeader();
5464
5598
  const choices = this.getWorkerTerminalActions(options);
@@ -5486,6 +5620,21 @@ const WORKER_INIT_START_TIME_LIMIT = 25; // 15 seconds max to start worker
5486
5620
  const START_PORT_FOR_SERVICES = 3600;
5487
5621
  //#endregion
5488
5622
  class BaseCliWorker {
5623
+ // private workerRemoteContextFor: {
5624
+ // [ipAddressOfTaonInstance: string]: ReturnType<typeof Taon.createContext>;
5625
+ // } = {};
5626
+ async getRemoteControllerFor(ipAddressOfTaonInstance, port) {
5627
+ // this.workerRemoteContextFor[ipAddressOfTaonInstance] =
5628
+ const remoteCtx = this.workerContextTemplate();
5629
+ // this.workerRemoteContextFor[ipAddressOfTaonInstance] = remoteCtx;
5630
+ const useHttps = ipAddressOfTaonInstance !== CoreModels.localhostIp127;
5631
+ const protocol = useHttps ? 'https' : 'http';
5632
+ const contextForRemoteConnection = await remoteCtx.initialize({
5633
+ overrideRemoteHost: `${protocol}://${ipAddressOfTaonInstance}${port ? `:${port}` : ''}`,
5634
+ });
5635
+ const taonProjectsController = contextForRemoteConnection.getInstanceBy(this.controllerClass);
5636
+ return taonProjectsController;
5637
+ }
5489
5638
  //#region fields & getters / path to process local info
5490
5639
  get pathToProcessLocalInfoJson() {
5491
5640
  /* */
@@ -5541,7 +5690,12 @@ class BaseCliWorker {
5541
5690
  * start normally process
5542
5691
  * this will crash if process already started
5543
5692
  */
5544
- async startNormallyInCurrentProcess() {
5693
+ async startNormallyInCurrentProcess(options) {
5694
+ /* */
5695
+ /* */
5696
+ /* */
5697
+ /* */
5698
+ /* */
5545
5699
  /* */
5546
5700
  /* */
5547
5701
  /* */
@@ -5698,6 +5852,7 @@ class BaseCliWorker {
5698
5852
  /* */
5699
5853
  /* */
5700
5854
  /* */
5855
+ /* */
5701
5856
  return (void 0);
5702
5857
  }
5703
5858
  //#endregion
@@ -5772,6 +5927,8 @@ class BaseCliWorker {
5772
5927
  /* */
5773
5928
  /* */
5774
5929
  /* */
5930
+ /* */
5931
+ /* */
5775
5932
  return (void 0);
5776
5933
  }
5777
5934
  //#endregion
@@ -5976,6 +6133,8 @@ class BaseCliWorker {
5976
6133
  /* */
5977
6134
  /* */
5978
6135
  /* */
6136
+ /* */
6137
+ /* */
5979
6138
  return (void 0);
5980
6139
  }
5981
6140
  //#endregion
@@ -6013,6 +6172,7 @@ class BaseCliWorker {
6013
6172
  /* */
6014
6173
  /* */
6015
6174
  /* */
6175
+ /* */
6016
6176
  return (void 0);
6017
6177
  }
6018
6178
  //#endregion
@@ -7004,7 +7164,7 @@ const PROJECT_NPM_NAME = 'tnp-helpers';
7004
7164
  /**
7005
7165
  * Autogenerated by current cli tool. Use *tnp release* to bump version.
7006
7166
  */
7007
- const CURRENT_PACKAGE_VERSION = '19.0.52';
7167
+ const CURRENT_PACKAGE_VERSION = '19.0.53';
7008
7168
  // THIS FILE IS GENERATED - DO NOT MODIFY
7009
7169
 
7010
7170
  //#endregion
@@ -7392,6 +7552,9 @@ class BaseProject {
7392
7552
  /* */
7393
7553
  /* */
7394
7554
  /* */
7555
+ /* */
7556
+ /* */
7557
+ /* */
7395
7558
  //#endregion
7396
7559
  //#region methods & getters / is monorepo
7397
7560
  /**
@@ -12238,6 +12401,10 @@ class BaseGit extends BaseFeatureForProject {
12238
12401
  resetIsRestingAlsoChildren() {
12239
12402
  return true;
12240
12403
  }
12404
+ //#endregion
12405
+ useBranchNameDirectlyAsCommitMessage() {
12406
+ return false;
12407
+ }
12241
12408
  }
12242
12409
 
12243
12410
  //#endregion
@@ -12560,7 +12727,10 @@ class BaseVscodeHelpers extends BaseFeatureForProject {
12560
12727
  await this.recreateBaseSettings();
12561
12728
  this.recreateWindowTitle();
12562
12729
  if (!options.skipHiddingTempFiles) {
12563
- this.toogleFilesVisibilityInVscode({ action: 'hide-files', skipSaving: true });
12730
+ this.toogleFilesVisibilityInVscode({
12731
+ action: 'hide-files',
12732
+ skipSaving: true,
12733
+ });
12564
12734
  }
12565
12735
  this.saveCurrentSettings();
12566
12736
  }
@@ -13210,6 +13380,8 @@ class BaseVscodeHelpers extends BaseFeatureForProject {
13210
13380
  /* */
13211
13381
  /* */
13212
13382
  /* */
13383
+ /* */
13384
+ /* */
13213
13385
  return (void 0);
13214
13386
  }
13215
13387
  //#endregion
@@ -13292,6 +13464,7 @@ class BaseVscodeHelpers extends BaseFeatureForProject {
13292
13464
  '.vscode': true,
13293
13465
  browser: true,
13294
13466
  dist: true,
13467
+ ['dist-*']: true,
13295
13468
  'package-lock.json': true,
13296
13469
  'tmp-*': true,
13297
13470
  'src/lib/env/**/*.*': true,
@@ -16755,5 +16928,5 @@ const Helpers = HelpersTaon.Instance;
16755
16928
  * Generated bundle index. Do not edit.
16756
16929
  */
16757
16930
 
16758
- export { BaseCliWorker, BaseCliWorkerConfig, BaseCliWorkerController, BaseCliWorkerTerminalUI, BaseCommandLineFeature, BaseCompilerForProject, BaseDebounceCompilerForProject, BaseFeatureForProject, BaseFileFoldersOperations, BaseGit, BaseIgnoreHideHelpers, BaseJsonFileReader, BaseLibraryBuild, BaseLinkedProjects, BaseLinter, BaseNodeModules, BaseNpmHelpers, BasePackageJson, BaseProcessManger, BaseProject, BaseProjectResolver, BaseProjectTypeArr, BaseQuickFixes, BaseReleaseProcess, BaseVscodeHelpers, CommandConfig, CommandProcess, CommandProcessState, CommitData, CoreAngularProject, CoreProject, CoreTypescriptProject, Helpers, HelpersAngular, LinkedPorjectsConfig, LinkedProject, PackageJsonDependencyObjArr, Port, PortStatusArr, PortsController, PortsWorker, ProgressData, UtilsDotFile, UtilsHttp, UtilsJava, UtilsMd, UtilsNpm, UtilsPasswords, UtilsQuickFixes, UtilsTaonWorker, UtilsTypescript, UtilsVSCode, UtilsZip, UtilsZipBrowser, executeCommand, getBaseCliWorkerDatabaseConfig };
16931
+ export { BaseCliWorker, BaseCliWorkerConfig, BaseCliWorkerController, BaseCliWorkerTerminalUI, BaseCommandLineFeature, BaseCompilerForProject, BaseDebounceCompilerForProject, BaseFeatureForProject, BaseFileFoldersOperations, BaseGit, BaseIgnoreHideHelpers, BaseJsonFileReader, BaseLibraryBuild, BaseLinkedProjects, BaseLinter, BaseNodeModules, BaseNpmHelpers, BasePackageJson, BaseProcessManger, BaseProject, BaseProjectResolver, BaseProjectTypeArr, BaseQuickFixes, BaseReleaseProcess, BaseVscodeHelpers, CommandConfig, CommandProcess, CommandProcessState, CommitData, CoreAngularProject, CoreProject, CoreTypescriptProject, FilePathMetaData, Helpers, HelpersAngular, LinkedPorjectsConfig, LinkedProject, PackageJsonDependencyObjArr, Port, PortStatusArr, PortsController, PortsWorker, ProgressData, UtilsCliMethod, UtilsDotFile, UtilsHttp, UtilsJava, UtilsMd, UtilsNpm, UtilsPasswords, UtilsQuickFixes, UtilsTaonWorker, UtilsTypescript, UtilsVSCode, UtilsZip, UtilsZipBrowser, executeCommand, getBaseCliWorkerDatabaseConfig };
16759
16932
  //# sourceMappingURL=tnp-helpers.mjs.map