@vercel/python-analysis 0.10.0 → 0.10.1

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/index.cjs CHANGED
@@ -72,6 +72,7 @@ __export(src_exports, {
72
72
  isPrivatePackageSource: () => isPrivatePackageSource,
73
73
  isWheelCompatible: () => isWheelCompatible,
74
74
  normalizePackageName: () => normalizePackageName2,
75
+ parsePep508: () => parsePep508,
75
76
  parseUvLock: () => parseUvLock,
76
77
  scanDistributions: () => scanDistributions,
77
78
  selectPython: () => selectPython,
@@ -265,6 +266,41 @@ function mergeExtras(existing, additional) {
265
266
  }
266
267
  return result.size > 0 ? Array.from(result) : void 0;
267
268
  }
269
+ function wasmEntryToRequirement(entry) {
270
+ const req = {
271
+ name: entry.name || ""
272
+ };
273
+ if (entry.versionSpec) {
274
+ req.version = entry.versionSpec;
275
+ }
276
+ if (entry.extras.length > 0) {
277
+ req.extras = entry.extras;
278
+ }
279
+ if (entry.markers) {
280
+ req.markers = entry.markers;
281
+ }
282
+ if (entry.url) {
283
+ req.url = entry.url;
284
+ }
285
+ return req;
286
+ }
287
+ async function parsePep508(depOrDeps) {
288
+ const wasm = await importWasmModule();
289
+ if (Array.isArray(depOrDeps)) {
290
+ return depOrDeps.map((dep) => {
291
+ try {
292
+ return wasmEntryToRequirement(wasm.parsePep508(dep));
293
+ } catch {
294
+ return null;
295
+ }
296
+ });
297
+ }
298
+ try {
299
+ return wasmEntryToRequirement(wasm.parsePep508(depOrDeps));
300
+ } catch {
301
+ return null;
302
+ }
303
+ }
268
304
 
269
305
  // src/manifest/dist-metadata.ts
270
306
  async function readDistInfoFile(distInfoDir, filename) {
@@ -919,7 +955,8 @@ var uvIndexEntrySchema = import_zod3.z.object({
919
955
  var uvConfigSchema = import_zod3.z.object({
920
956
  sources: import_zod3.z.record(import_zod3.z.union([dependencySourceSchema, import_zod3.z.array(dependencySourceSchema)])).optional(),
921
957
  index: import_zod3.z.array(uvIndexEntrySchema).optional(),
922
- workspace: uvConfigWorkspaceSchema.optional()
958
+ workspace: uvConfigWorkspaceSchema.optional(),
959
+ "dev-dependencies": import_zod3.z.array(import_zod3.z.string()).optional()
923
960
  });
924
961
 
925
962
  // src/manifest/pyproject/schema.zod.ts
@@ -960,7 +997,16 @@ var pyProjectProjectSchema = import_zod4.z.object({
960
997
  scripts: import_zod4.z.record(import_zod4.z.string()).optional(),
961
998
  entry_points: import_zod4.z.record(import_zod4.z.record(import_zod4.z.string())).optional()
962
999
  });
963
- var pyProjectDependencyGroupsSchema = import_zod4.z.record(import_zod4.z.array(import_zod4.z.string()));
1000
+ var dependencyGroupIncludeSchema = import_zod4.z.object({
1001
+ "include-group": import_zod4.z.string()
1002
+ });
1003
+ var dependencyGroupEntrySchema = import_zod4.z.union([
1004
+ import_zod4.z.string(),
1005
+ dependencyGroupIncludeSchema
1006
+ ]);
1007
+ var pyProjectDependencyGroupsSchema = import_zod4.z.record(
1008
+ import_zod4.z.array(dependencyGroupEntrySchema)
1009
+ );
964
1010
  var pyProjectToolSectionSchema = import_zod4.z.object({
965
1011
  uv: uvConfigSchema.optional()
966
1012
  });
@@ -1627,7 +1673,8 @@ function computeRequiresPython(manifest, workspaceManifest, configs) {
1627
1673
  constraints.push({
1628
1674
  request: pythonVersionConfig.data,
1629
1675
  source: pythonVersionConfig.path,
1630
- prettySource: pythonVersionConfig.path
1676
+ prettySource: pythonVersionConfig.path,
1677
+ specifier: pythonVersionConfig.specifier
1631
1678
  });
1632
1679
  hasPythonVersionFile = true;
1633
1680
  break;
@@ -1642,7 +1689,8 @@ function computeRequiresPython(manifest, workspaceManifest, configs) {
1642
1689
  constraints.push({
1643
1690
  request: [request],
1644
1691
  source: manifest.path,
1645
- prettySource: `"requires-python" key in ${manifest.path}`
1692
+ prettySource: `"requires-python" key in ${manifest.path}`,
1693
+ specifier: manifestRequiresPython
1646
1694
  });
1647
1695
  }
1648
1696
  } else {
@@ -1654,7 +1702,8 @@ function computeRequiresPython(manifest, workspaceManifest, configs) {
1654
1702
  constraints.push({
1655
1703
  request: [request],
1656
1704
  source: workspaceManifest.path,
1657
- prettySource: `"requires-python" key in ${workspaceManifest.path}`
1705
+ prettySource: `"requires-python" key in ${workspaceManifest.path}`,
1706
+ specifier: workspaceRequiresPython
1658
1707
  });
1659
1708
  }
1660
1709
  }
@@ -1935,7 +1984,8 @@ async function maybeLoadPythonRequest(root, subdir) {
1935
1984
  return {
1936
1985
  kind: ".python-version" /* PythonVersion */,
1937
1986
  path: dotPythonVersionRelPath,
1938
- data: pyreq
1987
+ data: pyreq,
1988
+ specifier: data.trim()
1939
1989
  };
1940
1990
  }
1941
1991
 
@@ -1980,7 +2030,8 @@ function parseUvLock(content, path4) {
1980
2030
  name: pkg.name,
1981
2031
  version: pkg.version,
1982
2032
  source: pkg.source,
1983
- wheels: (pkg.wheels ?? []).map((w) => ({ url: w.url }))
2033
+ wheels: (pkg.wheels ?? []).map((w) => ({ url: w.url })),
2034
+ ...pkg.dependencies ? { dependencies: pkg.dependencies } : {}
1984
2035
  }));
1985
2036
  return { version: parsed.version, packages };
1986
2037
  }
@@ -2365,6 +2416,7 @@ var HashDigestSchema = hashDigestSchema;
2365
2416
  isPrivatePackageSource,
2366
2417
  isWheelCompatible,
2367
2418
  normalizePackageName,
2419
+ parsePep508,
2368
2420
  parseUvLock,
2369
2421
  scanDistributions,
2370
2422
  selectPython,
package/dist/index.d.ts CHANGED
@@ -19,11 +19,12 @@ export type { PythonSelectionResult, PythonVersionSelectionResult, } from './man
19
19
  export { selectPython, selectPythonVersion } from './manifest/python-selector';
20
20
  export { PythonAnalysisError } from './util/error';
21
21
  export { LicenseObjectSchema, LicenseSchema, PersonSchema, PyProjectBuildSystemSchema, PyProjectDependencyGroupsSchema, PyProjectProjectSchema, PyProjectToolSectionSchema, PyProjectTomlSchema, ReadmeObjectSchema, ReadmeSchema, } from './manifest/pyproject/schema';
22
- export type { License, LicenseObject, Person, PyProjectBuildSystem, PyProjectDependencyGroups, PyProjectProject, PyProjectToml, PyProjectToolSection, Readme, ReadmeObject, } from './manifest/pyproject/types';
22
+ export type { DependencyGroupEntry, DependencyGroupInclude, License, LicenseObject, Person, PyProjectBuildSystem, PyProjectDependencyGroups, PyProjectProject, PyProjectToml, PyProjectToolSection, Readme, ReadmeObject, } from './manifest/pyproject/types';
23
23
  export { UvConfigSchema, UvConfigWorkspaceSchema, UvIndexEntrySchema, } from './manifest/uv-config/schema';
24
24
  export type { UvConfig, UvConfigWorkspace, UvIndexEntry, } from './manifest/uv-config/types';
25
25
  export { PipfileDependencyDetailSchema, PipfileDependencySchema, PipfileLikeSchema, PipfileLockLikeSchema, PipfileLockMetaSchema, PipfileSourceSchema, } from './manifest/pipfile/schema';
26
26
  export type { PipfileDependency, PipfileDependencyDetail, PipfileLike, PipfileLockLike, PipfileLockMeta, PipfileSource, } from './manifest/pipfile/types';
27
27
  export { DependencySourceSchema, HashDigestSchema, NormalizedRequirementSchema, } from './manifest/requirement/schema';
28
28
  export type { DependencySource, HashDigest, NormalizedRequirement, } from './manifest/requirement/types';
29
+ export { parsePep508 } from './manifest/pep508';
29
30
  export { PythonBuild, PythonConstraint, PythonImplementation, PythonPlatformRequest, PythonRequest, PythonVariant, PythonVersion, PythonVersionRequest, UnknownPythonImplementation, } from './manifest/python-specifiers';
package/dist/index.js CHANGED
@@ -183,6 +183,41 @@ function mergeExtras(existing, additional) {
183
183
  }
184
184
  return result.size > 0 ? Array.from(result) : void 0;
185
185
  }
186
+ function wasmEntryToRequirement(entry) {
187
+ const req = {
188
+ name: entry.name || ""
189
+ };
190
+ if (entry.versionSpec) {
191
+ req.version = entry.versionSpec;
192
+ }
193
+ if (entry.extras.length > 0) {
194
+ req.extras = entry.extras;
195
+ }
196
+ if (entry.markers) {
197
+ req.markers = entry.markers;
198
+ }
199
+ if (entry.url) {
200
+ req.url = entry.url;
201
+ }
202
+ return req;
203
+ }
204
+ async function parsePep508(depOrDeps) {
205
+ const wasm = await importWasmModule();
206
+ if (Array.isArray(depOrDeps)) {
207
+ return depOrDeps.map((dep) => {
208
+ try {
209
+ return wasmEntryToRequirement(wasm.parsePep508(dep));
210
+ } catch {
211
+ return null;
212
+ }
213
+ });
214
+ }
215
+ try {
216
+ return wasmEntryToRequirement(wasm.parsePep508(depOrDeps));
217
+ } catch {
218
+ return null;
219
+ }
220
+ }
186
221
 
187
222
  // src/manifest/dist-metadata.ts
188
223
  async function readDistInfoFile(distInfoDir, filename) {
@@ -840,7 +875,8 @@ var uvIndexEntrySchema = z3.object({
840
875
  var uvConfigSchema = z3.object({
841
876
  sources: z3.record(z3.union([dependencySourceSchema, z3.array(dependencySourceSchema)])).optional(),
842
877
  index: z3.array(uvIndexEntrySchema).optional(),
843
- workspace: uvConfigWorkspaceSchema.optional()
878
+ workspace: uvConfigWorkspaceSchema.optional(),
879
+ "dev-dependencies": z3.array(z3.string()).optional()
844
880
  });
845
881
 
846
882
  // src/manifest/pyproject/schema.zod.ts
@@ -881,7 +917,16 @@ var pyProjectProjectSchema = z4.object({
881
917
  scripts: z4.record(z4.string()).optional(),
882
918
  entry_points: z4.record(z4.record(z4.string())).optional()
883
919
  });
884
- var pyProjectDependencyGroupsSchema = z4.record(z4.array(z4.string()));
920
+ var dependencyGroupIncludeSchema = z4.object({
921
+ "include-group": z4.string()
922
+ });
923
+ var dependencyGroupEntrySchema = z4.union([
924
+ z4.string(),
925
+ dependencyGroupIncludeSchema
926
+ ]);
927
+ var pyProjectDependencyGroupsSchema = z4.record(
928
+ z4.array(dependencyGroupEntrySchema)
929
+ );
885
930
  var pyProjectToolSectionSchema = z4.object({
886
931
  uv: uvConfigSchema.optional()
887
932
  });
@@ -1548,7 +1593,8 @@ function computeRequiresPython(manifest, workspaceManifest, configs) {
1548
1593
  constraints.push({
1549
1594
  request: pythonVersionConfig.data,
1550
1595
  source: pythonVersionConfig.path,
1551
- prettySource: pythonVersionConfig.path
1596
+ prettySource: pythonVersionConfig.path,
1597
+ specifier: pythonVersionConfig.specifier
1552
1598
  });
1553
1599
  hasPythonVersionFile = true;
1554
1600
  break;
@@ -1563,7 +1609,8 @@ function computeRequiresPython(manifest, workspaceManifest, configs) {
1563
1609
  constraints.push({
1564
1610
  request: [request],
1565
1611
  source: manifest.path,
1566
- prettySource: `"requires-python" key in ${manifest.path}`
1612
+ prettySource: `"requires-python" key in ${manifest.path}`,
1613
+ specifier: manifestRequiresPython
1567
1614
  });
1568
1615
  }
1569
1616
  } else {
@@ -1575,7 +1622,8 @@ function computeRequiresPython(manifest, workspaceManifest, configs) {
1575
1622
  constraints.push({
1576
1623
  request: [request],
1577
1624
  source: workspaceManifest.path,
1578
- prettySource: `"requires-python" key in ${workspaceManifest.path}`
1625
+ prettySource: `"requires-python" key in ${workspaceManifest.path}`,
1626
+ specifier: workspaceRequiresPython
1579
1627
  });
1580
1628
  }
1581
1629
  }
@@ -1856,7 +1904,8 @@ async function maybeLoadPythonRequest(root, subdir) {
1856
1904
  return {
1857
1905
  kind: ".python-version" /* PythonVersion */,
1858
1906
  path: dotPythonVersionRelPath,
1859
- data: pyreq
1907
+ data: pyreq,
1908
+ specifier: data.trim()
1860
1909
  };
1861
1910
  }
1862
1911
 
@@ -1901,7 +1950,8 @@ function parseUvLock(content, path4) {
1901
1950
  name: pkg.name,
1902
1951
  version: pkg.version,
1903
1952
  source: pkg.source,
1904
- wheels: (pkg.wheels ?? []).map((w) => ({ url: w.url }))
1953
+ wheels: (pkg.wheels ?? []).map((w) => ({ url: w.url })),
1954
+ ...pkg.dependencies ? { dependencies: pkg.dependencies } : {}
1905
1955
  }));
1906
1956
  return { version: parsed.version, packages };
1907
1957
  }
@@ -2285,6 +2335,7 @@ export {
2285
2335
  isPrivatePackageSource,
2286
2336
  isWheelCompatible,
2287
2337
  normalizePackageName2 as normalizePackageName,
2338
+ parsePep508,
2288
2339
  parseUvLock,
2289
2340
  scanDistributions,
2290
2341
  selectPython,
@@ -98,6 +98,8 @@ export interface PythonVersionConfig {
98
98
  path: RelPath;
99
99
  /** Parsed Python version requests from the file. */
100
100
  data: PythonRequest[];
101
+ /** Raw version string from the file (e.g. "3.12", ">=3.12,<3.13"). */
102
+ specifier: string;
101
103
  }
102
104
  /**
103
105
  * Union type for all Python configuration file types.
@@ -62,3 +62,22 @@ export declare function formatPep508(req: NormalizedRequirement): string;
62
62
  * @returns Merged extras array, or undefined if both inputs are empty/undefined
63
63
  */
64
64
  export declare function mergeExtras(existing: string[] | undefined, additional: string[] | string | undefined): string[] | undefined;
65
+ /**
66
+ * Parse a single PEP 508 dependency string into a NormalizedRequirement.
67
+ *
68
+ * Uses the uv-pep508 Rust crate via WASM for spec-compliant parsing.
69
+ *
70
+ * @param dep - A PEP 508 dependency string (e.g., "flask[async]>=2.0 ; python_version >= '3.8'")
71
+ * @returns The parsed requirement, or null if parsing fails
72
+ */
73
+ export declare function parsePep508(dep: string): Promise<NormalizedRequirement | null>;
74
+ /**
75
+ * Parse multiple PEP 508 dependency strings in a single batch.
76
+ *
77
+ * Loads the WASM module once and parses all strings synchronously,
78
+ * avoiding per-item async overhead.
79
+ *
80
+ * @param deps - Array of PEP 508 dependency strings
81
+ * @returns Array of parsed requirements (null for entries that fail to parse)
82
+ */
83
+ export declare function parsePep508(deps: string[]): Promise<(NormalizedRequirement | null)[]>;
@@ -174,7 +174,27 @@ export declare const pyProjectProjectSchema: z.ZodObject<{
174
174
  scripts?: Record<string, string> | undefined;
175
175
  entry_points?: Record<string, Record<string, string>> | undefined;
176
176
  }>;
177
- export declare const pyProjectDependencyGroupsSchema: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString, "many">>;
177
+ export declare const dependencyGroupIncludeSchema: z.ZodObject<{
178
+ 'include-group': z.ZodString;
179
+ }, "strip", z.ZodTypeAny, {
180
+ 'include-group': string;
181
+ }, {
182
+ 'include-group': string;
183
+ }>;
184
+ export declare const dependencyGroupEntrySchema: z.ZodUnion<[z.ZodString, z.ZodObject<{
185
+ 'include-group': z.ZodString;
186
+ }, "strip", z.ZodTypeAny, {
187
+ 'include-group': string;
188
+ }, {
189
+ 'include-group': string;
190
+ }>]>;
191
+ export declare const pyProjectDependencyGroupsSchema: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
192
+ 'include-group': z.ZodString;
193
+ }, "strip", z.ZodTypeAny, {
194
+ 'include-group': string;
195
+ }, {
196
+ 'include-group': string;
197
+ }>]>, "many">>;
178
198
  export declare const pyProjectToolSectionSchema: z.ZodObject<{
179
199
  uv: z.ZodOptional<z.ZodObject<{
180
200
  sources: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
@@ -243,6 +263,7 @@ export declare const pyProjectToolSectionSchema: z.ZodObject<{
243
263
  members?: string[] | undefined;
244
264
  exclude?: string[] | undefined;
245
265
  }>>;
266
+ 'dev-dependencies': z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
246
267
  }, "strip", z.ZodTypeAny, {
247
268
  sources?: Record<string, {
248
269
  index?: string | undefined;
@@ -268,6 +289,7 @@ export declare const pyProjectToolSectionSchema: z.ZodObject<{
268
289
  members?: string[] | undefined;
269
290
  exclude?: string[] | undefined;
270
291
  } | undefined;
292
+ 'dev-dependencies'?: string[] | undefined;
271
293
  }, {
272
294
  sources?: Record<string, {
273
295
  index?: string | undefined;
@@ -293,6 +315,7 @@ export declare const pyProjectToolSectionSchema: z.ZodObject<{
293
315
  members?: string[] | undefined;
294
316
  exclude?: string[] | undefined;
295
317
  } | undefined;
318
+ 'dev-dependencies'?: string[] | undefined;
296
319
  }>>;
297
320
  }, "strip", z.ZodTypeAny, {
298
321
  uv?: {
@@ -320,6 +343,7 @@ export declare const pyProjectToolSectionSchema: z.ZodObject<{
320
343
  members?: string[] | undefined;
321
344
  exclude?: string[] | undefined;
322
345
  } | undefined;
346
+ 'dev-dependencies'?: string[] | undefined;
323
347
  } | undefined;
324
348
  }, {
325
349
  uv?: {
@@ -347,6 +371,7 @@ export declare const pyProjectToolSectionSchema: z.ZodObject<{
347
371
  members?: string[] | undefined;
348
372
  exclude?: string[] | undefined;
349
373
  } | undefined;
374
+ 'dev-dependencies'?: string[] | undefined;
350
375
  } | undefined;
351
376
  }>;
352
377
  export declare const pyProjectTomlSchema: z.ZodObject<{
@@ -475,7 +500,13 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
475
500
  'build-backend'?: string | undefined;
476
501
  'backend-path'?: string[] | undefined;
477
502
  }>>;
478
- 'dependency-groups': z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString, "many">>>;
503
+ 'dependency-groups': z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
504
+ 'include-group': z.ZodString;
505
+ }, "strip", z.ZodTypeAny, {
506
+ 'include-group': string;
507
+ }, {
508
+ 'include-group': string;
509
+ }>]>, "many">>>;
479
510
  tool: z.ZodOptional<z.ZodObject<{
480
511
  uv: z.ZodOptional<z.ZodObject<{
481
512
  sources: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
@@ -544,6 +575,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
544
575
  members?: string[] | undefined;
545
576
  exclude?: string[] | undefined;
546
577
  }>>;
578
+ 'dev-dependencies': z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
547
579
  }, "strip", z.ZodTypeAny, {
548
580
  sources?: Record<string, {
549
581
  index?: string | undefined;
@@ -569,6 +601,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
569
601
  members?: string[] | undefined;
570
602
  exclude?: string[] | undefined;
571
603
  } | undefined;
604
+ 'dev-dependencies'?: string[] | undefined;
572
605
  }, {
573
606
  sources?: Record<string, {
574
607
  index?: string | undefined;
@@ -594,6 +627,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
594
627
  members?: string[] | undefined;
595
628
  exclude?: string[] | undefined;
596
629
  } | undefined;
630
+ 'dev-dependencies'?: string[] | undefined;
597
631
  }>>;
598
632
  }, "strip", z.ZodTypeAny, {
599
633
  uv?: {
@@ -621,6 +655,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
621
655
  members?: string[] | undefined;
622
656
  exclude?: string[] | undefined;
623
657
  } | undefined;
658
+ 'dev-dependencies'?: string[] | undefined;
624
659
  } | undefined;
625
660
  }, {
626
661
  uv?: {
@@ -648,6 +683,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
648
683
  members?: string[] | undefined;
649
684
  exclude?: string[] | undefined;
650
685
  } | undefined;
686
+ 'dev-dependencies'?: string[] | undefined;
651
687
  } | undefined;
652
688
  }>>;
653
689
  }, "strip", z.ZodTypeAny, {
@@ -686,7 +722,9 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
686
722
  'build-backend'?: string | undefined;
687
723
  'backend-path'?: string[] | undefined;
688
724
  } | undefined;
689
- 'dependency-groups'?: Record<string, string[]> | undefined;
725
+ 'dependency-groups'?: Record<string, (string | {
726
+ 'include-group': string;
727
+ })[]> | undefined;
690
728
  tool?: {
691
729
  uv?: {
692
730
  sources?: Record<string, {
@@ -713,6 +751,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
713
751
  members?: string[] | undefined;
714
752
  exclude?: string[] | undefined;
715
753
  } | undefined;
754
+ 'dev-dependencies'?: string[] | undefined;
716
755
  } | undefined;
717
756
  } | undefined;
718
757
  }, {
@@ -751,7 +790,9 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
751
790
  'build-backend'?: string | undefined;
752
791
  'backend-path'?: string[] | undefined;
753
792
  } | undefined;
754
- 'dependency-groups'?: Record<string, string[]> | undefined;
793
+ 'dependency-groups'?: Record<string, (string | {
794
+ 'include-group': string;
795
+ })[]> | undefined;
755
796
  tool?: {
756
797
  uv?: {
757
798
  sources?: Record<string, {
@@ -778,6 +819,7 @@ export declare const pyProjectTomlSchema: z.ZodObject<{
778
819
  members?: string[] | undefined;
779
820
  exclude?: string[] | undefined;
780
821
  } | undefined;
822
+ 'dev-dependencies'?: string[] | undefined;
781
823
  } | undefined;
782
824
  } | undefined;
783
825
  }>;
@@ -71,9 +71,19 @@ export interface PyProjectProject {
71
71
  entry_points?: Record<string, Record<string, string>>;
72
72
  }
73
73
  /**
74
- * [dependency-groups].
74
+ * PEP 735 include-group directive: `{include-group: "other-group"}`.
75
75
  */
76
- export type PyProjectDependencyGroups = Record<string, string[]>;
76
+ export interface DependencyGroupInclude {
77
+ 'include-group': string;
78
+ }
79
+ /**
80
+ * A single entry in a dependency group: either a PEP 508 string or an include directive.
81
+ */
82
+ export type DependencyGroupEntry = string | DependencyGroupInclude;
83
+ /**
84
+ * [dependency-groups] per PEP 735.
85
+ */
86
+ export type PyProjectDependencyGroups = Record<string, DependencyGroupEntry[]>;
77
87
  /**
78
88
  * [tool.FOO] section.
79
89
  * @passthrough
@@ -55,6 +55,8 @@ export interface PythonConstraint {
55
55
  source: string;
56
56
  /** Human-readable description of where this constraint came from. */
57
57
  prettySource: string;
58
+ /** Raw version specifier string from the source file (e.g. ">=3.12", "3.12"). */
59
+ specifier?: string;
58
60
  }
59
61
  export type PythonVersion = {
60
62
  major: number;
@@ -95,6 +95,7 @@ export declare const uvConfigSchema: z.ZodObject<{
95
95
  members?: string[] | undefined;
96
96
  exclude?: string[] | undefined;
97
97
  }>>;
98
+ 'dev-dependencies': z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
98
99
  }, "strip", z.ZodTypeAny, {
99
100
  sources?: Record<string, {
100
101
  index?: string | undefined;
@@ -120,6 +121,7 @@ export declare const uvConfigSchema: z.ZodObject<{
120
121
  members?: string[] | undefined;
121
122
  exclude?: string[] | undefined;
122
123
  } | undefined;
124
+ 'dev-dependencies'?: string[] | undefined;
123
125
  }, {
124
126
  sources?: Record<string, {
125
127
  index?: string | undefined;
@@ -145,4 +147,5 @@ export declare const uvConfigSchema: z.ZodObject<{
145
147
  members?: string[] | undefined;
146
148
  exclude?: string[] | undefined;
147
149
  } | undefined;
150
+ 'dev-dependencies'?: string[] | undefined;
148
151
  }>;
@@ -47,4 +47,9 @@ export interface UvConfig {
47
47
  * Workspace configuration.
48
48
  */
49
49
  workspace?: UvConfigWorkspace;
50
+ /**
51
+ * Legacy dev dependencies (pre-PEP 735).
52
+ * Equivalent to `[dependency-groups].dev`.
53
+ */
54
+ 'dev-dependencies'?: string[];
50
55
  }
@@ -23,6 +23,9 @@ export interface UvLockPackage {
23
23
  version: string;
24
24
  source?: UvLockPackageSource;
25
25
  wheels: UvLockWheel[];
26
+ dependencies?: Array<{
27
+ name: string;
28
+ }>;
26
29
  }
27
30
  /**
28
31
  * Parsed uv.lock file structure.
@@ -124,6 +124,7 @@ export interface Root {
124
124
  parseDirectUrl(content: string): DirectUrlInfo,
125
125
  normalizePackageName(name: string): string,
126
126
  parseRequirementsTxt(content: string, workingDir: string | undefined, filename: string | undefined): ParsedRequirementsTxt,
127
+ parsePep508(dep: string): ParsedReqEntry,
127
128
  isWheelCompatible(wheelFilename: string, pythonMajor: number, pythonMinor: number, osName: string, archName: string, osMajor: number, osMinor: number): boolean,
128
129
  }
129
130
 
@@ -3452,6 +3452,7 @@ let gen = (function* _initGenerator () {
3452
3452
  let postReturn3;
3453
3453
  let postReturn4;
3454
3454
  let postReturn5;
3455
+ let postReturn6;
3455
3456
  function trampoline0(handle) {
3456
3457
  const handleEntry = rscTableRemove(handleTable1, handle);
3457
3458
  if (handleEntry.own) {
@@ -3647,6 +3648,7 @@ let gen = (function* _initGenerator () {
3647
3648
  postReturn3 = exports1['cabi_post_parse-direct-url'];
3648
3649
  postReturn4 = exports1['cabi_post_normalize-package-name'];
3649
3650
  postReturn5 = exports1['cabi_post_parse-requirements-txt'];
3651
+ postReturn6 = exports1['cabi_post_parse-pep508'];
3650
3652
  let exports1ContainsAppOrHandler;
3651
3653
 
3652
3654
  function containsAppOrHandler(arg0) {
@@ -4836,6 +4838,221 @@ let gen = (function* _initGenerator () {
4836
4838
 
4837
4839
 
4838
4840
 
4841
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4842
+ throw new ComponentError(retCopy.val);
4843
+ }
4844
+ return retCopy.val;
4845
+
4846
+ }
4847
+ let exports1ParsePep508;
4848
+
4849
+ function parsePep508(arg0) {
4850
+ var ptr0 = utf8Encode(arg0, realloc0, memory0);
4851
+ var len0 = utf8EncodedLen;
4852
+ _debugLog('[iface="parse-pep508", function="parse-pep508"][Instruction::CallWasm] enter', {
4853
+ funcName: 'parse-pep508',
4854
+ paramCount: 2,
4855
+ async: false,
4856
+ postReturn: true,
4857
+ });
4858
+ const _wasm_call_currentTaskID = startCurrentTask(0, false, 'exports1ParsePep508');
4859
+ const ret = exports1ParsePep508(ptr0, len0);
4860
+ endCurrentTask(0);
4861
+ let variant22;
4862
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
4863
+ case 0: {
4864
+ let variant2;
4865
+ switch (dataView(memory0).getUint8(ret + 4, true)) {
4866
+ case 0: {
4867
+ variant2 = undefined;
4868
+ break;
4869
+ }
4870
+ case 1: {
4871
+ var ptr1 = dataView(memory0).getUint32(ret + 8, true);
4872
+ var len1 = dataView(memory0).getUint32(ret + 12, true);
4873
+ var result1 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr1, len1));
4874
+ variant2 = result1;
4875
+ break;
4876
+ }
4877
+ default: {
4878
+ throw new TypeError('invalid variant discriminant for option');
4879
+ }
4880
+ }
4881
+ var ptr3 = dataView(memory0).getUint32(ret + 16, true);
4882
+ var len3 = dataView(memory0).getUint32(ret + 20, true);
4883
+ var result3 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr3, len3));
4884
+ var len5 = dataView(memory0).getUint32(ret + 28, true);
4885
+ var base5 = dataView(memory0).getUint32(ret + 24, true);
4886
+ var result5 = [];
4887
+ for (let i = 0; i < len5; i++) {
4888
+ const base = base5 + i * 8;
4889
+ var ptr4 = dataView(memory0).getUint32(base + 0, true);
4890
+ var len4 = dataView(memory0).getUint32(base + 4, true);
4891
+ var result4 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr4, len4));
4892
+ result5.push(result4);
4893
+ }
4894
+ let variant7;
4895
+ switch (dataView(memory0).getUint8(ret + 32, true)) {
4896
+ case 0: {
4897
+ variant7 = undefined;
4898
+ break;
4899
+ }
4900
+ case 1: {
4901
+ var ptr6 = dataView(memory0).getUint32(ret + 36, true);
4902
+ var len6 = dataView(memory0).getUint32(ret + 40, true);
4903
+ var result6 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr6, len6));
4904
+ variant7 = result6;
4905
+ break;
4906
+ }
4907
+ default: {
4908
+ throw new TypeError('invalid variant discriminant for option');
4909
+ }
4910
+ }
4911
+ let variant9;
4912
+ switch (dataView(memory0).getUint8(ret + 44, true)) {
4913
+ case 0: {
4914
+ variant9 = undefined;
4915
+ break;
4916
+ }
4917
+ case 1: {
4918
+ var ptr8 = dataView(memory0).getUint32(ret + 48, true);
4919
+ var len8 = dataView(memory0).getUint32(ret + 52, true);
4920
+ var result8 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr8, len8));
4921
+ variant9 = result8;
4922
+ break;
4923
+ }
4924
+ default: {
4925
+ throw new TypeError('invalid variant discriminant for option');
4926
+ }
4927
+ }
4928
+ let variant11;
4929
+ switch (dataView(memory0).getUint8(ret + 56, true)) {
4930
+ case 0: {
4931
+ variant11 = undefined;
4932
+ break;
4933
+ }
4934
+ case 1: {
4935
+ var ptr10 = dataView(memory0).getUint32(ret + 60, true);
4936
+ var len10 = dataView(memory0).getUint32(ret + 64, true);
4937
+ var result10 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr10, len10));
4938
+ variant11 = result10;
4939
+ break;
4940
+ }
4941
+ default: {
4942
+ throw new TypeError('invalid variant discriminant for option');
4943
+ }
4944
+ }
4945
+ var len13 = dataView(memory0).getUint32(ret + 72, true);
4946
+ var base13 = dataView(memory0).getUint32(ret + 68, true);
4947
+ var result13 = [];
4948
+ for (let i = 0; i < len13; i++) {
4949
+ const base = base13 + i * 8;
4950
+ var ptr12 = dataView(memory0).getUint32(base + 0, true);
4951
+ var len12 = dataView(memory0).getUint32(base + 4, true);
4952
+ var result12 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr12, len12));
4953
+ result13.push(result12);
4954
+ }
4955
+ var bool14 = dataView(memory0).getUint8(ret + 76, true);
4956
+ let variant18;
4957
+ switch (dataView(memory0).getUint8(ret + 80, true)) {
4958
+ case 0: {
4959
+ variant18 = undefined;
4960
+ break;
4961
+ }
4962
+ case 1: {
4963
+ var ptr15 = dataView(memory0).getUint32(ret + 84, true);
4964
+ var len15 = dataView(memory0).getUint32(ret + 88, true);
4965
+ var result15 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr15, len15));
4966
+ let variant17;
4967
+ switch (dataView(memory0).getUint8(ret + 92, true)) {
4968
+ case 0: {
4969
+ variant17 = undefined;
4970
+ break;
4971
+ }
4972
+ case 1: {
4973
+ var ptr16 = dataView(memory0).getUint32(ret + 96, true);
4974
+ var len16 = dataView(memory0).getUint32(ret + 100, true);
4975
+ var result16 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr16, len16));
4976
+ variant17 = result16;
4977
+ break;
4978
+ }
4979
+ default: {
4980
+ throw new TypeError('invalid variant discriminant for option');
4981
+ }
4982
+ }
4983
+ variant18 = {
4984
+ url: result15,
4985
+ rev: variant17,
4986
+ };
4987
+ break;
4988
+ }
4989
+ default: {
4990
+ throw new TypeError('invalid variant discriminant for option');
4991
+ }
4992
+ }
4993
+ let variant20;
4994
+ switch (dataView(memory0).getUint8(ret + 104, true)) {
4995
+ case 0: {
4996
+ variant20 = undefined;
4997
+ break;
4998
+ }
4999
+ case 1: {
5000
+ var ptr19 = dataView(memory0).getUint32(ret + 108, true);
5001
+ var len19 = dataView(memory0).getUint32(ret + 112, true);
5002
+ var result19 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr19, len19));
5003
+ variant20 = result19;
5004
+ break;
5005
+ }
5006
+ default: {
5007
+ throw new TypeError('invalid variant discriminant for option');
5008
+ }
5009
+ }
5010
+ variant22= {
5011
+ tag: 'ok',
5012
+ val: {
5013
+ name: variant2,
5014
+ pep508: result3,
5015
+ extras: result5,
5016
+ markers: variant7,
5017
+ versionSpec: variant9,
5018
+ url: variant11,
5019
+ hashes: result13,
5020
+ editable: bool14 == 0 ? false : (bool14 == 1 ? true : throwInvalidBool()),
5021
+ vcs: variant18,
5022
+ givenUrl: variant20,
5023
+ }
5024
+ };
5025
+ break;
5026
+ }
5027
+ case 1: {
5028
+ var ptr21 = dataView(memory0).getUint32(ret + 4, true);
5029
+ var len21 = dataView(memory0).getUint32(ret + 8, true);
5030
+ var result21 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr21, len21));
5031
+ variant22= {
5032
+ tag: 'err',
5033
+ val: result21
5034
+ };
5035
+ break;
5036
+ }
5037
+ default: {
5038
+ throw new TypeError('invalid variant discriminant for expected');
5039
+ }
5040
+ }
5041
+ _debugLog('[iface="parse-pep508", function="parse-pep508"][Instruction::Return]', {
5042
+ funcName: 'parse-pep508',
5043
+ paramCount: 1,
5044
+ async: false,
5045
+ postReturn: true
5046
+ });
5047
+ const retCopy = variant22;
5048
+
5049
+ let cstate = getOrCreateAsyncState(0);
5050
+ cstate.mayLeave = false;
5051
+ postReturn6(ret);
5052
+ cstate.mayLeave = true;
5053
+
5054
+
5055
+
4839
5056
  if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4840
5057
  throw new ComponentError(retCopy.val);
4841
5058
  }
@@ -4913,9 +5130,10 @@ let gen = (function* _initGenerator () {
4913
5130
  exports1ParseDirectUrl = exports1['parse-direct-url'];
4914
5131
  exports1NormalizePackageName = exports1['normalize-package-name'];
4915
5132
  exports1ParseRequirementsTxt = exports1['parse-requirements-txt'];
5133
+ exports1ParsePep508 = exports1['parse-pep508'];
4916
5134
  exports1IsWheelCompatible = exports1['is-wheel-compatible'];
4917
5135
 
4918
- return { containsAppOrHandler, containsTopLevelCallable, getStringConstant, isWheelCompatible, normalizePackageName, parseDirectUrl, parseDistMetadata, parseRecord, parseRequirementsTxt, };
5136
+ return { containsAppOrHandler, containsTopLevelCallable, getStringConstant, isWheelCompatible, normalizePackageName, parseDirectUrl, parseDistMetadata, parsePep508, parseRecord, parseRequirementsTxt, };
4919
5137
  })();
4920
5138
  let promise, resolve, reject;
4921
5139
  function runNext (value) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/python-analysis",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",