@atomic-ehr/fhir-canonical-manager 0.0.14 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/cache.d.ts +4 -1
  2. package/dist/cache.d.ts.map +1 -1
  3. package/dist/cache.js +30 -4
  4. package/dist/cache.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/local.d.ts +5 -0
  10. package/dist/local.d.ts.map +1 -0
  11. package/dist/local.js +148 -0
  12. package/dist/local.js.map +1 -0
  13. package/dist/manager/canonical.d.ts.map +1 -1
  14. package/dist/manager/canonical.js +231 -22
  15. package/dist/manager/canonical.js.map +1 -1
  16. package/dist/manager/package-spec.d.ts +5 -0
  17. package/dist/manager/package-spec.d.ts.map +1 -0
  18. package/dist/manager/package-spec.js +28 -0
  19. package/dist/manager/package-spec.js.map +1 -0
  20. package/dist/package.d.ts.map +1 -1
  21. package/dist/package.js +25 -5
  22. package/dist/package.js.map +1 -1
  23. package/dist/{reference/manager.d.ts → reference.d.ts} +8 -3
  24. package/dist/reference.d.ts.map +1 -0
  25. package/dist/{reference/manager.js → reference.js} +7 -2
  26. package/dist/reference.js.map +1 -0
  27. package/dist/{resolver/context.d.ts → resolver.d.ts} +3 -3
  28. package/dist/resolver.d.ts.map +1 -0
  29. package/dist/{resolver/context.js → resolver.js} +1 -1
  30. package/dist/resolver.js.map +1 -0
  31. package/dist/types/core.d.ts +14 -2
  32. package/dist/types/core.d.ts.map +1 -1
  33. package/dist/types/internal.d.ts +4 -2
  34. package/dist/types/internal.d.ts.map +1 -1
  35. package/package.json +2 -3
  36. package/dist/reference/index.d.ts +0 -4
  37. package/dist/reference/index.d.ts.map +0 -1
  38. package/dist/reference/index.js +0 -3
  39. package/dist/reference/index.js.map +0 -1
  40. package/dist/reference/manager.d.ts.map +0 -1
  41. package/dist/reference/manager.js.map +0 -1
  42. package/dist/reference/store.d.ts +0 -6
  43. package/dist/reference/store.d.ts.map +0 -1
  44. package/dist/reference/store.js +0 -6
  45. package/dist/reference/store.js.map +0 -1
  46. package/dist/resolver/context.d.ts.map +0 -1
  47. package/dist/resolver/context.js.map +0 -1
  48. package/dist/resolver/index.d.ts +0 -2
  49. package/dist/resolver/index.d.ts.map +0 -1
  50. package/dist/resolver/index.js +0 -2
  51. package/dist/resolver/index.js.map +0 -1
  52. package/src/cache.ts +0 -58
  53. package/src/cli/index.ts +0 -181
  54. package/src/cli/init.ts +0 -112
  55. package/src/cli/list.ts +0 -95
  56. package/src/cli/resolve.ts +0 -63
  57. package/src/cli/search.ts +0 -83
  58. package/src/cli/searchparam.ts +0 -163
  59. package/src/constants.ts +0 -6
  60. package/src/fs/index.ts +0 -5
  61. package/src/fs/utils.ts +0 -28
  62. package/src/index.ts +0 -18
  63. package/src/manager/canonical.ts +0 -327
  64. package/src/manager/index.ts +0 -6
  65. package/src/package.ts +0 -79
  66. package/src/reference/index.ts +0 -8
  67. package/src/reference/manager.ts +0 -55
  68. package/src/reference/store.ts +0 -14
  69. package/src/resolver/context.ts +0 -25
  70. package/src/resolver/index.ts +0 -5
  71. package/src/scanner/directory.ts +0 -36
  72. package/src/scanner/index.ts +0 -8
  73. package/src/scanner/package.ts +0 -35
  74. package/src/scanner/parser.ts +0 -40
  75. package/src/scanner/processor.ts +0 -65
  76. package/src/search/index.ts +0 -6
  77. package/src/search/smart.ts +0 -50
  78. package/src/search/terms.ts +0 -22
  79. package/src/types/core.ts +0 -131
  80. package/src/types/index.ts +0 -6
  81. package/src/types/internal.ts +0 -59
package/dist/cache.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ReferenceManager } from "./reference/index.js";
1
+ import { type ReferenceManager } from "./reference.js";
2
2
  import type { CacheData, CacheKey, IndexCache } from "./types/index.js";
3
3
  export interface ExtendedCache extends IndexCache {
4
4
  referenceManager: ReferenceManager;
@@ -9,8 +9,11 @@ export declare const cacheRecordPaths: (pwd: string, packages: string[]) => {
9
9
  cacheRecordPath: string;
10
10
  cacheIndexFile: string;
11
11
  npmPackagePath: string;
12
+ npmRootPackageJsonFile: string;
12
13
  };
14
+ export declare const calculatePackageLockHash: (npmPackagePath: string) => Promise<string | undefined>;
13
15
  export declare const createCacheRecord: () => ExtendedCache;
14
16
  export declare const loadCacheRecordFromDisk: (pwd: string, cacheKey: CacheKey) => Promise<CacheData | undefined>;
15
17
  export declare const saveCacheRecordToDisk: (cache: ExtendedCache, pwd: string, cacheKey: CacheKey) => Promise<void>;
18
+ export declare const flushCache: (workingDir: string) => Promise<void>;
16
19
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAExE,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;CACtC;AAED,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,KAAG,QAIpD,CAAC;AASF,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,EAAE;;;;;CAG/D,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,aAOpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,KAAK,MAAM,EAAE,UAAU,QAAQ,KAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAQ5G,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,OAAO,aAAa,EAAE,KAAK,MAAM,EAAE,UAAU,QAAQ,KAAG,OAAO,CAAC,IAAI,CAU/G,CAAC"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAExE,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;CACtC;AAED,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,KAAG,QAIpD,CAAC;AAUF,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,EAAE;;;;;;CAG/D,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAYjG,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,aAOpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,KAAK,MAAM,EAAE,UAAU,QAAQ,KAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAQ5G,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,OAAO,aAAa,EAAE,KAAK,MAAM,EAAE,UAAU,QAAQ,KAAG,OAAO,CAAC,IAAI,CAW/G,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CASjE,CAAC"}
package/dist/cache.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import * as afs from "node:fs/promises";
3
3
  import * as Path from "node:path";
4
- import { createReferenceManager } from "./reference/index.js";
4
+ import { createReferenceManager } from "./reference.js";
5
5
  export const computeCacheKey = (packages) => {
6
6
  const content = JSON.stringify(packages.toSorted());
7
7
  const hash = createHash("sha256").update(content).digest("hex");
@@ -10,13 +10,27 @@ export const computeCacheKey = (packages) => {
10
10
  const cacheRecordPathsFromKey = (pwd, cacheKey) => {
11
11
  const cacheRecordPath = Path.join(pwd, cacheKey);
12
12
  const npmPackagePath = Path.join(process.cwd(), cacheRecordPath, "node");
13
+ const npmRootPackageJsonFile = Path.join(npmPackagePath, "package.json");
13
14
  const cacheIndexFile = Path.join(cacheRecordPath, "index.json");
14
- return { cacheKey, cacheRecordPath, cacheIndexFile, npmPackagePath };
15
+ return { cacheKey, cacheRecordPath, cacheIndexFile, npmPackagePath, npmRootPackageJsonFile };
15
16
  };
16
17
  export const cacheRecordPaths = (pwd, packages) => {
17
18
  const cacheKey = computeCacheKey(packages);
18
19
  return cacheRecordPathsFromKey(pwd, cacheKey);
19
20
  };
21
+ export const calculatePackageLockHash = async (npmPackagePath) => {
22
+ const lockFiles = ["package-lock.json", "bun.lock", "bun.lockb"];
23
+ for (const lockFile of lockFiles) {
24
+ const lockPath = Path.join(npmPackagePath, lockFile);
25
+ try {
26
+ const content = await afs.readFile(lockPath);
27
+ return createHash("sha256").update(content).digest("hex");
28
+ }
29
+ catch {
30
+ }
31
+ }
32
+ return undefined;
33
+ };
20
34
  export const createCacheRecord = () => {
21
35
  return {
22
36
  entries: {},
@@ -40,10 +54,22 @@ export const saveCacheRecordToDisk = async (cache, pwd, cacheKey) => {
40
54
  entries: cache.entries,
41
55
  packages: cache.packages,
42
56
  references: cache.referenceManager.getAllReferences(),
43
- packageLockHash: cacheKey,
44
57
  };
45
- const { cacheIndexFile, cacheRecordPath } = cacheRecordPathsFromKey(pwd, cacheKey);
58
+ const { cacheIndexFile, cacheRecordPath, npmPackagePath } = cacheRecordPathsFromKey(pwd, cacheKey);
59
+ cacheData.packageLockHash = await calculatePackageLockHash(npmPackagePath);
60
+ cacheData.cacheKey = cacheKey;
46
61
  await afs.mkdir(cacheRecordPath, { recursive: true });
47
62
  await afs.writeFile(cacheIndexFile, JSON.stringify(cacheData, null, 2));
48
63
  };
64
+ export const flushCache = async (workingDir) => {
65
+ try {
66
+ const entries = await afs.readdir(workingDir, { withFileTypes: true });
67
+ for (const entry of entries) {
68
+ if (entry.isDirectory() && /^[a-f0-9]{64}$/i.test(entry.name)) {
69
+ await afs.rm(Path.join(workingDir, entry.name), { recursive: true, force: true });
70
+ }
71
+ }
72
+ }
73
+ catch { }
74
+ };
49
75
  //# sourceMappingURL=cache.js.map
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AAOrF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAkB,EAAY,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,IAAgB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,QAAkB,EAAE,EAAE;IAChE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAChE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AACzE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,QAAkB,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAkB,EAAE;IACjD,OAAO;QACH,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,sBAAsB,EAAE;KAC7C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,GAAW,EAAE,QAAkB,EAAkC,EAAE;IAC7G,IAAI,CAAC;QACD,MAAM,EAAE,cAAc,EAAE,GAAG,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO;IACX,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,KAAoB,EAAE,GAAW,EAAE,QAAkB,EAAiB,EAAE;IAChH,MAAM,SAAS,GAAc;QACzB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,EAAE;QACrD,eAAe,EAAE,QAAQ;KAC5B,CAAC;IACF,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { CanonicalManager, createCanonicalManager } from "./manager/index.js";
2
- export type { ReferenceManager as ReferenceManagerType } from "./reference/index.js";
3
- export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from "./reference/index.js";
2
+ export type { ReferenceManager as ReferenceManagerType } from "./reference.js";
3
+ export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from "./reference.js";
4
4
  export type { CanonicalManager as TCanonicalManager } from "./types/core.js";
5
5
  export * from "./types/index.js";
6
6
  import { createCanonicalManager } from "./manager/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAErF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE3G,YAAY,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAErG,YAAY,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,eAAe,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { CanonicalManager, createCanonicalManager } from "./manager/index.js";
2
- export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from "./reference/index.js";
2
+ export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from "./reference.js";
3
3
  export * from "./types/index.js";
4
4
  import { createCanonicalManager } from "./manager/index.js";
5
5
  export default createCanonicalManager;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAI3G,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIrG,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { LocalPackageConfig, PackageId } from "./types/index.js";
2
+ export declare const installTgzPackage: (archivePath: string, destPath: string, registry?: string) => Promise<PackageId>;
3
+ export declare const generateIndexJson: (targetPath: string) => Promise<void>;
4
+ export declare const installLocalFolder: (config: LocalPackageConfig, destPath: string) => Promise<PackageId>;
5
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../src/local.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAuCtE,eAAO,MAAM,iBAAiB,GAC1B,aAAa,MAAM,EACnB,UAAU,MAAM,EAChB,WAAW,MAAM,KAClB,OAAO,CAAC,SAAS,CA2CnB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CA+CxE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,QAAQ,kBAAkB,EAAE,UAAU,MAAM,KAAG,OAAO,CAAC,SAAS,CAwDxG,CAAC"}
package/dist/local.js ADDED
@@ -0,0 +1,148 @@
1
+ import * as afs from "node:fs/promises";
2
+ import * as Path from "node:path";
3
+ import { ensureDir, fileExists } from "./fs/index.js";
4
+ import { isPathSpec, parsePackageRef } from "./manager/package-spec.js";
5
+ import { installPackages } from "./package.js";
6
+ const parseDependencySpec = (spec) => {
7
+ const trimmed = spec.trim();
8
+ if (!trimmed || isPathSpec(trimmed) || trimmed.startsWith("http://") || trimmed.startsWith("https://")) {
9
+ return undefined;
10
+ }
11
+ try {
12
+ return parsePackageRef(trimmed);
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ };
18
+ export const installTgzPackage = async (archivePath, destPath, registry) => {
19
+ if (!(await fileExists(archivePath))) {
20
+ throw new Error(`TGZ archive not found: ${archivePath}`);
21
+ }
22
+ await installPackages([archivePath], destPath, registry);
23
+ const rootPackageJsonPath = Path.join(destPath, "package.json");
24
+ const rootPackageJson = JSON.parse(await afs.readFile(rootPackageJsonPath, "utf-8"));
25
+ const dependencies = rootPackageJson.dependencies || {};
26
+ for (const [depName, depVersion] of Object.entries(dependencies)) {
27
+ if (depVersion === archivePath || depVersion.includes(archivePath)) {
28
+ const pkgPath = depName.startsWith("@")
29
+ ? Path.join(destPath, "node_modules", ...depName.split("/"))
30
+ : Path.join(destPath, "node_modules", depName);
31
+ const pkgJsonPath = Path.join(pkgPath, "package.json");
32
+ if (await fileExists(pkgJsonPath)) {
33
+ const pkgJson = JSON.parse(await afs.readFile(pkgJsonPath, "utf-8"));
34
+ return { name: pkgJson.name, version: pkgJson.version };
35
+ }
36
+ }
37
+ }
38
+ const nodeModulesPath = Path.join(destPath, "node_modules");
39
+ const entries = await afs.readdir(nodeModulesPath, { withFileTypes: true });
40
+ for (const entry of entries) {
41
+ if (!entry.isDirectory())
42
+ continue;
43
+ const pkgPath = Path.join(nodeModulesPath, entry.name);
44
+ const pkgJsonPath = Path.join(pkgPath, "package.json");
45
+ if (await fileExists(pkgJsonPath)) {
46
+ const pkgJson = JSON.parse(await afs.readFile(pkgJsonPath, "utf-8"));
47
+ if (await fileExists(Path.join(pkgPath, ".index.json"))) {
48
+ return { name: pkgJson.name, version: pkgJson.version };
49
+ }
50
+ }
51
+ }
52
+ throw new Error(`Failed to identify installed package from tgz: ${archivePath}`);
53
+ };
54
+ export const generateIndexJson = async (targetPath) => {
55
+ const files = [];
56
+ const entries = await afs.readdir(targetPath, { withFileTypes: true });
57
+ for (const entry of entries) {
58
+ if (!entry.isFile())
59
+ continue;
60
+ if (!entry.name.endsWith(".json"))
61
+ continue;
62
+ if (entry.name === "package.json" || entry.name === ".index.json")
63
+ continue;
64
+ const filePath = Path.join(targetPath, entry.name);
65
+ try {
66
+ const content = await afs.readFile(filePath, "utf-8");
67
+ const resource = JSON.parse(content);
68
+ if (!resource.resourceType || !resource.id)
69
+ continue;
70
+ const indexEntry = {
71
+ filename: entry.name,
72
+ resourceType: resource.resourceType,
73
+ id: resource.id,
74
+ };
75
+ if (resource.url)
76
+ indexEntry.url = resource.url;
77
+ if (resource.version)
78
+ indexEntry.version = resource.version;
79
+ if (resource.resourceType === "StructureDefinition") {
80
+ if (resource.kind)
81
+ indexEntry.kind = resource.kind;
82
+ if (resource.type)
83
+ indexEntry.type = resource.type;
84
+ }
85
+ files.push(indexEntry);
86
+ }
87
+ catch (e) {
88
+ console.error("Error while creating index.json", e);
89
+ }
90
+ }
91
+ if (files.length === 0) {
92
+ throw new Error(`No valid FHIR resources found in folder: ${targetPath}`);
93
+ }
94
+ const indexFile = {
95
+ "index-version": 1,
96
+ files,
97
+ };
98
+ await afs.writeFile(Path.join(targetPath, ".index.json"), JSON.stringify(indexFile, null, 2));
99
+ };
100
+ export const installLocalFolder = async (config, destPath) => {
101
+ const { name, version, path: sourcePath } = config;
102
+ if (!(await fileExists(sourcePath))) {
103
+ throw new Error(`Local package folder not found: ${sourcePath}`);
104
+ }
105
+ const nodeModulesPath = Path.join(destPath, "node_modules");
106
+ const targetPath = name.startsWith("@")
107
+ ? Path.join(nodeModulesPath, ...name.split("/"))
108
+ : Path.join(nodeModulesPath, name);
109
+ await afs.rm(targetPath, { recursive: true, force: true });
110
+ await ensureDir(Path.dirname(targetPath));
111
+ await afs.cp(sourcePath, targetPath, { recursive: true });
112
+ const packageJsonPath = Path.join(targetPath, "package.json");
113
+ let packageJson;
114
+ if (await fileExists(packageJsonPath)) {
115
+ packageJson = JSON.parse(await afs.readFile(packageJsonPath, "utf-8"));
116
+ packageJson.name = packageJson.name ?? name;
117
+ packageJson.version = packageJson.version ?? version;
118
+ packageJson.private = true;
119
+ }
120
+ else {
121
+ packageJson = {
122
+ name,
123
+ version,
124
+ private: true,
125
+ };
126
+ }
127
+ if (!packageJson.dependencies) {
128
+ packageJson.dependencies = {};
129
+ }
130
+ const dependencyMap = packageJson.dependencies;
131
+ if (config.dependencies) {
132
+ for (const dep of config.dependencies) {
133
+ const parsed = parseDependencySpec(dep);
134
+ if (!parsed)
135
+ continue;
136
+ if (!dependencyMap[parsed.name]) {
137
+ dependencyMap[parsed.name] = parsed.version;
138
+ }
139
+ }
140
+ }
141
+ await afs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
142
+ const indexJsonPath = Path.join(targetPath, ".index.json");
143
+ if (!(await fileExists(indexJsonPath))) {
144
+ await generateIndexJson(targetPath);
145
+ }
146
+ return { name, version };
147
+ };
148
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../src/local.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/manager/canonical.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACR,gBAAgB,EAChB,MAAM,EAQT,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,gBA6SvD,CAAC"}
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/manager/canonical.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACR,gBAAgB,EAChB,MAAM,EAUT,MAAM,mBAAmB,CAAC;AA+C3B,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,gBAwfvD,CAAC"}
@@ -1,14 +1,93 @@
1
+ import { createHash } from "node:crypto";
1
2
  import * as afs from "node:fs/promises";
2
3
  import * as Path from "node:path";
3
- import { cacheRecordPaths, createCacheRecord, loadCacheRecordFromDisk, saveCacheRecordToDisk } from "../cache.js";
4
+ import { cacheRecordPaths, calculatePackageLockHash, createCacheRecord, flushCache as flushCacheFromDisk, loadCacheRecordFromDisk, saveCacheRecordToDisk, } from "../cache.js";
4
5
  import { DEFAULT_REGISTRY } from "../constants.js";
5
- import { ensureDir } from "../fs/index.js";
6
+ import { ensureDir, fileExists } from "../fs/index.js";
7
+ import { installLocalFolder, installTgzPackage } from "../local.js";
6
8
  import { installPackages } from "../package.js";
7
- import { resolveWithContext } from "../resolver/index.js";
9
+ import { resolveWithContext } from "../resolver.js";
8
10
  import { scanDirectory } from "../scanner/index.js";
9
11
  import { filterBySmartSearch } from "../search/index.js";
12
+ import { isPathSpec, normalizePackageSpec, parsePackageRef } from "./package-spec.js";
13
+ const hashLocalPackageSource = async (dirPath) => {
14
+ const hash = createHash("sha256");
15
+ const walk = async (currentPath) => {
16
+ const entries = await afs.readdir(currentPath, { withFileTypes: true });
17
+ entries.sort((a, b) => a.name.localeCompare(b.name));
18
+ for (const entry of entries) {
19
+ if (entry.name === "node_modules" || entry.name === ".git") {
20
+ continue;
21
+ }
22
+ const fullPath = Path.join(currentPath, entry.name);
23
+ if (entry.isDirectory()) {
24
+ hash.update(`dir:${fullPath}`);
25
+ await walk(fullPath);
26
+ }
27
+ else if (entry.isFile()) {
28
+ hash.update(`file:${fullPath}`);
29
+ const content = await afs.readFile(fullPath);
30
+ hash.update(content);
31
+ }
32
+ }
33
+ };
34
+ await walk(dirPath);
35
+ return hash.digest("hex");
36
+ };
37
+ const createLocalCacheKeyPart = async (config) => {
38
+ const dependencies = config.dependencies ? [...config.dependencies].sort() : [];
39
+ const sourceHash = await hashLocalPackageSource(config.path);
40
+ return JSON.stringify({
41
+ type: "local",
42
+ name: config.name,
43
+ version: config.version,
44
+ path: config.path,
45
+ dependencies,
46
+ sourceHash,
47
+ });
48
+ };
10
49
  export const createCanonicalManager = (config) => {
11
- const { packages = [], workingDir } = config;
50
+ const workingDir = config.workingDir;
51
+ const packageSpecs = [...(config.packages ?? [])].map(normalizePackageSpec);
52
+ const localPackages = new Map();
53
+ const pathPackageMeta = new Map();
54
+ const getCacheKeyPackages = () => {
55
+ const localParts = Array.from(localPackages.values()).map((entry) => entry.cacheKeyPart);
56
+ return [...packageSpecs, ...localParts];
57
+ };
58
+ const refreshLocalPackageCacheKeys = async () => {
59
+ if (localPackages.size === 0)
60
+ return;
61
+ await Promise.all(Array.from(localPackages.values()).map(async (entry) => {
62
+ entry.cacheKeyPart = await createLocalCacheKeyPart(entry.config);
63
+ }));
64
+ };
65
+ const localPackageTargetPath = (packageName, npmPackagePath) => {
66
+ const segments = packageName.startsWith("@") ? packageName.split("/") : [packageName];
67
+ return Path.join(npmPackagePath, "node_modules", ...segments);
68
+ };
69
+ const ensureLocalPackagesPresent = async (npmPackagePath) => {
70
+ if (localPackages.size === 0)
71
+ return true;
72
+ for (const entry of localPackages.values()) {
73
+ const targetPath = localPackageTargetPath(entry.config.name, npmPackagePath);
74
+ if (!(await fileExists(targetPath))) {
75
+ return false;
76
+ }
77
+ }
78
+ return true;
79
+ };
80
+ const areCachedPackagePathsPresent = async (packagesRecord) => {
81
+ const packageInfos = Object.values(packagesRecord);
82
+ if (packageInfos.length === 0)
83
+ return true;
84
+ const checks = await Promise.all(packageInfos.map(async (pkg) => {
85
+ if (!pkg.path)
86
+ return true;
87
+ return fileExists(pkg.path);
88
+ }));
89
+ return checks.every(Boolean);
90
+ };
12
91
  let registry = DEFAULT_REGISTRY;
13
92
  if (config.registry) {
14
93
  registry = config.registry.endsWith("/") ? config.registry : `${config.registry}/`;
@@ -16,19 +95,106 @@ export const createCanonicalManager = (config) => {
16
95
  const cache = createCacheRecord();
17
96
  let initialized = false;
18
97
  const searchParamsCache = new Map();
98
+ const installConfiguredLocalPackages = async (npmPackagePath) => {
99
+ const skipDependencyInstall = process.env.FCM_SKIP_LOCAL_DEP_INSTALL === "1";
100
+ for (const entry of localPackages.values()) {
101
+ await installLocalFolder(entry.config, npmPackagePath);
102
+ if (!skipDependencyInstall && entry.config.dependencies && entry.config.dependencies.length > 0) {
103
+ await installPackages(entry.config.dependencies, npmPackagePath, registry);
104
+ }
105
+ }
106
+ };
19
107
  const ensureInitialized = () => {
20
108
  if (!initialized) {
21
109
  throw new Error("CanonicalManager not initialized. Call init() first.");
22
110
  }
23
111
  };
112
+ const rebuildWithCurrentConfig = async () => {
113
+ if (initialized) {
114
+ await destroy();
115
+ }
116
+ await init();
117
+ };
118
+ const packageRefToPackageMeta = async () => {
119
+ ensureInitialized();
120
+ const { npmRootPackageJsonFile } = cacheRecordPaths(workingDir, getCacheKeyPackages());
121
+ const rootPackageDeps = JSON.parse(await afs.readFile(npmRootPackageJsonFile, "utf8")).dependencies ?? {};
122
+ const res = {};
123
+ const resolveHttpSpec = (pkgRef) => {
124
+ for (const [depName, depVersion] of Object.entries(rootPackageDeps)) {
125
+ if (depVersion === pkgRef) {
126
+ const packageInfo = cache.packages[depName];
127
+ if (!packageInfo)
128
+ throw new Error(`Package not found: ${depName}`);
129
+ return { name: packageInfo.id.name, version: packageInfo.id.version };
130
+ }
131
+ }
132
+ return undefined;
133
+ };
134
+ const getMetaForRef = (pkgRef) => {
135
+ if (pathPackageMeta.has(pkgRef)) {
136
+ return pathPackageMeta.get(pkgRef);
137
+ }
138
+ if (pkgRef.startsWith("http://") || pkgRef.startsWith("https://")) {
139
+ return resolveHttpSpec(pkgRef);
140
+ }
141
+ if (isPathSpec(pkgRef)) {
142
+ const meta = pathPackageMeta.get(pkgRef);
143
+ if (meta)
144
+ return meta;
145
+ }
146
+ const parsed = parsePackageRef(pkgRef);
147
+ const packageInfo = cache.packages[parsed.name];
148
+ if (packageInfo) {
149
+ return { name: packageInfo.id.name, version: packageInfo.id.version };
150
+ }
151
+ return parsed;
152
+ };
153
+ for (const pkgRef of packageSpecs) {
154
+ const meta = getMetaForRef(pkgRef);
155
+ if (meta) {
156
+ res[pkgRef] = meta;
157
+ }
158
+ }
159
+ for (const entry of localPackages.values()) {
160
+ res[entry.config.path] = {
161
+ name: entry.config.name,
162
+ version: entry.config.version,
163
+ };
164
+ if (entry.config.dependencies) {
165
+ for (const dependencyRef of entry.config.dependencies) {
166
+ if (res[dependencyRef])
167
+ continue;
168
+ const dependencyMeta = getMetaForRef(dependencyRef);
169
+ if (dependencyMeta) {
170
+ res[dependencyRef] = dependencyMeta;
171
+ }
172
+ }
173
+ }
174
+ }
175
+ return res;
176
+ };
24
177
  const init = async () => {
25
178
  if (initialized)
26
- return;
179
+ return packageRefToPackageMeta();
180
+ await refreshLocalPackageCacheKeys();
27
181
  await ensureDir(workingDir);
28
- const { cacheKey, npmPackagePath } = cacheRecordPaths(workingDir, packages);
182
+ const { cacheKey, npmPackagePath } = cacheRecordPaths(workingDir, getCacheKeyPackages());
29
183
  const cachedData = await loadCacheRecordFromDisk(workingDir, cacheKey);
30
- const isCacheValid = cachedData && cachedData.packageLockHash === cacheKey;
31
- if (isCacheValid) {
184
+ const nodeModulesPath = Path.join(npmPackagePath, "node_modules");
185
+ const hasInstalledPackages = await fileExists(nodeModulesPath);
186
+ let isCacheValid = false;
187
+ if (cachedData !== undefined && hasInstalledPackages) {
188
+ const cacheKeyMatches = cachedData.cacheKey === cacheKey;
189
+ const currentLockHash = await calculatePackageLockHash(npmPackagePath);
190
+ const lockHashMatches = currentLockHash === undefined ||
191
+ cachedData.packageLockHash === undefined ||
192
+ currentLockHash === cachedData.packageLockHash;
193
+ const cachedPackagesPresent = await areCachedPackagePathsPresent(cachedData.packages);
194
+ const localPackagesPresent = await ensureLocalPackagesPresent(npmPackagePath);
195
+ isCacheValid = cacheKeyMatches && lockHashMatches && cachedPackagesPresent && localPackagesPresent;
196
+ }
197
+ if (isCacheValid && cachedData) {
32
198
  cache.entries = cachedData.entries;
33
199
  cache.packages = cachedData.packages;
34
200
  Object.entries(cachedData.references).forEach(([id, metadata]) => {
@@ -36,11 +202,13 @@ export const createCanonicalManager = (config) => {
36
202
  });
37
203
  }
38
204
  else {
39
- await installPackages(packages, npmPackagePath, registry);
205
+ await installPackages(packageSpecs, npmPackagePath, registry);
206
+ await installConfiguredLocalPackages(npmPackagePath);
40
207
  await scanDirectory(cache, npmPackagePath);
41
208
  await saveCacheRecordToDisk(cache, workingDir, cacheKey);
42
209
  }
43
210
  initialized = true;
211
+ return packageRefToPackageMeta();
44
212
  };
45
213
  const destroy = async () => {
46
214
  cache.entries = {};
@@ -55,20 +223,21 @@ export const createCanonicalManager = (config) => {
55
223
  };
56
224
  const addPackages = async (...newPackages) => {
57
225
  if (newPackages.length === 0)
58
- return;
59
- const packagesToAdd = newPackages.filter((pkg) => !packages.includes(pkg));
226
+ return packageRefToPackageMeta();
227
+ const normalized = newPackages.map(normalizePackageSpec);
228
+ const packagesToAdd = normalized.filter((pkg) => !packageSpecs.includes(pkg));
60
229
  if (packagesToAdd.length !== 0) {
61
- packages.push(...packagesToAdd);
230
+ packageSpecs.push(...packagesToAdd);
62
231
  }
63
232
  if (!initialized) {
64
233
  await init();
65
- return;
234
+ return packageRefToPackageMeta();
66
235
  }
67
236
  if (packagesToAdd.length > 0) {
68
237
  await destroy();
69
238
  await init();
70
239
  }
71
- return;
240
+ return packageRefToPackageMeta();
72
241
  };
73
242
  const resolveEntry = async (canonicalUrl, options) => {
74
243
  ensureInitialized();
@@ -192,11 +361,58 @@ export const createCanonicalManager = (config) => {
192
361
  searchParamsCache.set(resourceType, results);
193
362
  return results;
194
363
  };
364
+ const packageJson = async (packageName) => {
365
+ ensureInitialized();
366
+ const fn = cache.packages[packageName]?.path;
367
+ if (!fn)
368
+ throw new Error(`Package ${packageName} not found`);
369
+ const packageJSON = JSON.parse(await afs.readFile(Path.join(fn, "package.json"), "utf8"));
370
+ return packageJSON;
371
+ };
372
+ const addTgzPackage = async (config) => {
373
+ const archivePath = Path.resolve(config.archivePath);
374
+ const { npmPackagePath } = cacheRecordPaths(workingDir, getCacheKeyPackages());
375
+ await ensureDir(npmPackagePath);
376
+ const { name, version } = await installTgzPackage(archivePath, npmPackagePath, registry);
377
+ pathPackageMeta.set(archivePath, { name, version });
378
+ if (!packageSpecs.includes(archivePath)) {
379
+ packageSpecs.push(archivePath);
380
+ }
381
+ await rebuildWithCurrentConfig();
382
+ return { name, version };
383
+ };
384
+ const addLocalPackage = async (config) => {
385
+ const normalizedConfig = {
386
+ ...config,
387
+ path: Path.resolve(config.path),
388
+ };
389
+ const cacheKeyPart = await createLocalCacheKeyPart(normalizedConfig);
390
+ const entry = {
391
+ config: normalizedConfig,
392
+ cacheKeyPart,
393
+ };
394
+ localPackages.set(normalizedConfig.path, entry);
395
+ pathPackageMeta.set(normalizedConfig.path, {
396
+ name: normalizedConfig.name,
397
+ version: normalizedConfig.version,
398
+ });
399
+ await rebuildWithCurrentConfig();
400
+ return { name: normalizedConfig.name, version: normalizedConfig.version };
401
+ };
402
+ const flushCache = async () => {
403
+ await flushCacheFromDisk(workingDir);
404
+ if (initialized) {
405
+ await destroy();
406
+ }
407
+ };
195
408
  return {
196
409
  init,
197
410
  destroy,
198
411
  packages: getPackages,
199
412
  addPackages,
413
+ addTgzPackage,
414
+ addLocalPackage,
415
+ flushCache,
200
416
  resolveEntry,
201
417
  resolve,
202
418
  read,
@@ -204,14 +420,7 @@ export const createCanonicalManager = (config) => {
204
420
  search,
205
421
  smartSearch,
206
422
  getSearchParametersForResource,
207
- packageJson: async (packageName) => {
208
- ensureInitialized();
209
- const fn = cache.packages[packageName]?.path;
210
- if (!fn)
211
- throw new Error(`Package ${packageName} not found`);
212
- const packageJSON = JSON.parse(await afs.readFile(Path.join(fn, "package.json"), "utf8"));
213
- return packageJSON;
214
- },
423
+ packageJson,
215
424
  };
216
425
  };
217
426
  //# sourceMappingURL=canonical.js.map