From 98d48fe2e18e13c500508116ea8544bc37ae7502 Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Sun, 13 Oct 2024 19:15:17 -0400 Subject: [PATCH] fix: Have modules extend Module and we use a union of Module and CustomModule for module-v1 --- fetchModuleSchemas.js | 21 +++--- src-tsp/main.tsp | 169 +++++++++++++++++++++--------------------- 2 files changed, 96 insertions(+), 94 deletions(-) diff --git a/fetchModuleSchemas.js b/fetchModuleSchemas.js index 6f56858..3c72356 100644 --- a/fetchModuleSchemas.js +++ b/fetchModuleSchemas.js @@ -21,15 +21,16 @@ for (const module of modules) { text = text // add `...ModuleDefaults;` after the model type .split("\n") .flatMap(line => { - if (line.trimStart().startsWith(`type: "${module.name}"`)) { - return [ - line, - '', - ' ...ModuleDefaults; // added by fetchModuleSchemas.js', - ] - } else { - return line; - } + return line.replace(/model ([A-Za-z]+) {/, "model $1 extends Module {"); + // if (line.trimStart().startsWith(`type: "${module.name}"`)) { + // return [ + // line, + // '', + // ' ...ModuleDefaults; // added by fetchModuleSchemas.js', + // ] + // } else { + // return line; + // } }) .join('\n') @@ -42,4 +43,4 @@ for (const module of modules) { fs.writeFileSync(`${modulesDir}/index.tsp`, moduleImports.map(m => `import "./${m}";`).join("\n") + ` alias RepoModule = ${moduleModels.map(m => `${m}Module`).join(" | ")};` -) \ No newline at end of file +) diff --git a/src-tsp/main.tsp b/src-tsp/main.tsp index 175b452..39bc254 100644 --- a/src-tsp/main.tsp +++ b/src-tsp/main.tsp @@ -5,123 +5,124 @@ using TypeSpec.JsonSchema; @jsonSchema("recipe-v1.json") model Recipe { - /** - * The image name. Used when publishing to GHCR as `ghcr.io/user/name`. - */ - name: string; + /** + * The image name. Used when publishing to GHCR as `ghcr.io/user/name`. + */ + name: string; - /** - * The image description. Published to GHCR in the image metadata. - */ - description: string; + /** + * The image description. Published to GHCR in the image metadata. + */ + description: string; - /** - * Allows setting custom tags on the recipe’s final image. - * Adding tags to this property will override the `latest` and timestamp tags. - */ - `alt-tags`?: Array; + /** + * Allows setting custom tags on the recipe’s final image. + * Adding tags to this property will override the `latest` and timestamp tags. + */ + `alt-tags`?: Array; - /** - * The [OCI](https://opencontainers.org/) image to base your custom image on. - * Only atomic Fedora images and those based on them are officially supported. - * Universal Blue is recommended. [A list of Universal Blue's images](https://universal-blue.org/images/) can be found on their website - * BlueBuild-built images can be used as well. - */ - `base-image`: string; + /** + * The [OCI](https://opencontainers.org/) image to base your custom image on. + * Only atomic Fedora images and those based on them are officially supported. + * Universal Blue is recommended. [A list of Universal Blue's images](https://universal-blue.org/images/) can be found on their website + * BlueBuild-built images can be used as well. + */ + `base-image`: string; - /** - * The tag of the base image to build on. - * Used to select a version explicitly (`40`) or to always use the latest stable version (`latest`). - * A list of all available tags can be viewed by pasting your `base-image` url into your browser. - */ - `image-version`: string | integer; + /** + * The tag of the base image to build on. + * Used to select a version explicitly (`40`) or to always use the latest stable version (`latest`). + * A list of all available tags can be viewed by pasting your `base-image` url into your browser. + */ + `image-version`: string | integer; - /** - * The tag to pull for the bluebuild cli. This is mostly used for - * trying out specific versions of the cli without compiling it locally. - **/ - `blue-build-tag`?: string; + /** + * The tag to pull for the bluebuild cli. This is mostly used for + * trying out specific versions of the cli without compiling it locally. + **/ + `blue-build-tag`?: string; - /** - * A list of [stages](https://blue-build.org/reference/stages/) that are executed before the build of the final image. - * This is useful for compiling programs from source without polluting the final bootable image. - */ - stages?: Array; + /** + * A list of [stages](https://blue-build.org/reference/stages/) that are executed before the build of the final image. + * This is useful for compiling programs from source without polluting the final bootable image. + */ + stages?: Array; - /** - * A list of [modules](https://blue-build.org/reference/module/) that is executed in order. Multiple of the same module can be included. - * - * Each item in this list should have at least a `type:` or be specified to be included from an external file in the `recipes/` directory with `from-file:`. - */ - modules: Array; + /** + * A list of [modules](https://blue-build.org/reference/module/) that is executed in order. Multiple of the same module can be included. + * + * Each item in this list should have at least a `type:` or be specified to be included from an external file in the `recipes/` directory with `from-file:`. + */ + modules: Array; } @jsonSchema("stage-list-v1.json") model StageList { - stages: Array; + stages: Array; } @jsonSchema("stage-v1.json") -model StageFull { - ...Record; -} +model Stage { + /** + * The name of the stage. This is used when referencing + * the stage when using the from: property in the [`copy` module](https://blue-build.org/reference/modules/copy/). + */ + name: string; -alias Stage = StageDefault | ImportedModule; + /** The full image ref (image name + tag). This will be set in the FROM statement of the stage. */ + from: string; -model StageDefault { - /** - * The name of the stage. This is used when referencing - * the stage when using the from: property in the [`copy` module](https://blue-build.org/reference/modules/copy/). - */ - name: string; + /** Allows a user to pass in an array of strings that are passed directly into the [`SHELL` instruction](https://docs.docker.com/reference/dockerfile/#shell). */ + shell?: string; - /** The full image ref (image name + tag). This will be set in the FROM statement of the stage. */ - from: string; - - /** Allows a user to pass in an array of strings that are passed directly into the [`SHELL` instruction](https://docs.docker.com/reference/dockerfile/#shell). */ - shell?: string; - - /** - * The list of modules to execute. The exact same syntax used by the main recipe `modules:` property. - */ - modules: Array; + /** + * The list of modules to execute. The exact same syntax used by the main recipe `modules:` property. + */ + modules: Array; } @jsonSchema("module-list-v1.json") model ModuleList { - modules: Array; + modules: Array; } @jsonSchema("module-v1.json") -model ModuleFull { - ...Record; +union ModuleType { + normal: Module, + custom: CustomModule, } -alias Module = RepoModule | CustomModule | ImportedModule; +@discriminator("type") +model Module { + /** This is not a built-in module. */ + type: string; -model ModuleDefaults { - /** Whether to disabling caching for this layer. - * https://blue-build.org/reference/module/#no-cache-optional - */ - `no-cache`?: boolean = false; + /** Whether to disabling caching for this layer. + * https://blue-build.org/reference/module/#no-cache-optional + */ + `no-cache`?: boolean = false; } model CustomModule { - /** This is not a built-in module. */ - type: string; + /** This is not a built-in module. */ + type: string; - /** The URL of the module repository (an OCI image) to pull the module from. - * https://blue-build.org/reference/module/#source-optional - */ - source?: string; + /** Whether to disabling caching for this layer. + * https://blue-build.org/reference/module/#no-cache-optional + */ + `no-cache`?: boolean = false; - ...ModuleDefaults; - ...Record; + /** The URL of the module repository (an OCI image) to pull the module from. + * https://blue-build.org/reference/module/#source-optional + */ + source?: string; + + ...Record; } model ImportedModule { - /** The path to another file containing module configuration to import here. - * https://blue-build.org/how-to/multiple-files/ - */ - `from-file`: string; + /** The path to another file containing module configuration to import here. + * https://blue-build.org/how-to/multiple-files/ + */ + `from-file`: string; }