tnp-helpers 19.0.67 → 19.0.72

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 (195) hide show
  1. package/browser/fesm2022/tnp-helpers.mjs +510 -166
  2. package/browser/fesm2022/tnp-helpers.mjs.map +1 -1
  3. package/browser/lib/base/classes/base-cli-worker/base-cli-worker-controller.d.ts +1 -1
  4. package/browser/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.d.ts +2 -2
  5. package/browser/lib/base/classes/base-cli-worker/base-cli-worker.d.ts +2 -2
  6. package/browser/lib/base/classes/base-cli-worker/base-cli-worker.models.d.ts +2 -2
  7. package/browser/lib/base/classes/base-compiler-for-project.d.ts +4 -4
  8. package/browser/lib/base/classes/base-global-command-line.d.ts +15 -1
  9. package/browser/lib/base/classes/base-linked-projects.d.ts +10 -3
  10. package/browser/lib/base/classes/base-package-json.d.ts +1 -0
  11. package/browser/lib/base/tcp-udp-ports/ports.controller.d.ts +2 -2
  12. package/browser/lib/base/tcp-udp-ports/tcp-udp-ports.context.d.ts +1 -1
  13. package/browser/lib/base/tcp-udp-ports/tcp-upd-ports.worker.d.ts +3 -3
  14. package/browser/lib/build-info._auto-generated_.d.ts +1 -1
  15. package/browser/lib/utils.d.ts +26 -3
  16. package/browser/migrations/1736198527297_init.d.ts +1 -1
  17. package/browser/migrations/1736199486472_addingNotAssignablePorts.d.ts +3 -3
  18. package/browser/migrations/1736454437350_addFreePorts.d.ts +3 -3
  19. package/browser/migrations/migrations_index._auto-generated_.d.ts +7 -7
  20. package/browser/package.json +1 -1
  21. package/lib/base/classes/base-bower-json.js +1 -1
  22. package/lib/base/classes/base-bower-json.js.map +1 -1
  23. package/lib/base/classes/base-cli-worker/base-cli-worker-controller.d.ts +1 -1
  24. package/lib/base/classes/base-cli-worker/base-cli-worker-controller.js +11 -11
  25. package/lib/base/classes/base-cli-worker/base-cli-worker-controller.js.map +1 -1
  26. package/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.d.ts +2 -2
  27. package/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.js +1 -1
  28. package/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.js.map +1 -1
  29. package/lib/base/classes/base-cli-worker/base-cli-worker.d.ts +2 -2
  30. package/lib/base/classes/base-cli-worker/base-cli-worker.js +1 -1
  31. package/lib/base/classes/base-cli-worker/base-cli-worker.js.map +1 -1
  32. package/lib/base/classes/base-cli-worker/base-cli-worker.models.d.ts +2 -2
  33. package/lib/base/classes/base-cli-worker/base-cli-worker.models.js +1 -1
  34. package/lib/base/classes/base-cli-worker/base-cli-worker.models.js.map +1 -1
  35. package/lib/base/classes/base-compiler-for-project.d.ts +4 -4
  36. package/lib/base/classes/base-compiler-for-project.js +9 -11
  37. package/lib/base/classes/base-compiler-for-project.js.map +1 -1
  38. package/lib/base/classes/base-debounce-compiler-for-project.js +8 -5
  39. package/lib/base/classes/base-debounce-compiler-for-project.js.map +1 -1
  40. package/lib/base/classes/base-file-folders-operations.js +1 -1
  41. package/lib/base/classes/base-file-folders-operations.js.map +1 -1
  42. package/lib/base/classes/base-global-command-line.backend.d.ts +1 -13
  43. package/lib/base/classes/base-global-command-line.backend.js +11 -416
  44. package/lib/base/classes/base-global-command-line.backend.js.map +1 -1
  45. package/lib/base/classes/base-global-command-line.d.ts +14 -0
  46. package/lib/base/classes/base-global-command-line.js +105 -5
  47. package/lib/base/classes/base-global-command-line.js.map +1 -1
  48. package/lib/base/classes/base-json-file-reader.js +1 -1
  49. package/lib/base/classes/base-json-file-reader.js.map +1 -1
  50. package/lib/base/classes/base-library-build.js +1 -1
  51. package/lib/base/classes/base-library-build.js.map +1 -1
  52. package/lib/base/classes/base-linked-projects.d.ts +10 -3
  53. package/lib/base/classes/base-linked-projects.js +18 -8
  54. package/lib/base/classes/base-linked-projects.js.map +1 -1
  55. package/lib/base/classes/base-linter.js +4 -0
  56. package/lib/base/classes/base-linter.js.map +1 -1
  57. package/lib/base/classes/base-node-modules.js +1 -1
  58. package/lib/base/classes/base-node-modules.js.map +1 -1
  59. package/lib/base/classes/base-package-json.d.ts +1 -0
  60. package/lib/base/classes/base-package-json.js +5 -1
  61. package/lib/base/classes/base-package-json.js.map +1 -1
  62. package/lib/base/classes/base-project-resolver.js +1 -1
  63. package/lib/base/classes/base-project-resolver.js.map +1 -1
  64. package/lib/base/classes/base-project.js +23 -3
  65. package/lib/base/classes/base-project.js.map +1 -1
  66. package/lib/base/classes/base-quick-fixes.js +1 -1
  67. package/lib/base/classes/base-quick-fixes.js.map +1 -1
  68. package/lib/base/classes/base-release-process.js +1 -1
  69. package/lib/base/classes/base-release-process.js.map +1 -1
  70. package/lib/base/classes/base-start-config.backend.js +1 -1
  71. package/lib/base/classes/base-start-config.backend.js.map +1 -1
  72. package/lib/base/classes/base-static-pages.js +1 -1
  73. package/lib/base/classes/base-static-pages.js.map +1 -1
  74. package/lib/base/classes/base-vscode.js +15 -6
  75. package/lib/base/classes/base-vscode.js.map +1 -1
  76. package/lib/base/index-rebuilder.backend.js +1 -1
  77. package/lib/base/index-rebuilder.backend.js.map +1 -1
  78. package/lib/base/linked-project.js +1 -1
  79. package/lib/base/linked-project.js.map +1 -1
  80. package/lib/base/tcp-udp-ports/not-assignable-port.entity.js +2 -2
  81. package/lib/base/tcp-udp-ports/ports.controller.d.ts +2 -2
  82. package/lib/base/tcp-udp-ports/ports.controller.js +13 -13
  83. package/lib/base/tcp-udp-ports/ports.controller.js.map +1 -1
  84. package/lib/base/tcp-udp-ports/tcp-udp-ports.context.d.ts +1 -1
  85. package/lib/base/tcp-udp-ports/tcp-udp-ports.context.js +6 -6
  86. package/lib/base/tcp-udp-ports/tcp-udp-ports.context.js.map +1 -1
  87. package/lib/base/tcp-udp-ports/tcp-upd-ports.worker.d.ts +3 -3
  88. package/lib/base/tcp-udp-ports/tcp-upd-ports.worker.js +2 -2
  89. package/lib/base/tcp-udp-ports/tcp-upd-ports.worker.js.map +1 -1
  90. package/lib/build-info._auto-generated_.d.ts +1 -1
  91. package/lib/build-info._auto-generated_.js +1 -1
  92. package/lib/helpers/for-backend/helpers-cli-tool.backend.js +1 -1
  93. package/lib/helpers/for-backend/helpers-cli-tool.backend.js.map +1 -1
  94. package/lib/helpers/for-backend/helpers-dependencies.backend.d.ts +1 -0
  95. package/lib/helpers/for-backend/helpers-dependencies.backend.js +27 -0
  96. package/lib/helpers/for-backend/helpers-dependencies.backend.js.map +1 -1
  97. package/lib/helpers/for-backend/helpers-file-folders.js +1 -1
  98. package/lib/helpers/for-backend/helpers-file-folders.js.map +1 -1
  99. package/lib/helpers/for-backend/helpers-git.backend.js +1 -1
  100. package/lib/helpers/for-backend/helpers-git.backend.js.map +1 -1
  101. package/lib/helpers/for-backend/helpers-path.backend.js +2 -2
  102. package/lib/helpers/for-backend/helpers-path.backend.js.map +1 -1
  103. package/lib/helpers/for-backend/helpers-process.js +1 -1
  104. package/lib/helpers/for-backend/helpers-process.js.map +1 -1
  105. package/lib/helpers/for-browser/angular.helper.js +2 -2
  106. package/lib/helpers/helpers-json5.backend.js +1 -1
  107. package/lib/helpers/helpers-json5.backend.js.map +1 -1
  108. package/lib/old/base-component.js +2 -2
  109. package/lib/old/base-formly-component.js +2 -2
  110. package/lib/old/dual-component-ctrl.js +2 -2
  111. package/lib/utils.d.ts +26 -3
  112. package/lib/utils.js +231 -67
  113. package/lib/utils.js.map +1 -1
  114. package/lib/validators/validators-git.js.map +1 -1
  115. package/migrations/1736198527297_init.d.ts +1 -1
  116. package/migrations/1736198527297_init.js +6 -6
  117. package/migrations/1736198527297_init.js.map +1 -1
  118. package/migrations/1736199486472_addingNotAssignablePorts.d.ts +3 -3
  119. package/migrations/1736199486472_addingNotAssignablePorts.js +7 -7
  120. package/migrations/1736199486472_addingNotAssignablePorts.js.map +1 -1
  121. package/migrations/1736454437350_addFreePorts.d.ts +3 -3
  122. package/migrations/1736454437350_addFreePorts.js +7 -7
  123. package/migrations/1736454437350_addFreePorts.js.map +1 -1
  124. package/migrations/migrations_index._auto-generated_.d.ts +7 -7
  125. package/migrations/migrations_index._auto-generated_.js +5 -5
  126. package/migrations/migrations_index._auto-generated_.js.map +1 -1
  127. package/package.json +7 -10
  128. package/tmp-environment.json +11 -7
  129. package/websql/fesm2022/tnp-helpers.mjs +482 -122
  130. package/websql/fesm2022/tnp-helpers.mjs.map +1 -1
  131. package/websql/lib/base/classes/base-cli-worker/base-cli-worker-controller.d.ts +1 -1
  132. package/websql/lib/base/classes/base-cli-worker/base-cli-worker-terminal-ui.d.ts +2 -2
  133. package/websql/lib/base/classes/base-cli-worker/base-cli-worker.d.ts +2 -2
  134. package/websql/lib/base/classes/base-cli-worker/base-cli-worker.models.d.ts +2 -2
  135. package/websql/lib/base/classes/base-compiler-for-project.d.ts +4 -4
  136. package/websql/lib/base/classes/base-global-command-line.d.ts +15 -1
  137. package/websql/lib/base/classes/base-linked-projects.d.ts +10 -3
  138. package/websql/lib/base/classes/base-package-json.d.ts +1 -0
  139. package/websql/lib/base/tcp-udp-ports/ports.controller.d.ts +2 -2
  140. package/websql/lib/base/tcp-udp-ports/tcp-udp-ports.context.d.ts +1 -1
  141. package/websql/lib/base/tcp-udp-ports/tcp-upd-ports.worker.d.ts +3 -3
  142. package/websql/lib/build-info._auto-generated_.d.ts +1 -1
  143. package/websql/lib/utils.d.ts +26 -3
  144. package/websql/migrations/1736198527297_init.d.ts +1 -1
  145. package/websql/migrations/1736199486472_addingNotAssignablePorts.d.ts +3 -3
  146. package/websql/migrations/1736454437350_addFreePorts.d.ts +3 -3
  147. package/websql/migrations/migrations_index._auto-generated_.d.ts +7 -7
  148. package/websql/package.json +1 -1
  149. package/lib/base/classes/base-process/base-process-api.service.d.ts +0 -7
  150. package/lib/base/classes/base-process/base-process.context.d.ts +0 -19
  151. package/lib/base/classes/base-process/base-process.context.js +0 -22
  152. package/lib/base/classes/base-process/base-process.context.js.map +0 -1
  153. package/lib/base/classes/base-process/base-process.controller.d.ts +0 -17
  154. package/lib/base/classes/base-process/base-process.controller.js +0 -91
  155. package/lib/base/classes/base-process/base-process.controller.js.map +0 -1
  156. package/lib/base/classes/base-process/base-process.d.ts +0 -8
  157. package/lib/base/classes/base-process/base-process.defaults-values.d.ts +0 -2
  158. package/lib/base/classes/base-process/base-process.defaults-values.js +0 -9
  159. package/lib/base/classes/base-process/base-process.defaults-values.js.map +0 -1
  160. package/lib/base/classes/base-process/base-process.js +0 -62
  161. package/lib/base/classes/base-process/base-process.js.map +0 -1
  162. package/lib/base/classes/base-process/base-process.models.d.ts +0 -6
  163. package/lib/base/classes/base-process/base-process.models.js +0 -3
  164. package/lib/base/classes/base-process/base-process.models.js.map +0 -1
  165. package/lib/base/classes/base-process/base-process.provider.d.ts +0 -16
  166. package/lib/base/classes/base-process/base-process.provider.js +0 -69
  167. package/lib/base/classes/base-process/base-process.provider.js.map +0 -1
  168. package/lib/base/classes/base-process/base-process.repository copy.d.ts +0 -8
  169. package/lib/base/classes/base-process/base-process.repository copy.js +0 -32
  170. package/lib/base/classes/base-process/base-process.repository copy.js.map +0 -1
  171. package/lib/base/classes/base-process/base-process.repository.d.ts +0 -8
  172. package/lib/base/classes/base-process/base-process.repository.js +0 -32
  173. package/lib/base/classes/base-process/base-process.repository.js.map +0 -1
  174. package/lib/base/classes/base-process/base-process.terminal-ui.d.ts +0 -11
  175. package/lib/base/classes/base-process/base-process.terminal-ui.js +0 -54
  176. package/lib/base/classes/base-process/base-process.terminal-ui.js.map +0 -1
  177. package/lib/base/classes/base-process/base-process.worker.d.ts +0 -16
  178. package/lib/base/classes/base-process/base-process.worker.js +0 -29
  179. package/lib/base/classes/base-process/base-process.worker.js.map +0 -1
  180. package/lib/base/classes/base-process/index.d.ts +0 -1
  181. package/lib/base/classes/base-process/index.js +0 -22
  182. package/lib/base/classes/base-process/index.js.map +0 -1
  183. package/lib/base/classes/base-process/processes.repository.d.ts +0 -0
  184. package/lib/base/classes/base-process/processes.repository.js +0 -5
  185. package/lib/base/classes/base-process/processes.repository.js.map +0 -1
  186. package/lib/env-backend._auto-generated_.d.ts +0 -34
  187. package/lib/env-backend._auto-generated_.js +0 -38
  188. package/lib/env-backend._auto-generated_.js.map +0 -1
  189. package/lib/env-browser._auto-generated_.d.ts +0 -34
  190. package/lib/env-browser._auto-generated_.js +0 -38
  191. package/lib/env-browser._auto-generated_.js.map +0 -1
  192. package/lib/env.backend.d.ts +0 -34
  193. package/lib/env.backend.js +0 -40
  194. package/lib/env.backend.js.map +0 -1
  195. package/lib/env.browser.d.ts +0 -34
package/lib/utils.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UtilsDocker = exports.UtilsPasswords = exports.UtilsJava = exports.UtilsTaonWorker = exports.UtilsZip = exports.UtilsZipBrowser = exports.UtilsVSCode = exports.UtilsQuickFixes = exports.UtilsMd = exports.UtilsHttp = exports.UtilsTypescript = exports.UtilsNpm = void 0;
3
+ exports.UtilsFileSync = exports.UtilsDocker = exports.UtilsPasswords = exports.UtilsJava = exports.UtilsTaonWorker = exports.UtilsZip = exports.UtilsZipBrowser = exports.UtilsVSCode = exports.UtilsQuickFixes = exports.UtilsMd = exports.UtilsHttp = exports.UtilsTypescript = exports.UtilsNpm = void 0;
4
4
  const node_crypto_1 = require("node:crypto"); // @backend
5
5
  const node_util_1 = require("node:util"); // @backend
6
- const lib_1 = require("tnp-config/lib");
6
+ const lib_1 = require("tnp-core/lib");
7
7
  const lib_2 = require("tnp-core/lib");
8
8
  const lib_3 = require("tnp-core/lib");
9
9
  const typescript_1 = require("typescript");
@@ -326,11 +326,12 @@ var UtilsTypescript;
326
326
  //#region @backendFunc
327
327
  absPathToFile = (0, lib_2.crossPlatformPath)(absPathToFile);
328
328
  if (index_1.Helpers.exists(absPathToFile)) {
329
- const { execSync } = require('child_process');
330
329
  index_1.Helpers.logInfo(`Fixing file with eslint: ${absPathToFile}`);
331
330
  try {
332
- execSync(`npx --yes eslint --fix ${lib_2.path.basename(absPathToFile)}`, {
331
+ // use local eslint first
332
+ lib_2.child_process.execSync(`npx --yes eslint --fix ${lib_2.path.basename(absPathToFile)}`, {
333
333
  cwd: lib_2.path.dirname(absPathToFile),
334
+ stdio: 'inherit',
334
335
  });
335
336
  }
336
337
  catch (error) { }
@@ -345,15 +346,14 @@ var UtilsTypescript;
345
346
  index_1.Helpers.info(`Fixing files with eslint in: ${absPathToFolder}`);
346
347
  const lintFixFn = () => {
347
348
  try {
348
- index_1.Helpers.run(`npx --yes eslint --fix . `, {
349
+ lib_2.child_process.execSync(`npx --yes eslint --fix . `, {
349
350
  cwd: absPathToFolder,
350
- output: false,
351
- silence: true,
352
- }).sync();
351
+ stdio: 'inherit',
352
+ });
353
353
  }
354
354
  catch (error) { }
355
355
  };
356
- lintFixFn();
356
+ lintFixFn(); // TODO QUICK_FIX
357
357
  lintFixFn(); // sometimes it needs to be run twice
358
358
  index_1.Helpers.info(`Eslint fixing files done.`);
359
359
  }
@@ -776,66 +776,39 @@ var UtilsTypescript;
776
776
  //#endregion
777
777
  };
778
778
  //#endregion
779
- //#region fix standalone ng 19
780
779
  /**
781
780
  * Transition methods ng18 => ng19
782
- * Remove standalone:true from component decorator
783
- * and add standalone: false if not exists
781
+ * Adds standalone: false if not exists in component decorator
784
782
  */
785
783
  function transformComponentStandaloneOption(sourceText) {
786
784
  //#region @backendFunc
787
- const sourceFile = (0, typescript_1.createSourceFile)('temp.ts', sourceText, typescript_1.ScriptTarget.Latest, true, typescript_1.ScriptKind.TS);
788
- const printer = (0, typescript_1.createPrinter)({ newLine: typescript_1.NewLineKind.LineFeed });
789
- // @ts-ignore
790
- const transformerFactory = context => {
791
- const { factory } = context;
792
- const visit = node => {
793
- if ((0, typescript_1.isDecorator)(node) &&
794
- (0, typescript_1.isCallExpression)(node.expression) &&
795
- (0, typescript_1.isIdentifier)(node.expression.expression) &&
796
- node.expression.expression.text === 'Component') {
797
- const args = node.expression.arguments;
798
- if (args.length === 1 && (0, typescript_1.isObjectLiteralExpression)(args[0])) {
799
- const originalProps = args[0].properties;
800
- const newProps = [];
801
- let hasStandalone = false;
802
- let standaloneIsTrue = false;
803
- for (const prop of originalProps) {
804
- if ((0, typescript_1.isPropertyAssignment)(prop) &&
805
- (0, typescript_1.isIdentifier)(prop.name) &&
806
- prop.name.text === 'standalone') {
807
- hasStandalone = true;
808
- if (prop.initializer.kind === typescript_1.SyntaxKind.TrueKeyword) {
809
- standaloneIsTrue = true;
810
- continue; // skip it
811
- }
812
- }
813
- newProps.push(prop);
814
- }
815
- if (!hasStandalone) {
816
- // add standalone: false
817
- newProps.push(factory.createPropertyAssignment(factory.createIdentifier('standalone'), factory.createFalse()));
818
- }
819
- const newArgs = [
820
- factory.updateObjectLiteralExpression(args[0], newProps),
821
- ];
822
- const newExpression = factory.updateCallExpression(node.expression, node.expression.expression, undefined, newArgs);
823
- return factory.updateDecorator(node, newExpression);
785
+ return sourceText.replace(/@Component\s*\(\s*\{([\s\S]*?)\}\s*\)/g, (full, propsBlock) => {
786
+ let props = propsBlock;
787
+ // 1. Remove standalone: true
788
+ // props = props.replace(/\s*standalone\s*:\s*true\s*,?/g, '');
789
+ // 2. Check if standalone exists after removal
790
+ const hasStandalone = /standalone\s*:/.test(props);
791
+ // 3. Insert standalone: false if missing
792
+ if (hasStandalone) {
793
+ // do nothing
794
+ }
795
+ else {
796
+ const hasImports = /imports\s*:/.test(props);
797
+ if (!hasImports) {
798
+ // If block is empty or only whitespace
799
+ if (/^\s*$/.test(props)) {
800
+ props = `\n standalone: false\n`;
801
+ }
802
+ else {
803
+ props += `\n standalone: false`;
824
804
  }
825
805
  }
826
- return (0, typescript_1.visitEachChild)(node, visit, context);
827
- };
828
- return node => (0, typescript_1.visitNode)(node, visit);
829
- };
830
- const result = (0, typescript_1.transform)(sourceFile, [transformerFactory]);
831
- const transformedSourceFile = result.transformed[0];
832
- const resultText = printer.printFile(transformedSourceFile);
833
- result.dispose();
834
- return resultText;
806
+ }
807
+ return `@Component({${props}})`;
808
+ });
835
809
  //#endregion
836
810
  }
837
811
  UtilsTypescript.transformComponentStandaloneOption = transformComponentStandaloneOption;
838
- //#endregion
839
812
  //#region escape @ in html text
840
813
  const escapeAtInHtmlText = (fileContent) => {
841
814
  return fileContent.replace(/>([^<@]*?)@([^<]*)</g, (_match, before, after) => {
@@ -866,7 +839,6 @@ var UtilsTypescript;
866
839
  //#endregion
867
840
  //#region remove tagged imports/exports
868
841
  function removeTaggedImportExport(tsFileContent, tags) {
869
- //#region @websqlFunc
870
842
  const sourceFile = (0, typescript_1.createSourceFile)('temp.ts', tsFileContent, typescript_1.ScriptTarget.Latest, true, typescript_1.ScriptKind.TS);
871
843
  // debug && console.log(tsFileContent);
872
844
  const lines = tsFileContent.split(/\r?\n/);
@@ -907,15 +879,26 @@ var UtilsTypescript;
907
879
  const result = lines.join('\n');
908
880
  // debug && console.log(result)
909
881
  return result;
910
- //#endregion
911
882
  }
912
883
  UtilsTypescript.removeTaggedImportExport = removeTaggedImportExport;
913
884
  //#endregion
914
885
  //#region wrap first imports in region
915
886
  UtilsTypescript.wrapFirstImportsInImportsRegion = (fileContent) => {
916
887
  //#region @backendFunc
917
- const importRegionStart = `//#re` + `gion imports`;
888
+ const importRegion = `//#re` + `gion`;
889
+ const importRegionStart = `${importRegion} imports`;
918
890
  const importRegionEnd = `//#end` + `region`;
891
+ if (fileContent.startsWith(importRegionStart)) {
892
+ return fileContent; // already wrapped
893
+ }
894
+ let firstRegionLine = undefined;
895
+ if (fileContent.startsWith(importRegion)) {
896
+ const lines = fileContent.split(/\r?\n/);
897
+ if (lines[0].includes('@notF' + 'orNpm')) {
898
+ firstRegionLine = lines[0];
899
+ fileContent = lines.slice(1).join('\n');
900
+ }
901
+ }
919
902
  const sourceFile = (0, typescript_1.createSourceFile)('temp.ts', fileContent, typescript_1.ScriptTarget.Latest, true);
920
903
  const lines = fileContent.split(/\r?\n/);
921
904
  const importDeclarations = [];
@@ -934,7 +917,7 @@ var UtilsTypescript;
934
917
  }
935
918
  }
936
919
  if (importDeclarations.length === 0) {
937
- return fileContent; // nothing to wrap
920
+ return fileContent + (firstRegionLine ? `\n${firstRegionLine}` : ''); // nothing to wrap
938
921
  }
939
922
  const firstImportStart = importDeclarations[0].getFullStart();
940
923
  const lastImportEnd = importDeclarations[importDeclarations.length - 1].getEnd();
@@ -946,11 +929,14 @@ var UtilsTypescript;
946
929
  const after = lines.slice(endLine + 1);
947
930
  return [
948
931
  ...before,
932
+ firstRegionLine,
949
933
  importRegionStart,
950
934
  ...importBlock,
951
935
  importRegionEnd,
952
936
  ...after,
953
- ].join('\n');
937
+ ]
938
+ .filter(f => f !== undefined)
939
+ .join('\n');
954
940
  //#endregion
955
941
  };
956
942
  //#endregion
@@ -1024,8 +1010,9 @@ var UtilsTypescript;
1024
1010
  var UtilsHttp;
1025
1011
  (function (UtilsHttp) {
1026
1012
  //#region utils http / start http server
1027
- UtilsHttp.startHttpServer = async (cwd, port) => {
1013
+ UtilsHttp.startHttpServer = async (cwd, port, options) => {
1028
1014
  //#region @backendFunc
1015
+ options = options || {};
1029
1016
  const express = require('express');
1030
1017
  const app = express();
1031
1018
  // Serve static files from the provided cwd
@@ -1034,12 +1021,13 @@ var UtilsHttp;
1034
1021
  app.use((req, res) => {
1035
1022
  res.status(404).send('File not found');
1036
1023
  });
1024
+ index_1.Helpers.taskStarted(`Starting server.. http://localhost:${port}`);
1037
1025
  // Start the server
1038
1026
  const server = app.listen(port, () => {
1039
- console.log(`Server started at http://localhost:${port}, serving files from ${cwd}`);
1027
+ index_1.Helpers.taskDone(options.startMessage ||
1028
+ `Server started at http://localhost:${port}, serving files from ${cwd}`);
1040
1029
  });
1041
1030
  return new Promise((resolve, reject) => {
1042
- console.log(`Server started at http://localhost:${port}`);
1043
1031
  // Handle Ctrl+C (SIGINT) gracefully
1044
1032
  process.on('SIGINT', () => {
1045
1033
  server.close(() => resolve());
@@ -1074,6 +1062,17 @@ var UtilsMd;
1074
1062
  return assets.map(r => r.replace(new RegExp(/^\.\//), ''));
1075
1063
  //#endregion
1076
1064
  };
1065
+ UtilsMd.getAssetsFromFile = (absPathToFile) => {
1066
+ //#region @backendFunc
1067
+ if (!index_1.Helpers.exists(absPathToFile)) {
1068
+ return [];
1069
+ }
1070
+ if (lib_2.path.extname('absPathToFile').toLowerCase() !== '.md') {
1071
+ return [];
1072
+ }
1073
+ return UtilsMd.getAssets(index_1.Helpers.readFile(absPathToFile));
1074
+ //#endregion
1075
+ };
1077
1076
  /**
1078
1077
  * Extract links to other Markdown files from a given Markdown content.
1079
1078
  * @param mdfileContent
@@ -2084,4 +2083,169 @@ var UtilsDocker;
2084
2083
  //#endregion
2085
2084
  })(UtilsDocker || (exports.UtilsDocker = UtilsDocker = {}));
2086
2085
  //#endregion
2086
+ //#region utils file sync
2087
+ /**
2088
+ * ! TODO @IN_PROGRESS @LAST
2089
+ */
2090
+ var UtilsFileSync;
2091
+ (function (UtilsFileSync) {
2092
+ //#region constants
2093
+ // ───── SAFETY SETTINGS ─────────────────────────────
2094
+ // Minimum realistic photo/video size (in bytes) before we even try
2095
+ const MIN_PHOTO_SIZE = 50_000; // ~50 KB — anything smaller is probably placeholder
2096
+ const MIN_VIDEO_SIZE = 500_000; // ~500 KB
2097
+ // How long we wait after the file stops growing before processing
2098
+ const STABILIZATION_MS = 5000; // 5 seconds is bulletproof
2099
+ //#region @backend
2100
+ const execAsync = (0, node_util_1.promisify)(lib_2.child_process.exec);
2101
+ //#endregion
2102
+ //#region for folders
2103
+ UtilsFileSync.forFolders = async (folder) => {
2104
+ //#region @backendFunc
2105
+ const hasFFmpeg = await lib_2.UtilsOs.commandExistsAsync('ffmpeg');
2106
+ if (!hasFFmpeg) {
2107
+ index_1.Helpers.error(`FFmpeg is not installed or not available in PATH. Please install FFmpeg to use the safe watcher.`);
2108
+ return;
2109
+ }
2110
+ const hasFFprobe = await lib_2.UtilsOs.commandExistsAsync('ffprobe');
2111
+ if (!hasFFprobe) {
2112
+ index_1.Helpers.error(`FFprobe is not installed or not available in PATH. Please install FFprobe to use the safe watcher.`);
2113
+ return;
2114
+ }
2115
+ //#region watcher setup
2116
+ await lib_2.fse.mkdirp(folder.tempConvertFolder);
2117
+ const processed = new Set();
2118
+ const pending = new Map();
2119
+ const watcherData = {
2120
+ ...folder,
2121
+ processed,
2122
+ pending,
2123
+ };
2124
+ //#endregion
2125
+ //#region terminal menu
2126
+ index_1.Helpers.info(`Starting safe watcher with the following settings:
2127
+ ${lib_1.chalk.bold('Android folder')}:\n${folder.androidFolder}
2128
+ ${lib_1.chalk.bold('MacOS Photos library')}:\n${folder.macPhotosLibrary}
2129
+ Temporary conversion folder:\n${folder.tempConvertFolder}
2130
+
2131
+ `);
2132
+ if (!folder.skipTerminalMenu) {
2133
+ const proceed = await lib_2.UtilsTerminal.confirm({
2134
+ message: `Proceed with starting the watcher?`,
2135
+ });
2136
+ }
2137
+ //#endregion
2138
+ // ───── MAIN WATCHER ─────────────────────────────────
2139
+ lib_1.chokidar
2140
+ .watch(folder.androidFolder, {
2141
+ //#region watcher options
2142
+ ignored: /(^|[\/\\])\../,
2143
+ persistent: true,
2144
+ ignoreInitial: false,
2145
+ awaitWriteFinish: {
2146
+ stabilityThreshold: STABILIZATION_MS,
2147
+ pollInterval: 500,
2148
+ },
2149
+ // On Windows 11 + MTP devices, native events are unreliable → force polling
2150
+ usePolling: true,
2151
+ interval: 2000,
2152
+ binaryInterval: 3000,
2153
+ //#endregion
2154
+ })
2155
+ .on('add', filePath => {
2156
+ //#region handle add
2157
+ // Clear any old timer
2158
+ if (pending.has(filePath))
2159
+ clearTimeout(pending.get(filePath));
2160
+ // Wait until the file stops growing for STABILIZATION_MS
2161
+ const timer = setTimeout(() => {
2162
+ pending.delete(filePath);
2163
+ safeProcess(filePath);
2164
+ }, STABILIZATION_MS + 1000);
2165
+ pending.set(filePath, timer);
2166
+ //#endregion
2167
+ })
2168
+ .on('change', filePath => {
2169
+ //#region handle change
2170
+ // File is still being written → reset timer
2171
+ if (pending.has(filePath))
2172
+ clearTimeout(pending.get(filePath));
2173
+ pending.set(filePath, setTimeout(() => {
2174
+ pending.delete(filePath);
2175
+ safeProcess(filePath);
2176
+ }, STABILIZATION_MS));
2177
+ //#endregion
2178
+ });
2179
+ //#region log startup info
2180
+ console.log(`Safe watcher started`);
2181
+ console.log(`Android folder : ${watcherData.androidFolder}`);
2182
+ console.log(`macOS Photos : ${watcherData.macPhotosLibrary}`);
2183
+ console.log(`Waiting ${STABILIZATION_MS / 1000}s after file stops growing...`);
2184
+ //#endregion
2185
+ //#endregion
2186
+ };
2187
+ //#endregion
2188
+ //#region is hevc
2189
+ async function isHevc(file) {
2190
+ //#region @backendFunc
2191
+ try {
2192
+ const { stdout } = await execAsync(`ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 "${file}"`);
2193
+ const codec = stdout.trim(); // ← remove newline
2194
+ return codec === 'hevc' || codec === 'hvc1'; // both mean HEVC/H.265
2195
+ }
2196
+ catch {
2197
+ return false;
2198
+ }
2199
+ //#endregion
2200
+ }
2201
+ //#endregion
2202
+ //#region safe process
2203
+ const safeProcess = async (filePath, wacherData) => {
2204
+ //#region @backendFunc
2205
+ if (wacherData.processed.has(filePath))
2206
+ return;
2207
+ const ext = lib_2.path.extname(filePath).toLowerCase();
2208
+ const stat = await lib_2.fse.stat(filePath);
2209
+ // ───── REJECT OBVIOUS PLACEHOLDERS ─────────────────
2210
+ if (stat.size < 10_000) {
2211
+ console.log(`Skipped tiny/placeholder file: ${lib_2.path.basename(filePath)} (${stat.size} bytes)`);
2212
+ wacherData.processed.add(filePath);
2213
+ return;
2214
+ }
2215
+ // ───── REJECT TOO-SMALL PHOTOS/VIDEOS ───────────────
2216
+ const isVideo = /\.(mp4|mov|avi|mkv|webm)$/i.test(ext);
2217
+ const minSize = isVideo ? MIN_VIDEO_SIZE : MIN_PHOTO_SIZE;
2218
+ if (stat.size < minSize) {
2219
+ console.log(`Still downloading or placeholder → ${lib_2.path.basename(filePath)} (${(stat.size / 1024 / 1024).toFixed(1)} MB)`);
2220
+ return; // don't mark as processed yet — wait for it to grow
2221
+ }
2222
+ wacherData.processed.add(filePath);
2223
+ const filename = lib_2.path.basename(filePath);
2224
+ try {
2225
+ if (ext === '.heic' || ext === '.heif') {
2226
+ // HEIC can be copied directly — Apple Photos loves them
2227
+ await lib_2.fse.copyFile(filePath, lib_2.path.join(wacherData.macPhotosLibrary, filename));
2228
+ console.log(`HEIC copied: ${filename} (${(stat.size / 1024 / 1024).toFixed(1)} MB)`);
2229
+ }
2230
+ else if (isVideo && (await isHevc(filePath))) {
2231
+ const outName = filename.replace(/\.[^.]+$/, '_iphone.mp4');
2232
+ const tempOut = lib_2.path.join(wacherData.tempConvertFolder, outName);
2233
+ console.log(`Converting HEVC → H.264: ${filename} (${(stat.size / 1024 / 1024).toFixed(1)} MB)`);
2234
+ await execAsync(`ffmpeg -i "${filePath}" -c:v libx264 -preset veryfast -crf 18 -pix_fmt yuv420p -movflags +faststart -c:a aac -b:a 192k "${tempOut}" -y`);
2235
+ await lib_2.fse.copyFile(tempOut, lib_2.path.join(wacherData.macPhotosLibrary, outName));
2236
+ console.log(`Converted: ${outName}`);
2237
+ }
2238
+ else {
2239
+ await lib_2.fse.copyFile(filePath, lib_2.path.join(wacherData.macPhotosLibrary, filename));
2240
+ console.log(`Copied: ${filename} (${(stat.size / 1024 / 1024).toFixed(1)} MB)`);
2241
+ }
2242
+ }
2243
+ catch (err) {
2244
+ console.error(`Failed ${filename}:`, err.message);
2245
+ wacherData.processed.delete(filePath); // retry later if it was a temporary error
2246
+ }
2247
+ //#endregion
2248
+ };
2249
+ //#endregion
2250
+ })(UtilsFileSync || (exports.UtilsFileSync = UtilsFileSync = {}));
2087
2251
  //# sourceMappingURL=utils.js.map