Skip to content
Source
Sign inSign up

useT3ProjectFileScripts.ts

45 lines1.4 KB

1import {
2 T3_PROJECT_FILE_NAME,
3 type EnvironmentId,
4 type T3ProjectFile,
5 type T3ProjectFileScript,
6} from "@t3tools/contracts";
7import { parseT3ProjectFile } from "@t3tools/shared/t3ProjectFile";
8​
9import { useProjectFileQuery } from "~/components/files/projectFilesQueryState";
10​
11const NO_SCRIPTS: ReadonlyArray<T3ProjectFileScript> = [];
12​
13export interface T3ProjectFileState {
14 status: "loading" | "missing" | "invalid" | "valid";
15 file: T3ProjectFile | null;
16 scripts: ReadonlyArray<T3ProjectFileScript>;
18​
19export function useT3ProjectFileState(
20 environmentId: EnvironmentId,
21 cwd: string | null,
22): T3ProjectFileState {
23 const query = useProjectFileQuery(environmentId, cwd ?? "", T3_PROJECT_FILE_NAME, cwd !== null);
24 const contents = query.data && !query.data.truncated ? query.data.contents : null;
25 const isPending = query.isPending;
26 if (contents === null) {
27 return {
28 status: isPending ? "loading" : "missing",
29 file: null,
30 scripts: NO_SCRIPTS,
31 } as const;
32 }
33 const file = parseT3ProjectFile(contents);
34 if (file === null) {
35 return { status: "invalid", file: null, scripts: NO_SCRIPTS } as const;
36 }
37 return { status: "valid", file, scripts: file.scripts ?? NO_SCRIPTS } as const;
39​
40export function useT3ProjectFileScripts(
41 environmentId: EnvironmentId,
42 cwd: string | null,
43): ReadonlyArray<T3ProjectFileScript> {
44 return useT3ProjectFileState(environmentId, cwd).scripts;