Skip to content

Commit 7e06ca4

Browse files
fix: Fully type location-enabled output (#14)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 4b7b9c4 commit 7e06ca4

File tree

2 files changed

+71
-9
lines changed

2 files changed

+71
-9
lines changed

src/index.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import grammar from './pep-508.ohm-bundle'
22
import { RequirementsSyntaxError, semantics } from './semantics'
3-
import { LooseProjectNameRequirement, Requirement, WithLocation } from './types'
3+
import {
4+
LooseProjectNameRequirement,
5+
Requirement,
6+
LooseProjectNameRequirementWithLocation,
7+
RequirementWithLocation,
8+
} from './types'
49

510
export { RequirementsSyntaxError } from './semantics'
611
export * from './types'
@@ -10,11 +15,11 @@ export function parsePipRequirementsFile(fileContent: string): Requirement[]
1015
export function parsePipRequirementsFile(
1116
fileContent: string,
1217
options: { includeLocations: true }
13-
): WithLocation<Requirement>[]
18+
): RequirementWithLocation[]
1419
export function parsePipRequirementsFile(
1520
fileContent: string,
1621
options?: { includeLocations?: boolean }
17-
): Requirement[] | WithLocation<Requirement>[] {
22+
): Requirement[] | RequirementWithLocation[] {
1823
const matchResult = grammar.match(fileContent, 'File')
1924
if (matchResult.failed()) {
2025
throw new RequirementsSyntaxError(`Failed to parse requirements file. ${matchResult.shortMessage}`)
@@ -31,11 +36,11 @@ export function parsePipRequirementsLine(lineContent: string): Requirement | nul
3136
export function parsePipRequirementsLine(
3237
lineContent: string,
3338
options: { includeLocations: true }
34-
): WithLocation<Requirement> | null
39+
): RequirementWithLocation | null
3540
export function parsePipRequirementsLine(
3641
lineContent: string,
3742
options?: { includeLocations?: boolean }
38-
): Requirement | WithLocation<Requirement> | null {
43+
): Requirement | RequirementWithLocation | null {
3944
const matchResult = grammar.match(lineContent, 'Line')
4045
if (matchResult.failed()) {
4146
throw new RequirementsSyntaxError(`Failed to parse requirements line. ${matchResult.shortMessage}`)
@@ -52,11 +57,11 @@ export function parsePipRequirementsFileLoosely(fileContent: string): LooseProje
5257
export function parsePipRequirementsFileLoosely(
5358
fileContent: string,
5459
options: { includeLocations: true }
55-
): WithLocation<LooseProjectNameRequirement>[]
60+
): LooseProjectNameRequirementWithLocation[]
5661
export function parsePipRequirementsFileLoosely(
5762
fileContent: string,
5863
options?: { includeLocations?: boolean }
59-
): LooseProjectNameRequirement[] | WithLocation<LooseProjectNameRequirement>[] {
64+
): LooseProjectNameRequirement[] | LooseProjectNameRequirementWithLocation[] {
6065
const matchResult = grammar.match(fileContent, 'LooseFile')
6166
if (matchResult.failed()) {
6267
throw new RequirementsSyntaxError(`Failed to loosely parse requirements file. ${matchResult.shortMessage}`)
@@ -73,11 +78,11 @@ export function parsePipRequirementsLineLoosely(lineContent: string): LooseProje
7378
export function parsePipRequirementsLineLoosely(
7479
lineContent: string,
7580
options: { includeLocations: true }
76-
): WithLocation<LooseProjectNameRequirement> | null
81+
): LooseProjectNameRequirementWithLocation | null
7782
export function parsePipRequirementsLineLoosely(
7883
lineContent: string,
7984
options?: { includeLocations?: boolean }
80-
): LooseProjectNameRequirement | WithLocation<LooseProjectNameRequirement> | null {
85+
): LooseProjectNameRequirement | LooseProjectNameRequirementWithLocation | null {
8186
const matchResult = grammar.match(lineContent, 'LooseLine')
8287
if (matchResult.failed()) {
8388
throw new RequirementsSyntaxError(`Failed to loosely parse requirements line. ${matchResult.shortMessage}`)

src/types.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ export interface LooseVersionSpec {
125125
version?: string
126126
}
127127

128+
// Location-enabled types
129+
128130
export interface SourceLocation {
129131
startIdx: number
130132
endIdx: number
@@ -134,3 +136,58 @@ export interface WithLocation<T> {
134136
data: T
135137
location: SourceLocation
136138
}
139+
140+
// WithLocation variants for project requirements
141+
export interface ProjectNameRequirementWithLocation extends ProjectRequirementBaseWithLocation {
142+
type: 'ProjectName'
143+
versionSpec?: WithLocation<VersionSpecWithLocation>[]
144+
}
145+
146+
export interface ProjectURLRequirementWithLocation extends ProjectRequirementBaseWithLocation {
147+
type: 'ProjectURL'
148+
url: WithLocation<string>
149+
}
150+
151+
interface ProjectRequirementBaseWithLocation {
152+
name: WithLocation<string>
153+
extras?: WithLocation<string>[]
154+
environmentMarkerTree?: EnvironmentMarker
155+
}
156+
157+
// WithLocation variants for file requirements
158+
export interface RequirementsFileRequirementWithLocation extends FileRequirementBaseWithLocation {
159+
type: 'RequirementsFile'
160+
}
161+
162+
export interface ConstraintsFileRequirementWithLocation extends FileRequirementBaseWithLocation {
163+
type: 'ConstraintsFile'
164+
}
165+
166+
interface FileRequirementBaseWithLocation {
167+
path: string
168+
}
169+
170+
export interface VersionSpecWithLocation {
171+
operator: WithLocation<VersionOperator>
172+
version: WithLocation<string>
173+
}
174+
175+
export interface LooseProjectNameRequirementData {
176+
type: 'ProjectName'
177+
name: WithLocation<string>
178+
versionSpec?: WithLocation<LooseVersionSpecWithLocation>[]
179+
extras?: WithLocation<string>[]
180+
}
181+
182+
export interface LooseVersionSpecWithLocation {
183+
operator: WithLocation<string>
184+
version?: WithLocation<string>
185+
}
186+
187+
export type RequirementWithLocation =
188+
| WithLocation<ProjectNameRequirementWithLocation>
189+
| WithLocation<ProjectURLRequirementWithLocation>
190+
| WithLocation<RequirementsFileRequirementWithLocation>
191+
| WithLocation<ConstraintsFileRequirementWithLocation>
192+
193+
export type LooseProjectNameRequirementWithLocation = WithLocation<LooseProjectNameRequirementData>

0 commit comments

Comments
 (0)