@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.
- package/dist/cache.d.ts +4 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +30 -4
- package/dist/cache.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/local.d.ts +5 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +148 -0
- package/dist/local.js.map +1 -0
- package/dist/manager/canonical.d.ts.map +1 -1
- package/dist/manager/canonical.js +231 -22
- package/dist/manager/canonical.js.map +1 -1
- package/dist/manager/package-spec.d.ts +5 -0
- package/dist/manager/package-spec.d.ts.map +1 -0
- package/dist/manager/package-spec.js +28 -0
- package/dist/manager/package-spec.js.map +1 -0
- package/dist/package.d.ts.map +1 -1
- package/dist/package.js +25 -5
- package/dist/package.js.map +1 -1
- package/dist/{reference/manager.d.ts → reference.d.ts} +8 -3
- package/dist/reference.d.ts.map +1 -0
- package/dist/{reference/manager.js → reference.js} +7 -2
- package/dist/reference.js.map +1 -0
- package/dist/{resolver/context.d.ts → resolver.d.ts} +3 -3
- package/dist/resolver.d.ts.map +1 -0
- package/dist/{resolver/context.js → resolver.js} +1 -1
- package/dist/resolver.js.map +1 -0
- package/dist/types/core.d.ts +14 -2
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/internal.d.ts +4 -2
- package/dist/types/internal.d.ts.map +1 -1
- package/package.json +2 -3
- package/dist/reference/index.d.ts +0 -4
- package/dist/reference/index.d.ts.map +0 -1
- package/dist/reference/index.js +0 -3
- package/dist/reference/index.js.map +0 -1
- package/dist/reference/manager.d.ts.map +0 -1
- package/dist/reference/manager.js.map +0 -1
- package/dist/reference/store.d.ts +0 -6
- package/dist/reference/store.d.ts.map +0 -1
- package/dist/reference/store.js +0 -6
- package/dist/reference/store.js.map +0 -1
- package/dist/resolver/context.d.ts.map +0 -1
- package/dist/resolver/context.js.map +0 -1
- package/dist/resolver/index.d.ts +0 -2
- package/dist/resolver/index.d.ts.map +0 -1
- package/dist/resolver/index.js +0 -2
- package/dist/resolver/index.js.map +0 -1
- package/src/cache.ts +0 -58
- package/src/cli/index.ts +0 -181
- package/src/cli/init.ts +0 -112
- package/src/cli/list.ts +0 -95
- package/src/cli/resolve.ts +0 -63
- package/src/cli/search.ts +0 -83
- package/src/cli/searchparam.ts +0 -163
- package/src/constants.ts +0 -6
- package/src/fs/index.ts +0 -5
- package/src/fs/utils.ts +0 -28
- package/src/index.ts +0 -18
- package/src/manager/canonical.ts +0 -327
- package/src/manager/index.ts +0 -6
- package/src/package.ts +0 -79
- package/src/reference/index.ts +0 -8
- package/src/reference/manager.ts +0 -55
- package/src/reference/store.ts +0 -14
- package/src/resolver/context.ts +0 -25
- package/src/resolver/index.ts +0 -5
- package/src/scanner/directory.ts +0 -36
- package/src/scanner/index.ts +0 -8
- package/src/scanner/package.ts +0 -35
- package/src/scanner/parser.ts +0 -40
- package/src/scanner/processor.ts +0 -65
- package/src/search/index.ts +0 -6
- package/src/search/smart.ts +0 -50
- package/src/search/terms.ts +0 -22
- package/src/types/core.ts +0 -131
- package/src/types/index.ts +0 -6
- package/src/types/internal.ts +0 -59
package/dist/cache.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ReferenceManager } from "./reference
|
|
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
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,
|
|
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
|
|
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,
|
|
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
|
|
3
|
-
export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from "./reference
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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,
|
|
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"}
|
package/dist/local.d.ts
ADDED
|
@@ -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":"
|
|
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
|
|
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
|
|
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,
|
|
182
|
+
const { cacheKey, npmPackagePath } = cacheRecordPaths(workingDir, getCacheKeyPackages());
|
|
29
183
|
const cachedData = await loadCacheRecordFromDisk(workingDir, cacheKey);
|
|
30
|
-
const
|
|
31
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|