-
Notifications
You must be signed in to change notification settings - Fork 427
Expand file tree
/
Copy pathnon-interactive.ts
More file actions
107 lines (100 loc) · 3.21 KB
/
non-interactive.ts
File metadata and controls
107 lines (100 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import program from "commander";
/**
* Helper function to collect multiple values for an option into an array
*/
export function collect(value: string, previous: string[]): string[] {
return previous.concat([value]);
}
/**
* Configure the commander program with all needed options
*/
export const configureProgram = () => {
const packageJson = require("../../package.json");
program
.name("gen-schema-views")
.description(packageJson.description)
.version(packageJson.version)
.option(
"--non-interactive",
"Parse all input from command line flags instead of prompting the caller.",
false
)
.option(
"-P, --project <project>",
"Firebase Project ID for project containing Cloud Firestore database."
)
.option(
"-B, --big-query-project <big-query-project>",
"Google Cloud Project ID for BigQuery (can be the same as the Firebase project ID)."
)
.option(
"-d, --dataset <dataset>",
"The ID of the BigQuery dataset containing a raw Cloud Firestore document changelog."
)
.option(
"-t, --table-name-prefix <table-name-prefix>",
"A common prefix for the names of all views generated by this script."
)
.option(
"-D, --database-id <database-id>",
"Firestore database ID (default: '(default)')"
)
.option(
"-f, --schema-files <schema-files>",
"A collection of files from which to read schemas.",
collect,
[]
)
.option(
"-g, --use-gemini <collection-path>",
"Use Gemini to automatically analyze your data and generate a draft schema. You will have a chance to manually view and approve this schema before it is used."
)
.option(
"--schema-directory <directory>",
"Directory to store generated schemas",
"./schemas"
)
.option("--google-ai-key <key>", "Google AI API Key for Gemini")
.option(
"--gemini-schema-file-name <file-name>",
"Name of schema json file generated by Gemini (without .json extension)",
"schema"
);
return program;
};
/**
* Parse command line arguments
*/
export const parseProgram = () => {
const prog = configureProgram();
prog.parse(process.argv);
return prog;
};
/**
* Validate required non-interactive parameters are present
* @returns {boolean} true if all required parameters are present
*/
export const validateNonInteractiveParams = (program: any): boolean => {
return !(
program.project === undefined ||
program.dataset === undefined ||
program.tableNamePrefix === undefined ||
(!program.useGemini && program.schemaFiles.length === 0) ||
program.useGemini === ""
);
};