@@ -19,11 +19,8 @@ export interface ProjectCandidate extends ProjectSummary {
1919 workspace : AuthWorkspace ;
2020}
2121
22- export interface ResolvedProjectTarget {
23- workspace : AuthWorkspace ;
24- project : ProjectSummary ;
25- resolution : ProjectResolution ;
26- }
22+ export type ResolvedProjectTarget = BoundProjectShowResult ;
23+ type BoundProjectSource = Exclude < ProjectSource , "unbound" > ;
2724
2825export type InferredTargetNameSource = "package-name" | "directory-name" ;
2926
@@ -43,51 +40,10 @@ export interface ResolveProjectOptions {
4340
4441export async function resolveProjectTarget ( options : ResolveProjectOptions ) : Promise < ResolvedProjectTarget > {
4542 const projects = await options . listProjects ( ) ;
43+ const target = await resolveBoundProjectTarget ( options , projects , { allowEnvProjectId : true } ) ;
4644
47- if ( options . explicitProject ) {
48- return resolvedTarget ( options . workspace , resolveExplicitProject ( options . explicitProject , projects , options . workspace ) , "explicit" , {
49- targetName : options . explicitProject ,
50- targetNameSource : "explicit" ,
51- } ) ;
52- }
53-
54- if ( options . envProjectId ) {
55- const project = projects . find ( ( candidate ) => candidate . id === options . envProjectId ) ;
56- if ( ! project ) {
57- throw projectNotFoundError ( options . envProjectId , options . workspace ) ;
58- }
59- return resolvedTarget ( options . workspace , project , "env" , {
60- targetName : options . envProjectId ,
61- targetNameSource : "env" ,
62- } ) ;
63- }
64-
65- const localPin = await readLocalResolutionPin ( options . context . runtime . cwd ) ;
66- if ( localPin . kind === "invalid" ) {
67- throw localStateStaleError ( ) ;
68- }
69- if ( localPin . kind === "present" ) {
70- if ( localPin . pin . workspaceId !== options . workspace . id ) {
71- throw localStateStaleError ( ) ;
72- }
73-
74- const project = projects . find ( ( candidate ) => candidate . id === localPin . pin . projectId ) ;
75- if ( ! project ) {
76- throw localStateStaleError ( ) ;
77- }
78-
79- return resolvedTarget ( options . workspace , project , "local-pin" , {
80- targetName : project . name ,
81- targetNameSource : "local-pin" ,
82- } ) ;
83- }
84-
85- const platformMapping = await resolveDurablePlatformMapping ( ) ;
86- if ( platformMapping && platformMapping . workspace . id === options . workspace . id ) {
87- return resolvedTarget ( options . workspace , platformMapping , "platform-mapping" , {
88- targetName : platformMapping . name ,
89- targetNameSource : "platform-mapping" ,
90- } ) ;
45+ if ( target ) {
46+ return target ;
9147 }
9248
9349 throw await projectSetupRequiredError ( {
@@ -99,40 +55,10 @@ export async function resolveProjectTarget(options: ResolveProjectOptions): Prom
9955
10056export async function inspectProjectBinding ( options : ResolveProjectOptions ) : Promise < ProjectShowResult > {
10157 const projects = await options . listProjects ( ) ;
58+ const target = await resolveBoundProjectTarget ( options , projects , { allowEnvProjectId : false } ) ;
10259
103- if ( options . explicitProject ) {
104- return resolvedTarget ( options . workspace , resolveExplicitProject ( options . explicitProject , projects , options . workspace ) , "explicit" , {
105- targetName : options . explicitProject ,
106- targetNameSource : "explicit" ,
107- } ) ;
108- }
109-
110- const localPin = await readLocalResolutionPin ( options . context . runtime . cwd ) ;
111- if ( localPin . kind === "invalid" ) {
112- throw localStateStaleError ( ) ;
113- }
114- if ( localPin . kind === "present" ) {
115- if ( localPin . pin . workspaceId !== options . workspace . id ) {
116- throw localStateStaleError ( ) ;
117- }
118-
119- const project = projects . find ( ( candidate ) => candidate . id === localPin . pin . projectId ) ;
120- if ( ! project ) {
121- throw localStateStaleError ( ) ;
122- }
123-
124- return resolvedTarget ( options . workspace , project , "local-pin" , {
125- targetName : project . name ,
126- targetNameSource : "local-pin" ,
127- } ) ;
128- }
129-
130- const platformMapping = await resolveDurablePlatformMapping ( ) ;
131- if ( platformMapping && platformMapping . workspace . id === options . workspace . id ) {
132- return resolvedTarget ( options . workspace , platformMapping , "platform-mapping" , {
133- targetName : platformMapping . name ,
134- targetNameSource : "platform-mapping" ,
135- } ) ;
60+ if ( target ) {
61+ return target ;
13662 }
13763
13864 return {
@@ -233,7 +159,7 @@ export async function projectSetupRequiredError(options: {
233159 summary : "Choose a Project before running this command" ,
234160 why : `This directory is not linked to a Prisma Project, and ${ commandLabel } will not choose one from package or directory names.` ,
235161 fix : "Link the directory to an existing Project, or pass --project <id-or-name> for this command." ,
236- meta : suggestion ,
162+ meta : { ... suggestion } ,
237163 exitCode : 1 ,
238164 nextSteps : [ "prisma-cli project list" , ...suggestion . recoveryCommands ] ,
239165 } ) ;
@@ -307,10 +233,66 @@ export async function resolveDurablePlatformMapping(): Promise<ProjectCandidate
307233 return null ;
308234}
309235
236+ async function resolveBoundProjectTarget (
237+ options : ResolveProjectOptions ,
238+ projects : ProjectCandidate [ ] ,
239+ settings : {
240+ allowEnvProjectId : boolean ;
241+ } ,
242+ ) : Promise < BoundProjectShowResult | null > {
243+ if ( options . explicitProject ) {
244+ return resolvedTarget ( options . workspace , resolveExplicitProject ( options . explicitProject , projects , options . workspace ) , "explicit" , {
245+ targetName : options . explicitProject ,
246+ targetNameSource : "explicit" ,
247+ } ) ;
248+ }
249+
250+ if ( settings . allowEnvProjectId && options . envProjectId ) {
251+ const project = projects . find ( ( candidate ) => candidate . id === options . envProjectId ) ;
252+ if ( ! project ) {
253+ throw projectNotFoundError ( options . envProjectId , options . workspace ) ;
254+ }
255+ return resolvedTarget ( options . workspace , project , "env" , {
256+ targetName : options . envProjectId ,
257+ targetNameSource : "env" ,
258+ } ) ;
259+ }
260+
261+ const localPin = await readLocalResolutionPin ( options . context . runtime . cwd ) ;
262+ if ( localPin . kind === "invalid" ) {
263+ throw localStateStaleError ( ) ;
264+ }
265+ if ( localPin . kind === "present" ) {
266+ if ( localPin . pin . workspaceId !== options . workspace . id ) {
267+ throw localStateStaleError ( ) ;
268+ }
269+
270+ const project = projects . find ( ( candidate ) => candidate . id === localPin . pin . projectId ) ;
271+ if ( ! project ) {
272+ throw localStateStaleError ( ) ;
273+ }
274+
275+ return resolvedTarget ( options . workspace , project , "local-pin" , {
276+ targetName : project . name ,
277+ targetNameSource : "local-pin" ,
278+ } ) ;
279+ }
280+
281+ const platformMapping = await resolveDurablePlatformMapping ( ) ;
282+ if ( platformMapping && platformMapping . workspace . id === options . workspace . id ) {
283+ return resolvedTarget ( options . workspace , platformMapping , "platform-mapping" , {
284+ targetName : platformMapping . name ,
285+ targetNameSource : "platform-mapping" ,
286+ } ) ;
287+ }
288+
289+ return null ;
290+ }
291+
310292function resolvedTarget (
311293 workspace : AuthWorkspace ,
312294 project : ProjectCandidate ,
313- projectSource : ProjectSource ,
295+ projectSource : BoundProjectSource ,
314296 resolutionDetails ?: Omit < ProjectResolution , "projectSource" > ,
315297) : BoundProjectShowResult {
316298 return {
0 commit comments