@caryhu/codemine-forge 0.0.1-alpha.3 → 0.0.1-alpha.4
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/build-pipeline/angular-resources.d.ts +12 -0
- package/dist/build-pipeline/angular-resources.js +316 -0
- package/dist/build-pipeline/browser-bundle.d.ts +6 -0
- package/dist/build-pipeline/browser-bundle.js +88 -7
- package/dist/build-pipeline/diagnostics.d.ts +5 -0
- package/dist/build-pipeline/diagnostics.js +52 -1
- package/dist/build-pipeline/index.d.ts +2 -2
- package/dist/build-pipeline/index.js +6 -4
- package/dist/build-pipeline/pipeline.js +178 -11
- package/dist/build-pipeline/types.d.ts +7 -1
- package/dist/dev-server-preview/index.d.ts +2 -2
- package/dist/dev-server-preview/index.js +1 -4
- package/dist/dev-server-preview/server.d.ts +1 -1
- package/dist/dev-server-preview/server.js +9 -18
- package/dist/dev-server-preview/types.d.ts +2 -2
- package/dist/framework-compatibility.d.ts +27 -0
- package/dist/framework-compatibility.js +109 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +18 -8
- package/dist/package-resolution/cdn-source.js +13 -1
- package/dist/package-resolution/diagnostics.d.ts +3 -0
- package/dist/package-resolution/diagnostics.js +28 -1
- package/dist/package-resolution/index.d.ts +2 -1
- package/dist/package-resolution/index.js +4 -1
- package/dist/package-resolution/resolver.d.ts +3 -3
- package/dist/package-resolution/resolver.js +146 -7
- package/dist/package-resolution/types.d.ts +9 -1
- package/dist/terminal-commands/npm-dev.js +1 -1
- package/package.json +1 -1
|
@@ -40,7 +40,11 @@ exports.createCdnPackageSource = createCdnPackageSource;
|
|
|
40
40
|
function createDefaultMetadataUrl(request, baseUrl) {
|
|
41
41
|
const trimmedBase = baseUrl.replace(/\/+$/, "");
|
|
42
42
|
const packageKey = `${encodeURIComponent(request.name)}@${encodeURIComponent(request.requestedRange)}`;
|
|
43
|
-
|
|
43
|
+
const peerDependencyPins = formatPeerDependencyPins(request.peerDependencyPins);
|
|
44
|
+
const query = peerDependencyPins.length === 0
|
|
45
|
+
? ""
|
|
46
|
+
: `?deps=${encodeURIComponent(peerDependencyPins.join(","))}`;
|
|
47
|
+
return `${trimmedBase}/${packageKey}.json${query}`;
|
|
44
48
|
}
|
|
45
49
|
function normalizeCdnPackageRecord(metadata, request, sourceId) {
|
|
46
50
|
if (!isPlainObject(metadata)) {
|
|
@@ -64,6 +68,9 @@ function normalizeCdnPackageRecord(metadata, request, sourceId) {
|
|
|
64
68
|
dependencies: stringRecordField(metadata, "dependencies") ?? {},
|
|
65
69
|
files: packageFilesField(metadata, "files") ?? {},
|
|
66
70
|
integrity: stringField(metadata, "integrity"),
|
|
71
|
+
peerDependencies: stringRecordField(metadata, "peerDependencies") ?? {},
|
|
72
|
+
peerDependencyPins: stringRecordField(metadata, "peerDependencyPins") ??
|
|
73
|
+
request.peerDependencyPins,
|
|
67
74
|
};
|
|
68
75
|
}
|
|
69
76
|
function selectPackageEntry(metadata) {
|
|
@@ -162,3 +169,8 @@ function isPlainObject(value) {
|
|
|
162
169
|
value !== null &&
|
|
163
170
|
!Array.isArray(value));
|
|
164
171
|
}
|
|
172
|
+
function formatPeerDependencyPins(peerDependencyPins) {
|
|
173
|
+
return Object.entries(peerDependencyPins ?? {})
|
|
174
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
175
|
+
.map(([name, version]) => `${name}@${version}`);
|
|
176
|
+
}
|
|
@@ -13,4 +13,7 @@ export declare function createInvalidDependencyDiagnostic(dependencyName: string
|
|
|
13
13
|
export declare function createUnsupportedRangeDiagnostic(dependencyName: string, requestedRange: string): ForgePackageResolutionDiagnostic;
|
|
14
14
|
export declare function createOfflineCacheMissDiagnostic(dependencyName: string, requestedRange: string): ForgePackageResolutionDiagnostic;
|
|
15
15
|
export declare function createUnresolvedPackageDiagnostic(dependencyName: string, requestedRange: string): ForgePackageResolutionDiagnostic;
|
|
16
|
+
export declare function createAngularPeerDependencyUnpinnedDiagnostic(dependencyName: string, requestedRange: string): ForgePackageResolutionDiagnostic;
|
|
17
|
+
export declare function createAngularSingletonDuplicateDiagnostic(dependencyName: string, requestedRange: string, message?: string): ForgePackageResolutionDiagnostic;
|
|
18
|
+
export declare function createAngularSingletonVersionConflictDiagnostic(dependencyName: string, requestedRange: string): ForgePackageResolutionDiagnostic;
|
|
16
19
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createUnresolvedPackageDiagnostic = exports.createOfflineCacheMissDiagnostic = exports.createUnsupportedRangeDiagnostic = exports.createInvalidDependencyDiagnostic = exports.createInvalidManifestDiagnostic = exports.createPackageResolutionDiagnostic = void 0;
|
|
3
|
+
exports.createAngularSingletonVersionConflictDiagnostic = exports.createAngularSingletonDuplicateDiagnostic = exports.createAngularPeerDependencyUnpinnedDiagnostic = exports.createUnresolvedPackageDiagnostic = exports.createOfflineCacheMissDiagnostic = exports.createUnsupportedRangeDiagnostic = exports.createInvalidDependencyDiagnostic = exports.createInvalidManifestDiagnostic = exports.createPackageResolutionDiagnostic = void 0;
|
|
4
4
|
function createPackageResolutionDiagnostic(input) {
|
|
5
5
|
return {
|
|
6
6
|
code: input.code,
|
|
@@ -58,3 +58,30 @@ function createUnresolvedPackageDiagnostic(dependencyName, requestedRange) {
|
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
exports.createUnresolvedPackageDiagnostic = createUnresolvedPackageDiagnostic;
|
|
61
|
+
function createAngularPeerDependencyUnpinnedDiagnostic(dependencyName, requestedRange) {
|
|
62
|
+
return createPackageResolutionDiagnostic({
|
|
63
|
+
code: "angular_peer_dependency_unpinned",
|
|
64
|
+
message: "Angular peer dependency could not be pinned to a workspace Angular version.",
|
|
65
|
+
dependencyName,
|
|
66
|
+
requestedRange,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.createAngularPeerDependencyUnpinnedDiagnostic = createAngularPeerDependencyUnpinnedDiagnostic;
|
|
70
|
+
function createAngularSingletonDuplicateDiagnostic(dependencyName, requestedRange, message = "Angular singleton package resolved to a dependency-wrapper URL.") {
|
|
71
|
+
return createPackageResolutionDiagnostic({
|
|
72
|
+
code: "angular_singleton_duplicate",
|
|
73
|
+
message,
|
|
74
|
+
dependencyName,
|
|
75
|
+
requestedRange,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
exports.createAngularSingletonDuplicateDiagnostic = createAngularSingletonDuplicateDiagnostic;
|
|
79
|
+
function createAngularSingletonVersionConflictDiagnostic(dependencyName, requestedRange) {
|
|
80
|
+
return createPackageResolutionDiagnostic({
|
|
81
|
+
code: "angular_singleton_version_conflict",
|
|
82
|
+
message: "Angular singleton package resolved to a version that conflicts with the workspace request.",
|
|
83
|
+
dependencyName,
|
|
84
|
+
requestedRange,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
exports.createAngularSingletonVersionConflictDiagnostic = createAngularSingletonVersionConflictDiagnostic;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { createCdnPackageSource, type ForgeCdnPackageFetch, type ForgeCdnPackageMetadataUrlFactory, type ForgeCdnPackageSourceOptions, } from "./cdn-source";
|
|
2
|
-
export { createInvalidDependencyDiagnostic, createInvalidManifestDiagnostic, createOfflineCacheMissDiagnostic, createPackageResolutionDiagnostic, createUnsupportedRangeDiagnostic, createUnresolvedPackageDiagnostic, } from "./diagnostics";
|
|
2
|
+
export { createAngularPeerDependencyUnpinnedDiagnostic, createAngularSingletonDuplicateDiagnostic, createAngularSingletonVersionConflictDiagnostic, createInvalidDependencyDiagnostic, createInvalidManifestDiagnostic, createOfflineCacheMissDiagnostic, createPackageResolutionDiagnostic, createUnsupportedRangeDiagnostic, createUnresolvedPackageDiagnostic, } from "./diagnostics";
|
|
3
3
|
export { ForgePackageResolutionError } from "./errors";
|
|
4
|
+
export type { ForgeAngularCompatibilityOptions, ForgeFrameworkCompatibilityOptions, } from "../framework-compatibility";
|
|
4
5
|
export { collectDependencyRequests, DEFAULT_FORGE_MANIFEST_PATH, readPackageManifest, } from "./manifest";
|
|
5
6
|
export { createPackageCacheKey, createPackageResolver, DefaultPackageResolver, } from "./resolver";
|
|
6
7
|
export { PACKAGE_RESOLUTION_CAPABILITY, type ForgeBundleAliases, type ForgeDependencyKind, type ForgeDependencyRequest, type ForgeImportMap, type ForgePackageCacheMode, type ForgePackageDiagnostic, type ForgePackageFile, type ForgePackageLockMetadata, type ForgePackageLockPackage, type ForgePackageManifest, type ForgePackageRecord, type ForgePackageResolutionDiagnostic, type ForgePackageResolutionDiagnosticCode, type ForgePackageResolutionMode, type ForgePackageResolutionResult, type ForgePackageResolver, type ForgePackageResolverOptions, type ForgePackageSource, type ForgeResolvePackagesOptions, } from "./types";
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PACKAGE_RESOLUTION_CAPABILITY = exports.DefaultPackageResolver = exports.createPackageResolver = exports.createPackageCacheKey = exports.readPackageManifest = exports.DEFAULT_FORGE_MANIFEST_PATH = exports.collectDependencyRequests = exports.ForgePackageResolutionError = exports.createUnresolvedPackageDiagnostic = exports.createUnsupportedRangeDiagnostic = exports.createPackageResolutionDiagnostic = exports.createOfflineCacheMissDiagnostic = exports.createInvalidManifestDiagnostic = exports.createInvalidDependencyDiagnostic = exports.createCdnPackageSource = void 0;
|
|
3
|
+
exports.PACKAGE_RESOLUTION_CAPABILITY = exports.DefaultPackageResolver = exports.createPackageResolver = exports.createPackageCacheKey = exports.readPackageManifest = exports.DEFAULT_FORGE_MANIFEST_PATH = exports.collectDependencyRequests = exports.ForgePackageResolutionError = exports.createUnresolvedPackageDiagnostic = exports.createUnsupportedRangeDiagnostic = exports.createPackageResolutionDiagnostic = exports.createOfflineCacheMissDiagnostic = exports.createInvalidManifestDiagnostic = exports.createInvalidDependencyDiagnostic = exports.createAngularSingletonVersionConflictDiagnostic = exports.createAngularSingletonDuplicateDiagnostic = exports.createAngularPeerDependencyUnpinnedDiagnostic = exports.createCdnPackageSource = void 0;
|
|
4
4
|
var cdn_source_1 = require("./cdn-source");
|
|
5
5
|
Object.defineProperty(exports, "createCdnPackageSource", { enumerable: true, get: function () { return cdn_source_1.createCdnPackageSource; } });
|
|
6
6
|
var diagnostics_1 = require("./diagnostics");
|
|
7
|
+
Object.defineProperty(exports, "createAngularPeerDependencyUnpinnedDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createAngularPeerDependencyUnpinnedDiagnostic; } });
|
|
8
|
+
Object.defineProperty(exports, "createAngularSingletonDuplicateDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createAngularSingletonDuplicateDiagnostic; } });
|
|
9
|
+
Object.defineProperty(exports, "createAngularSingletonVersionConflictDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createAngularSingletonVersionConflictDiagnostic; } });
|
|
7
10
|
Object.defineProperty(exports, "createInvalidDependencyDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createInvalidDependencyDiagnostic; } });
|
|
8
11
|
Object.defineProperty(exports, "createInvalidManifestDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createInvalidManifestDiagnostic; } });
|
|
9
12
|
Object.defineProperty(exports, "createOfflineCacheMissDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createOfflineCacheMissDiagnostic; } });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ForgePackageResolutionResult, ForgePackageResolver, ForgePackageResolverOptions, ForgeResolvePackagesOptions } from "./types";
|
|
1
|
+
import type { ForgePackageResolutionResult, ForgePackageResolver, ForgePackageResolverOptions, ForgeResolvePackagesOptions, ForgePackageManifest } from "./types";
|
|
2
2
|
export declare class DefaultPackageResolver implements ForgePackageResolver {
|
|
3
3
|
private readonly options;
|
|
4
4
|
readonly capability: "package-resolution";
|
|
@@ -9,7 +9,7 @@ export declare class DefaultPackageResolver implements ForgePackageResolver {
|
|
|
9
9
|
private readonly manifestPath;
|
|
10
10
|
private readonly now;
|
|
11
11
|
constructor(options: ForgePackageResolverOptions);
|
|
12
|
-
readManifest(manifestPath?: string): Promise<
|
|
12
|
+
readManifest(manifestPath?: string): Promise<ForgePackageManifest>;
|
|
13
13
|
resolve(options?: ForgeResolvePackagesOptions): Promise<ForgePackageResolutionResult>;
|
|
14
14
|
private resolveRequest;
|
|
15
15
|
private readCachedPackage;
|
|
@@ -17,4 +17,4 @@ export declare class DefaultPackageResolver implements ForgePackageResolver {
|
|
|
17
17
|
private emitTelemetry;
|
|
18
18
|
}
|
|
19
19
|
export declare function createPackageResolver(options: ForgePackageResolverOptions): ForgePackageResolver;
|
|
20
|
-
export declare function createPackageCacheKey(packageName: string, versionOrRange: string): string;
|
|
20
|
+
export declare function createPackageCacheKey(packageName: string, versionOrRange: string, peerDependencyPins?: Readonly<Record<string, string>> | undefined): string;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createPackageCacheKey = exports.createPackageResolver = exports.DefaultPackageResolver = void 0;
|
|
4
4
|
const virtual_file_system_1 = require("../virtual-file-system");
|
|
5
|
+
const framework_compatibility_1 = require("../framework-compatibility");
|
|
5
6
|
const telemetry_1 = require("../telemetry");
|
|
6
7
|
const manifest_1 = require("./manifest");
|
|
7
8
|
const diagnostics_1 = require("./diagnostics");
|
|
@@ -32,12 +33,15 @@ class DefaultPackageResolver {
|
|
|
32
33
|
let requests;
|
|
33
34
|
try {
|
|
34
35
|
const manifest = await this.readManifest(options.manifestPath ?? this.manifestPath);
|
|
35
|
-
|
|
36
|
+
const angularOptions = (0, framework_compatibility_1.resolveAngularCompatibilityOptions)(manifest, (options.frameworkCompatibility ?? this.options.frameworkCompatibility)
|
|
37
|
+
?.angular);
|
|
38
|
+
requests = mergeDependencyRequests(manifest, (0, manifest_1.collectDependencyRequests)(manifest), options.additionalDependencies ?? []);
|
|
36
39
|
const packages = [];
|
|
37
40
|
const warnings = [];
|
|
38
41
|
for (const request of requests) {
|
|
39
42
|
try {
|
|
40
|
-
const
|
|
43
|
+
const compatibilityRequest = applyAngularPeerDependencyPins(request, manifest, packages, angularOptions);
|
|
44
|
+
const result = await this.resolveRequest(compatibilityRequest, sources, cacheMode);
|
|
41
45
|
packages.push(result.packageRecord);
|
|
42
46
|
warnings.push(...result.warnings);
|
|
43
47
|
}
|
|
@@ -53,6 +57,13 @@ class DefaultPackageResolver {
|
|
|
53
57
|
}
|
|
54
58
|
}
|
|
55
59
|
packages.sort((left, right) => left.name.localeCompare(right.name));
|
|
60
|
+
const validationDiagnostics = validateAngularPackageResolution(manifest, packages, angularOptions);
|
|
61
|
+
if (validationDiagnostics.length > 0) {
|
|
62
|
+
throw new errors_1.ForgePackageResolutionError(validationDiagnostics[0], [
|
|
63
|
+
...warnings,
|
|
64
|
+
...validationDiagnostics.slice(1),
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
56
67
|
const lock = createLockMetadata(packages, resolutionMode);
|
|
57
68
|
const resultBase = {
|
|
58
69
|
manifest,
|
|
@@ -123,7 +134,7 @@ class DefaultPackageResolver {
|
|
|
123
134
|
if (this.options.storage === undefined) {
|
|
124
135
|
return undefined;
|
|
125
136
|
}
|
|
126
|
-
const cacheRecord = await this.options.storage.getPackageCacheRecord(createPackageCacheKey(request.name, request.requestedRange));
|
|
137
|
+
const cacheRecord = await this.options.storage.getPackageCacheRecord(createPackageCacheKey(request.name, request.requestedRange, request.peerDependencyPins));
|
|
127
138
|
if (cacheRecord === undefined || !isForgePackageRecord(cacheRecord.value)) {
|
|
128
139
|
return undefined;
|
|
129
140
|
}
|
|
@@ -138,10 +149,10 @@ class DefaultPackageResolver {
|
|
|
138
149
|
}
|
|
139
150
|
const warnings = [];
|
|
140
151
|
const records = [
|
|
141
|
-
createCacheRecord(createPackageCacheKey(request.name, request.requestedRange), packageRecord, this.now()),
|
|
152
|
+
createCacheRecord(createPackageCacheKey(request.name, request.requestedRange, request.peerDependencyPins), packageRecord, this.now()),
|
|
142
153
|
];
|
|
143
154
|
if (request.requestedRange !== packageRecord.version) {
|
|
144
|
-
records.push(createCacheRecord(createPackageCacheKey(request.name, packageRecord.version), packageRecord, this.now()));
|
|
155
|
+
records.push(createCacheRecord(createPackageCacheKey(request.name, packageRecord.version, request.peerDependencyPins), packageRecord, this.now()));
|
|
145
156
|
}
|
|
146
157
|
for (const record of records) {
|
|
147
158
|
try {
|
|
@@ -180,11 +191,134 @@ function createPackageResolver(options) {
|
|
|
180
191
|
return new DefaultPackageResolver(options);
|
|
181
192
|
}
|
|
182
193
|
exports.createPackageResolver = createPackageResolver;
|
|
183
|
-
function createPackageCacheKey(packageName, versionOrRange) {
|
|
184
|
-
|
|
194
|
+
function createPackageCacheKey(packageName, versionOrRange, peerDependencyPins = undefined) {
|
|
195
|
+
const baseKey = `package:${encodeURIComponent(packageName)}@${encodeURIComponent(versionOrRange)}`;
|
|
196
|
+
const pins = formatPeerDependencyPins(peerDependencyPins);
|
|
197
|
+
return pins.length === 0
|
|
198
|
+
? baseKey
|
|
199
|
+
: `${baseKey}?deps=${encodeURIComponent(pins.join(","))}`;
|
|
185
200
|
}
|
|
186
201
|
exports.createPackageCacheKey = createPackageCacheKey;
|
|
202
|
+
function mergeDependencyRequests(manifest, requests, additionalRequests) {
|
|
203
|
+
if (additionalRequests.length === 0) {
|
|
204
|
+
return requests;
|
|
205
|
+
}
|
|
206
|
+
const merged = new Map(requests.map((request) => [request.name, request]));
|
|
207
|
+
for (const request of additionalRequests) {
|
|
208
|
+
if (!isValidAdditionalDependencyRequest(request)) {
|
|
209
|
+
throw new errors_1.ForgePackageResolutionError((0, diagnostics_1.createInvalidDependencyDiagnostic)(request.name, request.requestedRange, "Additional dependency request is invalid."));
|
|
210
|
+
}
|
|
211
|
+
const existing = merged.get(request.name);
|
|
212
|
+
if (existing !== undefined) {
|
|
213
|
+
if (existing.requestedRange !== request.requestedRange) {
|
|
214
|
+
throw new errors_1.ForgePackageResolutionError((0, diagnostics_1.createInvalidDependencyDiagnostic)(request.name, request.requestedRange, "Additional dependency conflicts with the workspace manifest."));
|
|
215
|
+
}
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
merged.set(request.name, request);
|
|
219
|
+
}
|
|
220
|
+
return Array.from(merged.values()).sort((left, right) => compareDependencyRequests(left, right, manifest));
|
|
221
|
+
}
|
|
222
|
+
function applyAngularPeerDependencyPins(request, manifest, packageRecords, angularOptions) {
|
|
223
|
+
if (!(0, framework_compatibility_1.shouldApplyAngularPeerDependencyPins)(request.name, angularOptions)) {
|
|
224
|
+
return request;
|
|
225
|
+
}
|
|
226
|
+
const pins = (0, framework_compatibility_1.createAngularPeerDependencyPinMap)(manifest, packageRecords, angularOptions);
|
|
227
|
+
return Object.keys(pins).length === 0
|
|
228
|
+
? request
|
|
229
|
+
: {
|
|
230
|
+
...request,
|
|
231
|
+
peerDependencyPins: pins,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function validateAngularPackageResolution(manifest, packages, angularOptions) {
|
|
235
|
+
if (!angularOptions.enabled) {
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
const diagnostics = [];
|
|
239
|
+
for (const packageRecord of packages) {
|
|
240
|
+
if ((0, framework_compatibility_1.isAngularSingletonPackage)(packageRecord.name, angularOptions)) {
|
|
241
|
+
const requestedVersion = (0, framework_compatibility_1.normalizeVersionPin)(packageRecord.requestedRange);
|
|
242
|
+
if (requestedVersion !== undefined &&
|
|
243
|
+
isExactVersionRequest(packageRecord.requestedRange) &&
|
|
244
|
+
requestedVersion !== packageRecord.version) {
|
|
245
|
+
diagnostics.push((0, diagnostics_1.createAngularSingletonVersionConflictDiagnostic)(packageRecord.name, packageRecord.requestedRange));
|
|
246
|
+
}
|
|
247
|
+
if (hasDependencyWrappedEntryUrl(packageRecord)) {
|
|
248
|
+
diagnostics.push((0, diagnostics_1.createAngularSingletonDuplicateDiagnostic)(packageRecord.name, packageRecord.requestedRange));
|
|
249
|
+
}
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (!packageUsesAngularSingleton(packageRecord, angularOptions)) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const pins = packageRecord.peerDependencyPins ?? {};
|
|
256
|
+
for (const singletonName of angularOptions.singletonPackages) {
|
|
257
|
+
if (packageImportsAngularSingleton(packageRecord, singletonName) &&
|
|
258
|
+
pins[singletonName] === undefined &&
|
|
259
|
+
hasManifestDependency(manifest, singletonName)) {
|
|
260
|
+
diagnostics.push((0, diagnostics_1.createAngularPeerDependencyUnpinnedDiagnostic)(packageRecord.name, packageRecord.requestedRange));
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return diagnostics;
|
|
266
|
+
}
|
|
267
|
+
function isValidAdditionalDependencyRequest(request) {
|
|
268
|
+
return (request.name.length > 0 &&
|
|
269
|
+
request.requestedRange.trim().length > 0 &&
|
|
270
|
+
(request.kind === "dependency" || request.kind === "devDependency"));
|
|
271
|
+
}
|
|
272
|
+
function compareDependencyRequests(left, right, manifest) {
|
|
273
|
+
const leftDeclared = hasManifestDependency(manifest, left.name);
|
|
274
|
+
const rightDeclared = hasManifestDependency(manifest, right.name);
|
|
275
|
+
if (leftDeclared !== rightDeclared) {
|
|
276
|
+
return leftDeclared ? -1 : 1;
|
|
277
|
+
}
|
|
278
|
+
const nameComparison = left.name.localeCompare(right.name);
|
|
279
|
+
if (nameComparison !== 0) {
|
|
280
|
+
return nameComparison;
|
|
281
|
+
}
|
|
282
|
+
return left.kind.localeCompare(right.kind);
|
|
283
|
+
}
|
|
284
|
+
function hasManifestDependency(manifest, packageName) {
|
|
285
|
+
return (packageName in manifest.dependencies ||
|
|
286
|
+
packageName in manifest.devDependencies);
|
|
287
|
+
}
|
|
288
|
+
function hasDependencyWrappedEntryUrl(packageRecord) {
|
|
289
|
+
if (packageRecord.entryUrl === undefined) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
const queryIndex = packageRecord.entryUrl.indexOf("?");
|
|
293
|
+
if (queryIndex === -1) {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
const query = packageRecord.entryUrl.slice(queryIndex + 1);
|
|
297
|
+
return /(?:^|[?&])deps=/.test(query) || /(?:^|[?&])external=/.test(query);
|
|
298
|
+
}
|
|
299
|
+
function isExactVersionRequest(requestedRange) {
|
|
300
|
+
return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(requestedRange.trim());
|
|
301
|
+
}
|
|
302
|
+
function packageUsesAngularSingleton(packageRecord, angularOptions) {
|
|
303
|
+
return angularOptions.singletonPackages.some((singletonName) => packageImportsAngularSingleton(packageRecord, singletonName));
|
|
304
|
+
}
|
|
305
|
+
function packageImportsAngularSingleton(packageRecord, singletonName) {
|
|
306
|
+
return (packageRecord.dependencies[singletonName] !== undefined ||
|
|
307
|
+
packageRecord.peerDependencies?.[singletonName] !== undefined ||
|
|
308
|
+
Object.values(packageRecord.files).some((file) => typeof file.content === "string" &&
|
|
309
|
+
(file.content.includes(`"${singletonName}"`) ||
|
|
310
|
+
file.content.includes(`'${singletonName}'`))));
|
|
311
|
+
}
|
|
312
|
+
function formatPeerDependencyPins(peerDependencyPins) {
|
|
313
|
+
return Object.entries(peerDependencyPins ?? {})
|
|
314
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
315
|
+
.map(([name, version]) => `${name}@${version}`);
|
|
316
|
+
}
|
|
187
317
|
function normalizePackageRecord(request, sourceId, packageRecord) {
|
|
318
|
+
const peerDependencyPins = {
|
|
319
|
+
...(packageRecord.peerDependencyPins ?? {}),
|
|
320
|
+
...(request.peerDependencyPins ?? {}),
|
|
321
|
+
};
|
|
188
322
|
return {
|
|
189
323
|
...packageRecord,
|
|
190
324
|
name: request.name,
|
|
@@ -193,6 +327,10 @@ function normalizePackageRecord(request, sourceId, packageRecord) {
|
|
|
193
327
|
entry: normalizeEntryPath(packageRecord.entry),
|
|
194
328
|
dependencies: { ...packageRecord.dependencies },
|
|
195
329
|
files: { ...packageRecord.files },
|
|
330
|
+
peerDependencies: { ...(packageRecord.peerDependencies ?? {}) },
|
|
331
|
+
peerDependencyPins: Object.keys(peerDependencyPins).length > 0
|
|
332
|
+
? peerDependencyPins
|
|
333
|
+
: undefined,
|
|
196
334
|
};
|
|
197
335
|
}
|
|
198
336
|
function createLockMetadata(packages, resolutionMode) {
|
|
@@ -207,6 +345,7 @@ function createLockMetadata(packages, resolutionMode) {
|
|
|
207
345
|
entry: packageRecord.entry,
|
|
208
346
|
entryUrl: packageRecord.entryUrl,
|
|
209
347
|
integrity: packageRecord.integrity,
|
|
348
|
+
peerDependencyPins: packageRecord.peerDependencyPins,
|
|
210
349
|
})),
|
|
211
350
|
};
|
|
212
351
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { ForgeDiagnostic, ForgeVirtualFileSystemStorage } from "../virtual-file-system";
|
|
2
2
|
import type { ForgeVirtualFileSystem } from "../virtual-file-system";
|
|
3
3
|
import type { ForgeTelemetryReporter } from "../telemetry";
|
|
4
|
+
import type { ForgeFrameworkCompatibilityOptions } from "../framework-compatibility";
|
|
4
5
|
export declare const PACKAGE_RESOLUTION_CAPABILITY: "package-resolution";
|
|
5
6
|
export type ForgePackageResolutionMode = "import-map" | "bundle-alias";
|
|
6
7
|
export type ForgePackageCacheMode = "prefer-cache" | "cache-only";
|
|
7
|
-
export type ForgePackageResolutionDiagnosticCode = "invalid_dependency" | "invalid_manifest" | "offline_cache_miss" | "unresolved_package" | "unsupported_range";
|
|
8
|
+
export type ForgePackageResolutionDiagnosticCode = "angular_peer_dependency_unpinned" | "angular_singleton_duplicate" | "angular_singleton_version_conflict" | "invalid_dependency" | "invalid_manifest" | "offline_cache_miss" | "unresolved_package" | "unsupported_range";
|
|
8
9
|
export interface ForgePackageResolutionDiagnostic {
|
|
9
10
|
readonly code: ForgePackageResolutionDiagnosticCode;
|
|
10
11
|
readonly severity: "error";
|
|
@@ -29,6 +30,7 @@ export interface ForgeDependencyRequest {
|
|
|
29
30
|
readonly name: string;
|
|
30
31
|
readonly requestedRange: string;
|
|
31
32
|
readonly kind: ForgeDependencyKind;
|
|
33
|
+
readonly peerDependencyPins?: Readonly<Record<string, string>>;
|
|
32
34
|
}
|
|
33
35
|
export interface ForgePackageFile {
|
|
34
36
|
readonly path: string;
|
|
@@ -48,6 +50,8 @@ export interface ForgePackageRecord {
|
|
|
48
50
|
readonly dependencies: Record<string, string>;
|
|
49
51
|
readonly files: Record<string, ForgePackageFile>;
|
|
50
52
|
readonly integrity?: string;
|
|
53
|
+
readonly peerDependencies?: Record<string, string>;
|
|
54
|
+
readonly peerDependencyPins?: Readonly<Record<string, string>>;
|
|
51
55
|
}
|
|
52
56
|
export interface ForgePackageLockPackage {
|
|
53
57
|
readonly name: string;
|
|
@@ -57,6 +61,7 @@ export interface ForgePackageLockPackage {
|
|
|
57
61
|
readonly entry: string;
|
|
58
62
|
readonly entryUrl?: string;
|
|
59
63
|
readonly integrity?: string;
|
|
64
|
+
readonly peerDependencyPins?: Readonly<Record<string, string>>;
|
|
60
65
|
}
|
|
61
66
|
export interface ForgePackageLockMetadata {
|
|
62
67
|
readonly lockfileVersion: 1;
|
|
@@ -77,6 +82,7 @@ export interface ForgePackageResolverOptions {
|
|
|
77
82
|
readonly sources?: readonly ForgePackageSource[];
|
|
78
83
|
readonly resolutionMode?: ForgePackageResolutionMode;
|
|
79
84
|
readonly cacheMode?: ForgePackageCacheMode;
|
|
85
|
+
readonly frameworkCompatibility?: ForgeFrameworkCompatibilityOptions;
|
|
80
86
|
readonly telemetry?: ForgeTelemetryReporter;
|
|
81
87
|
readonly manifestPath?: string;
|
|
82
88
|
readonly now?: () => string;
|
|
@@ -85,6 +91,8 @@ export interface ForgeResolvePackagesOptions {
|
|
|
85
91
|
readonly sources?: readonly ForgePackageSource[];
|
|
86
92
|
readonly resolutionMode?: ForgePackageResolutionMode;
|
|
87
93
|
readonly cacheMode?: ForgePackageCacheMode;
|
|
94
|
+
readonly additionalDependencies?: readonly ForgeDependencyRequest[];
|
|
95
|
+
readonly frameworkCompatibility?: ForgeFrameworkCompatibilityOptions;
|
|
88
96
|
readonly telemetry?: ForgeTelemetryReporter;
|
|
89
97
|
readonly manifestPath?: string;
|
|
90
98
|
}
|
|
@@ -43,7 +43,7 @@ class NpmRunDevCommandHandler {
|
|
|
43
43
|
stdout(`Forge started browser preview session ${startResult.session.id}.`),
|
|
44
44
|
stdout(`Preview URL: ${startResult.session.previewUrl}`),
|
|
45
45
|
stdout(`Preview revision ${startResult.session.revision} is ready as iframe HTML.`),
|
|
46
|
-
stdout("No real
|
|
46
|
+
stdout("No real dev server or TCP port was opened."),
|
|
47
47
|
...warningOutput(startResult.diagnostics),
|
|
48
48
|
],
|
|
49
49
|
diagnostics: startResult.diagnostics,
|