@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.
@@ -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
- return `${trimmedBase}/${packageKey}.json`;
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<import("./types").ForgePackageManifest>;
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
- requests = (0, manifest_1.collectDependencyRequests)(manifest);
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 result = await this.resolveRequest(request, sources, cacheMode);
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
- return `package:${encodeURIComponent(packageName)}@${encodeURIComponent(versionOrRange)}`;
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 Vite server or TCP port was opened."),
46
+ stdout("No real dev server or TCP port was opened."),
47
47
  ...warningOutput(startResult.diagnostics),
48
48
  ],
49
49
  diagnostics: startResult.diagnostics,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caryhu/codemine-forge",
3
- "version": "0.0.1-alpha.3",
3
+ "version": "0.0.1-alpha.4",
4
4
  "description": "Browser-side runtime layer for Codemine demos.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",