commit 004177195570d55e232e2ae8bf126692fb411805 Author: Hoang Nguyen Date: Sun Dec 10 00:00:00 2023 +0700 Initial commit There is nothing here yet, just boilerplate code -_- diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 0000000..cb79795 --- /dev/null +++ b/.bazelrc @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: CC0-1.0 + +# TODO: remove this once Bazel 7 is released +common --enable_bzlmod + +# Use these by passing `--config=ci` to Bazel's command argument +common:ci --color=no +common:ci --show_timestamps +common:ci --noshow_progress --noshow_loading_progress +build:ci --verbose_failures +build:ci --sandbox_debug +test:ci --test_output=errors + +# Private configuration +try-import %workspace%/.bazelrc.local diff --git a/.bazelversion b/.bazelversion new file mode 100644 index 0000000..5ad5930 --- /dev/null +++ b/.bazelversion @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: CC0-1.0 + +6.4.0 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f8cf1cc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: CC0-1.0 + +root = true + +[*] +tab_width = 2 +indent_size = 2 +indent_style = space +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[{*.go,*.cue,*.sh}] +indent_style = tab + +[*.bazel] +indent_size = 4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ea9488 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: CC0-1.0 + +# Bazel's result symlinks +/bazel-* +/.bazelrc.local + +# Nix's output +/result diff --git a/.golangci.toml b/.golangci.toml new file mode 100644 index 0000000..094c44d --- /dev/null +++ b/.golangci.toml @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: CC0-1.0 + +[linters] + disable-all = true + enable = [ + "bodyclose", + "dogsled", + "dupl", + "errcheck", + "exhaustive", + "exportloopref", + "funlen", + "goconst", + "gofumpt", + "goimports", + "gomnd", + "goprintffuncname", + "gosec", + "gosimple", + "govet", + "ineffassign", + "lll", + "misspell", + "nakedret", + "noctx", + "nolintlint", + "revive", + "staticcheck", + "stylecheck", + "typecheck", + "unconvert", + "unparam", + "unused", + "whitespace", + ] + +[linters-settings] + [linters-settings.errcheck] + check-type-assertions = true + [linters-settings.funlen] + lines = 100 + statements = 50 + [linters-settings.gofumpt] + extra-rules = true + [linters-settings.goimports] + local-prefixes = "gitlab.com/FollieHiyuki/cuelumi" + [linters-settings.govet] + check-shadowing = true + [linters-settings.misspell] + locale = "US" + [linters-settings.nolintlint] + require-explanation = true + +[output] + sort-results = true + +[run] + timeout = "15m" diff --git a/.neoconf.json b/.neoconf.json new file mode 100644 index 0000000..4747405 --- /dev/null +++ b/.neoconf.json @@ -0,0 +1,15 @@ +{ + "lspconfig": { + "gopls": { + "gopls.env": { + "GOPACKAGESDRIVER": "./tools/gopackagesdriver.sh" + }, + "gopls.directoryFilters": [ + "-bazel-bin", + "-bazel-out", + "-bazel-testlogs", + "-bazel-cuelumi" + ] + } + } +} diff --git a/.neoconf.json.license b/.neoconf.json.license new file mode 100644 index 0000000..b157bf8 --- /dev/null +++ b/.neoconf.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2023 Hoang Nguyen + +SPDX-License-Identifier: CC0-1.0 diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000..3c06bca --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +load("@gazelle//:def.bzl", "gazelle") + +# gazelle:prefix gitlab.com/FollieHiyuki/cuelumi +gazelle(name = "gazelle") diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSES/Apache-2.0.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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 + + http://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. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..76a40f5 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +module( + name = "cuelumi", + version = "0.0.0", +) + +# TODO: enable when `rules_nixpkgs_go` is published and stablized (https://github.com/tweag/rules_nixpkgs/issues/181) +# bazel_dep(name = "rules_nixpkgs_core", version = "0.10.0") +# +# nix_repo = use_extension("@rules_nixpkgs_core//extentions:repository.bzl", "nix_repo") +# nix_repo.file( +# name = "nixpkgs", +# file = "//:nixpkgs.nix", +# file_deps = ["//:flake.lock"], +# ) +# use_repo(nix_repo, "nixpkgs") + +# TODO: enable `nogo` linters (doesn't support bzlmod yet) +# Ref: https://github.com/bazelbuild/rules_go/issues/3529 +bazel_dep(name = "rules_go", version = "0.43.0") + +# FIXME: temporarily use the Go SDK from host, until we have rules_nixpkgs_go +go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") +go_sdk.host() + +bazel_dep(name = "gazelle", version = "0.34.0") + +go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") +go_deps.from_file(go_mod = "//:go.mod") +use_repo(go_deps) + +# Expose the generated CUE files as Bazel inputs, so other modules can use them +bazel_dep(name = "rules_cue", version = "0.4.2") + +cue = use_extension("@rules_cue//cue:extensions.bzl", "cue") +cue.download(version = "v0.6.0") diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..6076c2d --- /dev/null +++ b/README.adoc @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2023 Hoang Nguyen +// +// SPDX-License-Identifier: Apache-2.0 + += Cuelumi + +This project generates CUE schemas for Pulumi providers, based on `+schema.json+` files published with their source code. These CUE schema files are intended to be used with https://github.com/pulumi/pulumi-yaml[Pulumi's YAML language provider], when one wants to write resource definitions using CUE instead of YAML. + +See link:./examples[examples/] directory for some use cases. + +== Providers + +Except link:./providers/pulumi[`+pulumi+`] package, which implements base schema for `+Pulumi.yaml+` file, all CUE packages inside link:./providers[providers/] directory are auto-generated. See link:./tools/pulumi-schemas/providers.toml[providers.toml] file for the full list of providers and their JSON schema sources. + +== Reference + +* https://www.pulumi.com/docs/languages-sdks/yaml/yaml-language-reference/[Pulumi's YAML specs] +* https://www.pulumi.com/docs/using-pulumi/pulumi-packages/schema/#pulumi-package-schema[Pulumi's package schema] + +== Credits + +Existing projects, which inspires me to create this one: + +* https://github.com/tweag/tf-ncl[tf-ncl] +* https://github.com/tnarg/cue_terraform[cue_terraform] + +== Roadmap + +Things to implement (yeah, there are a lot \^-\^) + +* [ ] Use https://github.com/tweag/rules_nixpkgs[rules_nixpkgs] +* [ ] Ditch `+go.mod+` file and `+golangci-lint+` (solely rely on `+nogo+` and GOPACKAGEDIRVER) diff --git a/cue.mod/BUILD.bazel b/cue.mod/BUILD.bazel new file mode 100644 index 0000000..c6c60e0 --- /dev/null +++ b/cue.mod/BUILD.bazel @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +load("@rules_cue//cue:cue.bzl", "cue_module") + +cue_module( + name = "cuelumi", + visibility = ["//visibility:public"], +) diff --git a/cue.mod/module.cue b/cue.mod/module.cue new file mode 100644 index 0000000..52d9e4b --- /dev/null +++ b/cue.mod/module.cue @@ -0,0 +1,5 @@ +// SPDX-FileCopyrightText: 2023 Hoang Nguyen +// +// SPDX-License-Identifier: Apache-2.0 + +module: "gitlab.com/FollieHiyuki/cuelumi" diff --git a/examples/time/BUILD.bazel b/examples/time/BUILD.bazel new file mode 100644 index 0000000..7658b9b --- /dev/null +++ b/examples/time/BUILD.bazel @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +load("@rules_cue//cue:cue.bzl", "cue_consolidated_files") + +# This target creates a Pulumi.yaml file suitable for pulumi CLI to use +cue_consolidated_files( + name = "Pulumi", + srcs = [ + "main.cue", + ], + module = "//cue.mod:cuelumi", + output_format = "yaml", + deps = [ + "//providers/pulumi", + ], +) diff --git a/examples/time/main.cue b/examples/time/main.cue new file mode 100644 index 0000000..999f3c7 --- /dev/null +++ b/examples/time/main.cue @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: 2023 Hoang Nguyen +// +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "gitlab.com/FollieHiyuki/cuelumi/providers/pulumi" +) + +name: pulumi.#Name & "cuelumi-examples" + +runtime: pulumi.#Runtime & "yaml" + +description: pulumi.#Description & "Example Pulumi project using CUE" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..40bc2b9 --- /dev/null +++ b/flake.lock @@ -0,0 +1,99 @@ +{ + "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1701718080, + "narHash": "sha256-6ovz0pG76dE0P170pmmZex1wWcQoeiomUZGggfH9XPs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2c7f3c0fb7c08a0814627611d9d7d45ab6d75335", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "treefmt-nix": "treefmt-nix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1701958734, + "narHash": "sha256-3h3EH1FXQkIeAuzaWB+nK0XK54uSD46pp+dMD3gAcB4=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "e8cea581dd2b7c9998c1e6662db2c1dc30e7fdb0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.lock.license b/flake.lock.license new file mode 100644 index 0000000..b157bf8 --- /dev/null +++ b/flake.lock.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2023 Hoang Nguyen + +SPDX-License-Identifier: CC0-1.0 diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..f3aaadf --- /dev/null +++ b/flake.nix @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + + treefmt-nix = { + url = "github:numtide/treefmt-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + flake-compat = { + url = "github:edolstra/flake-compat"; + flake = false; + }; + }; + outputs = { self, nixpkgs, flake-utils, treefmt-nix, ... }: + flake-utils.lib.eachDefaultSystem + (system: + let + inherit (nixpkgs) lib; + pkgs = import nixpkgs { inherit system; }; + + treefmtEval = treefmt-nix.lib.evalModule pkgs ./treefmt.nix; + + apps = { + # Wrap bazel with `nix run .#bazel`, for convenience + inherit (pkgs) bazel; + + # Run `go mod tidy` then update BUILD.bazel files + gazelle = let bazel = "${pkgs.bazel}/bin/bazel"; in + pkgs.writeShellScriptBin "gazelle-update" '' + ${bazel} run @rules_go//go -- mod tidy -v + ${bazel} run //:gazelle + ''; + }; + in + { + apps = lib.mapAttrs + (_: value: + flake-utils.lib.mkApp { drv = value; }) + apps; + + formatter = treefmtEval.config.build.wrapper; + + checks = { + treefmt = treefmtEval.config.build.check self; + license = pkgs.writeShellScriptBin "reuse-lint" '' + ${pkgs.reuse}/bin/reuse lint + ''; + golangci-lint = with pkgs; writeShellApplication { + name = "golangci-lint"; + runtimeInputs = [ go ]; + text = '' + ${golangci-lint}/bin/golangci-lint run + ''; + }; + }; + + devShells.default = with pkgs; mkShellNoCC { + name = "cuelumi-dev-shell"; + inputsFrom = [ treefmtEval.config.build.devShell ]; + packages = [ bazel ]; + }; + } + ); +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..67aafd7 --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +// SPDX-FileCopyrightText: 2023 Hoang Nguyen +// +// SPDX-License-Identifier: CC0-1.0 + +module gitlab.com/FollieHiyuki/cuelumi + +go 1.21.5 diff --git a/nixpkgs.nix b/nixpkgs.nix new file mode 100644 index 0000000..bef02d3 --- /dev/null +++ b/nixpkgs.nix @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +# NOTE: this file is used solely to register into `rules_nixpkgs` +let + lock = builtins.fromJSON (builtins.readFile ./flake.lock); + src = lock.nodes.nixpkgs.locked; + nixpkgs = + assert src.type == "github"; + fetchTarball { + url = "https://github.com/${src.owner}/${src.repo}/archive/${src.rev}.tar.gz"; + sha256 = src.narHash; + }; +in +import nixpkgs diff --git a/providers/pulumi/BUILD.bazel b/providers/pulumi/BUILD.bazel new file mode 100644 index 0000000..aa8bea0 --- /dev/null +++ b/providers/pulumi/BUILD.bazel @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +load("@rules_cue//cue:cue.bzl", "cue_instance") + +cue_instance( + name = "pulumi", + srcs = [ + "main.cue", + ], + ancestor = "//cue.mod:cuelumi", + visibility = ["//visibility:public"], +) diff --git a/providers/pulumi/main.cue b/providers/pulumi/main.cue new file mode 100644 index 0000000..d5d4042 --- /dev/null +++ b/providers/pulumi/main.cue @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 Hoang Nguyen +// +// SPDX-License-Identifier: Apache-2.0 + +// This package implements schema for the base Pulumi.yaml file. +// It extends https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/pulumi.json with support for pulumi-yaml definitions. +// Ref: https://www.pulumi.com/docs/languages-sdks/yaml/yaml-language-reference/ +package pulumi + +#Name: string + +#Runtime: string + +#Description: string diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..912a3bb --- /dev/null +++ b/shell.nix @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +let + lock = builtins.fromJSON (builtins.readFile ./flake.lock); + src = lock.nodes.flake-compat.locked; + + flake-compat = + assert src.type == "github"; + fetchTarball { + url = "https://github.com/${src.owner}/${src.repo}/archive/${src.rev}.tar.gz"; + sha256 = src.narHash; + }; +in +(import flake-compat { src = ./.; }).shellNix diff --git a/tools/cue-pulumi-gen/BUILD.bazel b/tools/cue-pulumi-gen/BUILD.bazel new file mode 100644 index 0000000..04194fd --- /dev/null +++ b/tools/cue-pulumi-gen/BUILD.bazel @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +load("@rules_go//go:def.bzl", "go_binary", "go_library") + +go_library( + name = "cue-pulumi-gen_lib", + srcs = ["main.go"], + importpath = "gitlab.com/FollieHiyuki/cuelumi/tools/cue-pulumi-gen", + visibility = ["//visibility:private"], +) + +go_binary( + name = "cue-pulumi-gen", + embed = [":cue-pulumi-gen_lib"], + visibility = ["//visibility:public"], +) diff --git a/tools/cue-pulumi-gen/main.go b/tools/cue-pulumi-gen/main.go new file mode 100644 index 0000000..a735b6b --- /dev/null +++ b/tools/cue-pulumi-gen/main.go @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 Hoang Nguyen + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package main + +import "fmt" + +func main() { + fmt.Println("Hello") +} diff --git a/tools/gopackagesdriver.sh b/tools/gopackagesdriver.sh new file mode 100755 index 0000000..a203b53 --- /dev/null +++ b/tools/gopackagesdriver.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env nix +#! nix shell nixpkgs#bash nixpkgs#bazel --command bash + +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +exec bazel run -- @rules_go//go/tools/gopackagesdriver "$@" diff --git a/tools/pulumi-schemas/BUILD.bazel b/tools/pulumi-schemas/BUILD.bazel new file mode 100644 index 0000000..bbb6ce6 --- /dev/null +++ b/tools/pulumi-schemas/BUILD.bazel @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +load("@rules_go//go:def.bzl", "go_binary", "go_library") + +go_library( + name = "pulumi-schemas_lib", + srcs = ["main.go"], + importpath = "gitlab.com/FollieHiyuki/cuelumi/tools/pulumi-schemas", + visibility = ["//visibility:private"], +) + +go_binary( + name = "pulumi-schemas", + embed = [":pulumi-schemas_lib"], + visibility = ["//visibility:public"], +) diff --git a/tools/pulumi-schemas/main.go b/tools/pulumi-schemas/main.go new file mode 100644 index 0000000..a735b6b --- /dev/null +++ b/tools/pulumi-schemas/main.go @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 Hoang Nguyen + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package main + +import "fmt" + +func main() { + fmt.Println("Hello") +} diff --git a/tools/pulumi-schemas/providers.toml b/tools/pulumi-schemas/providers.toml new file mode 100644 index 0000000..236d56a --- /dev/null +++ b/tools/pulumi-schemas/providers.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + diff --git a/treefmt.nix b/treefmt.nix new file mode 100644 index 0000000..171c07d --- /dev/null +++ b/treefmt.nix @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: 2023 Hoang Nguyen +# +# SPDX-License-Identifier: Apache-2.0 + +_: { + projectRootFile = "flake.lock"; + + programs = builtins.listToAttrs ( + builtins.map + (x: { + name = x; + value.enable = true; + }) + [ + "buildifier" + # "cue" # https://github.com/cue-lang/cue/issues/2523 + "gofumpt" + "nixpkgs-fmt" + "statix" + ] + ); +}