@ms-cloudpack/package-utilities 0.1.3 → 0.1.6
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/CHANGELOG.json +24 -1
- package/CHANGELOG.md +10 -2
- package/lib/createResolveMap.d.ts +19 -0
- package/lib/createResolveMap.js +116 -0
- package/lib/createResolveMap.js.map +1 -0
- package/lib/createResolveMap.test.d.ts +1 -0
- package/lib/createResolveMap.test.js +12 -0
- package/lib/createResolveMap.test.js.map +1 -0
- package/lib/detectModuleType.d.ts +11 -0
- package/lib/detectModuleType.js +29 -0
- package/lib/detectModuleType.js.map +1 -0
- package/lib/detectModuleType.test.d.ts +1 -0
- package/lib/detectModuleType.test.js +22 -0
- package/lib/detectModuleType.test.js.map +1 -0
- package/lib/evaluateImportsFromEntries.d.ts +31 -0
- package/lib/evaluateImportsFromEntries.js +158 -0
- package/lib/evaluateImportsFromEntries.js.map +1 -0
- package/lib/evaluateImportsFromEntries.test.d.ts +1 -0
- package/lib/evaluateImportsFromEntries.test.js +9 -0
- package/lib/evaluateImportsFromEntries.test.js.map +1 -0
- package/lib/filterJson.d.ts +3 -0
- package/lib/filterJson.js +21 -0
- package/lib/filterJson.js.map +1 -0
- package/lib/getExportPathFromEntry.d.ts +5 -0
- package/lib/getExportPathFromEntry.js +27 -0
- package/lib/getExportPathFromEntry.js.map +1 -0
- package/lib/getExportPathFromEntry.test.d.ts +1 -0
- package/lib/getExportPathFromEntry.test.js +36 -0
- package/lib/getExportPathFromEntry.test.js.map +1 -0
- package/lib/getInstalledPackages.d.ts +44 -0
- package/lib/getInstalledPackages.js +85 -0
- package/lib/getInstalledPackages.js.map +1 -0
- package/lib/getInstalledPackages.test.d.ts +1 -0
- package/lib/getInstalledPackages.test.js +14 -0
- package/lib/getInstalledPackages.test.js.map +1 -0
- package/lib/getPackageDefinition.d.ts +22 -0
- package/lib/getPackageDefinition.js +26 -0
- package/lib/getPackageDefinition.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/isExternalPackage.d.ts +1 -0
- package/lib/isExternalPackage.js +9 -0
- package/lib/isExternalPackage.js.map +1 -0
- package/lib/isExternalPackage.test.d.ts +1 -0
- package/lib/isExternalPackage.test.js +12 -0
- package/lib/isExternalPackage.test.js.map +1 -0
- package/lib/parseImportString.d.ts +6 -0
- package/lib/parseImportString.js +9 -0
- package/lib/parseImportString.js.map +1 -0
- package/lib/parseImportString.test.d.ts +1 -0
- package/lib/parseImportString.test.js +24 -0
- package/lib/parseImportString.test.js.map +1 -0
- package/lib/resolve.d.ts +1 -0
- package/lib/resolve.js +21 -0
- package/lib/resolve.js.map +1 -0
- package/lib/resolve.test.d.ts +1 -0
- package/lib/resolve.test.js +12 -0
- package/lib/resolve.test.js.map +1 -0
- package/lib/resolveImportFromPackage.test.d.ts +1 -0
- package/lib/resolveImportFromPackage.test.js +167 -0
- package/lib/resolveImportFromPackage.test.js.map +1 -0
- package/lib/resolveImportFromPackagePath.d.ts +21 -0
- package/lib/resolveImportFromPackagePath.js +119 -0
- package/lib/resolveImportFromPackagePath.js.map +1 -0
- package/lib/resolvePackageEntries.d.ts +2 -0
- package/lib/resolvePackageEntries.js +36 -0
- package/lib/resolvePackageEntries.js.map +1 -0
- package/lib/resolvePackageEntries.test.d.ts +1 -0
- package/lib/resolvePackageEntries.test.js +78 -0
- package/lib/resolvePackageEntries.test.js.map +1 -0
- package/lib/testPaths.d.ts +3 -0
- package/lib/testPaths.js +6 -0
- package/lib/testPaths.js.map +1 -0
- package/lib/tsdoc-metadata.json +11 -0
- package/package.json +11 -7
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,30 @@
|
|
|
2
2
|
"name": "@ms-cloudpack/package-utilities",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Sat, 14 May 2022 04:35:56 GMT",
|
|
6
|
+
"tag": "@ms-cloudpack/package-utilities_v0.1.6",
|
|
7
|
+
"version": "0.1.6",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "elcraig@microsoft.com",
|
|
12
|
+
"package": "@ms-cloudpack/package-utilities",
|
|
13
|
+
"commit": "fac526415cf68c1a69f3bca1e7b873de8ae75ed3",
|
|
14
|
+
"comment": "Fix issues found by eslint rules"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"none": [
|
|
18
|
+
{
|
|
19
|
+
"author": "dzearing@microsoft.com",
|
|
20
|
+
"package": "@ms-cloudpack/package-utilities",
|
|
21
|
+
"commit": "cc0844a7d18790d69e59b16dbd6eef8fab5bc4e0",
|
|
22
|
+
"comment": "Updating the build."
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"date": "Mon, 09 May 2022 23:39:35 GMT",
|
|
6
29
|
"tag": "@ms-cloudpack/package-utilities_v0.1.3",
|
|
7
30
|
"version": "0.1.3",
|
|
8
31
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
# Change Log - @ms-cloudpack/package-utilities
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Sat, 14 May 2022 04:35:56 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 0.1.6
|
|
8
|
+
|
|
9
|
+
Sat, 14 May 2022 04:35:56 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Fix issues found by eslint rules (elcraig@microsoft.com)
|
|
14
|
+
|
|
7
15
|
## 0.1.3
|
|
8
16
|
|
|
9
|
-
Mon, 09 May 2022 23:39:
|
|
17
|
+
Mon, 09 May 2022 23:39:35 GMT
|
|
10
18
|
|
|
11
19
|
### Patches
|
|
12
20
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { InstalledPackagesResult } from './getInstalledPackages.js';
|
|
2
|
+
export declare type ResolveMapEntry = {
|
|
3
|
+
version: string;
|
|
4
|
+
path: string;
|
|
5
|
+
entry: string;
|
|
6
|
+
scopedVersions?: {
|
|
7
|
+
[packageNameAndVersion: `${string}@${string}`]: ResolveMapEntry;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export declare type ResolveMap = {
|
|
11
|
+
[packageName: string]: ResolveMapEntry;
|
|
12
|
+
};
|
|
13
|
+
export declare function createResolveMap(options: {
|
|
14
|
+
appPath: string;
|
|
15
|
+
additionalPaths?: string[];
|
|
16
|
+
}): Promise<{
|
|
17
|
+
resolveMap: ResolveMap;
|
|
18
|
+
stats: InstalledPackagesResult['stats'];
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { getInstalledPackages } from './getInstalledPackages.js';
|
|
2
|
+
// import fs from 'fs';
|
|
3
|
+
// import path from 'path';
|
|
4
|
+
import { resolveImportFromPackagePath } from './resolveImportFromPackagePath.js';
|
|
5
|
+
/*
|
|
6
|
+
For each package:
|
|
7
|
+
|
|
8
|
+
1. Resolve the version required from the lockfile.
|
|
9
|
+
2. Determine what version is installed.
|
|
10
|
+
3. If version required was not found, default to the version installed.
|
|
11
|
+
4. If no lockfile version is installed, get metadata and use the latest.
|
|
12
|
+
5. If there is no installed version, or the version installed does not
|
|
13
|
+
satisfy the required version, install the version required.
|
|
14
|
+
|
|
15
|
+
Repeat this process for each *unique* version resolved.
|
|
16
|
+
|
|
17
|
+
{
|
|
18
|
+
react: {
|
|
19
|
+
'7.1.0': { path: '...', requiredBy: [ { name: 'foo', version: '1.1.1' }, { name: 'bar'}],
|
|
20
|
+
'6.9.0': [ { name: 'baz' } ]
|
|
21
|
+
},
|
|
22
|
+
etc...
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
This should be enough to know which dependencies have dupes.
|
|
26
|
+
|
|
27
|
+
Then, optimize the resolve map to top-level the most common/latest versions. This map will provide
|
|
28
|
+
physical paths for resolving dependencies, where each key in the package object represents the scope.
|
|
29
|
+
This is useful because at esbuild resolve time, we can quickly identify which package the import source
|
|
30
|
+
is coming from, and quickly look up the package resolution by:
|
|
31
|
+
|
|
32
|
+
`const packageDetails = resolveMap[requestPackage][sourcePackage] || resolveMap[requestPackage].default`
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
react: {
|
|
36
|
+
version: string;
|
|
37
|
+
path: '/tmp/react/7.1.0',
|
|
38
|
+
entry: './lib/index.js'
|
|
39
|
+
|
|
40
|
+
scopedVersions: {
|
|
41
|
+
baz: { // when bar imports 'react', resolve to this other location.
|
|
42
|
+
path: '/tmp/react/6.9.0'
|
|
43
|
+
entry: './lib/index.js'
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
etc: ...
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
By optimizing the default to be the most common package, we can reduce the scope entries.
|
|
51
|
+
|
|
52
|
+
Note that when we have dupes, this will keep them intact and will not try to optimize. It could be that
|
|
53
|
+
holding back one package could dedupe. In the example above, perhaps "foo" and "bar" packages could be
|
|
54
|
+
downgraded to a build which accepts 6.9.0. But it could also introduce other dupes.
|
|
55
|
+
*/
|
|
56
|
+
export async function createResolveMap(options) {
|
|
57
|
+
const { appPath, additionalPaths = [] } = options;
|
|
58
|
+
// First, create a merged dependency list.
|
|
59
|
+
// const dependencies = {};
|
|
60
|
+
// Grab what's installed, so that we can default to use those packages.
|
|
61
|
+
const { installedPackages, stats } = await getInstalledPackages([appPath, ...additionalPaths]);
|
|
62
|
+
// await writeFile(
|
|
63
|
+
// path.join(appPath, "install-map.json"),
|
|
64
|
+
// JSON.stringify({ installedPackages, stats }, null, 2),
|
|
65
|
+
// "utf8"
|
|
66
|
+
// );
|
|
67
|
+
// // Add the dependencies for the appPath.
|
|
68
|
+
// await addDependencies(dependencies, appPath, installedPackages);
|
|
69
|
+
// // Add deps for additional paths.
|
|
70
|
+
// for (let additionalPath of additionalPaths) {
|
|
71
|
+
// await addDependencies(dependencies, additionalPath, installedPackages);
|
|
72
|
+
// }
|
|
73
|
+
// Now that we have the resolved dependency list, optimize it as the resolveMap.
|
|
74
|
+
const resolveMap = {};
|
|
75
|
+
// Iterate through installed packages.
|
|
76
|
+
for (const packageName of Object.keys(installedPackages)) {
|
|
77
|
+
// Get installed versions, sorted by the number of dependencies (greatest to least)
|
|
78
|
+
const versions = Object.keys(installedPackages[packageName]).sort((a, b) => installedPackages[packageName][a].requiredBy?.length > installedPackages[packageName][b].requiredBy.length
|
|
79
|
+
? -1
|
|
80
|
+
: 1);
|
|
81
|
+
// Default to the most used version to dedupe. All other versions scope to specifics.
|
|
82
|
+
const defaultVersionEntry = installedPackages[packageName][versions[0]];
|
|
83
|
+
// Define the default resolved version for the package.
|
|
84
|
+
const depResolveEntry = (resolveMap[packageName] = {
|
|
85
|
+
version: versions[0],
|
|
86
|
+
path: defaultVersionEntry.path,
|
|
87
|
+
entry: await resolveImportFromPackagePath(defaultVersionEntry.path, '', {
|
|
88
|
+
preferSource: false,
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
// If we have additional versions, scope each of those to their specific parents
|
|
92
|
+
if (versions.length > 1) {
|
|
93
|
+
const scopedVersionEntries = (depResolveEntry.scopedVersions = {});
|
|
94
|
+
for (let i = 1; i < versions.length; i++) {
|
|
95
|
+
const scopedVersion = versions[i];
|
|
96
|
+
const scopedPackage = installedPackages[packageName][scopedVersion];
|
|
97
|
+
for (const dep of scopedPackage.requiredBy) {
|
|
98
|
+
scopedVersionEntries[`${dep.name}@${dep.version}`] = {
|
|
99
|
+
version: scopedVersion,
|
|
100
|
+
path: scopedPackage.path,
|
|
101
|
+
entry: await resolveImportFromPackagePath(scopedPackage.path, '', {
|
|
102
|
+
preferSource: false,
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// await writeFile(
|
|
110
|
+
// path.join(appPath, 'resolve-map.json'),
|
|
111
|
+
// JSON.stringify(resolveMap, null, 2),
|
|
112
|
+
// 'utf8'
|
|
113
|
+
// );
|
|
114
|
+
return { resolveMap, stats };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=createResolveMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createResolveMap.js","sourceRoot":"","sources":["../src/createResolveMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { slash } from '@ms-cloudpack/path-utilities';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { createResolveMap } from './createResolveMap.js';
|
|
4
|
+
import { filterJson } from './filterJson.js';
|
|
5
|
+
import { testProject1Path } from '../src/testPaths.js';
|
|
6
|
+
const createResolveMapSafe = async (options) => filterJson(await createResolveMap(options), 'path', (oldPath) => slash(path.relative(testProject1Path, oldPath)));
|
|
7
|
+
describe('createResolveMap', () => {
|
|
8
|
+
it('can create a resolve map', async () => {
|
|
9
|
+
expect(await createResolveMapSafe({ appPath: testProject1Path })).toMatchSnapshot();
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=createResolveMap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createResolveMap.test.js","sourceRoot":"","sources":["../src/createResolveMap.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,oBAAoB,GAA4B,KAAK,EAAE,OAAO,EAAE,EAAE,CACtE,UAAU,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,CAAC,MAAM,oBAAoB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare type ModuleType = 'esm' | 'cjs';
|
|
2
|
+
/**
|
|
3
|
+
* Determines if the given source is commonjs or esm.
|
|
4
|
+
* @returns "esm" | "cjs" | undefined
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectModuleTypeFromSource(source: string): Promise<ModuleType | undefined>;
|
|
7
|
+
/**
|
|
8
|
+
* Determines if the given file is commonjs or esm.
|
|
9
|
+
* @returns "esm" | "cjs" | undefined
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectModuleType(filePath: string): Promise<ModuleType | undefined>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
const { readFile } = fs.promises;
|
|
3
|
+
function removeComments(source) {
|
|
4
|
+
// Takes a string of code, not an actual function.
|
|
5
|
+
return source.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '').trim(); // Strip comments
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Determines if the given source is commonjs or esm.
|
|
9
|
+
* @returns "esm" | "cjs" | undefined
|
|
10
|
+
*/
|
|
11
|
+
export async function detectModuleTypeFromSource(source) {
|
|
12
|
+
let result;
|
|
13
|
+
const content = removeComments(source);
|
|
14
|
+
if (content.match(/(import *)|(import {)|(export {)|(export \*)|(export (default )?[_a-zA-Z0-9]+)|(export [a-zA-Z]+ from)/)) {
|
|
15
|
+
result = 'esm';
|
|
16
|
+
}
|
|
17
|
+
else if (content.match(/(module.exports[ =]+)|(require\(['"]+)/)) {
|
|
18
|
+
result = 'cjs';
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Determines if the given file is commonjs or esm.
|
|
24
|
+
* @returns "esm" | "cjs" | undefined
|
|
25
|
+
*/
|
|
26
|
+
export async function detectModuleType(filePath) {
|
|
27
|
+
return await detectModuleTypeFromSource(removeComments((await readFile(filePath)).toString()));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=detectModuleType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectModuleType.js","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;AAEjC,SAAS,cAAc,CAAC,MAAc;IACpC,kDAAkD;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,iBAAiB;AACjF,CAAC;AAID;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,MAAc;IAC7D,IAAI,MAA8B,CAAC;IAEnC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvC,IACE,OAAO,CAAC,KAAK,CACX,wGAAwG,CACzG,EACD;QACA,MAAM,GAAG,KAAK,CAAC;KAChB;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,EAAE;QAClE,MAAM,GAAG,KAAK,CAAC;KAChB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,OAAO,MAAM,0BAA0B,CAAC,cAAc,CAAC,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { detectModuleTypeFromSource } from './detectModuleType.js';
|
|
2
|
+
describe('detectModuleTypeFromSource', () => {
|
|
3
|
+
it('can detect imports mean esm', async () => {
|
|
4
|
+
expect(await detectModuleTypeFromSource(`import react from 'react';`)).toBe('esm');
|
|
5
|
+
});
|
|
6
|
+
it('can detect exports mean esm', async () => {
|
|
7
|
+
expect(await detectModuleTypeFromSource(`export const foo = 'foo';`)).toBe('esm');
|
|
8
|
+
});
|
|
9
|
+
it('can detect requires mean cjs', async () => {
|
|
10
|
+
expect(await detectModuleTypeFromSource(`const path = require('path')`)).toBe('cjs');
|
|
11
|
+
});
|
|
12
|
+
it('can detect exports mean cjs', async () => {
|
|
13
|
+
expect(await detectModuleTypeFromSource(`module.exports = 'foo';`)).toBe('cjs');
|
|
14
|
+
});
|
|
15
|
+
it('can detect cjs with imports in comments.', async () => {
|
|
16
|
+
expect(await detectModuleTypeFromSource(`/* import react from 'react'; */ module.exports = 'foo';`)).toBe('cjs');
|
|
17
|
+
});
|
|
18
|
+
it('can detect no modules', async () => {
|
|
19
|
+
expect(await detectModuleTypeFromSource(`const hello = 'hello';`)).toBeUndefined();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=detectModuleType.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectModuleType.test.js","sourceRoot":"","sources":["../src/detectModuleType.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,CAAC,MAAM,0BAA0B,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,CAAC,MAAM,0BAA0B,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,CAAC,MAAM,0BAA0B,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,CAAC,MAAM,0BAA0B,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,CAAC,MAAM,0BAA0B,CAAC,0DAA0D,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,CAAC,MAAM,0BAA0B,CAAC,wBAAwB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ResolveMap } from './createResolveMap.js';
|
|
2
|
+
declare type PackageExports = {
|
|
3
|
+
[packageName: string]: {
|
|
4
|
+
[version: string]: {
|
|
5
|
+
[importPath: string]: {
|
|
6
|
+
count: number;
|
|
7
|
+
import: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export interface EvaluateImportsFromEntriesStats {
|
|
13
|
+
parsedSourceFiles: number;
|
|
14
|
+
parseErrors: string[];
|
|
15
|
+
uniqueImports: number;
|
|
16
|
+
uniquePackages: number;
|
|
17
|
+
unresolvedPackages: {
|
|
18
|
+
name: string;
|
|
19
|
+
from: string;
|
|
20
|
+
}[];
|
|
21
|
+
unresolvedPackageImports: {
|
|
22
|
+
name: string;
|
|
23
|
+
path: string;
|
|
24
|
+
from: string;
|
|
25
|
+
}[];
|
|
26
|
+
}
|
|
27
|
+
export declare function evaluateImportsFromEntries(entries: string[], resolveMap?: ResolveMap, allExports?: PackageExports): Promise<{
|
|
28
|
+
exports: PackageExports;
|
|
29
|
+
stats: EvaluateImportsFromEntriesStats;
|
|
30
|
+
}>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { parseImportString } from './parseImportString.js';
|
|
4
|
+
import { resolveImportFromPackagePath } from './resolveImportFromPackagePath.js';
|
|
5
|
+
import { resolve } from './resolve.js';
|
|
6
|
+
import babelParser from '@babel/parser';
|
|
7
|
+
import traverseAPI from '@babel/traverse';
|
|
8
|
+
import { getPackageDefinition } from './getPackageDefinition.js';
|
|
9
|
+
const { readFile } = fs.promises;
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
const traverse = traverseAPI.default;
|
|
12
|
+
const sourceExtensions = ['.ts', '.tsx', '.js', '.cjs', '.mjs', '.jsx'];
|
|
13
|
+
function resolveSource(sourcePath) {
|
|
14
|
+
const originalExt = path.extname(sourcePath);
|
|
15
|
+
if (!originalExt) {
|
|
16
|
+
for (const ext of sourceExtensions) {
|
|
17
|
+
if (fs.existsSync(sourcePath + ext)) {
|
|
18
|
+
return sourcePath + ext;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else if (sourceExtensions.indexOf(originalExt) >= 0) {
|
|
23
|
+
return sourcePath;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function evaluateImportsFromEntries(entries, resolveMap, allExports = {}) {
|
|
27
|
+
const entriesToEvaluate = [...entries];
|
|
28
|
+
const visitedPaths = new Set();
|
|
29
|
+
const addEntry = (newEntry) => {
|
|
30
|
+
const ext = path.extname(newEntry);
|
|
31
|
+
if (!visitedPaths.has(newEntry) && (!ext || sourceExtensions.indexOf(ext) >= 0)) {
|
|
32
|
+
entriesToEvaluate.push(newEntry);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const stats = {
|
|
36
|
+
parsedSourceFiles: 0,
|
|
37
|
+
parseErrors: [],
|
|
38
|
+
uniqueImports: 0,
|
|
39
|
+
uniquePackages: 0,
|
|
40
|
+
unresolvedPackages: [],
|
|
41
|
+
unresolvedPackageImports: [],
|
|
42
|
+
};
|
|
43
|
+
// Skip entry file paths we've already visited.
|
|
44
|
+
while (entriesToEvaluate.length) {
|
|
45
|
+
const entry = entriesToEvaluate.shift();
|
|
46
|
+
console.log(`${entriesToEvaluate.length}: Adding ${entry}`);
|
|
47
|
+
if (visitedPaths.has(entry)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
visitedPaths.add(entry);
|
|
51
|
+
// Get imports in entry file.
|
|
52
|
+
const content = await readFile(entry, 'utf8');
|
|
53
|
+
const importValues = [];
|
|
54
|
+
try {
|
|
55
|
+
const plugins = [
|
|
56
|
+
'typescript',
|
|
57
|
+
'decorators-legacy',
|
|
58
|
+
'objectRestSpread',
|
|
59
|
+
'optionalChaining',
|
|
60
|
+
'nullishCoalescingOperator',
|
|
61
|
+
];
|
|
62
|
+
const isJsx = ['.jsx', '.tsx'].indexOf(path.extname(entry)) >= 0;
|
|
63
|
+
if (isJsx) {
|
|
64
|
+
plugins.push('jsx');
|
|
65
|
+
}
|
|
66
|
+
const ast = babelParser.parse(content, {
|
|
67
|
+
sourceType: 'unambiguous',
|
|
68
|
+
plugins,
|
|
69
|
+
});
|
|
70
|
+
traverse(ast, {
|
|
71
|
+
ImportDeclaration(astPath) {
|
|
72
|
+
if (astPath.node.source) {
|
|
73
|
+
importValues.push(astPath.node.source?.value);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
ExportDeclaration(astPath) {
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
if (astPath.node.source) {
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
importValues.push(astPath.node.source?.value);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
CallExpression(astPath) {
|
|
84
|
+
if (astPath.node.callee.type === 'Import') {
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
importValues.push(astPath.node.arguments[0].value);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
stats.parsedSourceFiles++;
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
stats.parseErrors.push(entry);
|
|
95
|
+
console.log(`Failed: "${entry}"`, e?.toString());
|
|
96
|
+
}
|
|
97
|
+
for (const importValue of importValues) {
|
|
98
|
+
if (importValue) {
|
|
99
|
+
if (importValue[0] !== '.') {
|
|
100
|
+
const { packageName, importPath } = parseImportString(importValue);
|
|
101
|
+
let packagePath;
|
|
102
|
+
// Fix import path
|
|
103
|
+
const fixedImportPath = !importPath ? '.' : './' + importPath;
|
|
104
|
+
// Get package path
|
|
105
|
+
try {
|
|
106
|
+
packagePath = await resolve(packageName, path.dirname(entry));
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
stats.unresolvedPackages.push({ name: packageName, from: entry });
|
|
110
|
+
console.log(`Unable to resolve "${packageName}" from "${entry}"`);
|
|
111
|
+
}
|
|
112
|
+
if (packagePath) {
|
|
113
|
+
const version = (await getPackageDefinition(packagePath, true))?.version || 'unknown';
|
|
114
|
+
if (!allExports[packageName]?.[version]) {
|
|
115
|
+
stats.uniquePackages++;
|
|
116
|
+
}
|
|
117
|
+
const packageMap = (allExports[packageName] = allExports[packageName] || {});
|
|
118
|
+
const versionMap = (packageMap[version] = packageMap[version] || {});
|
|
119
|
+
// TODO: resolve should take in resolveMap to support resolution overrides
|
|
120
|
+
const relativeImportPath = await resolveImportFromPackagePath(packagePath, importPath, {
|
|
121
|
+
preferSource: true,
|
|
122
|
+
});
|
|
123
|
+
const fullPath = relativeImportPath && path.join(packagePath, relativeImportPath);
|
|
124
|
+
let importDefinition = versionMap[fixedImportPath];
|
|
125
|
+
if (!importDefinition) {
|
|
126
|
+
stats.uniqueImports++;
|
|
127
|
+
importDefinition = versionMap[fixedImportPath] = {
|
|
128
|
+
import: undefined,
|
|
129
|
+
count: 0,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (fs.existsSync(fullPath)) {
|
|
133
|
+
importDefinition.import = './' + relativeImportPath;
|
|
134
|
+
addEntry(fullPath);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
stats.unresolvedPackageImports.push({ name: packageName, path: importPath, from: entry });
|
|
138
|
+
console.log(`Unable to resolve "${packageName}"${importPath ? ` (${importPath})` : ''} from "${entry}"`);
|
|
139
|
+
}
|
|
140
|
+
importDefinition.count++;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// relative path
|
|
145
|
+
// Not a package. Traverse source if needed.
|
|
146
|
+
const relativeSourcePath = resolveSource(path.resolve(path.dirname(entry), importValue));
|
|
147
|
+
if (relativeSourcePath) {
|
|
148
|
+
// console.log(`Adding ${relativeSourcePath}, "${importValue}"`);
|
|
149
|
+
addEntry(relativeSourcePath);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
console.log(stats);
|
|
156
|
+
return { exports: allExports, stats };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=evaluateImportsFromEntries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateImportsFromEntries.js","sourceRoot":"","sources":["../src/evaluateImportsFromEntries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { evaluateImportsFromEntries } from './evaluateImportsFromEntries.js';
|
|
3
|
+
import { testProject1Path } from '../src/testPaths.js';
|
|
4
|
+
describe('evaluateImportsFromEntries', () => {
|
|
5
|
+
it('can evaluate exports map', async () => {
|
|
6
|
+
expect(await evaluateImportsFromEntries([path.join(testProject1Path, 'src/index.ts')])).toMatchSnapshot();
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=evaluateImportsFromEntries.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateImportsFromEntries.test.js","sourceRoot":"","sources":["../src/evaluateImportsFromEntries.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,CAAC,MAAM,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAC5G,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2
|
+
export function filterJson(json, propName, filterFunction) {
|
|
3
|
+
for (const [name, value] of Object.entries(json)) {
|
|
4
|
+
if (typeof value === 'string' && name == propName) {
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
json[name] = filterFunction(value);
|
|
7
|
+
}
|
|
8
|
+
else if (typeof value === 'object') {
|
|
9
|
+
if (Array.isArray(value)) {
|
|
10
|
+
for (const item of value) {
|
|
11
|
+
if (typeof item === 'object') {
|
|
12
|
+
filterJson(value, propName, filterFunction);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
filterJson(value, propName, filterFunction);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return json;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=filterJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterJson.js","sourceRoot":"","sources":["../src/filterJson.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,UAAU,UAAU,CACxB,IAAO,EACP,QAAgB,EAChB,cAA4C;IAE5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,IAAI,QAAQ,EAAE;YACjD,8DAA8D;YAC7D,IAAY,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;SAC7C;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;wBAC5B,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;qBAC7C;iBACF;aACF;YACD,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;SAC7C;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExportsEntry } from './getPackageDefinition.js';
|
|
2
|
+
/**
|
|
3
|
+
* Given an export map entry, return the esm entry string value. (Parses arrays, maps, has a fallback system.)
|
|
4
|
+
*/
|
|
5
|
+
export declare function getExportPathFromEntry(exportEntry: ExportsEntry): string | undefined;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Given an export map entry, return the esm entry string value. (Parses arrays, maps, has a fallback system.)
|
|
3
|
+
*/
|
|
4
|
+
export function getExportPathFromEntry(exportEntry) {
|
|
5
|
+
let exportPath = undefined;
|
|
6
|
+
if (exportEntry) {
|
|
7
|
+
if (typeof exportEntry === 'string') {
|
|
8
|
+
exportPath = exportEntry;
|
|
9
|
+
}
|
|
10
|
+
else if (typeof exportEntry === 'object') {
|
|
11
|
+
if (Array.isArray(exportEntry)) {
|
|
12
|
+
for (const entry of exportEntry) {
|
|
13
|
+
const value = getExportPathFromEntry(entry);
|
|
14
|
+
if (value) {
|
|
15
|
+
exportPath = value;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
exportPath = getExportPathFromEntry(exportEntry['browser'] || exportEntry['import'] || exportEntry['default']);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return exportPath;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=getExportPathFromEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getExportPathFromEntry.js","sourceRoot":"","sources":["../src/getExportPathFromEntry.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAyB;IAC9D,IAAI,UAAU,GAAG,SAAS,CAAC;IAE3B,IAAI,WAAW,EAAE;QACf,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;YACnC,UAAU,GAAG,WAAW,CAAC;SAC1B;aAAM,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;YAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;gBAC9B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;oBAC/B,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;oBAE5C,IAAI,KAAK,EAAE;wBACT,UAAU,GAAG,KAAK,CAAC;wBACnB,MAAM;qBACP;iBACF;aACF;iBAAM;gBACL,UAAU,GAAG,sBAAsB,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;aAChH;SACF;KACF;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getExportPathFromEntry } from './getExportPathFromEntry.js';
|
|
2
|
+
describe('getExportPathFromEntry', () => {
|
|
3
|
+
it('gets a path from a string', () => {
|
|
4
|
+
expect(getExportPathFromEntry('string')).toEqual('string');
|
|
5
|
+
});
|
|
6
|
+
it('prioritizes browser response', () => {
|
|
7
|
+
expect(getExportPathFromEntry({
|
|
8
|
+
browser: 'browser',
|
|
9
|
+
import: 'import',
|
|
10
|
+
default: 'default',
|
|
11
|
+
require: 'require',
|
|
12
|
+
})).toEqual('browser');
|
|
13
|
+
});
|
|
14
|
+
it('falls back to import path if browser is missing', () => {
|
|
15
|
+
expect(getExportPathFromEntry({
|
|
16
|
+
import: 'import',
|
|
17
|
+
default: 'default',
|
|
18
|
+
require: 'require',
|
|
19
|
+
})).toEqual('import');
|
|
20
|
+
});
|
|
21
|
+
it('falls back to default if import is missing', () => {
|
|
22
|
+
expect(getExportPathFromEntry({
|
|
23
|
+
default: 'default',
|
|
24
|
+
require: 'require',
|
|
25
|
+
})).toEqual('default');
|
|
26
|
+
});
|
|
27
|
+
it('handles arrays', () => {
|
|
28
|
+
expect(getExportPathFromEntry([
|
|
29
|
+
{
|
|
30
|
+
default: 'default',
|
|
31
|
+
require: 'require',
|
|
32
|
+
},
|
|
33
|
+
])).toEqual('default');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=getExportPathFromEntry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getExportPathFromEntry.test.js","sourceRoot":"","sources":["../src/getExportPathFromEntry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CACJ,sBAAsB,CAAC;YACrB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;SACnB,CAAC,CACH,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CACJ,sBAAsB,CAAC;YACrB,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;SACnB,CAAC,CACH,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,sBAAsB,CAAC;YACrB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;SACnB,CAAC,CACH,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CACJ,sBAAsB,CAAC;YACrB;gBACE,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,SAAS;aACnB;SACF,CAAC,CACH,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|