Cavnas: Implement basic service discovery logic

Change-Id: I71b25076dba94d6491ad4db748b259870991c526
diff --git a/apps/canvas/back/src/lib/semantics.ts b/apps/canvas/back/src/lib/semantics.ts
new file mode 100644
index 0000000..2cbd1ab
--- /dev/null
+++ b/apps/canvas/back/src/lib/semantics.ts
@@ -0,0 +1,64 @@
+import { ConfigVar, ConfigVarSemanticType } from "./analyze";
+
+export function augmentConfigVar(cv: ConfigVar) {
+	if (cv.semanticType != null) {
+		return;
+	}
+	const name = cv.name.toLowerCase();
+	const value = cv.defaultValue ? String(cv.defaultValue).toLowerCase() : "";
+	if (name.includes("postgres") || name.includes("pg")) {
+		if (name.includes("url")) cv.semanticType = ConfigVarSemanticType.POSTGRES_URL;
+		if (name.includes("password") || name.includes("pass"))
+			cv.semanticType = ConfigVarSemanticType.POSTGRES_PASSWORD;
+		if (name.includes("user")) cv.semanticType = ConfigVarSemanticType.POSTGRES_USER;
+		if (
+			name.includes("db_name") ||
+			name.includes("database_name") ||
+			(name.includes("db") && !name.includes("url"))
+		)
+			cv.semanticType = ConfigVarSemanticType.POSTGRES_DB;
+		if (name.includes("port")) cv.semanticType = ConfigVarSemanticType.POSTGRES_PORT;
+		if (name.includes("host")) cv.semanticType = ConfigVarSemanticType.POSTGRES_HOST;
+		if (name.includes("sslmode") || name.includes("ssl")) cv.semanticType = ConfigVarSemanticType.POSTGRES_SSL;
+	}
+	if (name.includes("mongo")) {
+		if (name.includes("url") || name.includes("uri")) cv.semanticType = ConfigVarSemanticType.MONGO_URL;
+		if (name.includes("password") || name.includes("pass")) cv.semanticType = ConfigVarSemanticType.MONGO_PASSWORD;
+		if (name.includes("user")) cv.semanticType = ConfigVarSemanticType.MONGO_USER;
+		if (
+			name.includes("db_name") ||
+			name.includes("database_name") ||
+			(name.includes("db") && !name.includes("url"))
+		)
+			cv.semanticType = ConfigVarSemanticType.MONGO_DB;
+		if (name.includes("port")) cv.semanticType = ConfigVarSemanticType.MONGO_PORT;
+		if (name.includes("host")) cv.semanticType = ConfigVarSemanticType.MONGO_HOST;
+		if (name.includes("ssl")) cv.semanticType = ConfigVarSemanticType.MONGO_SSL;
+	}
+	if (name.includes("sqlite_path") || value.endsWith(".sqlite") || value.endsWith(".db3") || value.endsWith(".db")) {
+		cv.semanticType = ConfigVarSemanticType.SQLITE_PATH;
+	}
+	if (name.includes("sqlite") && (name.includes("url") || name.includes("uri") || name.includes("path"))) {
+		cv.semanticType = ConfigVarSemanticType.SQLITE_PATH;
+	}
+	if (name.includes("database_url") || name.includes("db_url")) {
+		cv.semanticType = ConfigVarSemanticType.DATABASE_URL;
+	}
+	if (name.includes("path") || name.includes("file_path") || name.includes("dir") || name.includes("directory")) {
+		if (
+			!name.includes("url") &&
+			(value.startsWith("./") || value.startsWith("../") || value.startsWith("/") || /^[a-z]:[\\/]/.test(value))
+		) {
+			cv.semanticType = ConfigVarSemanticType.FILESYSTEM_PATH;
+		}
+	}
+	if (
+		!name.includes("url") &&
+		(value.startsWith("./") || value.startsWith("../") || value.startsWith("/") || /^[a-z]:[\\/]/.test(value))
+	) {
+		cv.semanticType = ConfigVarSemanticType.FILESYSTEM_PATH;
+	}
+	if (name.includes("port")) {
+		cv.semanticType = ConfigVarSemanticType.PORT;
+	}
+}