Path: blob/main/components/gitpod-protocol/src/gitpod-file-parser.ts
2498 views
/**1* Copyright (c) 2020 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { injectable } from "inversify";7import * as yaml from "js-yaml";8import Ajv from "ajv";9import { log } from "./util/logging";10import { WorkspaceConfig, PortRangeConfig } from "./protocol";1112export type MaybeConfig = WorkspaceConfig | undefined;1314const schema = require("../data/gitpod-schema.json");15const validate = new Ajv().compile(schema as object);16const defaultParseOptions = {17acceptPortRanges: false,18};1920export interface ParseResult {21config: WorkspaceConfig;22parsedConfig?: WorkspaceConfig;23validationErrors?: string[];24}2526@injectable()27export class GitpodFileParser {28public parse(content: string, parseOptions = {}, defaultConfig: WorkspaceConfig = {}): ParseResult {29const options = {30...defaultParseOptions,31...parseOptions,32};33try {34const parsedConfig = yaml.safeLoad(content) as any;35// eslint-disable-next-line @typescript-eslint/no-floating-promises36validate(parsedConfig);37const validationErrors = validate.errors ? validate.errors.map((e) => e.message || e.keyword) : undefined;38if (validationErrors && validationErrors.length > 0) {39return {40config: defaultConfig,41parsedConfig,42validationErrors,43};44}45const overrides = {} as any;46if (!options.acceptPortRanges && Array.isArray(parsedConfig.ports)) {47overrides.ports = parsedConfig.ports.filter((port: any) => !PortRangeConfig.is(port));48}49return {50config: {51...defaultConfig,52...parsedConfig,53...overrides,54},55parsedConfig,56};57} catch (err) {58log.error("Unparsable Gitpod configuration", err, { content });59return {60config: defaultConfig,61validationErrors: ["Unparsable Gitpod configuration: " + err.toString()],62};63}64}65}666768