@hmos-library-adapter/fast 0.0.17-beta.0 → 0.0.17-beta.1

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 (149) hide show
  1. package/node_modules/@hmos-library-adapter/executer/README.md +2 -2
  2. package/node_modules/@hmos-library-adapter/executer/shared/skill-map.json +5 -1
  3. package/node_modules/@hmos-library-adapter/executer/shared/skills/arkts-rules/SKILL.md +400 -0
  4. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/CHANGELOG.md +1391 -0
  5. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/COMPATIBILITY.md +53 -0
  6. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/README.md +123 -0
  7. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/SKILL.md +48 -0
  8. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/agents/upgrade-assess-change.md +37 -0
  9. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/agents/upgrade-fix-file.md +23 -0
  10. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/package.json +19 -0
  11. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/beta1-changes-for-all-apps.md +1793 -0
  12. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/beta1-ux-style-and-effect-changes.md +288 -0
  13. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/beta2-changes-for-all-apps.md +148 -0
  14. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/release-changes-for-all-apps.md +662 -0
  15. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/beta3-os-api-behavior-changes.md +652 -0
  16. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/beta3-ux-style-and-effect-changes.md +222 -0
  17. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/release-os-api-behavior-changes.md +444 -0
  18. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/release-ux-style-and-effect-changes.md +221 -0
  19. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.2(14)/os-api-behavior-changes.md +1767 -0
  20. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.2(14)/ux-style-and-effect-changes.md +134 -0
  21. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta1-os-api-behavior-changes.md +430 -0
  22. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta1-ux-style-and-effect-changes.md +49 -0
  23. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta2-os-api-behavior-changes.md +240 -0
  24. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta2-ux-style-and-effect-changes.md +90 -0
  25. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/release-os-api-behavior-changes.md +69 -0
  26. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.1.0(18)/os-api-behavior-changes.md +1294 -0
  27. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.1.0(18)/ux-style-and-effect-changes.md +147 -0
  28. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta1-os-api-behavior-changes.md +1019 -0
  29. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta1-ux-style-and-effect-changes.md +153 -0
  30. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta2-os-api-behavior-changes.md +662 -0
  31. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta2-ux-style-and-effect-changes.md +78 -0
  32. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta3-os-api-behavior-changes.md +167 -0
  33. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta5-os-api-behavior-changes.md +52 -0
  34. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.1.0(23)/changes-for-all-apps.md +397 -0
  35. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs-index.json +883 -0
  36. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/arkts-coding-standards.md +53 -0
  37. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/compatibility.md +207 -0
  38. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/native-adaptation.md +21 -0
  39. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/runtime-functional-tests.md +62 -0
  40. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/sdk-versions.md +77 -0
  41. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/troubleshooting.md +54 -0
  42. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/verification.md +79 -0
  43. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/workflow-scan.md +41 -0
  44. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/deprecated/context-migration.md +274 -0
  45. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/deprecated/deprecated-api-adaptation.md +157 -0
  46. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/deprecated/deprecated-api-examples.md +219 -0
  47. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/toolchain/hvigor.md +50 -0
  48. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/har-upgrade.md +60 -0
  49. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/scanner-missed-cases.md +171 -0
  50. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/upgrade-compatibility.md +112 -0
  51. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/upgrade-examples.md +289 -0
  52. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/upgrade-workflow.md +122 -0
  53. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/references/generate-behavior-policy.mjs +96 -0
  54. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/references/references.mjs +9 -0
  55. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/regression/compare-deprecated.mjs +57 -0
  56. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/regression/compare-golden.mjs +130 -0
  57. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/regression/regress-deprecated.mjs +120 -0
  58. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/behavior-catalog-generation.test.mjs +59 -0
  59. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/behavior-local-sources.test.mjs +44 -0
  60. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/changelog-index.test.mjs +66 -0
  61. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/compare-golden.test.mjs +103 -0
  62. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/fixtures/behavior/local-sources.csv +5 -0
  63. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/references.test.mjs +16 -0
  64. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/skill-content.test.mjs +139 -0
  65. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/skill-frontmatter.test.mjs +11 -0
  66. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/test-suite.test.mjs +65 -0
  67. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/validation/skill-content.mjs +125 -0
  68. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/validation/skill-frontmatter.mjs +6 -0
  69. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/validation/validate-skill.mjs +57 -0
  70. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/CHANGELOG.md +506 -0
  71. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/GOLDEN_VALIDATION.md +42 -0
  72. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/README.md +137 -0
  73. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/behavior/behavior-policy.mjs +117 -0
  74. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/behavior/upgrade-coverage.mjs +29 -0
  75. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/bin/deveco-worker-compat.cjs +21 -0
  76. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/bin/harmony-api-scan.mjs +17 -0
  77. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/cli.mjs +416 -0
  78. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/deveco.mjs +348 -0
  79. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/project.mjs +81 -0
  80. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/rules.mjs +425 -0
  81. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/runtime-identity.mjs +23 -0
  82. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/scan-runner.mjs +521 -0
  83. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/sdk-deprecations.mjs +204 -0
  84. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/data/behavior-change-policy.json +4378 -0
  85. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/deprecated/arkts-deprecations.mjs +363 -0
  86. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/deprecated/build-log.mjs +72 -0
  87. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/native/native.mjs +95 -0
  88. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/package.json +16 -0
  89. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/batch-layout.test.mjs +94 -0
  90. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/behavior-policy.test.mjs +75 -0
  91. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/build-log.test.mjs +69 -0
  92. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/cli.test.mjs +102 -0
  93. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/csv.test.mjs +35 -0
  94. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/deprecations.test.mjs +283 -0
  95. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/deveco.test.mjs +262 -0
  96. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/helpers/scan-batch.mjs +10 -0
  97. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/native.test.mjs +108 -0
  98. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/project.test.mjs +42 -0
  99. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/rules.test.mjs +190 -0
  100. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/runtime-identity.test.mjs +53 -0
  101. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/scan-mode.test.mjs +38 -0
  102. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/scan-runner.test.mjs +481 -0
  103. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/scan-scope.test.mjs +110 -0
  104. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/source-inputs.test.mjs +64 -0
  105. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/upgrade.test.mjs +164 -0
  106. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/args.mjs +66 -0
  107. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/csv.mjs +85 -0
  108. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/json5.mjs +92 -0
  109. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/upgrade-results.mjs +45 -0
  110. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/zip.mjs +87 -0
  111. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/io/fs-utils.mjs +60 -0
  112. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/artifact-layout.mjs +74 -0
  113. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/changelog-index.mjs +29 -0
  114. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/deveco-version.mjs +40 -0
  115. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/document-links.mjs +30 -0
  116. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/errors.mjs +41 -0
  117. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/fs.mjs +72 -0
  118. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/paths.mjs +34 -0
  119. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/process.mjs +154 -0
  120. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-mode.mjs +7 -0
  121. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-statistics.mjs +7 -0
  122. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-version-catalog.json +43 -0
  123. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-versions.mjs +51 -0
  124. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/sdk-layout.mjs +27 -0
  125. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/source-scope.mjs +108 -0
  126. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/source-types.mjs +7 -0
  127. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/version.mjs +76 -0
  128. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/deveco-version.test.mjs +50 -0
  129. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/document-links.test.mjs +13 -0
  130. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/errors.test.mjs +40 -0
  131. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/fs-utils.test.mjs +31 -0
  132. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/platform-paths.test.mjs +19 -0
  133. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/process-utils.test.mjs +68 -0
  134. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/scan-versions.test.mjs +26 -0
  135. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/sdk-version.test.mjs +17 -0
  136. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/upgrade-results.test.mjs +140 -0
  137. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/test-suite.mjs +29 -0
  138. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/deprecated-report.md +86 -0
  139. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/progress.md +150 -0
  140. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/results.md +110 -0
  141. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/upgrade-report.md +105 -0
  142. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/upgrade-spec.md +58 -0
  143. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/upgrade-test-report.md +47 -0
  144. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-knowledge/SKILL.md +70 -0
  145. package/node_modules/@hmos-library-adapter/executer/src/config.js +3 -4
  146. package/node_modules/@hmos-library-adapter/executer/src/doctor.js +1 -1
  147. package/node_modules/@hmos-library-adapter/executer/src/install.js +1 -1
  148. package/node_modules/@hmos-library-adapter/executer/src/paths.js +4 -4
  149. package/package.json +1 -1
@@ -0,0 +1,348 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { exists, sha256File } from '../../shared/io/fs-utils.mjs';
4
+ import { canonicalHarmonyVersion as canonicalVersion, compareHarmonyVersions as compareVersions, parseVersion } from '../../shared/platform/version.mjs';
5
+ import { listZipEntries } from '../../shared/format/zip.mjs';
6
+ import { resolveSdkRoot } from '../../shared/platform/sdk-layout.mjs';
7
+ import { runProcess } from '../../shared/platform/process.mjs';
8
+ import { assertDevEcoCompatibility, inspectDevEcoCompatibility } from '../../shared/platform/deveco-version.mjs';
9
+
10
+ const INTEGRATED_CLI_MARKERS = [
11
+ '--startVersion', '--endVersion', '--modulePaths', '--sdkPath', '--apiModifiedPath', '--outputPath',
12
+ ];
13
+ const INDEX_CLI_MARKERS = ['--configPath', '--apiModifiedPath', '--outPath', '--tmpPath'];
14
+ const capabilityCache = new Map();
15
+ const helpCache = new Map();
16
+ async function scannerHelp(file) {
17
+ const info = await stat(file), key = `${file}:${info.size}:${info.mtimeMs}`;
18
+ if (!helpCache.has(key)) helpCache.set(key, runProcess(process.execPath, [file, '--help'], {
19
+ cwd: path.dirname(file), timeoutMs: 5000, detached: true, terminationGraceMs: 500,
20
+ }));
21
+ return helpCache.get(key);
22
+ }
23
+
24
+ async function scannerCapabilities(scanner, probeHelp) {
25
+ if (!scanner) return {moduleScanSupported:false,fileScanSupported:false};
26
+ const info=await stat(scanner.file),key=`${scanner.file}:${info.size}:${info.mtimeMs}:${probeHelp}`;
27
+ if (!capabilityCache.has(key)) capabilityCache.set(key,(async()=>{
28
+ const text=await readFile(scanner.file,'utf8');
29
+ const flag=scanner.contract==='index'?'--scanFilePaths':'--arkTsFiles';
30
+ const help=probeHelp ? await scannerHelp(scanner.file) : null;
31
+ const output=help ? `${help.stdout}\n${help.stderr}` : '';
32
+ const verified=help?.exitCode===0 && /--(?:configPath|modulePaths)/.test(output);
33
+ const declared=new RegExp(`\\.option\\(\\s*['"\x60]${flag}(?:[\\s<]|['"\x60])`).test(text);
34
+ return {moduleScanSupported:true,fileScanSupported:verified ? output.includes(flag) : declared,
35
+ capabilityEvidence:{source:verified?'CLI_HELP':'SOURCE_OPTIONS',file:scanner.file,helpExitCode:help?.exitCode ?? null}};
36
+ })());
37
+ return capabilityCache.get(key);
38
+ }
39
+
40
+ async function firstExisting(candidates) {
41
+ for (const candidate of candidates.filter(Boolean)) if (await exists(candidate)) return candidate;
42
+ return null;
43
+ }
44
+
45
+ async function listFiles(root, predicate, maxDepth = 3) {
46
+ const results = [];
47
+ async function visit(directory, depth) {
48
+ if (!(await exists(directory)) || depth > maxDepth) return;
49
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
50
+ const target = path.join(directory, entry.name);
51
+ if (entry.isDirectory()) await visit(target, depth + 1);
52
+ else if (entry.isFile() && predicate(target)) results.push(target);
53
+ }
54
+ }
55
+ await visit(root, 0);
56
+ return results.sort();
57
+ }
58
+
59
+ async function newestMatching(roots, pattern, maxDepth = 1) {
60
+ const files = [];
61
+ for (const root of roots) files.push(...await listFiles(root, file => pattern.test(path.basename(file)), maxDepth));
62
+ return files.sort().at(-1) ?? null;
63
+ }
64
+
65
+ function executableNames(base, platform) {
66
+ if (platform !== 'win32') return [base];
67
+ if (base === 'java' || base === 'hdc' || base === 'Emulator') return [`${base}.exe`, base];
68
+ return [`${base}.cmd`, `${base}.bat`, `${base}.exe`, base];
69
+ }
70
+
71
+ async function readProductInfo(contentsRoot, platform) {
72
+ const candidates = [
73
+ path.join(contentsRoot, 'product-info.json'),
74
+ path.join(contentsRoot, 'Resources', 'product-info.json'),
75
+ path.join(contentsRoot, 'bin', 'product-info.json'),
76
+ ];
77
+ for (const file of candidates) {
78
+ if (!(await exists(file))) continue;
79
+ try {
80
+ const data = JSON.parse(await readFile(file, 'utf8'));
81
+ const osName = platform === 'win32' ? 'Windows' : platform === 'darwin' ? 'macOS' : 'Linux';
82
+ const launch = data.launch?.find(item => item.os === osName) ?? data.launch?.[0] ?? null;
83
+ return {
84
+ file,
85
+ name: data.name ?? null,
86
+ version: data.version ?? null,
87
+ buildNumber: data.buildNumber ?? null,
88
+ java: launch?.javaExecutablePath ? path.resolve(path.dirname(file), launch.javaExecutablePath) : null,
89
+ };
90
+ } catch {
91
+ return { file, name: null, version: null, buildNumber: null, java: null };
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+
97
+ async function scannerContract(file, probeHelp = true) {
98
+ try {
99
+ const text = await readFile(file, 'utf8');
100
+ if (text.includes('__webpack_require__.s = "./src/collector/api/ApiChangeMain.ts"')) return 'integrated';
101
+ if (text.includes('__webpack_require__.s = "./src/collector/api/MainSrc.ts"')) return 'index';
102
+ const integrated = INTEGRATED_CLI_MARKERS.every(marker => text.includes(marker));
103
+ const index = INDEX_CLI_MARKERS.every(marker => text.includes(marker));
104
+ if (integrated && !index) return 'integrated';
105
+ if (index && !integrated) return 'index';
106
+ if (integrated && index) {
107
+ if (!probeHelp) return 'unknown';
108
+ const help = await scannerHelp(file);
109
+ const output = `${help.stdout}\n${help.stderr}`;
110
+ if (/--startVersion/.test(output) && /--modulePaths/.test(output)) return 'integrated';
111
+ if (/--configPath/.test(output) && /--apiModifiedPath/.test(output)) return 'index';
112
+ }
113
+ } catch {
114
+ // The candidate is recorded in layout diagnostics below.
115
+ }
116
+ return 'unknown';
117
+ }
118
+
119
+ async function analyzerRoots(contentsRoot) {
120
+ const roots = [];
121
+ const add = (candidate) => {
122
+ const normalized = path.resolve(candidate);
123
+ if (!roots.includes(normalized)) roots.push(normalized);
124
+ };
125
+ if (/arkanalyzer|api.*scan|scan.*api/i.test(path.basename(contentsRoot))) add(contentsRoot);
126
+ for (const pluginFamily of ['harmony', 'openharmony']) {
127
+ const familyRoot = path.join(contentsRoot, 'plugins', pluginFamily);
128
+ if (!(await exists(familyRoot))) continue;
129
+ add(path.join(familyRoot, 'arkanalyzer-apiscan'));
130
+ async function visit(directory, depth) {
131
+ if (!(await exists(directory)) || depth > 2) return;
132
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
133
+ if (!entry.isDirectory()) continue;
134
+ const target = path.join(directory, entry.name);
135
+ if (/arkanalyzer|api.*scan|scan.*api/i.test(entry.name)) add(target);
136
+ await visit(target, depth + 1);
137
+ }
138
+ }
139
+ await visit(familyRoot, 0);
140
+ }
141
+ const existing = [];
142
+ for (const root of roots) if (await exists(root)) existing.push(root);
143
+ return existing;
144
+ }
145
+
146
+ export async function discoverSdkLayout(sdkRoot) {
147
+ const location = await resolveSdkRoot(sdkRoot, { required: false });
148
+ const root = location?.root ?? path.resolve(sdkRoot);
149
+ const defaultRoot = location?.defaultRoot ?? path.join(root, 'default');
150
+ const families = {};
151
+ const candidates = [];
152
+ if (await exists(defaultRoot)) {
153
+ for (const entry of await readdir(defaultRoot, { withFileTypes: true })) {
154
+ if (!entry.isDirectory()) continue;
155
+ const familyRoot = path.join(defaultRoot, entry.name);
156
+ const etsRoot = path.join(familyRoot, 'ets');
157
+ if (!(await exists(etsRoot))) continue;
158
+ const parser = path.join(etsRoot, 'build-tools', 'ets-loader', 'node_modules', 'typescript', 'lib', 'typescript.js');
159
+ const record = { name: entry.name, root: familyRoot, etsRoot, parserPath: await exists(parser) ? parser : null };
160
+ candidates.push(record);
161
+ if (entry.name.toLowerCase() === 'hms') families.hms = etsRoot;
162
+ if (record.parserPath) families.openharmony = etsRoot;
163
+ }
164
+ }
165
+ if (!families.openharmony) {
166
+ const preferred = candidates.find(item => ['openharmony', 'harmonyos', 'ohos'].includes(item.name.toLowerCase()));
167
+ if (preferred) families.openharmony = preferred.etsRoot;
168
+ }
169
+ const system = candidates.find(item => item.etsRoot === families.openharmony) ?? null;
170
+ return {
171
+ root,
172
+ defaultRoot,
173
+ families,
174
+ parserPath: system?.parserPath ?? null,
175
+ candidates,
176
+ };
177
+ }
178
+
179
+ export async function inspectDevEcoLayout(contentsRoot, sdkRoot, platform = process.platform, { targetVersion = null } = {}) {
180
+ const root = path.resolve(contentsRoot);
181
+ if (!(await exists(root))) return null;
182
+ const productInfo = await readProductInfo(root, platform);
183
+ const probeHelp = !targetVersion || inspectDevEcoCompatibility(productInfo, targetVersion, root).status === 'COMPATIBLE';
184
+ const sdkLayout = sdkRoot ? await discoverSdkLayout(sdkRoot) : null;
185
+ const roots = await analyzerRoots(root);
186
+ const scannerCandidates = [];
187
+ for (const analyzerRoot of roots) {
188
+ const files = await listFiles(analyzerRoot, file => /\.(?:c?js|mjs)$/i.test(file), 1);
189
+ for (const file of files) scannerCandidates.push({ file, analyzerRoot, contract: await scannerContract(file, probeHelp) });
190
+ }
191
+ const scanner = scannerCandidates.find(item => item.contract === 'integrated')
192
+ ?? scannerCandidates.find(item => item.contract === 'index') ?? null;
193
+ const analyzerRoot = scanner?.analyzerRoot ?? roots[0] ?? null;
194
+ const resourceCandidates = roots.map(candidate => path.join(candidate, 'resources', 'apiChange'));
195
+ for (const candidate of roots) {
196
+ const ruleFiles = await listFiles(candidate, file => /^HarmonyOS_.+\.json$/i.test(path.basename(file)), 3);
197
+ for (const file of ruleFiles) {
198
+ const directory = path.dirname(file);
199
+ if (!resourceCandidates.includes(directory)) resourceCandidates.push(directory);
200
+ }
201
+ }
202
+ let apiChangeResourceRoot = null;
203
+ for (const candidate of resourceCandidates) {
204
+ if (!(await exists(candidate))) continue;
205
+ const files = await readdir(candidate, { withFileTypes: true });
206
+ if (files.some(entry => entry.isFile() && /^HarmonyOS_.+\.json$/i.test(entry.name))) {
207
+ apiChangeResourceRoot = candidate;
208
+ break;
209
+ }
210
+ }
211
+ const harmonyLibRoots = [
212
+ path.join(root, 'plugins', 'harmony', 'lib'),
213
+ path.join(root, 'plugins', 'openharmony', 'lib'),
214
+ ];
215
+ const cApiScanJar = await newestMatching([
216
+ ...roots.map(candidate => path.join(candidate, 'lib')),
217
+ ...harmonyLibRoots,
218
+ ], /^(?:c[-_]?api[-_]?scan|capiscan)(?:-.*)?\.jar$/i);
219
+ const projectApiChangeJar = await newestMatching(harmonyLibRoots,
220
+ /^project[-_]?api[-_]?change[-_]?assistant(?:-.*)?\.jar$/i);
221
+ let apiChangeResourceArchive = null;
222
+ let archiveEntries = [];
223
+ let archiveError = null;
224
+ if (projectApiChangeJar) {
225
+ try {
226
+ archiveEntries = (await listZipEntries(projectApiChangeJar))
227
+ .filter(name => /^apiChange\/.+\.json$/i.test(name));
228
+ if (archiveEntries.length > 0) apiChangeResourceArchive = projectApiChangeJar;
229
+ } catch (error) {
230
+ archiveError = error.message;
231
+ }
232
+ }
233
+ const java = await firstExisting([
234
+ productInfo?.java,
235
+ ...executableNames('java', platform).map(name => path.join(root, 'jbr', 'Contents', 'Home', 'bin', name)),
236
+ ...executableNames('java', platform).map(name => path.join(root, 'jbr', 'bin', name)),
237
+ ]);
238
+ const executable = (directory, base) => firstExisting(executableNames(base, platform)
239
+ .map(name => path.join(root, directory, name)));
240
+ const components = {
241
+ java,
242
+ hvigorw: await executable(path.join('tools', 'hvigor', 'bin'), 'hvigorw'),
243
+ ohpm: await executable(path.join('tools', 'ohpm', 'bin'), 'ohpm'),
244
+ emulator: await executable(path.join('tools', 'emulator'), 'Emulator'),
245
+ hdc: sdkLayout ? await firstExisting(sdkLayout.candidates.flatMap(family => executableNames('hdc', platform)
246
+ .map(name => path.join(family.root, 'toolchains', name)))) : null,
247
+ apiChangeScan: scanner?.file ?? null,
248
+ apiChangeBackend: scanner?.contract ?? null,
249
+ ...await scannerCapabilities(scanner,probeHelp),
250
+ apiChangeResourceRoot,
251
+ apiChangeResourceArchive,
252
+ projectApiChangeJar,
253
+ cApiScanJar,
254
+ parserPath: sdkLayout?.parserPath ?? null,
255
+ sdkFamilies: sdkLayout?.families ?? {},
256
+ };
257
+ return {
258
+ root,
259
+ analyzerRoot,
260
+ components,
261
+ productInfo,
262
+ diagnostics: {
263
+ analyzerRoots: roots,
264
+ scannerCandidates,
265
+ resourceCandidates,
266
+ projectApiChangeJar,
267
+ archiveEntries,
268
+ archiveError,
269
+ sdkLayout,
270
+ },
271
+ };
272
+ }
273
+
274
+ export async function discoverDevEco(sdkPath, devecoHomePath = null, {
275
+ platform = process.platform,
276
+ env = process.env,
277
+ targetVersion = null,
278
+ } = {}) {
279
+ const sdkLocation = await resolveSdkRoot(sdkPath);
280
+ const { root: sdkRoot, packagePath: sdkPackage } = sdkLocation;
281
+ const sdkMetadata = JSON.parse(await readFile(sdkPackage, 'utf8'));
282
+ const contentsRoot = path.resolve(devecoHomePath || env.DEVECO_HOME || path.dirname(sdkRoot));
283
+ const rawVersion = `${sdkMetadata.data.platformVersion}(${sdkMetadata.data.apiVersion}) ${sdkMetadata.data.releaseType}`;
284
+ const sdkVersion = parseVersion(rawVersion);
285
+ const productInfo = await readProductInfo(contentsRoot, platform);
286
+ const devecoCompatibility = inspectDevEcoCompatibility(productInfo, targetVersion ?? sdkVersion, contentsRoot);
287
+ assertDevEcoCompatibility(devecoCompatibility);
288
+ const layout = await inspectDevEcoLayout(contentsRoot, sdkRoot, platform);
289
+ const required = [
290
+ ['compatible API scan CLI', layout?.components.apiChangeScan],
291
+ ['API change resources', layout?.components.apiChangeResourceRoot
292
+ ?? layout?.components.apiChangeResourceArchive],
293
+ ['target SDK ArkTS parser', layout?.components.parserPath],
294
+ ];
295
+ const missing = required.filter(([, target]) => !target).map(([name]) => name);
296
+ if (missing.length) {
297
+ const error = new Error(`DevEco scanner layout is unsupported or incomplete: ${missing.join(', ')}`);
298
+ error.code = 'UNSUPPORTED_DEVECO_SCANNER_LAYOUT';
299
+ error.details = { contentsRoot, ...(layout?.diagnostics ?? {}) };
300
+ throw error;
301
+ }
302
+ const components = layout.components;
303
+ const hashes = {
304
+ apiChangeScan: await sha256File(components.apiChangeScan),
305
+ sdkPackage: await sha256File(sdkPackage),
306
+ };
307
+ if (components.projectApiChangeJar) hashes.projectApiChangeJar = await sha256File(components.projectApiChangeJar);
308
+ if (components.cApiScanJar) hashes.cApiScanJar = await sha256File(components.cApiScanJar);
309
+ return {
310
+ sdkRoot,
311
+ sdkLocation,
312
+ contentsRoot,
313
+ analyzerRoot: layout.analyzerRoot,
314
+ apiChangeScan: components.apiChangeScan,
315
+ apiChangeBackend: components.apiChangeBackend,
316
+ fileScanSupported: components.fileScanSupported,
317
+ moduleScanSupported: components.moduleScanSupported,
318
+ capabilityEvidence:components.capabilityEvidence,
319
+ apiChangeResourceRoot: components.apiChangeResourceRoot,
320
+ apiChangeResourceArchive: components.apiChangeResourceArchive,
321
+ projectApiChangeJar: components.projectApiChangeJar,
322
+ cApiScanJar: components.cApiScanJar,
323
+ java: components.java,
324
+ hvigorw: components.hvigorw,
325
+ ohpm: components.ohpm,
326
+ parserPath: components.parserPath,
327
+ sdkFamilies: components.sdkFamilies,
328
+ productInfo: layout.productInfo,
329
+ devecoCompatibility,
330
+ layoutDiagnostics: layout.diagnostics,
331
+ sdkMetadata,
332
+ sdkVersion,
333
+ hashes,
334
+ };
335
+ }
336
+
337
+ export function validateTargetCoverage(toolchain, target) {
338
+ assertDevEcoCompatibility(inspectDevEcoCompatibility(toolchain.productInfo, target, toolchain.contentsRoot));
339
+ if (compareVersions(toolchain.sdkVersion, target) < 0) {
340
+ const error = new Error(
341
+ `Installed SDK ${toolchain.sdkMetadata.data.platformVersion} ${toolchain.sdkMetadata.data.releaseType} `
342
+ + `does not cover target ${target.raw ?? target}`,
343
+ );
344
+ error.code = 'SDK_TARGET_NOT_COVERED';
345
+ error.details = { installed: canonicalVersion(toolchain.sdkVersion), target: canonicalVersion(target) };
346
+ throw error;
347
+ }
348
+ }
@@ -0,0 +1,81 @@
1
+ import { readFile, realpath } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { statSync, realpathSync } from 'node:fs';
4
+ import { exists, listFiles, portableRelative, sha256, sha256File } from '../../shared/io/fs-utils.mjs';
5
+ import { parseJson5 } from '../../shared/format/json5.mjs';
6
+ import { projectModules, createSourceScope, sourceInScope, sourceLocation, SOURCE_EXCLUDED } from '../../shared/platform/source-scope.mjs';
7
+ import { errorWithCode } from '../../shared/platform/errors.mjs';
8
+ import { samePath } from '../../shared/platform/paths.mjs';
9
+ import { isSourceFile } from '../../shared/platform/source-types.mjs';
10
+
11
+ function overlaps(left, right) {
12
+ return left === right || left.startsWith(`${right}${path.sep}`) || right.startsWith(`${left}${path.sep}`);
13
+ }
14
+
15
+ export async function loadProject(projectPath, productName, requestedScanDirs = [], requestedScanModules = [], projectType = 'app') {
16
+ const root = await realpath(path.resolve(projectPath));
17
+ const buildProfilePath = path.join(root, 'build-profile.json5');
18
+ if (!(await exists(buildProfilePath))) throw new Error(`HarmonyOS build profile not found: ${buildProfilePath}`);
19
+ const buildProfileText = await readFile(buildProfilePath, 'utf8');
20
+ const buildProfile = parseJson5(buildProfileText);
21
+ const products = buildProfile.app?.products ?? [];
22
+ let product = productName ? products.find((item) => item.name === productName) : null;
23
+ if (!product && !productName && products.length === 1) product = products[0];
24
+ if (!product) throw new Error(`Product ${productName || '<unspecified>'} not found or is ambiguous`);
25
+ const allModules = await projectModules(root, buildProfile);
26
+ const sourceScope = await createSourceScope(root, allModules, { scanDirs: requestedScanDirs, scanModules: requestedScanModules, projectType });
27
+ const selectedModules = allModules.filter(module => sourceScope.selectedModules.includes(module.name));
28
+ const scanDirs = (sourceScope.scanDirs.length ? sourceScope.scanDirs : sourceScope.roots)
29
+ .map(absolute => ({ absolute, relative: portableRelative(root, absolute) || '.' }));
30
+ const roots = [...new Set([root, ...allModules.map(module => module.root)])];
31
+ const sourceFiles = [...new Set((await Promise.all(roots.map(directory => listFiles(directory, file =>
32
+ isSourceFile(file) && !['hvigorfile.ts', 'BuildProfile.ets'].includes(path.basename(file))
33
+ && sourceInScope(root, file, sourceScope), directory => !SOURCE_EXCLUDED.has(path.basename(directory)))))).flat())].sort();
34
+ if (sourceScope.restricted && !sourceFiles.length) throw errorWithCode('The selected scope contains no scannable source files', 'SCAN_SCOPE_EMPTY');
35
+ const snapshotParts = [];
36
+ for (const file of sourceFiles) snapshotParts.push(`${portableRelative(root, file)}\0${await sha256File(file)}`);
37
+ return {
38
+ root,
39
+ model: 'STAGE',
40
+ buildProfilePath,
41
+ buildProfile,
42
+ buildProfileHash: sha256(buildProfileText),
43
+ product,
44
+ modules: allModules,
45
+ selectedModules,
46
+ scanDirs,
47
+ sourceScope,
48
+ sourceFiles,
49
+ sourceFileSet: new Set(sourceFiles),
50
+ sourceSnapshot: sha256(snapshotParts.join('\n')),
51
+ };
52
+ }
53
+
54
+ export function canonicalSourceFile(project, absolute, platform = process.platform) {
55
+ if (!project.sourceFiles || project.sourceFiles.includes(absolute)) return absolute;
56
+ if (existsSyncFile(absolute)) {
57
+ const actual = realpathSync.native(absolute);
58
+ const physicalMatches = project.sourceFiles.filter(file => existsSyncFile(file) && realpathSync.native(file) === actual);
59
+ if (physicalMatches.length === 1) return physicalMatches[0];
60
+ }
61
+ const candidates = project.sourceFiles.filter(file => platform === 'darwin'
62
+ ? file.toLowerCase() === absolute.toLowerCase()
63
+ : samePath(file, absolute, platform));
64
+ if (candidates.length !== 1) return null;
65
+ try {
66
+ const actual = statSync(candidates[0]);
67
+ const requested = statSync(absolute);
68
+ return actual.ino === requested.ino && actual.dev === requested.dev ? candidates[0] : null;
69
+ } catch { return null; }
70
+ }
71
+
72
+ export function locationInsideScanDirs(project, codeLocation) {
73
+ try {
74
+ const { absolutePath } = sourceLocation(project.root, project.modules, codeLocation);
75
+ return (project.sourceScope ? sourceInScope(project.root, absolutePath, project.sourceScope)
76
+ : project.scanDirs.some(directory => overlaps(absolutePath, directory.absolute)))
77
+ && canonicalSourceFile(project, absolutePath) !== null;
78
+ } catch { return false; }
79
+ }
80
+
81
+ function existsSyncFile(file) { try { return statSync(file).isFile(); } catch { return false; } }