+25
.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+25
.fluentci/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+25
.fluentci/.fluentci/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/.fluentci/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+28
.fluentci/.fluentci/.fluentci/.github/workflows/ci.yml
+28
.fluentci/.fluentci/.fluentci/.github/workflows/ci.yml
···
···
1
+
name: Codecov
2
+
3
+
# Controls when the action will run. Triggers the workflow on push or pull request
4
+
# events but only for the master branch
5
+
on:
6
+
push:
7
+
branches: [main]
8
+
pull_request:
9
+
branches: [main]
10
+
11
+
jobs:
12
+
test:
13
+
runs-on: ubuntu-latest
14
+
steps:
15
+
- uses: actions/checkout@v2
16
+
- uses: denoland/setup-deno@v1
17
+
with:
18
+
deno-version: v1.34
19
+
- name: Create coverage files
20
+
run: deno test --allow-read --coverage=coverage --lock-write # create coverage files
21
+
- name: Create coverage report
22
+
run: deno coverage ./coverage --lcov > coverage.lcov # create coverage report
23
+
- name: Collect coverage
24
+
uses: codecov/codecov-action@v3 # upload the report on Codecov
25
+
env:
26
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
27
+
with:
28
+
file: ./coverage.lcov
+132
.fluentci/.fluentci/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/.fluentci/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/.fluentci/.fluentci/CONTRIBUTING.md
+70
.fluentci/.fluentci/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/.fluentci/.fluentci/LICENSE
+19
.fluentci/.fluentci/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+88
.fluentci/.fluentci/.fluentci/README.md
+88
.fluentci/.fluentci/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use GitLab CI Pipeline and Jobs for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Quick start:
12
+
13
+
```ts
14
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
15
+
16
+
const { pipeline } = GitLab;
17
+
18
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
19
+
```
20
+
21
+
Or, if you want to use the predefined jobs:
22
+
23
+
```ts
24
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci/mod.ts";
25
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
26
+
27
+
const { fmt, lint, test } = GitLab;
28
+
29
+
const const pipeline = new GitlabCI()
30
+
.image("denoland/deno:alpine")
31
+
.addJob("fmt", fmt)
32
+
.addJob("lint", lint)
33
+
.addJob("test", test);
34
+
35
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
36
+
```
37
+
38
+
It will generate the following `.gitlab-ci.yml` file:
39
+
40
+
```yaml
41
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
42
+
43
+
image: denoland/deno:alpine
44
+
45
+
fmt:
46
+
image: denoland/deno:alpine
47
+
script:
48
+
- deno fmt --check
49
+
50
+
lint:
51
+
image: denoland/deno:alpine
52
+
script:
53
+
- deno lint
54
+
55
+
test:
56
+
image: denoland/deno:alpine
57
+
script:
58
+
- deno test
59
+
```
60
+
61
+
## ๐งช Advanced Usage
62
+
63
+
This package also provides a ready-to-use pipeline for
64
+
[Dagger](https://dagger.io/), just run the following command on your Deno
65
+
project:
66
+
67
+
```sh
68
+
dagger run deno run -A https://deno.land/x/deno_pipeline/ci.ts
69
+
```
70
+
71
+
Or, if you want to use the predefined jobs:
72
+
73
+
```ts
74
+
import Client, { connect } from "@dagger.io/dagger";
75
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
76
+
77
+
const { fmt, lint, test } = Dagger;
78
+
79
+
function pipeline(src = ".") {
80
+
connect(async (client: Client) => {
81
+
await fmt(client, src);
82
+
await lint(client, src);
83
+
await test(client, src);
84
+
});
85
+
}
86
+
87
+
pipeline();
88
+
```
+12
.fluentci/.fluentci/.fluentci/ci.ts
+12
.fluentci/.fluentci/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/.fluentci/.fluentci/deno.json
+9
.fluentci/.fluentci/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+68
.fluentci/.fluentci/.fluentci/deno.lock
+68
.fluentci/.fluentci/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "2",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/codecov_pipeline@v0.1.0/src/dagger/jobs.ts": "e980479e0bcd759773286145f3345ce7e1662c7d6734bfc4bbf8e6bfc93b974e",
9
+
"https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts": "a34aea3753c7079de5877f592ce31f30d05d552155729ff3e695d77326405133",
10
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
11
+
"https://esm.sh/stringify-tree@1.1.1": "8d994a105481fa944515323d89bd2596c1de79f3d9bd1386266463934716eca0",
12
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
13
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
14
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
15
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
16
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
17
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
18
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
19
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
20
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
21
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
22
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
23
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
25
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
26
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
27
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
28
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
29
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
30
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
31
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
32
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
33
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
34
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
35
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
36
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
37
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
38
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
39
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
40
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
41
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
42
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
43
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
44
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
45
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
46
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
47
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
48
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
49
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
50
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
51
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
52
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
53
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
54
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
55
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
56
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
57
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
58
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
59
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
60
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
61
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
62
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
63
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
64
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
65
+
"https://esm.sh/v130/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
66
+
"https://esm.sh/v130/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "40a9d40e0282b5432302a3da68b88aa11685bc0b8a0b70246168deed5c5773fe"
67
+
}
68
+
}
+19
.fluentci/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/.fluentci/.fluentci/flake.lock
+61
.fluentci/.fluentci/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/.fluentci/.fluentci/flake.nix
+26
.fluentci/.fluentci/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+28
.fluentci/.fluentci/.fluentci/import_map.json
+28
.fluentci/.fluentci/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.1.2/mod.ts",
6
+
"url": "node:url",
7
+
"readline": "node:readline",
8
+
"process": "node:process",
9
+
"path": "node:path",
10
+
"os": "node:os",
11
+
"fs": "node:fs",
12
+
"crypto": "node:crypto"
13
+
},
14
+
"scopes": {
15
+
"https://esm.sh/v128/": {
16
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
17
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
18
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
19
+
"execa": "https://esm.sh/v128/execa@7.1.1",
20
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
21
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
22
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
23
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
24
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
25
+
"tar": "https://esm.sh/v128/tar@6.1.15"
26
+
}
27
+
}
28
+
}
+4
.fluentci/.fluentci/.fluentci/mod.ts
+4
.fluentci/.fluentci/.fluentci/mod.ts
+4
.fluentci/.fluentci/.fluentci/src/dagger/index.ts
+4
.fluentci/.fluentci/.fluentci/src/dagger/index.ts
+197
.fluentci/.fluentci/.fluentci/src/dagger/jobs.ts
+197
.fluentci/.fluentci/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { upload } from "https://deno.land/x/codecov_pipeline@v0.1.0/src/dagger/jobs.ts";
3
+
import { withDevbox } from "https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts";
4
+
import { existsSync } from "fs";
5
+
6
+
export enum Job {
7
+
fmt = "fmt",
8
+
lint = "lint",
9
+
test = "test",
10
+
deploy = "deploy",
11
+
codecov = "codecov",
12
+
}
13
+
14
+
const baseCtr = (client: Client, pipeline: string) => {
15
+
if (existsSync("devbox.json")) {
16
+
return withDevbox(
17
+
client
18
+
.pipeline(pipeline)
19
+
.container()
20
+
.from("alpine:latest")
21
+
.withExec(["apk", "update"])
22
+
.withExec(["apk", "add", "bash", "curl"])
23
+
.withMountedCache("/nix", client.cacheVolume("nix"))
24
+
.withMountedCache("/etc/nix", client.cacheVolume("nix-etc"))
25
+
);
26
+
}
27
+
return client.pipeline(pipeline).container().from("denoland/deno:alpine");
28
+
};
29
+
30
+
export const lint = async (client: Client, src = ".") => {
31
+
const context = client.host().directory(src);
32
+
let command = ["deno", "lint"];
33
+
34
+
if (existsSync("devbox.json")) {
35
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
36
+
}
37
+
38
+
const ctr = baseCtr(client, Job.lint)
39
+
.withDirectory("/app", context, {
40
+
exclude: [".git", ".devbox", ".fluentci"],
41
+
})
42
+
.withWorkdir("/app")
43
+
.withExec(command);
44
+
45
+
const result = await ctr.stdout();
46
+
47
+
console.log(result);
48
+
};
49
+
50
+
export const fmt = async (client: Client, src = ".") => {
51
+
const context = client.host().directory(src);
52
+
let command = ["deno", "fmt"];
53
+
54
+
if (existsSync("devbox.json")) {
55
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
56
+
}
57
+
58
+
const ctr = baseCtr(client, Job.fmt)
59
+
.withDirectory("/app", context, {
60
+
exclude: [".git", ".devbox", ".fluentci"],
61
+
})
62
+
.withWorkdir("/app")
63
+
.withExec(command);
64
+
65
+
const result = await ctr.stdout();
66
+
67
+
console.log(result);
68
+
};
69
+
70
+
export const test = async (
71
+
client: Client,
72
+
src = ".",
73
+
options: { ignore: string[] } = { ignore: [] }
74
+
) => {
75
+
const context = client.host().directory(src);
76
+
let command = ["deno", "test", "-A", "--coverage=coverage", "--lock-write"];
77
+
78
+
if (options.ignore.length > 0) {
79
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
80
+
}
81
+
82
+
if (existsSync("devbox.json")) {
83
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
84
+
}
85
+
86
+
const ctr = baseCtr(client, Job.test)
87
+
.from("denoland/deno:alpine")
88
+
.withDirectory("/app", context, {
89
+
exclude: [".git", ".devbox", ".fluentci"],
90
+
})
91
+
.withWorkdir("/app")
92
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
93
+
.withExec(command)
94
+
.withExec(["sh", "-c", "deno coverage ./coverage --lcov > coverage.lcov"]);
95
+
96
+
await ctr.file("/app/coverage.lcov").export("./coverage.lcov");
97
+
98
+
const result = await ctr.stdout();
99
+
100
+
console.log(result);
101
+
};
102
+
103
+
export const deploy = async (client: Client, src = ".") => {
104
+
const context = client.host().directory(src);
105
+
let installDeployCtl = [
106
+
"deno",
107
+
"install",
108
+
"--allow-all",
109
+
"--no-check",
110
+
"-r",
111
+
"-f",
112
+
"https://deno.land/x/deploy/deployctl.ts",
113
+
];
114
+
const project = Deno.env.get("DENO_PROJECT");
115
+
const noStatic = Deno.env.get("NO_STATIC");
116
+
const exclude = Deno.env.get("EXCLUDE");
117
+
118
+
let command = ["deployctl", "deploy"];
119
+
120
+
if (noStatic) {
121
+
command = command.concat(["--no-static"]);
122
+
}
123
+
124
+
if (exclude) {
125
+
command = command.concat([`--exclude=${exclude}`]);
126
+
}
127
+
128
+
if (!Deno.env.get("DENO_DEPLOY_TOKEN")) {
129
+
throw new Error("DENO_DEPLOY_TOKEN environment variable is not set");
130
+
}
131
+
132
+
if (!project) {
133
+
throw new Error("DENO_PROJECT environment variable is not set");
134
+
}
135
+
136
+
const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx";
137
+
command = command.concat([`--project=${project}`, script]);
138
+
139
+
if (existsSync("devbox.json")) {
140
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
141
+
installDeployCtl = [
142
+
"sh",
143
+
"-c",
144
+
`devbox run -- ${installDeployCtl.join(" ")}`,
145
+
];
146
+
}
147
+
148
+
const ctr = baseCtr(client, Job.deploy)
149
+
.from("denoland/deno:alpine")
150
+
.withDirectory("/app", context, {
151
+
exclude: [".git", ".devbox", ".fluentci"],
152
+
})
153
+
.withWorkdir("/app")
154
+
.withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true })
155
+
.withEnvVariable("DENO_DEPLOY_TOKEN", Deno.env.get("DENO_DEPLOY_TOKEN")!)
156
+
.withEnvVariable(
157
+
"DENO_MAIN_SCRIPT",
158
+
Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"
159
+
)
160
+
.withExec(installDeployCtl)
161
+
.withExec(command);
162
+
163
+
const result = await ctr.stdout();
164
+
165
+
console.log(result);
166
+
};
167
+
168
+
export type JobExec = (
169
+
client: Client,
170
+
src?: string
171
+
) =>
172
+
| Promise<void>
173
+
| ((
174
+
client: Client,
175
+
src?: string,
176
+
options?: {
177
+
ignore: string[];
178
+
}
179
+
) => Promise<void>);
180
+
181
+
export const codecov = upload;
182
+
183
+
export const runnableJobs: Record<Job, JobExec> = {
184
+
[Job.fmt]: fmt,
185
+
[Job.lint]: lint,
186
+
[Job.test]: test,
187
+
[Job.deploy]: deploy,
188
+
[Job.codecov]: upload,
189
+
};
190
+
191
+
export const jobDescriptions: Record<Job, string> = {
192
+
[Job.fmt]: "Format your code",
193
+
[Job.lint]: "Lint your code",
194
+
[Job.test]: "Run your tests",
195
+
[Job.deploy]: "Deploy your code to Deno Deploy",
196
+
[Job.codecov]: "Upload your code coverage to Codecov",
197
+
};
+21
.fluentci/.fluentci/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/.fluentci/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/.fluentci/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/.fluentci/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/.fluentci/.fluentci/src/dagger/runner.ts
+3
.fluentci/.fluentci/.fluentci/src/dagger/runner.ts
+52
.fluentci/.fluentci/.fluentci/src/github/config.ts
+52
.fluentci/.fluentci/.fluentci/src/github/config.ts
···
···
1
+
import { JobSpec, Workflow } from "fluent_github_actions";
2
+
3
+
export function generateYaml() {
4
+
const workflow = new Workflow("Codecov");
5
+
6
+
const push = {
7
+
branches: ["main"],
8
+
};
9
+
10
+
const setupDagger = `\
11
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
sudo mv bin/dagger /usr/local/bin
13
+
dagger version`;
14
+
15
+
const tests: JobSpec = {
16
+
"runs-on": "ubuntu-latest",
17
+
steps: [
18
+
{
19
+
uses: "actions/checkout@v2",
20
+
},
21
+
{
22
+
uses: "denoland/setup-deno@v1",
23
+
with: {
24
+
"deno-version": "v1.37",
25
+
},
26
+
},
27
+
{
28
+
name: "Setup Fluent CI CLI",
29
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
},
31
+
{
32
+
name: "Setup Dagger",
33
+
run: setupDagger,
34
+
},
35
+
{
36
+
name: "List Jobs",
37
+
run: "fluentci ls .",
38
+
},
39
+
{
40
+
name: "Run Dagger Pipelines",
41
+
run: "dagger run fluentci . fmt lint test codecov",
42
+
env: {
43
+
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}",
44
+
},
45
+
},
46
+
],
47
+
};
48
+
49
+
workflow.on({ push }).jobs({ tests });
50
+
51
+
workflow.save(".github/workflows/ci.yml");
52
+
}
+3
.fluentci/.fluentci/.fluentci/src/github/init.ts
+3
.fluentci/.fluentci/.fluentci/src/github/init.ts
+4
.fluentci/.fluentci/.fluentci/src/gitlab/index.ts
+4
.fluentci/.fluentci/.fluentci/src/gitlab/index.ts
+9
.fluentci/.fluentci/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/.fluentci/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/.fluentci/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/.fluentci/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+28
.fluentci/.fluentci/.github/workflows/ci.yml
+28
.fluentci/.fluentci/.github/workflows/ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent Github Actions
2
+
3
+
name: Codecov
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
tests:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: List Jobs
24
+
run: fluentci ls .
25
+
- name: Run Dagger Pipelines
26
+
run: dagger run fluentci . fmt lint test codecov
27
+
env:
28
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+132
.fluentci/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/.fluentci/CONTRIBUTING.md
+70
.fluentci/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/.fluentci/LICENSE
+19
.fluentci/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+69
.fluentci/.fluentci/README.md
+69
.fluentci/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use CI/CD Pipeline for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Run the following command:
12
+
13
+
```bash
14
+
dagger run fluentci deno_pipeline
15
+
```
16
+
17
+
Or, if you want to use it as a template:
18
+
19
+
```bash
20
+
fluentci init -t deno
21
+
```
22
+
23
+
This will create a `.fluentci` folder in your project.
24
+
25
+
Now you can run the pipeline with:
26
+
27
+
```bash
28
+
dagger run fluentci .
29
+
```
30
+
31
+
## Environment variables (Deno Deploy)
32
+
33
+
| Variable | Description | Default |
34
+
| ----------------- | ------------------------- | ---------- |
35
+
| DENO_PROJECT | Your project name | |
36
+
| NO_STATIC | Disable static assets | `false` |
37
+
| EXCLUDE | Exclude files from deploy | |
38
+
| DENO_DEPLOY_TOKEN | Your Deno Deploy token | |
39
+
| DENO_MAIN_SCRIPT | Your main script | `main.tsx` |
40
+
41
+
## Jobs
42
+
43
+
| Job | Description | Options |
44
+
| ------ | ------------------------------ | ---------------------- |
45
+
| fmt | Format your code | |
46
+
| lint | Lint your code | |
47
+
| test | Run your tests | `{ ignore: string[] }` |
48
+
| deploy | Deploy your app to Deno Deploy | |
49
+
50
+
## Programmatic usage
51
+
52
+
You can also use this pipeline programmatically:
53
+
54
+
```ts
55
+
import { Client, connect } from "https://esm.sh/@dagger.io/dagger@0.8.1";
56
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
57
+
58
+
const { fmt, lint, test } = Dagger;
59
+
60
+
function pipeline(src = ".") {
61
+
connect(async (client: Client) => {
62
+
await fmt(client, src);
63
+
await lint(client, src);
64
+
await test(client, src);
65
+
});
66
+
}
67
+
68
+
pipeline();
69
+
```
+12
.fluentci/.fluentci/ci.ts
+12
.fluentci/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/.fluentci/deno.json
+9
.fluentci/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+68
.fluentci/.fluentci/deno.lock
+68
.fluentci/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "3",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/codecov_pipeline@v0.1.1/src/dagger/jobs.ts": "ea5ea4fb985f879fdd1c0aed77ac635ba090606c1ecce9d5f5c107493d287984",
9
+
"https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts": "a34aea3753c7079de5877f592ce31f30d05d552155729ff3e695d77326405133",
10
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
11
+
"https://esm.sh/stringify-tree@1.1.1": "a0515b0f4fe97a6972047a588b7982592d9079e7aeac3323b0d26448a757cf84",
12
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
13
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
14
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
15
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
16
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
17
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
18
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
19
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
20
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
21
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
22
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
23
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
25
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
26
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
27
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
28
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
29
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
30
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
31
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
32
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
33
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
34
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
35
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
36
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
37
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
38
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
39
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
40
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
41
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
42
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
43
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
44
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
45
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
46
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
47
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
48
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
49
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
50
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
51
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
52
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
53
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
54
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
55
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
56
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
57
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
58
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
59
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
60
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
61
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
62
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
63
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
64
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
65
+
"https://esm.sh/v132/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
66
+
"https://esm.sh/v132/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "eaa9333a5219638ad170d12e12603ae00ae80fc8bf02cc112cfec7294e6bcb43"
67
+
}
68
+
}
+25
.fluentci/.fluentci/example/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/.fluentci/example/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+25
.fluentci/.fluentci/example/.fluentci/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/.fluentci/example/.fluentci/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+28
.fluentci/.fluentci/example/.fluentci/.fluentci/.github/workflows/ci.yml
+28
.fluentci/.fluentci/example/.fluentci/.fluentci/.github/workflows/ci.yml
···
···
1
+
name: Codecov
2
+
3
+
# Controls when the action will run. Triggers the workflow on push or pull request
4
+
# events but only for the master branch
5
+
on:
6
+
push:
7
+
branches: [main]
8
+
pull_request:
9
+
branches: [main]
10
+
11
+
jobs:
12
+
test:
13
+
runs-on: ubuntu-latest
14
+
steps:
15
+
- uses: actions/checkout@v2
16
+
- uses: denoland/setup-deno@v1
17
+
with:
18
+
deno-version: v1.34
19
+
- name: Create coverage files
20
+
run: deno test --allow-read --coverage=coverage --lock-write # create coverage files
21
+
- name: Create coverage report
22
+
run: deno coverage ./coverage --lcov > coverage.lcov # create coverage report
23
+
- name: Collect coverage
24
+
uses: codecov/codecov-action@v3 # upload the report on Codecov
25
+
env:
26
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
27
+
with:
28
+
file: ./coverage.lcov
+3
.fluentci/.fluentci/example/.fluentci/.fluentci/.vscode/settings.json
+3
.fluentci/.fluentci/example/.fluentci/.fluentci/.vscode/settings.json
+132
.fluentci/.fluentci/example/.fluentci/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/.fluentci/example/.fluentci/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/.fluentci/example/.fluentci/.fluentci/CONTRIBUTING.md
+70
.fluentci/.fluentci/example/.fluentci/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/.fluentci/example/.fluentci/.fluentci/LICENSE
+19
.fluentci/.fluentci/example/.fluentci/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+88
.fluentci/.fluentci/example/.fluentci/.fluentci/README.md
+88
.fluentci/.fluentci/example/.fluentci/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use GitLab CI Pipeline and Jobs for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Quick start:
12
+
13
+
```ts
14
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
15
+
16
+
const { pipeline } = GitLab;
17
+
18
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
19
+
```
20
+
21
+
Or, if you want to use the predefined jobs:
22
+
23
+
```ts
24
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci/mod.ts";
25
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
26
+
27
+
const { fmt, lint, test } = GitLab;
28
+
29
+
const const pipeline = new GitlabCI()
30
+
.image("denoland/deno:alpine")
31
+
.addJob("fmt", fmt)
32
+
.addJob("lint", lint)
33
+
.addJob("test", test);
34
+
35
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
36
+
```
37
+
38
+
It will generate the following `.gitlab-ci.yml` file:
39
+
40
+
```yaml
41
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
42
+
43
+
image: denoland/deno:alpine
44
+
45
+
fmt:
46
+
image: denoland/deno:alpine
47
+
script:
48
+
- deno fmt --check
49
+
50
+
lint:
51
+
image: denoland/deno:alpine
52
+
script:
53
+
- deno lint
54
+
55
+
test:
56
+
image: denoland/deno:alpine
57
+
script:
58
+
- deno test
59
+
```
60
+
61
+
## ๐งช Advanced Usage
62
+
63
+
This package also provides a ready-to-use pipeline for
64
+
[Dagger](https://dagger.io/), just run the following command on your Deno
65
+
project:
66
+
67
+
```sh
68
+
dagger run deno run -A https://deno.land/x/deno_pipeline/ci.ts
69
+
```
70
+
71
+
Or, if you want to use the predefined jobs:
72
+
73
+
```ts
74
+
import Client, { connect } from "@dagger.io/dagger";
75
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
76
+
77
+
const { fmt, lint, test } = Dagger;
78
+
79
+
function pipeline(src = ".") {
80
+
connect(async (client: Client) => {
81
+
await fmt(client, src);
82
+
await lint(client, src);
83
+
await test(client, src);
84
+
});
85
+
}
86
+
87
+
pipeline();
88
+
```
+12
.fluentci/.fluentci/example/.fluentci/.fluentci/ci.ts
+12
.fluentci/.fluentci/example/.fluentci/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/.fluentci/example/.fluentci/.fluentci/deno.json
+9
.fluentci/.fluentci/example/.fluentci/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+66
.fluentci/.fluentci/example/.fluentci/.fluentci/deno.lock
+66
.fluentci/.fluentci/example/.fluentci/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "2",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
9
+
"https://esm.sh/stringify-tree@1.1.1": "8d994a105481fa944515323d89bd2596c1de79f3d9bd1386266463934716eca0",
10
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
11
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
12
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
13
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
14
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
15
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
16
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
17
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
18
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
19
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
20
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
21
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
22
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
23
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
25
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
26
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
27
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
28
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
29
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
30
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
31
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
32
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
33
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
34
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
35
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
36
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
37
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
38
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
39
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
40
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
41
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
42
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
43
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
44
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
45
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
46
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
47
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
48
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
49
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
50
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
51
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
52
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
53
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
54
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
55
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
56
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
57
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
58
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
59
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
60
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
61
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
62
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
63
+
"https://esm.sh/v130/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
64
+
"https://esm.sh/v130/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "40a9d40e0282b5432302a3da68b88aa11685bc0b8a0b70246168deed5c5773fe"
65
+
}
66
+
}
+19
.fluentci/.fluentci/example/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/.fluentci/example/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/.fluentci/example/.fluentci/.fluentci/flake.lock
+61
.fluentci/.fluentci/example/.fluentci/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/.fluentci/example/.fluentci/.fluentci/flake.nix
+26
.fluentci/.fluentci/example/.fluentci/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+27
.fluentci/.fluentci/example/.fluentci/.fluentci/import_map.json
+27
.fluentci/.fluentci/example/.fluentci/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"url": "node:url",
6
+
"readline": "node:readline",
7
+
"process": "node:process",
8
+
"path": "node:path",
9
+
"os": "node:os",
10
+
"fs": "node:fs",
11
+
"crypto": "node:crypto"
12
+
},
13
+
"scopes": {
14
+
"https://esm.sh/v128/": {
15
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
16
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
17
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
18
+
"execa": "https://esm.sh/v128/execa@7.1.1",
19
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
20
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
21
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
22
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
23
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
24
+
"tar": "https://esm.sh/v128/tar@6.1.15"
25
+
}
26
+
}
27
+
}
+4
.fluentci/.fluentci/example/.fluentci/.fluentci/mod.ts
+4
.fluentci/.fluentci/example/.fluentci/.fluentci/mod.ts
+4
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/index.ts
+4
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/index.ts
+111
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/jobs.ts
+111
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { existsSync } from "fs";
3
+
4
+
export enum Job {
5
+
fmt = "fmt",
6
+
lint = "lint",
7
+
test = "test",
8
+
}
9
+
10
+
export const lint = async (client: Client, src = ".") => {
11
+
const context = client.host().directory(src);
12
+
let command = ["deno", "lint"];
13
+
14
+
if (existsSync("devbox.json")) {
15
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
16
+
}
17
+
18
+
const ctr = client
19
+
.pipeline(Job.lint)
20
+
.container()
21
+
.from("denoland/deno:alpine")
22
+
.withDirectory("/app", context, {
23
+
exclude: [".git", ".devbox", ".fluentci"],
24
+
})
25
+
.withWorkdir("/app")
26
+
.withExec(command);
27
+
28
+
const result = await ctr.stdout();
29
+
30
+
console.log(result);
31
+
};
32
+
33
+
export const fmt = async (client: Client, src = ".") => {
34
+
const context = client.host().directory(src);
35
+
let command = ["deno", "fmt"];
36
+
37
+
if (existsSync("devbox.json")) {
38
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
39
+
}
40
+
41
+
const ctr = client
42
+
.pipeline(Job.fmt)
43
+
.container()
44
+
.from("denoland/deno:alpine")
45
+
.withDirectory("/app", context, {
46
+
exclude: [".git", ".devbox", ".fluentci"],
47
+
})
48
+
.withWorkdir("/app")
49
+
.withExec(command);
50
+
51
+
const result = await ctr.stdout();
52
+
53
+
console.log(result);
54
+
};
55
+
56
+
export const test = async (
57
+
client: Client,
58
+
src = ".",
59
+
options: { ignore: string[] } = { ignore: [] }
60
+
) => {
61
+
const context = client.host().directory(src);
62
+
let command = ["deno", "test", "-A", "--lock-write"];
63
+
64
+
if (options.ignore.length > 0) {
65
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
66
+
}
67
+
68
+
if (existsSync("devbox.json")) {
69
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
70
+
}
71
+
72
+
const ctr = client
73
+
.pipeline(Job.test)
74
+
.container()
75
+
.from("denoland/deno:alpine")
76
+
.withDirectory("/app", context, {
77
+
exclude: [".git", ".devbox", ".fluentci"],
78
+
})
79
+
.withWorkdir("/app")
80
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
81
+
.withExec(command);
82
+
83
+
const result = await ctr.stdout();
84
+
85
+
console.log(result);
86
+
};
87
+
88
+
export type JobExec = (
89
+
client: Client,
90
+
src?: string
91
+
) =>
92
+
| Promise<void>
93
+
| ((
94
+
client: Client,
95
+
src?: string,
96
+
options?: {
97
+
ignore: string[];
98
+
}
99
+
) => Promise<void>);
100
+
101
+
export const runnableJobs: Record<Job, JobExec> = {
102
+
[Job.fmt]: fmt,
103
+
[Job.lint]: lint,
104
+
[Job.test]: test,
105
+
};
106
+
107
+
export const jobDescriptions: Record<Job, string> = {
108
+
[Job.fmt]: "Format your code",
109
+
[Job.lint]: "Lint your code",
110
+
[Job.test]: "Run your tests",
111
+
};
+21
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/runner.ts
+3
.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/runner.ts
+4
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/index.ts
+4
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/index.ts
+9
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+28
.fluentci/.fluentci/example/.fluentci/.github/workflows/ci.yml
+28
.fluentci/.fluentci/example/.fluentci/.github/workflows/ci.yml
···
···
1
+
name: Codecov
2
+
3
+
# Controls when the action will run. Triggers the workflow on push or pull request
4
+
# events but only for the master branch
5
+
on:
6
+
push:
7
+
branches: [main]
8
+
pull_request:
9
+
branches: [main]
10
+
11
+
jobs:
12
+
test:
13
+
runs-on: ubuntu-latest
14
+
steps:
15
+
- uses: actions/checkout@v2
16
+
- uses: denoland/setup-deno@v1
17
+
with:
18
+
deno-version: v1.34
19
+
- name: Create coverage files
20
+
run: deno test --allow-read --coverage=coverage --lock-write # create coverage files
21
+
- name: Create coverage report
22
+
run: deno coverage ./coverage --lcov > coverage.lcov # create coverage report
23
+
- name: Collect coverage
24
+
uses: codecov/codecov-action@v3 # upload the report on Codecov
25
+
env:
26
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
27
+
with:
28
+
file: ./coverage.lcov
+3
.fluentci/.fluentci/example/.fluentci/.vscode/settings.json
+3
.fluentci/.fluentci/example/.fluentci/.vscode/settings.json
+132
.fluentci/.fluentci/example/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/.fluentci/example/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/.fluentci/example/.fluentci/CONTRIBUTING.md
+70
.fluentci/.fluentci/example/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/.fluentci/example/.fluentci/LICENSE
+19
.fluentci/.fluentci/example/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+58
.fluentci/.fluentci/example/.fluentci/README.md
+58
.fluentci/.fluentci/example/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use CI/CD Pipeline for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Run the following command:
12
+
13
+
```bash
14
+
dagger run fluentci deno_pipeline
15
+
```
16
+
17
+
Or, if you want to use it as a template:
18
+
19
+
```bash
20
+
fluentci init -t deno
21
+
```
22
+
23
+
This will create a `.fluentci` folder in your project.
24
+
25
+
Now you can run the pipeline with:
26
+
27
+
```bash
28
+
dagger run fluentci .
29
+
```
30
+
31
+
## Jobs
32
+
33
+
| Job | Description | Options |
34
+
| ----- | ---------------- | ---------------------- |
35
+
| fmt | Format your code | |
36
+
| lint | Lint your code | |
37
+
| test | Run your tests | `{ ignore: string[] }` |
38
+
39
+
## Programmatic usage
40
+
41
+
You can also use this pipeline programmatically:
42
+
43
+
```ts
44
+
import Client, { connect } from "@dagger.io/dagger";
45
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
46
+
47
+
const { fmt, lint, test } = Dagger;
48
+
49
+
function pipeline(src = ".") {
50
+
connect(async (client: Client) => {
51
+
await fmt(client, src);
52
+
await lint(client, src);
53
+
await test(client, src);
54
+
});
55
+
}
56
+
57
+
pipeline();
58
+
```
+12
.fluentci/.fluentci/example/.fluentci/ci.ts
+12
.fluentci/.fluentci/example/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/.fluentci/example/.fluentci/deno.json
+9
.fluentci/.fluentci/example/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+67
.fluentci/.fluentci/example/.fluentci/deno.lock
+67
.fluentci/.fluentci/example/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "2",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts": "a34aea3753c7079de5877f592ce31f30d05d552155729ff3e695d77326405133",
9
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
10
+
"https://esm.sh/stringify-tree@1.1.1": "8d994a105481fa944515323d89bd2596c1de79f3d9bd1386266463934716eca0",
11
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
12
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
13
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
14
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
15
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
16
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
17
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
18
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
19
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
20
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
21
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
22
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
23
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
25
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
26
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
27
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
28
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
29
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
30
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
31
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
32
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
33
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
34
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
35
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
36
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
37
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
38
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
39
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
40
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
41
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
42
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
43
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
44
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
45
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
46
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
47
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
48
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
49
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
50
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
51
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
52
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
53
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
54
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
55
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
56
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
57
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
58
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
59
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
60
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
61
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
62
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
63
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
64
+
"https://esm.sh/v130/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
65
+
"https://esm.sh/v130/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "40a9d40e0282b5432302a3da68b88aa11685bc0b8a0b70246168deed5c5773fe"
66
+
}
67
+
}
+19
.fluentci/.fluentci/example/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/.fluentci/example/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/.fluentci/example/.fluentci/flake.lock
+61
.fluentci/.fluentci/example/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/.fluentci/example/.fluentci/flake.nix
+26
.fluentci/.fluentci/example/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+27
.fluentci/.fluentci/example/.fluentci/import_map.json
+27
.fluentci/.fluentci/example/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"url": "node:url",
6
+
"readline": "node:readline",
7
+
"process": "node:process",
8
+
"path": "node:path",
9
+
"os": "node:os",
10
+
"fs": "node:fs",
11
+
"crypto": "node:crypto"
12
+
},
13
+
"scopes": {
14
+
"https://esm.sh/v128/": {
15
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
16
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
17
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
18
+
"execa": "https://esm.sh/v128/execa@7.1.1",
19
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
20
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
21
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
22
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
23
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
24
+
"tar": "https://esm.sh/v128/tar@6.1.15"
25
+
}
26
+
}
27
+
}
+4
.fluentci/.fluentci/example/.fluentci/mod.ts
+4
.fluentci/.fluentci/example/.fluentci/mod.ts
+4
.fluentci/.fluentci/example/.fluentci/src/dagger/index.ts
+4
.fluentci/.fluentci/example/.fluentci/src/dagger/index.ts
+188
.fluentci/.fluentci/example/.fluentci/src/dagger/jobs.ts
+188
.fluentci/.fluentci/example/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { withDevbox } from "https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts";
3
+
import { existsSync } from "fs";
4
+
5
+
export enum Job {
6
+
fmt = "fmt",
7
+
lint = "lint",
8
+
test = "test",
9
+
deploy = "deploy",
10
+
}
11
+
12
+
const baseCtr = (client: Client, pipeline: string) => {
13
+
if (existsSync("devbox.json")) {
14
+
return withDevbox(
15
+
client
16
+
.pipeline(pipeline)
17
+
.container()
18
+
.from("alpine:latest")
19
+
.withExec(["apk", "update"])
20
+
.withExec(["apk", "add", "bash", "curl"])
21
+
.withMountedCache("/nix", client.cacheVolume("nix"))
22
+
.withMountedCache("/etc/nix", client.cacheVolume("nix-etc"))
23
+
);
24
+
}
25
+
return client.pipeline(pipeline).container().from("denoland/deno:alpine");
26
+
};
27
+
28
+
export const lint = async (client: Client, src = ".") => {
29
+
const context = client.host().directory(src);
30
+
let command = ["deno", "lint"];
31
+
32
+
if (existsSync("devbox.json")) {
33
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
34
+
}
35
+
36
+
const ctr = baseCtr(client, Job.lint)
37
+
.withDirectory("/app", context, {
38
+
exclude: [".git", ".devbox", ".fluentci"],
39
+
})
40
+
.withWorkdir("/app")
41
+
.withExec(command);
42
+
43
+
const result = await ctr.stdout();
44
+
45
+
console.log(result);
46
+
};
47
+
48
+
export const fmt = async (client: Client, src = ".") => {
49
+
const context = client.host().directory(src);
50
+
let command = ["deno", "fmt"];
51
+
52
+
if (existsSync("devbox.json")) {
53
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
54
+
}
55
+
56
+
const ctr = baseCtr(client, Job.fmt)
57
+
.withDirectory("/app", context, {
58
+
exclude: [".git", ".devbox", ".fluentci"],
59
+
})
60
+
.withWorkdir("/app")
61
+
.withExec(command);
62
+
63
+
const result = await ctr.stdout();
64
+
65
+
console.log(result);
66
+
};
67
+
68
+
export const test = async (
69
+
client: Client,
70
+
src = ".",
71
+
options: { ignore: string[] } = { ignore: [] }
72
+
) => {
73
+
const context = client.host().directory(src);
74
+
let command = ["deno", "test", "-A", "--lock-write"];
75
+
76
+
if (options.ignore.length > 0) {
77
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
78
+
}
79
+
80
+
if (existsSync("devbox.json")) {
81
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
82
+
}
83
+
84
+
const ctr = baseCtr(client, Job.test)
85
+
.from("denoland/deno:alpine")
86
+
.withDirectory("/app", context, {
87
+
exclude: [".git", ".devbox", ".fluentci"],
88
+
})
89
+
.withWorkdir("/app")
90
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
91
+
.withExec(command);
92
+
93
+
const result = await ctr.stdout();
94
+
95
+
console.log(result);
96
+
};
97
+
98
+
export const deploy = async (client: Client, src = ".") => {
99
+
const context = client.host().directory(src);
100
+
let installDeployCtl = [
101
+
"deno",
102
+
"install",
103
+
"--allow-all",
104
+
"--no-check",
105
+
"-r",
106
+
"-f",
107
+
"https://deno.land/x/deploy/deployctl.ts",
108
+
];
109
+
const project = Deno.env.get("DENO_PROJECT");
110
+
const noStatic = Deno.env.get("NO_STATIC");
111
+
const exclude = Deno.env.get("EXCLUDE");
112
+
113
+
let command = ["deployctl", "deploy"];
114
+
115
+
if (noStatic) {
116
+
command = command.concat(["--no-static"]);
117
+
}
118
+
119
+
if (exclude) {
120
+
command = command.concat([`--exclude=${exclude}`]);
121
+
}
122
+
123
+
if (!Deno.env.get("DENO_DEPLOY_TOKEN")) {
124
+
throw new Error("DENO_DEPLOY_TOKEN environment variable is not set");
125
+
}
126
+
127
+
if (!project) {
128
+
throw new Error("DENO_PROJECT environment variable is not set");
129
+
}
130
+
131
+
const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx";
132
+
command = command.concat([`--project=${project}`, script]);
133
+
134
+
if (existsSync("devbox.json")) {
135
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
136
+
installDeployCtl = [
137
+
"sh",
138
+
"-c",
139
+
`devbox run -- ${installDeployCtl.join(" ")}`,
140
+
];
141
+
}
142
+
143
+
const ctr = baseCtr(client, Job.deploy)
144
+
.from("denoland/deno:alpine")
145
+
.withDirectory("/app", context, {
146
+
exclude: [".git", ".devbox", ".fluentci"],
147
+
})
148
+
.withWorkdir("/app")
149
+
.withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true })
150
+
.withEnvVariable("DENO_DEPLOY_TOKEN", Deno.env.get("DENO_DEPLOY_TOKEN")!)
151
+
.withEnvVariable(
152
+
"DENO_MAIN_SCRIPT",
153
+
Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"
154
+
)
155
+
.withExec(installDeployCtl)
156
+
.withExec(command);
157
+
158
+
const result = await ctr.stdout();
159
+
160
+
console.log(result);
161
+
};
162
+
163
+
export type JobExec = (
164
+
client: Client,
165
+
src?: string
166
+
) =>
167
+
| Promise<void>
168
+
| ((
169
+
client: Client,
170
+
src?: string,
171
+
options?: {
172
+
ignore: string[];
173
+
}
174
+
) => Promise<void>);
175
+
176
+
export const runnableJobs: Record<Job, JobExec> = {
177
+
[Job.fmt]: fmt,
178
+
[Job.lint]: lint,
179
+
[Job.test]: test,
180
+
[Job.deploy]: deploy,
181
+
};
182
+
183
+
export const jobDescriptions: Record<Job, string> = {
184
+
[Job.fmt]: "Format your code",
185
+
[Job.lint]: "Lint your code",
186
+
[Job.test]: "Run your tests",
187
+
[Job.deploy]: "Deploy your code to Deno Deploy",
188
+
};
+21
.fluentci/.fluentci/example/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/.fluentci/example/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/.fluentci/example/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/.fluentci/example/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/.fluentci/example/.fluentci/src/dagger/runner.ts
+3
.fluentci/.fluentci/example/.fluentci/src/dagger/runner.ts
+4
.fluentci/.fluentci/example/.fluentci/src/gitlab/index.ts
+4
.fluentci/.fluentci/example/.fluentci/src/gitlab/index.ts
+9
.fluentci/.fluentci/example/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/.fluentci/example/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+16
.fluentci/.fluentci/example/README.md
+16
.fluentci/.fluentci/example/README.md
···
···
1
+
# Deno Pipeline Example
2
+
3
+
This is an example using the [Deno Pipeline](https://github.com/fluent-ci-templates/deno-pipeline).
4
+
5
+
## ๐ Usage
6
+
7
+
You need to set the following environment variables:
8
+
9
+
- `DENO_DEPLOY_TOKEN`: Your Deno Deploy token.
10
+
- `DENO_PROJECT`: Your project name.
11
+
12
+
Then, run the following command:
13
+
14
+
```bash
15
+
dagger run fluentci . fmt lint deploy
16
+
```
+20
.fluentci/.fluentci/example/main.tsx
+20
.fluentci/.fluentci/example/main.tsx
···
···
1
+
/** @jsx h */
2
+
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";
3
+
import html, { h } from "https://deno.land/x/htm@0.2.1/mod.ts";
4
+
5
+
const handler = (req: Request) =>
6
+
html({
7
+
title: "Hello World!",
8
+
styles: [
9
+
"html, body { margin: 0; height: 100%; }",
10
+
"body { background: #86efac; display: flex; flex-direction: column; align-items: center; justify-content: center; }",
11
+
],
12
+
body: (
13
+
<body>
14
+
<img width="64" src="https://dash.deno.com/assets/logo.svg" />
15
+
<h1>Hello Patricia!</h1>
16
+
</body>
17
+
),
18
+
});
19
+
20
+
serve(handler);
+19
.fluentci/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/.fluentci/flake.lock
+61
.fluentci/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/.fluentci/flake.nix
+26
.fluentci/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+28
.fluentci/.fluentci/import_map.json
+28
.fluentci/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.1.2/mod.ts",
6
+
"url": "node:url",
7
+
"readline": "node:readline",
8
+
"process": "node:process",
9
+
"path": "node:path",
10
+
"os": "node:os",
11
+
"fs": "node:fs",
12
+
"crypto": "node:crypto"
13
+
},
14
+
"scopes": {
15
+
"https://esm.sh/v128/": {
16
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
17
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
18
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
19
+
"execa": "https://esm.sh/v128/execa@7.1.1",
20
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
21
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
22
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
23
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
24
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
25
+
"tar": "https://esm.sh/v128/tar@6.1.15"
26
+
}
27
+
}
28
+
}
+4
.fluentci/.fluentci/mod.ts
+4
.fluentci/.fluentci/mod.ts
+4
.fluentci/.fluentci/src/dagger/index.ts
+4
.fluentci/.fluentci/src/dagger/index.ts
+197
.fluentci/.fluentci/src/dagger/jobs.ts
+197
.fluentci/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { upload } from "https://deno.land/x/codecov_pipeline@v0.1.1/src/dagger/jobs.ts";
3
+
import { withDevbox } from "https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts";
4
+
import { existsSync } from "fs";
5
+
6
+
export enum Job {
7
+
fmt = "fmt",
8
+
lint = "lint",
9
+
test = "test",
10
+
deploy = "deploy",
11
+
codecov = "codecov",
12
+
}
13
+
14
+
const baseCtr = (client: Client, pipeline: string) => {
15
+
if (existsSync("devbox.json")) {
16
+
return withDevbox(
17
+
client
18
+
.pipeline(pipeline)
19
+
.container()
20
+
.from("alpine:latest")
21
+
.withExec(["apk", "update"])
22
+
.withExec(["apk", "add", "bash", "curl"])
23
+
.withMountedCache("/nix", client.cacheVolume("nix"))
24
+
.withMountedCache("/etc/nix", client.cacheVolume("nix-etc"))
25
+
);
26
+
}
27
+
return client.pipeline(pipeline).container().from("denoland/deno:alpine");
28
+
};
29
+
30
+
export const lint = async (client: Client, src = ".") => {
31
+
const context = client.host().directory(src);
32
+
let command = ["deno", "lint"];
33
+
34
+
if (existsSync("devbox.json")) {
35
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
36
+
}
37
+
38
+
const ctr = baseCtr(client, Job.lint)
39
+
.withDirectory("/app", context, {
40
+
exclude: [".git", ".devbox", ".fluentci"],
41
+
})
42
+
.withWorkdir("/app")
43
+
.withExec(command);
44
+
45
+
const result = await ctr.stdout();
46
+
47
+
console.log(result);
48
+
};
49
+
50
+
export const fmt = async (client: Client, src = ".") => {
51
+
const context = client.host().directory(src);
52
+
let command = ["deno", "fmt"];
53
+
54
+
if (existsSync("devbox.json")) {
55
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
56
+
}
57
+
58
+
const ctr = baseCtr(client, Job.fmt)
59
+
.withDirectory("/app", context, {
60
+
exclude: [".git", ".devbox", ".fluentci"],
61
+
})
62
+
.withWorkdir("/app")
63
+
.withExec(command);
64
+
65
+
const result = await ctr.stdout();
66
+
67
+
console.log(result);
68
+
};
69
+
70
+
export const test = async (
71
+
client: Client,
72
+
src = ".",
73
+
options: { ignore: string[] } = { ignore: [] }
74
+
) => {
75
+
const context = client.host().directory(src);
76
+
let command = ["deno", "test", "-A", "--coverage=coverage", "--lock-write"];
77
+
78
+
if (options.ignore.length > 0) {
79
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
80
+
}
81
+
82
+
if (existsSync("devbox.json")) {
83
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
84
+
}
85
+
86
+
const ctr = baseCtr(client, Job.test)
87
+
.from("denoland/deno:alpine")
88
+
.withDirectory("/app", context, {
89
+
exclude: [".git", ".devbox", ".fluentci"],
90
+
})
91
+
.withWorkdir("/app")
92
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
93
+
.withExec(command)
94
+
.withExec(["sh", "-c", "deno coverage ./coverage --lcov > coverage.lcov"]);
95
+
96
+
const result = await ctr.stdout();
97
+
98
+
await ctr.file("/app/coverage.lcov").export("./coverage.lcov");
99
+
100
+
console.log(result);
101
+
};
102
+
103
+
export const deploy = async (client: Client, src = ".") => {
104
+
const context = client.host().directory(src);
105
+
let installDeployCtl = [
106
+
"deno",
107
+
"install",
108
+
"--allow-all",
109
+
"--no-check",
110
+
"-r",
111
+
"-f",
112
+
"https://deno.land/x/deploy/deployctl.ts",
113
+
];
114
+
const project = Deno.env.get("DENO_PROJECT");
115
+
const noStatic = Deno.env.get("NO_STATIC");
116
+
const exclude = Deno.env.get("EXCLUDE");
117
+
118
+
let command = ["deployctl", "deploy"];
119
+
120
+
if (noStatic) {
121
+
command = command.concat(["--no-static"]);
122
+
}
123
+
124
+
if (exclude) {
125
+
command = command.concat([`--exclude=${exclude}`]);
126
+
}
127
+
128
+
if (!Deno.env.get("DENO_DEPLOY_TOKEN")) {
129
+
throw new Error("DENO_DEPLOY_TOKEN environment variable is not set");
130
+
}
131
+
132
+
if (!project) {
133
+
throw new Error("DENO_PROJECT environment variable is not set");
134
+
}
135
+
136
+
const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx";
137
+
command = command.concat([`--project=${project}`, script]);
138
+
139
+
if (existsSync("devbox.json")) {
140
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
141
+
installDeployCtl = [
142
+
"sh",
143
+
"-c",
144
+
`devbox run -- ${installDeployCtl.join(" ")}`,
145
+
];
146
+
}
147
+
148
+
const ctr = baseCtr(client, Job.deploy)
149
+
.from("denoland/deno:alpine")
150
+
.withDirectory("/app", context, {
151
+
exclude: [".git", ".devbox", ".fluentci"],
152
+
})
153
+
.withWorkdir("/app")
154
+
.withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true })
155
+
.withEnvVariable("DENO_DEPLOY_TOKEN", Deno.env.get("DENO_DEPLOY_TOKEN")!)
156
+
.withEnvVariable(
157
+
"DENO_MAIN_SCRIPT",
158
+
Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"
159
+
)
160
+
.withExec(installDeployCtl)
161
+
.withExec(command);
162
+
163
+
const result = await ctr.stdout();
164
+
165
+
console.log(result);
166
+
};
167
+
168
+
export type JobExec = (
169
+
client: Client,
170
+
src?: string
171
+
) =>
172
+
| Promise<void>
173
+
| ((
174
+
client: Client,
175
+
src?: string,
176
+
options?: {
177
+
ignore: string[];
178
+
}
179
+
) => Promise<void>);
180
+
181
+
export const codecov = upload;
182
+
183
+
export const runnableJobs: Record<Job, JobExec> = {
184
+
[Job.fmt]: fmt,
185
+
[Job.lint]: lint,
186
+
[Job.test]: test,
187
+
[Job.deploy]: deploy,
188
+
[Job.codecov]: upload,
189
+
};
190
+
191
+
export const jobDescriptions: Record<Job, string> = {
192
+
[Job.fmt]: "Format your code",
193
+
[Job.lint]: "Lint your code",
194
+
[Job.test]: "Run your tests",
195
+
[Job.deploy]: "Deploy your code to Deno Deploy",
196
+
[Job.codecov]: "Upload your code coverage to Codecov",
197
+
};
+21
.fluentci/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/.fluentci/src/dagger/runner.ts
+3
.fluentci/.fluentci/src/dagger/runner.ts
+52
.fluentci/.fluentci/src/github/config.ts
+52
.fluentci/.fluentci/src/github/config.ts
···
···
1
+
import { JobSpec, Workflow } from "fluent_github_actions";
2
+
3
+
export function generateYaml() {
4
+
const workflow = new Workflow("Codecov");
5
+
6
+
const push = {
7
+
branches: ["main"],
8
+
};
9
+
10
+
const setupDagger = `\
11
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
sudo mv bin/dagger /usr/local/bin
13
+
dagger version`;
14
+
15
+
const tests: JobSpec = {
16
+
"runs-on": "ubuntu-latest",
17
+
steps: [
18
+
{
19
+
uses: "actions/checkout@v2",
20
+
},
21
+
{
22
+
uses: "denoland/setup-deno@v1",
23
+
with: {
24
+
"deno-version": "v1.37",
25
+
},
26
+
},
27
+
{
28
+
name: "Setup Fluent CI CLI",
29
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
},
31
+
{
32
+
name: "Setup Dagger",
33
+
run: setupDagger,
34
+
},
35
+
{
36
+
name: "Run Dagger Pipelines",
37
+
run: "dagger run fluentci . fmt lint test",
38
+
},
39
+
{
40
+
name: "Upload to Codecov",
41
+
run: "dagger run fluentci codecov_pipeline",
42
+
env: {
43
+
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}",
44
+
},
45
+
},
46
+
],
47
+
};
48
+
49
+
workflow.on({ push }).jobs({ tests });
50
+
51
+
workflow.save(".github/workflows/ci.yml");
52
+
}
+3
.fluentci/.fluentci/src/github/init.ts
+3
.fluentci/.fluentci/src/github/init.ts
+4
.fluentci/.fluentci/src/gitlab/index.ts
+4
.fluentci/.fluentci/src/gitlab/index.ts
+9
.fluentci/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+28
.fluentci/.github/workflows/ci.yml
+28
.fluentci/.github/workflows/ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent Github Actions
2
+
3
+
name: Codecov
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
tests:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.8 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Dagger Pipelines
24
+
run: dagger run fluentci . fmt lint test
25
+
- name: Upload to Codecov
26
+
run: dagger run fluentci codecov_pipeline
27
+
env:
28
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+25
.fluentci/.github/workflows/example.yml
+25
.fluentci/.github/workflows/example.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
2
+
3
+
name: Example
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
tests:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.8 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Dagger Pipelines
24
+
run: dagger run deno run -A ../src/dagger/runner.ts
25
+
working-directory: example
+23
.fluentci/.github/workflows/zenith.yml
+23
.fluentci/.github/workflows/zenith.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
2
+
3
+
name: Zenith Example
4
+
on:
5
+
push:
6
+
branches:
7
+
- zenith
8
+
9
+
jobs:
10
+
tests:
11
+
runs-on: ubuntu-latest
12
+
steps:
13
+
- uses: actions/checkout@v2
14
+
- name: Setup Dagger Zenith
15
+
run: |
16
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.8 sh
17
+
sudo mv bin/dagger /usr/local/bin
18
+
dagger version
19
+
- name: Run Dagger Pipelines
20
+
run: |
21
+
dagger query --doc test.gql
22
+
dagger query --doc build.gql
23
+
working-directory: example
+132
.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/rust-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/CONTRIBUTING.md
+70
.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/LICENSE
+19
.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+54
.fluentci/README.md
+54
.fluentci/README.md
···
···
1
+
# Rust Pipeline
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
A ready-to-use CI/CD Pipeline for your Rust projects.
9
+
## ๐ Usage
10
+
11
+
Run the following command in your Rust Project:
12
+
13
+
```bash
14
+
fluentci run rust_pipeline
15
+
```
16
+
17
+
Or if you want to run specific jobs:
18
+
19
+
```bash
20
+
fluentci run rust_pipeline test build
21
+
```
22
+
23
+
24
+
if you want to use it as a template:
25
+
26
+
```bash
27
+
fluentci init -t rust
28
+
```
29
+
30
+
This will create a `.fluentci` folder in your project.
31
+
32
+
Now you can run the pipeline with:
33
+
34
+
```bash
35
+
fluentci run .
36
+
```
37
+
38
+
## Jobs
39
+
40
+
| Job | Description |
41
+
| ----- | ------------------ |
42
+
| build | build your project |
43
+
| test | Run your tests |
44
+
45
+
## Programmatic usage
46
+
47
+
You can also use this pipeline programmatically:
48
+
49
+
```ts
50
+
import { build, test } from "https://pkg.fluentci.io/rust_pipeline@v0.6.1/mod.ts";
51
+
52
+
await test();
53
+
await build();
54
+
```
+7
.fluentci/ci.ts
+7
.fluentci/ci.ts
+5
.fluentci/dagger.json
+5
.fluentci/dagger.json
+31
.fluentci/deno.json
+31
.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"schema": "deno run -A src/dagger/schema.ts",
8
+
"clean": "rm -rf gen schema.graphql"
9
+
},
10
+
"fmt": {
11
+
"exclude": [
12
+
"example/",
13
+
".fluentci/",
14
+
"gen/"
15
+
]
16
+
},
17
+
"lint": {
18
+
"exclude": [
19
+
"example/",
20
+
".fluentci/",
21
+
"gen/"
22
+
]
23
+
},
24
+
"test": {
25
+
"exclude": [
26
+
"example/",
27
+
".fluentci/",
28
+
"gen/"
29
+
]
30
+
}
31
+
}
+256
.fluentci/deno.lock
+256
.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "3",
3
+
"packages": {
4
+
"specifiers": {
5
+
"npm:nexus": "npm:nexus@1.3.0_graphql@16.8.1"
6
+
},
7
+
"npm": {
8
+
"graphql@16.8.1": {
9
+
"integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==",
10
+
"dependencies": {}
11
+
},
12
+
"iterall@1.3.0": {
13
+
"integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==",
14
+
"dependencies": {}
15
+
},
16
+
"nexus@1.3.0_graphql@16.8.1": {
17
+
"integrity": "sha512-w/s19OiNOs0LrtP7pBmD9/FqJHvZLmCipVRt6v1PM8cRUYIbhEswyNKGHVoC4eHZGPSnD+bOf5A3+gnbt0A5/A==",
18
+
"dependencies": {
19
+
"graphql": "graphql@16.8.1",
20
+
"iterall": "iterall@1.3.0",
21
+
"tslib": "tslib@2.6.2"
22
+
}
23
+
},
24
+
"tslib@2.6.2": {
25
+
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
26
+
"dependencies": {}
27
+
}
28
+
}
29
+
},
30
+
"remote": {
31
+
"https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/deps.ts": "096395daebc7ed8a18f0484e4ffcc3a7f70e50946735f7df9611a7fcfd8272cc",
32
+
"https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/mod.ts": "e269d71c72ae68e82c1960e5db2a0c7419c97c9683ef717de0ab75d90f364713",
33
+
"https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/src/tar.ts": "9b02eaaa784b225ad7a23d2769cd492adf113ea7c11c02e3646849e98f4ae43b",
34
+
"https://deno.land/std@0.129.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
35
+
"https://deno.land/std@0.129.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617",
36
+
"https://deno.land/std@0.129.0/archive/tar.ts": "35ea1baddec7988cc4034765a2cee7613bc8074bd40940d3f5e98f63070a716a",
37
+
"https://deno.land/std@0.129.0/async/abortable.ts": "a896ac6b0d4237bd2d2d248217cfa1f0d85ccda93cb25ebda55e33850e526be6",
38
+
"https://deno.land/std@0.129.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0",
39
+
"https://deno.land/std@0.129.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620",
40
+
"https://deno.land/std@0.129.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a",
41
+
"https://deno.land/std@0.129.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c",
42
+
"https://deno.land/std@0.129.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f",
43
+
"https://deno.land/std@0.129.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e",
44
+
"https://deno.land/std@0.129.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082",
45
+
"https://deno.land/std@0.129.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f",
46
+
"https://deno.land/std@0.129.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
47
+
"https://deno.land/std@0.129.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
48
+
"https://deno.land/std@0.129.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9",
49
+
"https://deno.land/std@0.129.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f",
50
+
"https://deno.land/std@0.129.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130",
51
+
"https://deno.land/std@0.129.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
52
+
"https://deno.land/std@0.129.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379",
53
+
"https://deno.land/std@0.129.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f",
54
+
"https://deno.land/std@0.129.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d",
55
+
"https://deno.land/std@0.129.0/fs/ensure_file.ts": "7d353e64fee3d4d1e7c6b6726a2a5e987ba402c15fb49566309042887349c545",
56
+
"https://deno.land/std@0.129.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
57
+
"https://deno.land/std@0.129.0/io/files.ts": "d199ef64e918a256320ba8d8d44ae91de87c9077df8f8d6cca013f1b9fbbe285",
58
+
"https://deno.land/std@0.129.0/io/readers.ts": "679471f3b9929b54393c9cd75b6bd178b4bc6d9aab5c0f1f9538f862cf4746fe",
59
+
"https://deno.land/std@0.129.0/io/util.ts": "078da53bba767bec0d45f7da44411f6dbf269e51ef7fcfea5e3714e04681c674",
60
+
"https://deno.land/std@0.129.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d",
61
+
"https://deno.land/std@0.129.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9",
62
+
"https://deno.land/std@0.129.0/node/_events.mjs": "c0e3e0e290a8b81fee9d2973a529c8dcd5ebb4406782d1f91085274e2cb8490f",
63
+
"https://deno.land/std@0.129.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5",
64
+
"https://deno.land/std@0.129.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1",
65
+
"https://deno.land/std@0.129.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce",
66
+
"https://deno.land/std@0.129.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf",
67
+
"https://deno.land/std@0.129.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615",
68
+
"https://deno.land/std@0.129.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600",
69
+
"https://deno.land/std@0.129.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd",
70
+
"https://deno.land/std@0.129.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7",
71
+
"https://deno.land/std@0.129.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9",
72
+
"https://deno.land/std@0.129.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e",
73
+
"https://deno.land/std@0.129.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f",
74
+
"https://deno.land/std@0.129.0/node/internal/errors.ts": "0d3a1eb03b654beb29b8354759a6902f45a840d4f957e9a3c632a24ce4c32632",
75
+
"https://deno.land/std@0.129.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03",
76
+
"https://deno.land/std@0.129.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a",
77
+
"https://deno.land/std@0.129.0/node/internal/util.mjs": "684653b962fae84fd2bc08997291b1a50bed09b95dcfa7d35e3c4143163e879a",
78
+
"https://deno.land/std@0.129.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e",
79
+
"https://deno.land/std@0.129.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb",
80
+
"https://deno.land/std@0.129.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa",
81
+
"https://deno.land/std@0.129.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60",
82
+
"https://deno.land/std@0.129.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a",
83
+
"https://deno.land/std@0.129.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519",
84
+
"https://deno.land/std@0.129.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b",
85
+
"https://deno.land/std@0.129.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94",
86
+
"https://deno.land/std@0.129.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2",
87
+
"https://deno.land/std@0.129.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9",
88
+
"https://deno.land/std@0.129.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc",
89
+
"https://deno.land/std@0.129.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227",
90
+
"https://deno.land/std@0.129.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7",
91
+
"https://deno.land/std@0.129.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7",
92
+
"https://deno.land/std@0.129.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba",
93
+
"https://deno.land/std@0.129.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630",
94
+
"https://deno.land/std@0.129.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60",
95
+
"https://deno.land/std@0.129.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
96
+
"https://deno.land/std@0.129.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
97
+
"https://deno.land/std@0.129.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
98
+
"https://deno.land/std@0.129.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
99
+
"https://deno.land/std@0.129.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
100
+
"https://deno.land/std@0.129.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7",
101
+
"https://deno.land/std@0.129.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb",
102
+
"https://deno.land/std@0.129.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
103
+
"https://deno.land/std@0.129.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e",
104
+
"https://deno.land/std@0.129.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21",
105
+
"https://deno.land/std@0.129.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392",
106
+
"https://deno.land/std@0.129.0/testing/asserts.ts": "0a95d9e8076dd3e7f0eeb605a67c148078b4b11f4abcd5eef115b0361b0736a2",
107
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
108
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
109
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
110
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
111
+
"https://deno.land/std@0.191.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea",
112
+
"https://deno.land/std@0.191.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7",
113
+
"https://deno.land/std@0.191.0/testing/asserts.ts": "e16d98b4d73ffc4ed498d717307a12500ae4f2cbe668f1a215632d19fcffc22f",
114
+
"https://deno.land/std@0.203.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee",
115
+
"https://deno.land/std@0.203.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56",
116
+
"https://deno.land/std@0.203.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343",
117
+
"https://deno.land/std@0.203.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
118
+
"https://deno.land/std@0.203.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395",
119
+
"https://deno.land/std@0.203.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664",
120
+
"https://deno.land/std@0.203.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4",
121
+
"https://deno.land/std@0.203.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581",
122
+
"https://deno.land/std@0.203.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
123
+
"https://deno.land/std@0.203.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c",
124
+
"https://deno.land/std@0.203.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e",
125
+
"https://deno.land/std@0.203.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81",
126
+
"https://deno.land/std@0.203.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2",
127
+
"https://deno.land/std@0.203.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa",
128
+
"https://deno.land/std@0.203.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5",
129
+
"https://deno.land/std@0.203.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6",
130
+
"https://deno.land/std@0.203.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8",
131
+
"https://deno.land/std@0.203.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8",
132
+
"https://deno.land/std@0.203.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221",
133
+
"https://deno.land/std@0.203.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930",
134
+
"https://deno.land/std@0.203.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
135
+
"https://deno.land/std@0.203.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd",
136
+
"https://deno.land/std@0.203.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf",
137
+
"https://deno.land/std@0.203.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5",
138
+
"https://deno.land/std@0.203.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac",
139
+
"https://deno.land/std@0.203.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed",
140
+
"https://deno.land/std@0.203.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1",
141
+
"https://deno.land/std@0.203.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8",
142
+
"https://deno.land/std@0.203.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532",
143
+
"https://deno.land/std@0.203.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955",
144
+
"https://deno.land/std@0.203.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394",
145
+
"https://deno.land/std@0.203.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b",
146
+
"https://deno.land/std@0.203.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61",
147
+
"https://deno.land/std@0.203.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc",
148
+
"https://deno.land/std@0.203.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f",
149
+
"https://deno.land/std@0.203.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31",
150
+
"https://deno.land/std@0.203.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d",
151
+
"https://deno.land/std@0.203.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd",
152
+
"https://deno.land/std@0.52.0/fmt/colors.ts": "ec9d653672a9a3c7b6eafe53c5bc797364a2db2dcf766ab649c1155fea7a80b2",
153
+
"https://deno.land/x/crc32@v0.2.0/mod.ts": "de7a3fa2d4ef24b96fc21e1cc4d2d65d1d2b1dcea92f63960e3e11bfa82df0fa",
154
+
"https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts": "79cc758901d20a3573d7e3cc2db9f0a5fe56833f4d9befcedc072b94d542eec7",
155
+
"https://deno.land/x/fluent_aws_codepipeline@v0.2.3/src/buildspec.ts": "fb07cbbf9473586cea66c0c508412080c2d4ba4e7f4ea0985661afeed445710b",
156
+
"https://deno.land/x/fluent_aws_codepipeline@v0.2.3/src/spec.ts": "c0ce4c6e2685e23a3abdeb9fc18012253199dae355b06189d8248b052301a63e",
157
+
"https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts": "6f3c62419b96251dd1b5d8d6a172c0a8724a73b7feec786e540f51f0c8a0f0fd",
158
+
"https://deno.land/x/fluent_azure_pipelines@v0.2.0/src/config.ts": "619f4c64dad9b510c5788d4939a8afe013cb7dfc993dfd32f2ff4d0a2140075e",
159
+
"https://deno.land/x/fluent_azure_pipelines@v0.2.0/src/spec.ts": "cab6e4a6afb0f16e6c406cfab87264a963734720c468532c4f778228d1f1758d",
160
+
"https://deno.land/x/fluent_circleci@v0.2.5/mod.ts": "6a885bf35dbe08a7e971aa105763d724dd2a09c237b6292c9cd5de540237af37",
161
+
"https://deno.land/x/fluent_circleci@v0.2.5/src/config.ts": "d7e9902b4c2fddfa61ff6a509f3a09adee161fae9f93029dcbc8ec7a7bbd990b",
162
+
"https://deno.land/x/fluent_circleci@v0.2.5/src/job.ts": "b6ffb66ef10cf0e26460a88e1614ef864b606571e8d72376eeb09254f66a9926",
163
+
"https://deno.land/x/fluent_circleci@v0.2.5/src/spec.ts": "eda462e9ff535dbc7d3eb7e47253948d40ebaaf34d964e0931a6a25cdd823736",
164
+
"https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts": "dc62b622791da77bc27f68e33cba618983a0770a9a12dcc9e0f9a61161bb90e5",
165
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/event.ts": "d44d42356a04aea7ba64ff9e9a12090f477605c27a940bbf80aba612e4e96d1e",
166
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/job_spec.ts": "93aa5b8b79cd8baaf875901322c4c38c27d4458439a831cb0ad86401b207a3dc",
167
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/step_spec.ts": "b399949d1fd9c45873cdda70d82c92e3d9d96ba9a1d5749f3010a1f242b20e35",
168
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/workflow.ts": "c9e3b7b3a59f7edff958eae8f27a8542f2a24889ea27c8aa016d0c0b0ca416c6",
169
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/workflow_spec.ts": "b5c696dc70ee3f777a565197c6a3a379d87d026e12d59942fef5b9dc72124c3a",
170
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts": "3becefe569f5c9814dffa1b534794a42b948481753a5903fa1b48d5337206ced",
171
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/environment.ts": "f12ee4fb50e5100fccec29dc1d35aa430bfe8373e84286a8ab9f7b8e178f14e3",
172
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/gitlabci.ts": "ef36465c41412ae94b919cfcb80b99ec1c04536dbf42ad09cd73abf3ea4d52a6",
173
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/gitlabci_spec.ts": "37f4ecef3ea414f57c54a360bc0178f5fad21b4a9db59d29d1961cd368febaed",
174
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/index.ts": "b5e374a24e3bca1d6fead0861f2c1b1e09e087a17e59297263f681ee71c972fe",
175
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/job.ts": "65a5be7f5816846919907aab00530044b571570a54a8a0bc967f4269a2ce99b7",
176
+
"https://deno.land/x/spinners@v1.1.2/mod.ts": "ed5b3562d4ea6c6887bc7e9844612b08a3bc3a3678ca77cc7dfdf461c362751e",
177
+
"https://deno.land/x/spinners@v1.1.2/spinner-types.ts": "c67e6962a0c738aa57b4d3ad9fe06c8c0131f93360acbf95456f2ba200fd8826",
178
+
"https://deno.land/x/spinners@v1.1.2/terminal-spinner.ts": "1cf0c38a423781734e2e538323c1992027830d741e90f0b81f532e5bc993d035",
179
+
"https://deno.land/x/spinners@v1.1.2/util.ts": "7083203bedbda2e6144a14a7dd093747a7a01e73d95637c888bae8ac22a1c58b",
180
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
181
+
"https://deno.land/x/zod@v3.22.1/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea",
182
+
"https://deno.land/x/zod@v3.22.1/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef",
183
+
"https://deno.land/x/zod@v3.22.1/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe",
184
+
"https://deno.land/x/zod@v3.22.1/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c",
185
+
"https://deno.land/x/zod@v3.22.1/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7",
186
+
"https://deno.land/x/zod@v3.22.1/helpers/parseUtil.ts": "f791e6e65a0340d85ad37d26cd7a3ba67126cd9957eac2b7163162155283abb1",
187
+
"https://deno.land/x/zod@v3.22.1/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7",
188
+
"https://deno.land/x/zod@v3.22.1/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e",
189
+
"https://deno.land/x/zod@v3.22.1/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774",
190
+
"https://deno.land/x/zod@v3.22.1/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268",
191
+
"https://deno.land/x/zod@v3.22.1/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c",
192
+
"https://deno.land/x/zod@v3.22.1/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4",
193
+
"https://deno.land/x/zod@v3.22.1/types.ts": "4edc1823385f446532c8c9f676d84550c6dc54b17135e34508576647d9612d0e",
194
+
"https://esm.sh/@dagger.io/dagger@0.8.8": "615a37f0edf04b25a6efefe7ea8c4cb0f801830b5dbe0a57164919e16a3ef6e6",
195
+
"https://esm.sh/graphql-tag@2.12.6": "6e93f81d26bddf63270317b4fce53a03747ec5322a26e5b78fb0abd098a1f6ea",
196
+
"https://esm.sh/nanoid@4.0.2": "51031602a4d76c7dd62da9439016cdfd6d1121101e489925e4423d88bf8fa0e1",
197
+
"https://esm.sh/stringify-tree@1.1.1": "4d0252ece34f52f7f312a6d270ed2714e57e1610f7a7f71c2fdceceb948e87b2",
198
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
199
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
200
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
201
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
202
+
"https://esm.sh/v128/yaml@2.3.1": "8ef3aee065e93b03cebf8fd5a3418bc30131344b7f2b8c8ae27bf9f277416087",
203
+
"https://esm.sh/v128/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5",
204
+
"https://esm.sh/v131/yaml@2.3.1": "1fe2490feb3d9c6d2c71c64dbdbed90acd4164b00628b3c68a311b6731ca38b5",
205
+
"https://esm.sh/v131/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5",
206
+
"https://esm.sh/v133/@dagger.io/dagger@0.8.8/denonext/dagger.mjs": "c4bd80a72add877450ef029ab71091f862f02af8ebc7c4c7f5bb6aab1854095f",
207
+
"https://esm.sh/v133/adm-zip@0.5.10/denonext/adm-zip.mjs": "9ccca01e6dea77f3c20386125c0eea2a811aa0f9b73243517b747264df8af046",
208
+
"https://esm.sh/v133/chownr@2.0.0/denonext/chownr.mjs": "d7282b2612a9f13c62084c76fc72cdfb20503bccce959178b77b6def14d3ffd2",
209
+
"https://esm.sh/v133/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
210
+
"https://esm.sh/v133/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0a698bfa213c75e5d20176a3f2f65870d31cd26745451d5f56c58e08df138118",
211
+
"https://esm.sh/v133/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
212
+
"https://esm.sh/v133/execa@8.0.1/denonext/execa.mjs": "775e244075c8f23a4caf786116722314a5f2839ee135dba7fde444fc67d5e643",
213
+
"https://esm.sh/v133/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "de8b7228c151f04326a852ce57655d36bf9171f8efcd212e34ac8bce3fbd84a0",
214
+
"https://esm.sh/v133/get-stream@8.0.1/denonext/get-stream.mjs": "b8ab640bf2638c1ae704a217b79e0a56e7a1f97bb48bbe40d723d5ea87eb0ecb",
215
+
"https://esm.sh/v133/graphql-request@6.1.0/denonext/graphql-request.mjs": "7206b27d14333f19f8d2aa3615a81f9e3035f4d33b7a9edff44f990e69fe1964",
216
+
"https://esm.sh/v133/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "af56d5f8b96e688f433ccca87d8a2bfcf171686e7f7a3b27cde61df816ad8472",
217
+
"https://esm.sh/v133/graphql@16.8.1/denonext/graphql.mjs": "585b84022623b931e27a7a8134cd24ec50b33ea12fd18b43254527628a0fddac",
218
+
"https://esm.sh/v133/human-signals@5.0.0/denonext/human-signals.mjs": "8d8663d92280b1ed15bb1b1a0a79601e17f6b165335e85f94c40e56129542077",
219
+
"https://esm.sh/v133/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
220
+
"https://esm.sh/v133/isexe@2.0.0/denonext/isexe.mjs": "4675d9d53a332f096efd344cb1418dbda8e6f2effc8a5c81edd43cdd56636be7",
221
+
"https://esm.sh/v133/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
222
+
"https://esm.sh/v133/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
223
+
"https://esm.sh/v133/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
224
+
"https://esm.sh/v133/minipass@3.3.6/denonext/minipass.mjs": "195894c7a7f1fb71de48b4a41af182cd3ad0e357cadc0ad9d8b5340cda895cc0",
225
+
"https://esm.sh/v133/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
226
+
"https://esm.sh/v133/minizlib@2.1.2/denonext/minizlib.mjs": "714b5458f010d3f70aebd738dd14f2099d3f33046bef05cef2db4714b828620a",
227
+
"https://esm.sh/v133/mkdirp@1.0.4/denonext/mkdirp.mjs": "53abed4328bbe5c844cbc8363ee1b45b4db2bdcdaec770cd1d08e5917af18de3",
228
+
"https://esm.sh/v133/nanoid@4.0.2/denonext/nanoid.mjs": "4f26e89bc0867e6a838069435b3d75af305017d87ce5b51c9d6edc680954b52f",
229
+
"https://esm.sh/v133/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
230
+
"https://esm.sh/v133/node_fetch.js": "b11355358cf61343a3c30bd5942df60a3586d13e2c979b515164bfe851662798",
231
+
"https://esm.sh/v133/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "0b4d70b3aa79c6f5d9b021d5eaceff7029ebc1b0784b00b572ce4869bcd24cb0",
232
+
"https://esm.sh/v133/onetime@6.0.0/denonext/onetime.mjs": "88857d05735668f3e431f95626780c156c7698cfa6bc81175d48ddf4402dffe0",
233
+
"https://esm.sh/v133/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
234
+
"https://esm.sh/v133/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
235
+
"https://esm.sh/v133/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
236
+
"https://esm.sh/v133/shebang-command@2.0.0/denonext/shebang-command.mjs": "23d8e6099e8d3927b5ea0e396d3da92e082dfa32f27d36df9e892a8653b08437",
237
+
"https://esm.sh/v133/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
238
+
"https://esm.sh/v133/signal-exit@4.1.0/denonext/signal-exit.mjs": "c450b9024df3b59ded71e7b52aada1ac4b3856aad93e9d64bbc6ea3cdd181824",
239
+
"https://esm.sh/v133/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "7640f153ff571180467c1087934154aa2a96acba9e17d5782daeb6e1f6b45759",
240
+
"https://esm.sh/v133/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
241
+
"https://esm.sh/v133/tar@6.2.0/denonext/tar.mjs": "e13b28512d8a017442db9665e2c4bf7f134c1b74deb96ba5fd07e5ec6c905617",
242
+
"https://esm.sh/v133/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1",
243
+
"https://esm.sh/v133/which@2.0.2/denonext/which.mjs": "15c7fcc13cfe719c1854f470278518f158f85fa040aeb0f02ef40676c25f26c0",
244
+
"https://esm.sh/v133/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
245
+
"https://esm.sh/v133/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5",
246
+
"https://esm.sh/yaml@v2.3.1": "1eebb55f799726dfa0698314b3ba178bc478cba64b31c8309284899c96f8ff8f",
247
+
"https://nix.fluentci.io/v0.5.2/deps.ts": "6ccc8510c72998a52c24bc02c848b669413b5ef1d15dccd7e03a25dd0e408564",
248
+
"https://nix.fluentci.io/v0.5.2/src/dagger/steps.ts": "b766f4fa9624a032e7af884a5ca47bc666a529c4a472d38b74b55ca0d63cf81d",
249
+
"https://sdk.fluentci.io/v0.2.0/deps.ts": "20dd191afaf88662b82c2a42164afe6d06f2e79942f40ce07aa0972719fc858f",
250
+
"https://sdk.fluentci.io/v0.2.0/mod.ts": "261ba81a4728f5def4e327a5cd80664ea8449515a2f4eea5f3f416acae39a1fa",
251
+
"https://sdk.fluentci.io/v0.2.0/src/client.ts": "d350d4f59763e32a9b35f3f06f0b1058e5c8e5a3824e6d096cdaf3fc4332dcf6",
252
+
"https://sdk.fluentci.io/v0.2.0/src/connect.ts": "4aff111c403cf78672384a10214a9885e08319dde579ec458f98a7bb04874101",
253
+
"https://sdk.fluentci.io/v0.2.0/src/context.ts": "2939ff58d0a79d7377d5553e725c9a2110a0013035a5a57abe9a9a5da975c4ce",
254
+
"https://sdk.fluentci.io/v0.2.0/src/utils.ts": "5dcd6d83553930502069d067ff42bc44698e22c23426fdb78630c4b39769d308"
255
+
}
256
+
}
+35
.fluentci/deps.ts
+35
.fluentci/deps.ts
···
···
1
+
export { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import Client from "https://sdk.fluentci.io/v0.2.0/mod.ts";
3
+
export default Client;
4
+
5
+
export {
6
+
connect,
7
+
uploadContext,
8
+
CacheSharingMode,
9
+
Container,
10
+
} from "https://sdk.fluentci.io/v0.2.0/mod.ts";
11
+
export { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
12
+
export { withDevbox } from "https://nix.fluentci.io/v0.5.2/src/dagger/steps.ts";
13
+
export { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
14
+
import gql from "https://esm.sh/graphql-tag@2.12.6";
15
+
export { gql };
16
+
17
+
export {
18
+
arg,
19
+
queryType,
20
+
stringArg,
21
+
intArg,
22
+
nonNull,
23
+
makeSchema,
24
+
} from "npm:nexus";
25
+
export {
26
+
dirname,
27
+
join,
28
+
resolve,
29
+
} from "https://deno.land/std@0.203.0/path/mod.ts";
30
+
31
+
export * as FluentGitlabCI from "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts";
32
+
export * as FluentGithubActions from "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts";
33
+
export * as FluentCircleCI from "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts";
34
+
export * as FluentAzurePipelines from "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts";
35
+
export * as FluentAWSCodePipeline from "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts";
+25
.fluentci/example/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/example/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+25
.fluentci/example/.fluentci/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/example/.fluentci/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+25
.fluentci/example/.fluentci/.fluentci/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/example/.fluentci/.fluentci/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+28
.fluentci/example/.fluentci/.fluentci/.fluentci/.github/workflows/ci.yml
+28
.fluentci/example/.fluentci/.fluentci/.fluentci/.github/workflows/ci.yml
···
···
1
+
name: Codecov
2
+
3
+
# Controls when the action will run. Triggers the workflow on push or pull request
4
+
# events but only for the master branch
5
+
on:
6
+
push:
7
+
branches: [main]
8
+
pull_request:
9
+
branches: [main]
10
+
11
+
jobs:
12
+
test:
13
+
runs-on: ubuntu-latest
14
+
steps:
15
+
- uses: actions/checkout@v2
16
+
- uses: denoland/setup-deno@v1
17
+
with:
18
+
deno-version: v1.34
19
+
- name: Create coverage files
20
+
run: deno test --allow-read --coverage=coverage --lock-write # create coverage files
21
+
- name: Create coverage report
22
+
run: deno coverage ./coverage --lcov > coverage.lcov # create coverage report
23
+
- name: Collect coverage
24
+
uses: codecov/codecov-action@v3 # upload the report on Codecov
25
+
env:
26
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
27
+
with:
28
+
file: ./coverage.lcov
+3
.fluentci/example/.fluentci/.fluentci/.fluentci/.vscode/settings.json
+3
.fluentci/example/.fluentci/.fluentci/.fluentci/.vscode/settings.json
+132
.fluentci/example/.fluentci/.fluentci/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/example/.fluentci/.fluentci/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/example/.fluentci/.fluentci/.fluentci/CONTRIBUTING.md
+70
.fluentci/example/.fluentci/.fluentci/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/example/.fluentci/.fluentci/.fluentci/LICENSE
+19
.fluentci/example/.fluentci/.fluentci/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+88
.fluentci/example/.fluentci/.fluentci/.fluentci/README.md
+88
.fluentci/example/.fluentci/.fluentci/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use GitLab CI Pipeline and Jobs for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Quick start:
12
+
13
+
```ts
14
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
15
+
16
+
const { pipeline } = GitLab;
17
+
18
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
19
+
```
20
+
21
+
Or, if you want to use the predefined jobs:
22
+
23
+
```ts
24
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci/mod.ts";
25
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
26
+
27
+
const { fmt, lint, test } = GitLab;
28
+
29
+
const const pipeline = new GitlabCI()
30
+
.image("denoland/deno:alpine")
31
+
.addJob("fmt", fmt)
32
+
.addJob("lint", lint)
33
+
.addJob("test", test);
34
+
35
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
36
+
```
37
+
38
+
It will generate the following `.gitlab-ci.yml` file:
39
+
40
+
```yaml
41
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
42
+
43
+
image: denoland/deno:alpine
44
+
45
+
fmt:
46
+
image: denoland/deno:alpine
47
+
script:
48
+
- deno fmt --check
49
+
50
+
lint:
51
+
image: denoland/deno:alpine
52
+
script:
53
+
- deno lint
54
+
55
+
test:
56
+
image: denoland/deno:alpine
57
+
script:
58
+
- deno test
59
+
```
60
+
61
+
## ๐งช Advanced Usage
62
+
63
+
This package also provides a ready-to-use pipeline for
64
+
[Dagger](https://dagger.io/), just run the following command on your Deno
65
+
project:
66
+
67
+
```sh
68
+
dagger run deno run -A https://deno.land/x/deno_pipeline/ci.ts
69
+
```
70
+
71
+
Or, if you want to use the predefined jobs:
72
+
73
+
```ts
74
+
import Client, { connect } from "@dagger.io/dagger";
75
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
76
+
77
+
const { fmt, lint, test } = Dagger;
78
+
79
+
function pipeline(src = ".") {
80
+
connect(async (client: Client) => {
81
+
await fmt(client, src);
82
+
await lint(client, src);
83
+
await test(client, src);
84
+
});
85
+
}
86
+
87
+
pipeline();
88
+
```
+12
.fluentci/example/.fluentci/.fluentci/.fluentci/ci.ts
+12
.fluentci/example/.fluentci/.fluentci/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/example/.fluentci/.fluentci/.fluentci/deno.json
+9
.fluentci/example/.fluentci/.fluentci/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+68
.fluentci/example/.fluentci/.fluentci/.fluentci/deno.lock
+68
.fluentci/example/.fluentci/.fluentci/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "2",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/codecov_pipeline@v0.1.0/src/dagger/jobs.ts": "e980479e0bcd759773286145f3345ce7e1662c7d6734bfc4bbf8e6bfc93b974e",
9
+
"https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts": "a34aea3753c7079de5877f592ce31f30d05d552155729ff3e695d77326405133",
10
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
11
+
"https://esm.sh/stringify-tree@1.1.1": "8d994a105481fa944515323d89bd2596c1de79f3d9bd1386266463934716eca0",
12
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
13
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
14
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
15
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
16
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
17
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
18
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
19
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
20
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
21
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
22
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
23
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
25
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
26
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
27
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
28
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
29
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
30
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
31
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
32
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
33
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
34
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
35
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
36
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
37
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
38
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
39
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
40
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
41
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
42
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
43
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
44
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
45
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
46
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
47
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
48
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
49
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
50
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
51
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
52
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
53
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
54
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
55
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
56
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
57
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
58
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
59
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
60
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
61
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
62
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
63
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
64
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
65
+
"https://esm.sh/v130/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
66
+
"https://esm.sh/v130/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "40a9d40e0282b5432302a3da68b88aa11685bc0b8a0b70246168deed5c5773fe"
67
+
}
68
+
}
+19
.fluentci/example/.fluentci/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/example/.fluentci/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/example/.fluentci/.fluentci/.fluentci/flake.lock
+61
.fluentci/example/.fluentci/.fluentci/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/example/.fluentci/.fluentci/.fluentci/flake.nix
+26
.fluentci/example/.fluentci/.fluentci/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+28
.fluentci/example/.fluentci/.fluentci/.fluentci/import_map.json
+28
.fluentci/example/.fluentci/.fluentci/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.1.2/mod.ts",
6
+
"url": "node:url",
7
+
"readline": "node:readline",
8
+
"process": "node:process",
9
+
"path": "node:path",
10
+
"os": "node:os",
11
+
"fs": "node:fs",
12
+
"crypto": "node:crypto"
13
+
},
14
+
"scopes": {
15
+
"https://esm.sh/v128/": {
16
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
17
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
18
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
19
+
"execa": "https://esm.sh/v128/execa@7.1.1",
20
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
21
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
22
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
23
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
24
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
25
+
"tar": "https://esm.sh/v128/tar@6.1.15"
26
+
}
27
+
}
28
+
}
+4
.fluentci/example/.fluentci/.fluentci/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/index.ts
+4
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/index.ts
+197
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/jobs.ts
+197
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { upload } from "https://deno.land/x/codecov_pipeline@v0.1.0/src/dagger/jobs.ts";
3
+
import { withDevbox } from "https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts";
4
+
import { existsSync } from "fs";
5
+
6
+
export enum Job {
7
+
fmt = "fmt",
8
+
lint = "lint",
9
+
test = "test",
10
+
deploy = "deploy",
11
+
codecov = "codecov",
12
+
}
13
+
14
+
const baseCtr = (client: Client, pipeline: string) => {
15
+
if (existsSync("devbox.json")) {
16
+
return withDevbox(
17
+
client
18
+
.pipeline(pipeline)
19
+
.container()
20
+
.from("alpine:latest")
21
+
.withExec(["apk", "update"])
22
+
.withExec(["apk", "add", "bash", "curl"])
23
+
.withMountedCache("/nix", client.cacheVolume("nix"))
24
+
.withMountedCache("/etc/nix", client.cacheVolume("nix-etc"))
25
+
);
26
+
}
27
+
return client.pipeline(pipeline).container().from("denoland/deno:alpine");
28
+
};
29
+
30
+
export const lint = async (client: Client, src = ".") => {
31
+
const context = client.host().directory(src);
32
+
let command = ["deno", "lint"];
33
+
34
+
if (existsSync("devbox.json")) {
35
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
36
+
}
37
+
38
+
const ctr = baseCtr(client, Job.lint)
39
+
.withDirectory("/app", context, {
40
+
exclude: [".git", ".devbox", ".fluentci"],
41
+
})
42
+
.withWorkdir("/app")
43
+
.withExec(command);
44
+
45
+
const result = await ctr.stdout();
46
+
47
+
console.log(result);
48
+
};
49
+
50
+
export const fmt = async (client: Client, src = ".") => {
51
+
const context = client.host().directory(src);
52
+
let command = ["deno", "fmt"];
53
+
54
+
if (existsSync("devbox.json")) {
55
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
56
+
}
57
+
58
+
const ctr = baseCtr(client, Job.fmt)
59
+
.withDirectory("/app", context, {
60
+
exclude: [".git", ".devbox", ".fluentci"],
61
+
})
62
+
.withWorkdir("/app")
63
+
.withExec(command);
64
+
65
+
const result = await ctr.stdout();
66
+
67
+
console.log(result);
68
+
};
69
+
70
+
export const test = async (
71
+
client: Client,
72
+
src = ".",
73
+
options: { ignore: string[] } = { ignore: [] }
74
+
) => {
75
+
const context = client.host().directory(src);
76
+
let command = ["deno", "test", "-A", "--coverage=coverage", "--lock-write"];
77
+
78
+
if (options.ignore.length > 0) {
79
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
80
+
}
81
+
82
+
if (existsSync("devbox.json")) {
83
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
84
+
}
85
+
86
+
const ctr = baseCtr(client, Job.test)
87
+
.from("denoland/deno:alpine")
88
+
.withDirectory("/app", context, {
89
+
exclude: [".git", ".devbox", ".fluentci"],
90
+
})
91
+
.withWorkdir("/app")
92
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
93
+
.withExec(command)
94
+
.withExec(["sh", "-c", "deno coverage ./coverage --lcov > coverage.lcov"]);
95
+
96
+
await ctr.file("/app/coverage.lcov").export("./coverage.lcov");
97
+
98
+
const result = await ctr.stdout();
99
+
100
+
console.log(result);
101
+
};
102
+
103
+
export const deploy = async (client: Client, src = ".") => {
104
+
const context = client.host().directory(src);
105
+
let installDeployCtl = [
106
+
"deno",
107
+
"install",
108
+
"--allow-all",
109
+
"--no-check",
110
+
"-r",
111
+
"-f",
112
+
"https://deno.land/x/deploy/deployctl.ts",
113
+
];
114
+
const project = Deno.env.get("DENO_PROJECT");
115
+
const noStatic = Deno.env.get("NO_STATIC");
116
+
const exclude = Deno.env.get("EXCLUDE");
117
+
118
+
let command = ["deployctl", "deploy"];
119
+
120
+
if (noStatic) {
121
+
command = command.concat(["--no-static"]);
122
+
}
123
+
124
+
if (exclude) {
125
+
command = command.concat([`--exclude=${exclude}`]);
126
+
}
127
+
128
+
if (!Deno.env.get("DENO_DEPLOY_TOKEN")) {
129
+
throw new Error("DENO_DEPLOY_TOKEN environment variable is not set");
130
+
}
131
+
132
+
if (!project) {
133
+
throw new Error("DENO_PROJECT environment variable is not set");
134
+
}
135
+
136
+
const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx";
137
+
command = command.concat([`--project=${project}`, script]);
138
+
139
+
if (existsSync("devbox.json")) {
140
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
141
+
installDeployCtl = [
142
+
"sh",
143
+
"-c",
144
+
`devbox run -- ${installDeployCtl.join(" ")}`,
145
+
];
146
+
}
147
+
148
+
const ctr = baseCtr(client, Job.deploy)
149
+
.from("denoland/deno:alpine")
150
+
.withDirectory("/app", context, {
151
+
exclude: [".git", ".devbox", ".fluentci"],
152
+
})
153
+
.withWorkdir("/app")
154
+
.withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true })
155
+
.withEnvVariable("DENO_DEPLOY_TOKEN", Deno.env.get("DENO_DEPLOY_TOKEN")!)
156
+
.withEnvVariable(
157
+
"DENO_MAIN_SCRIPT",
158
+
Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"
159
+
)
160
+
.withExec(installDeployCtl)
161
+
.withExec(command);
162
+
163
+
const result = await ctr.stdout();
164
+
165
+
console.log(result);
166
+
};
167
+
168
+
export type JobExec = (
169
+
client: Client,
170
+
src?: string
171
+
) =>
172
+
| Promise<void>
173
+
| ((
174
+
client: Client,
175
+
src?: string,
176
+
options?: {
177
+
ignore: string[];
178
+
}
179
+
) => Promise<void>);
180
+
181
+
export const codecov = upload;
182
+
183
+
export const runnableJobs: Record<Job, JobExec> = {
184
+
[Job.fmt]: fmt,
185
+
[Job.lint]: lint,
186
+
[Job.test]: test,
187
+
[Job.deploy]: deploy,
188
+
[Job.codecov]: upload,
189
+
};
190
+
191
+
export const jobDescriptions: Record<Job, string> = {
192
+
[Job.fmt]: "Format your code",
193
+
[Job.lint]: "Lint your code",
194
+
[Job.test]: "Run your tests",
195
+
[Job.deploy]: "Deploy your code to Deno Deploy",
196
+
[Job.codecov]: "Upload your code coverage to Codecov",
197
+
};
+21
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/runner.ts
+3
.fluentci/example/.fluentci/.fluentci/.fluentci/src/dagger/runner.ts
+52
.fluentci/example/.fluentci/.fluentci/.fluentci/src/github/config.ts
+52
.fluentci/example/.fluentci/.fluentci/.fluentci/src/github/config.ts
···
···
1
+
import { JobSpec, Workflow } from "fluent_github_actions";
2
+
3
+
export function generateYaml() {
4
+
const workflow = new Workflow("Codecov");
5
+
6
+
const push = {
7
+
branches: ["main"],
8
+
};
9
+
10
+
const setupDagger = `\
11
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
sudo mv bin/dagger /usr/local/bin
13
+
dagger version`;
14
+
15
+
const tests: JobSpec = {
16
+
"runs-on": "ubuntu-latest",
17
+
steps: [
18
+
{
19
+
uses: "actions/checkout@v2",
20
+
},
21
+
{
22
+
uses: "denoland/setup-deno@v1",
23
+
with: {
24
+
"deno-version": "v1.37",
25
+
},
26
+
},
27
+
{
28
+
name: "Setup Fluent CI CLI",
29
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
},
31
+
{
32
+
name: "Setup Dagger",
33
+
run: setupDagger,
34
+
},
35
+
{
36
+
name: "List Jobs",
37
+
run: "fluentci ls .",
38
+
},
39
+
{
40
+
name: "Run Dagger Pipelines",
41
+
run: "dagger run fluentci . fmt lint test codecov",
42
+
env: {
43
+
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}",
44
+
},
45
+
},
46
+
],
47
+
};
48
+
49
+
workflow.on({ push }).jobs({ tests });
50
+
51
+
workflow.save(".github/workflows/ci.yml");
52
+
}
+3
.fluentci/example/.fluentci/.fluentci/.fluentci/src/github/init.ts
+3
.fluentci/example/.fluentci/.fluentci/.fluentci/src/github/init.ts
+4
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/index.ts
+4
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/index.ts
+9
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/example/.fluentci/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+28
.fluentci/example/.fluentci/.fluentci/.github/workflows/ci.yml
+28
.fluentci/example/.fluentci/.fluentci/.github/workflows/ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent Github Actions
2
+
3
+
name: Codecov
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
tests:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: List Jobs
24
+
run: fluentci ls .
25
+
- name: Run Dagger Pipelines
26
+
run: dagger run fluentci . fmt lint test codecov
27
+
env:
28
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+3
.fluentci/example/.fluentci/.fluentci/.vscode/settings.json
+3
.fluentci/example/.fluentci/.fluentci/.vscode/settings.json
+132
.fluentci/example/.fluentci/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/example/.fluentci/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/example/.fluentci/.fluentci/CONTRIBUTING.md
+70
.fluentci/example/.fluentci/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/example/.fluentci/.fluentci/LICENSE
+19
.fluentci/example/.fluentci/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+69
.fluentci/example/.fluentci/.fluentci/README.md
+69
.fluentci/example/.fluentci/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use CI/CD Pipeline for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Run the following command:
12
+
13
+
```bash
14
+
dagger run fluentci deno_pipeline
15
+
```
16
+
17
+
Or, if you want to use it as a template:
18
+
19
+
```bash
20
+
fluentci init -t deno
21
+
```
22
+
23
+
This will create a `.fluentci` folder in your project.
24
+
25
+
Now you can run the pipeline with:
26
+
27
+
```bash
28
+
dagger run fluentci .
29
+
```
30
+
31
+
## Environment variables (Deno Deploy)
32
+
33
+
| Variable | Description | Default |
34
+
| ----------------- | ------------------------- | ---------- |
35
+
| DENO_PROJECT | Your project name | |
36
+
| NO_STATIC | Disable static assets | `false` |
37
+
| EXCLUDE | Exclude files from deploy | |
38
+
| DENO_DEPLOY_TOKEN | Your Deno Deploy token | |
39
+
| DENO_MAIN_SCRIPT | Your main script | `main.tsx` |
40
+
41
+
## Jobs
42
+
43
+
| Job | Description | Options |
44
+
| ------ | ------------------------------ | ---------------------- |
45
+
| fmt | Format your code | |
46
+
| lint | Lint your code | |
47
+
| test | Run your tests | `{ ignore: string[] }` |
48
+
| deploy | Deploy your app to Deno Deploy | |
49
+
50
+
## Programmatic usage
51
+
52
+
You can also use this pipeline programmatically:
53
+
54
+
```ts
55
+
import { Client, connect } from "https://esm.sh/@dagger.io/dagger@0.8.1";
56
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
57
+
58
+
const { fmt, lint, test } = Dagger;
59
+
60
+
function pipeline(src = ".") {
61
+
connect(async (client: Client) => {
62
+
await fmt(client, src);
63
+
await lint(client, src);
64
+
await test(client, src);
65
+
});
66
+
}
67
+
68
+
pipeline();
69
+
```
+12
.fluentci/example/.fluentci/.fluentci/ci.ts
+12
.fluentci/example/.fluentci/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/example/.fluentci/.fluentci/deno.json
+9
.fluentci/example/.fluentci/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+68
.fluentci/example/.fluentci/.fluentci/deno.lock
+68
.fluentci/example/.fluentci/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "3",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/codecov_pipeline@v0.1.1/src/dagger/jobs.ts": "ea5ea4fb985f879fdd1c0aed77ac635ba090606c1ecce9d5f5c107493d287984",
9
+
"https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts": "a34aea3753c7079de5877f592ce31f30d05d552155729ff3e695d77326405133",
10
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
11
+
"https://esm.sh/stringify-tree@1.1.1": "a0515b0f4fe97a6972047a588b7982592d9079e7aeac3323b0d26448a757cf84",
12
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
13
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
14
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
15
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
16
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
17
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
18
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
19
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
20
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
21
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
22
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
23
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
25
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
26
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
27
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
28
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
29
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
30
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
31
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
32
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
33
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
34
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
35
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
36
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
37
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
38
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
39
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
40
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
41
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
42
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
43
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
44
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
45
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
46
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
47
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
48
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
49
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
50
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
51
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
52
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
53
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
54
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
55
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
56
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
57
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
58
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
59
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
60
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
61
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
62
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
63
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
64
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
65
+
"https://esm.sh/v132/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
66
+
"https://esm.sh/v132/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "eaa9333a5219638ad170d12e12603ae00ae80fc8bf02cc112cfec7294e6bcb43"
67
+
}
68
+
}
+25
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+25
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/.devcontainer/devcontainer.json
+25
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/.devcontainer/devcontainer.json
···
···
1
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
3
+
{
4
+
"name": "Debian",
5
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+
"image": "mcr.microsoft.com/devcontainers/base:bullseye",
7
+
"features": {
8
+
"ghcr.io/devcontainers/features/github-cli:1": {},
9
+
"ghcr.io/devcontainers/features/nix:1": {}
10
+
},
11
+
12
+
// Features to add to the dev container. More info: https://containers.dev/features.
13
+
// "features": {},
14
+
15
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16
+
// "forwardPorts": [],
17
+
18
+
// Use 'postCreateCommand' to run commands after the container is created.
19
+
"postCreateCommand": "nix develop --experimental-features \"nix-command flakes\""
20
+
// Configure tool-specific properties.
21
+
// "customizations": {},
22
+
23
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
24
+
// "remoteUser": "root"
25
+
}
+28
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/.github/workflows/ci.yml
+28
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/.github/workflows/ci.yml
···
···
1
+
name: Codecov
2
+
3
+
# Controls when the action will run. Triggers the workflow on push or pull request
4
+
# events but only for the master branch
5
+
on:
6
+
push:
7
+
branches: [main]
8
+
pull_request:
9
+
branches: [main]
10
+
11
+
jobs:
12
+
test:
13
+
runs-on: ubuntu-latest
14
+
steps:
15
+
- uses: actions/checkout@v2
16
+
- uses: denoland/setup-deno@v1
17
+
with:
18
+
deno-version: v1.34
19
+
- name: Create coverage files
20
+
run: deno test --allow-read --coverage=coverage --lock-write # create coverage files
21
+
- name: Create coverage report
22
+
run: deno coverage ./coverage --lcov > coverage.lcov # create coverage report
23
+
- name: Collect coverage
24
+
uses: codecov/codecov-action@v3 # upload the report on Codecov
25
+
env:
26
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
27
+
with:
28
+
file: ./coverage.lcov
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/.vscode/settings.json
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/.vscode/settings.json
+132
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/CONTRIBUTING.md
+70
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/LICENSE
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+88
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/README.md
+88
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use GitLab CI Pipeline and Jobs for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Quick start:
12
+
13
+
```ts
14
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
15
+
16
+
const { pipeline } = GitLab;
17
+
18
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
19
+
```
20
+
21
+
Or, if you want to use the predefined jobs:
22
+
23
+
```ts
24
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci/mod.ts";
25
+
import { GitLab } from "https://deno.land/x/deno_pipeline/mod.ts";
26
+
27
+
const { fmt, lint, test } = GitLab;
28
+
29
+
const const pipeline = new GitlabCI()
30
+
.image("denoland/deno:alpine")
31
+
.addJob("fmt", fmt)
32
+
.addJob("lint", lint)
33
+
.addJob("test", test);
34
+
35
+
pipeline.write(); // Write the pipeline to the file .gitlab-ci.yml
36
+
```
37
+
38
+
It will generate the following `.gitlab-ci.yml` file:
39
+
40
+
```yaml
41
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
42
+
43
+
image: denoland/deno:alpine
44
+
45
+
fmt:
46
+
image: denoland/deno:alpine
47
+
script:
48
+
- deno fmt --check
49
+
50
+
lint:
51
+
image: denoland/deno:alpine
52
+
script:
53
+
- deno lint
54
+
55
+
test:
56
+
image: denoland/deno:alpine
57
+
script:
58
+
- deno test
59
+
```
60
+
61
+
## ๐งช Advanced Usage
62
+
63
+
This package also provides a ready-to-use pipeline for
64
+
[Dagger](https://dagger.io/), just run the following command on your Deno
65
+
project:
66
+
67
+
```sh
68
+
dagger run deno run -A https://deno.land/x/deno_pipeline/ci.ts
69
+
```
70
+
71
+
Or, if you want to use the predefined jobs:
72
+
73
+
```ts
74
+
import Client, { connect } from "@dagger.io/dagger";
75
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
76
+
77
+
const { fmt, lint, test } = Dagger;
78
+
79
+
function pipeline(src = ".") {
80
+
connect(async (client: Client) => {
81
+
await fmt(client, src);
82
+
await lint(client, src);
83
+
await test(client, src);
84
+
});
85
+
}
86
+
87
+
pipeline();
88
+
```
+12
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/ci.ts
+12
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/deno.json
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+66
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/deno.lock
+66
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "2",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
9
+
"https://esm.sh/stringify-tree@1.1.1": "8d994a105481fa944515323d89bd2596c1de79f3d9bd1386266463934716eca0",
10
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
11
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
12
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
13
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
14
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
15
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
16
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
17
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
18
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
19
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
20
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
21
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
22
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
23
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
25
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
26
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
27
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
28
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
29
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
30
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
31
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
32
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
33
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
34
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
35
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
36
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
37
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
38
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
39
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
40
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
41
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
42
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
43
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
44
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
45
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
46
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
47
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
48
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
49
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
50
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
51
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
52
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
53
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
54
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
55
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
56
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
57
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
58
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
59
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
60
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
61
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
62
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
63
+
"https://esm.sh/v130/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
64
+
"https://esm.sh/v130/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "40a9d40e0282b5432302a3da68b88aa11685bc0b8a0b70246168deed5c5773fe"
65
+
}
66
+
}
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/flake.lock
+61
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/flake.nix
+26
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/import_map.json
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"url": "node:url",
6
+
"readline": "node:readline",
7
+
"process": "node:process",
8
+
"path": "node:path",
9
+
"os": "node:os",
10
+
"fs": "node:fs",
11
+
"crypto": "node:crypto"
12
+
},
13
+
"scopes": {
14
+
"https://esm.sh/v128/": {
15
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
16
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
17
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
18
+
"execa": "https://esm.sh/v128/execa@7.1.1",
19
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
20
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
21
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
22
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
23
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
24
+
"tar": "https://esm.sh/v128/tar@6.1.15"
25
+
}
26
+
}
27
+
}
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/index.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/index.ts
+111
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/jobs.ts
+111
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { existsSync } from "fs";
3
+
4
+
export enum Job {
5
+
fmt = "fmt",
6
+
lint = "lint",
7
+
test = "test",
8
+
}
9
+
10
+
export const lint = async (client: Client, src = ".") => {
11
+
const context = client.host().directory(src);
12
+
let command = ["deno", "lint"];
13
+
14
+
if (existsSync("devbox.json")) {
15
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
16
+
}
17
+
18
+
const ctr = client
19
+
.pipeline(Job.lint)
20
+
.container()
21
+
.from("denoland/deno:alpine")
22
+
.withDirectory("/app", context, {
23
+
exclude: [".git", ".devbox", ".fluentci"],
24
+
})
25
+
.withWorkdir("/app")
26
+
.withExec(command);
27
+
28
+
const result = await ctr.stdout();
29
+
30
+
console.log(result);
31
+
};
32
+
33
+
export const fmt = async (client: Client, src = ".") => {
34
+
const context = client.host().directory(src);
35
+
let command = ["deno", "fmt"];
36
+
37
+
if (existsSync("devbox.json")) {
38
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
39
+
}
40
+
41
+
const ctr = client
42
+
.pipeline(Job.fmt)
43
+
.container()
44
+
.from("denoland/deno:alpine")
45
+
.withDirectory("/app", context, {
46
+
exclude: [".git", ".devbox", ".fluentci"],
47
+
})
48
+
.withWorkdir("/app")
49
+
.withExec(command);
50
+
51
+
const result = await ctr.stdout();
52
+
53
+
console.log(result);
54
+
};
55
+
56
+
export const test = async (
57
+
client: Client,
58
+
src = ".",
59
+
options: { ignore: string[] } = { ignore: [] }
60
+
) => {
61
+
const context = client.host().directory(src);
62
+
let command = ["deno", "test", "-A", "--lock-write"];
63
+
64
+
if (options.ignore.length > 0) {
65
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
66
+
}
67
+
68
+
if (existsSync("devbox.json")) {
69
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
70
+
}
71
+
72
+
const ctr = client
73
+
.pipeline(Job.test)
74
+
.container()
75
+
.from("denoland/deno:alpine")
76
+
.withDirectory("/app", context, {
77
+
exclude: [".git", ".devbox", ".fluentci"],
78
+
})
79
+
.withWorkdir("/app")
80
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
81
+
.withExec(command);
82
+
83
+
const result = await ctr.stdout();
84
+
85
+
console.log(result);
86
+
};
87
+
88
+
export type JobExec = (
89
+
client: Client,
90
+
src?: string
91
+
) =>
92
+
| Promise<void>
93
+
| ((
94
+
client: Client,
95
+
src?: string,
96
+
options?: {
97
+
ignore: string[];
98
+
}
99
+
) => Promise<void>);
100
+
101
+
export const runnableJobs: Record<Job, JobExec> = {
102
+
[Job.fmt]: fmt,
103
+
[Job.lint]: lint,
104
+
[Job.test]: test,
105
+
};
106
+
107
+
export const jobDescriptions: Record<Job, string> = {
108
+
[Job.fmt]: "Format your code",
109
+
[Job.lint]: "Lint your code",
110
+
[Job.test]: "Run your tests",
111
+
};
+21
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/runner.ts
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/dagger/runner.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/index.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/index.ts
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+28
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.github/workflows/ci.yml
+28
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.github/workflows/ci.yml
···
···
1
+
name: Codecov
2
+
3
+
# Controls when the action will run. Triggers the workflow on push or pull request
4
+
# events but only for the master branch
5
+
on:
6
+
push:
7
+
branches: [main]
8
+
pull_request:
9
+
branches: [main]
10
+
11
+
jobs:
12
+
test:
13
+
runs-on: ubuntu-latest
14
+
steps:
15
+
- uses: actions/checkout@v2
16
+
- uses: denoland/setup-deno@v1
17
+
with:
18
+
deno-version: v1.34
19
+
- name: Create coverage files
20
+
run: deno test --allow-read --coverage=coverage --lock-write # create coverage files
21
+
- name: Create coverage report
22
+
run: deno coverage ./coverage --lcov > coverage.lcov # create coverage report
23
+
- name: Collect coverage
24
+
uses: codecov/codecov-action@v3 # upload the report on Codecov
25
+
env:
26
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
27
+
with:
28
+
file: ./coverage.lcov
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.vscode/settings.json
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/.vscode/settings.json
+132
.fluentci/example/.fluentci/.fluentci/example/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/example/.fluentci/.fluentci/example/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/example/.fluentci/.fluentci/example/.fluentci/CONTRIBUTING.md
+70
.fluentci/example/.fluentci/.fluentci/example/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/LICENSE
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+58
.fluentci/example/.fluentci/.fluentci/example/.fluentci/README.md
+58
.fluentci/example/.fluentci/.fluentci/example/.fluentci/README.md
···
···
1
+
# Deno Pipeline
2
+
3
+
[](https://deno.land/x/deno_pipeline)
4
+

5
+
[](https://codecov.io/gh/fluent-ci-templates/deno-pipeline)
6
+
7
+
A ready-to-use CI/CD Pipeline for your Deno projects.
8
+
9
+
## ๐ Usage
10
+
11
+
Run the following command:
12
+
13
+
```bash
14
+
dagger run fluentci deno_pipeline
15
+
```
16
+
17
+
Or, if you want to use it as a template:
18
+
19
+
```bash
20
+
fluentci init -t deno
21
+
```
22
+
23
+
This will create a `.fluentci` folder in your project.
24
+
25
+
Now you can run the pipeline with:
26
+
27
+
```bash
28
+
dagger run fluentci .
29
+
```
30
+
31
+
## Jobs
32
+
33
+
| Job | Description | Options |
34
+
| ----- | ---------------- | ---------------------- |
35
+
| fmt | Format your code | |
36
+
| lint | Lint your code | |
37
+
| test | Run your tests | `{ ignore: string[] }` |
38
+
39
+
## Programmatic usage
40
+
41
+
You can also use this pipeline programmatically:
42
+
43
+
```ts
44
+
import Client, { connect } from "@dagger.io/dagger";
45
+
import { Dagger } from "https://deno.land/x/deno_pipeline/mod.ts";
46
+
47
+
const { fmt, lint, test } = Dagger;
48
+
49
+
function pipeline(src = ".") {
50
+
connect(async (client: Client) => {
51
+
await fmt(client, src);
52
+
await lint(client, src);
53
+
await test(client, src);
54
+
});
55
+
}
56
+
57
+
pipeline();
58
+
```
+12
.fluentci/example/.fluentci/.fluentci/example/.fluentci/ci.ts
+12
.fluentci/example/.fluentci/.fluentci/example/.fluentci/ci.ts
···
···
1
+
const command = new Deno.Command(Deno.execPath(), {
2
+
args: [
3
+
"run",
4
+
"-A",
5
+
"--import-map=https://deno.land/x/deno_pipeline/import_map.json",
6
+
"https://deno.land/x/deno_pipeline/src/dagger/runner.ts",
7
+
],
8
+
});
9
+
10
+
const { stdout } = await command.output();
11
+
12
+
console.log(new TextDecoder().decode(stdout));
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/deno.json
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"ci:dagger": "dagger run deno run -A src/dagger/runner.ts"
8
+
}
9
+
}
+67
.fluentci/example/.fluentci/.fluentci/example/.fluentci/deno.lock
+67
.fluentci/example/.fluentci/.fluentci/example/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "2",
3
+
"remote": {
4
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
5
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
6
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
7
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
8
+
"https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts": "a34aea3753c7079de5877f592ce31f30d05d552155729ff3e695d77326405133",
9
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
10
+
"https://esm.sh/stringify-tree@1.1.1": "8d994a105481fa944515323d89bd2596c1de79f3d9bd1386266463934716eca0",
11
+
"https://esm.sh/v128/*@dagger.io/dagger@0.6.3": "cb691a77c0cdaee22f2b8393731b5143c83ce22dbbea204cdbfd203768d15b64",
12
+
"https://esm.sh/v128/@dagger.io/dagger@0.6.3/X-ZS8q/denonext/dagger.mjs": "fd0901784d75b99615b5409c3654b5c7edfc5ba377c9e1a5a67ffff4f7d3ac32",
13
+
"https://esm.sh/v128/adm-zip@0.5.10": "d9c54d6d2dd788462781a57d923295bd79304e6fd74b242fd4b30e35b39c5dcf",
14
+
"https://esm.sh/v128/adm-zip@0.5.10/denonext/adm-zip.mjs": "07a9731547905e0ca55ae917e1969d7f6d04fb3773f906ce3306891337eb4849",
15
+
"https://esm.sh/v128/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
16
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
17
+
"https://esm.sh/v128/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "0569a26e7ad4b3376516cbc9b1942e10961a58030eadcea8c848e6b956eb355c",
18
+
"https://esm.sh/v128/data-uri-to-buffer@4.0.1/denonext/data-uri-to-buffer.mjs": "70ef987b1da58391495ecfad9888d996469224faf3cd996d81dc2e059feb9f31",
19
+
"https://esm.sh/v128/env-paths@3.0.0": "8400fb23319be9b30d7b40d1c865541c5b3c7726cdf9b74000bc0f1678d52ecf",
20
+
"https://esm.sh/v128/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
21
+
"https://esm.sh/v128/execa@7.1.1": "a40c7030df81ab0847a5d844f4c5c6420af973dff05fef88e53cbb9b8667fdc2",
22
+
"https://esm.sh/v128/execa@7.1.1/denonext/execa.mjs": "9d5943544c0df3761b52f2c095f89a03ca6c028d818a8f0475ff883b0408f154",
23
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/fetch-blob.mjs": "0531568b36c0f6db3e9825fbb2d08dee51100eb675c2bf1d98d6971a92010721",
24
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/file.js": "fd82828163a4e7bdc15190d8c3dbfd92f93274d05bd7f7f5ab81093e3ad7e9c2",
25
+
"https://esm.sh/v128/fetch-blob@3.2.0/denonext/from.js": "7d3258c7960755497f90879806f0b815d5e564c2ac1523238af5cb9552ff5c45",
26
+
"https://esm.sh/v128/formdata-polyfill@4.0.10/denonext/esm.min.js": "b6d65a204e81eca699d9eb6f867e9efffa42db39a8f161690915a89e5eb1766f",
27
+
"https://esm.sh/v128/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "74b00283d556b281bdfd6a669576d852f2c43702043c411985f8f8188d208c5d",
28
+
"https://esm.sh/v128/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
29
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
30
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
31
+
"https://esm.sh/v128/graphql-tag@2.12.6": "5bfa27da9c9918fb52a01b8579891e804e0365d91118df1f2e0957a72dacdc39",
32
+
"https://esm.sh/v128/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "331d09949efc4ac60c84a69b52a7da8b333210493900e54953ae4604c9874527",
33
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
34
+
"https://esm.sh/v128/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
35
+
"https://esm.sh/v128/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
36
+
"https://esm.sh/v128/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
37
+
"https://esm.sh/v128/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
38
+
"https://esm.sh/v128/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
39
+
"https://esm.sh/v128/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
40
+
"https://esm.sh/v128/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
41
+
"https://esm.sh/v128/minizlib@2.1.2/denonext/minizlib.mjs": "0d919b6a0c60d5a31e14d748ff9d62aeae2923b604bcc6a22f90fa4bbd400d68",
42
+
"https://esm.sh/v128/mkdirp@1.0.4/denonext/mkdirp.mjs": "ee129b32e55dd8bede6b1bbd1978f7775fa5e2720d5a7ae07bf1e8c99abd77c7",
43
+
"https://esm.sh/v128/node-color-log@10.0.2": "05a277987c64153af1252167135076155fdc6b39ca260b2bdc39750da12d2a2d",
44
+
"https://esm.sh/v128/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
45
+
"https://esm.sh/v128/node-domexception@1.0.0/denonext/node-domexception.mjs": "bb35ba54c1a2b35870618876c0c96310a28ae58aecff33c8eed58a582e270ff4",
46
+
"https://esm.sh/v128/node-fetch@3.3.1": "916dcee177a69fb0e46970c528cb66fcd4973488f861844c0a235bfc645b0506",
47
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/node-fetch.mjs": "dc3a8f1f2fc9eb26d0d33e49f3750acc265d51a1a54bbd670c5d9f640b633a93",
48
+
"https://esm.sh/v128/node-fetch@3.3.1/denonext/src/utils/multipart-parser.js": "713b1b8cbafc4bfb7358debeb35d507e0d2328f0a28b8a2a7d79a3e5e4f5e5b8",
49
+
"https://esm.sh/v128/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "3540b8c2dd1430f10d580f323f3a51aa30094da27a9220cce03ce69884b163bb",
50
+
"https://esm.sh/v128/onetime@6.0.0/denonext/onetime.mjs": "6e362222575d815f37fb813168d7069dd6a0f6bb6f972ed54d1bccb0f9fb3e1b",
51
+
"https://esm.sh/v128/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
52
+
"https://esm.sh/v128/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
53
+
"https://esm.sh/v128/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
54
+
"https://esm.sh/v128/shebang-command@2.0.0/denonext/shebang-command.mjs": "404e0fb09a782ca9495d53c721bb84b673b7b2e1054e021852143a6b91ca0e4f",
55
+
"https://esm.sh/v128/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
56
+
"https://esm.sh/v128/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
57
+
"https://esm.sh/v128/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
58
+
"https://esm.sh/v128/tar@6.1.15": "0460339f8aba5f287e8bebe258fe3fe13cb12f85820693f25724f0d98ef1258e",
59
+
"https://esm.sh/v128/tar@6.1.15/denonext/tar.mjs": "6194d892de8457b3b1f11d5cbacda1d540b453b45e8cb9f5f610abfb3e490b65",
60
+
"https://esm.sh/v128/tslib@2.6.0/denonext/tslib.mjs": "2215292e6fcf28a7a081eee911f127bb3c44cdd61ff0651e3e384d7a49b4e42b",
61
+
"https://esm.sh/v128/web-streams-polyfill@3.2.1/denonext/dist/ponyfill.es2018.js": "a2edb52a93494cda06386b3d6a168016b366e78f02c5eff1f94a0240be12ac96",
62
+
"https://esm.sh/v128/which@2.0.2/denonext/which.mjs": "86bf76e4937edb7fa3464d7bb9a426ef273684d1cefbec5ba5f1bdcb5cafff91",
63
+
"https://esm.sh/v128/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
64
+
"https://esm.sh/v130/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
65
+
"https://esm.sh/v130/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "40a9d40e0282b5432302a3da68b88aa11685bc0b8a0b70246168deed5c5773fe"
66
+
}
67
+
}
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/example/.fluentci/.fluentci/example/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/example/.fluentci/.fluentci/example/.fluentci/flake.lock
+61
.fluentci/example/.fluentci/.fluentci/example/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/example/.fluentci/.fluentci/example/.fluentci/flake.nix
+26
.fluentci/example/.fluentci/.fluentci/example/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/import_map.json
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"url": "node:url",
6
+
"readline": "node:readline",
7
+
"process": "node:process",
8
+
"path": "node:path",
9
+
"os": "node:os",
10
+
"fs": "node:fs",
11
+
"crypto": "node:crypto"
12
+
},
13
+
"scopes": {
14
+
"https://esm.sh/v128/": {
15
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
16
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
17
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
18
+
"execa": "https://esm.sh/v128/execa@7.1.1",
19
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
20
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
21
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
22
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
23
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
24
+
"tar": "https://esm.sh/v128/tar@6.1.15"
25
+
}
26
+
}
27
+
}
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/index.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/index.ts
+188
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/jobs.ts
+188
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { withDevbox } from "https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts";
3
+
import { existsSync } from "fs";
4
+
5
+
export enum Job {
6
+
fmt = "fmt",
7
+
lint = "lint",
8
+
test = "test",
9
+
deploy = "deploy",
10
+
}
11
+
12
+
const baseCtr = (client: Client, pipeline: string) => {
13
+
if (existsSync("devbox.json")) {
14
+
return withDevbox(
15
+
client
16
+
.pipeline(pipeline)
17
+
.container()
18
+
.from("alpine:latest")
19
+
.withExec(["apk", "update"])
20
+
.withExec(["apk", "add", "bash", "curl"])
21
+
.withMountedCache("/nix", client.cacheVolume("nix"))
22
+
.withMountedCache("/etc/nix", client.cacheVolume("nix-etc"))
23
+
);
24
+
}
25
+
return client.pipeline(pipeline).container().from("denoland/deno:alpine");
26
+
};
27
+
28
+
export const lint = async (client: Client, src = ".") => {
29
+
const context = client.host().directory(src);
30
+
let command = ["deno", "lint"];
31
+
32
+
if (existsSync("devbox.json")) {
33
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
34
+
}
35
+
36
+
const ctr = baseCtr(client, Job.lint)
37
+
.withDirectory("/app", context, {
38
+
exclude: [".git", ".devbox", ".fluentci"],
39
+
})
40
+
.withWorkdir("/app")
41
+
.withExec(command);
42
+
43
+
const result = await ctr.stdout();
44
+
45
+
console.log(result);
46
+
};
47
+
48
+
export const fmt = async (client: Client, src = ".") => {
49
+
const context = client.host().directory(src);
50
+
let command = ["deno", "fmt"];
51
+
52
+
if (existsSync("devbox.json")) {
53
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
54
+
}
55
+
56
+
const ctr = baseCtr(client, Job.fmt)
57
+
.withDirectory("/app", context, {
58
+
exclude: [".git", ".devbox", ".fluentci"],
59
+
})
60
+
.withWorkdir("/app")
61
+
.withExec(command);
62
+
63
+
const result = await ctr.stdout();
64
+
65
+
console.log(result);
66
+
};
67
+
68
+
export const test = async (
69
+
client: Client,
70
+
src = ".",
71
+
options: { ignore: string[] } = { ignore: [] }
72
+
) => {
73
+
const context = client.host().directory(src);
74
+
let command = ["deno", "test", "-A", "--lock-write"];
75
+
76
+
if (options.ignore.length > 0) {
77
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
78
+
}
79
+
80
+
if (existsSync("devbox.json")) {
81
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
82
+
}
83
+
84
+
const ctr = baseCtr(client, Job.test)
85
+
.from("denoland/deno:alpine")
86
+
.withDirectory("/app", context, {
87
+
exclude: [".git", ".devbox", ".fluentci"],
88
+
})
89
+
.withWorkdir("/app")
90
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
91
+
.withExec(command);
92
+
93
+
const result = await ctr.stdout();
94
+
95
+
console.log(result);
96
+
};
97
+
98
+
export const deploy = async (client: Client, src = ".") => {
99
+
const context = client.host().directory(src);
100
+
let installDeployCtl = [
101
+
"deno",
102
+
"install",
103
+
"--allow-all",
104
+
"--no-check",
105
+
"-r",
106
+
"-f",
107
+
"https://deno.land/x/deploy/deployctl.ts",
108
+
];
109
+
const project = Deno.env.get("DENO_PROJECT");
110
+
const noStatic = Deno.env.get("NO_STATIC");
111
+
const exclude = Deno.env.get("EXCLUDE");
112
+
113
+
let command = ["deployctl", "deploy"];
114
+
115
+
if (noStatic) {
116
+
command = command.concat(["--no-static"]);
117
+
}
118
+
119
+
if (exclude) {
120
+
command = command.concat([`--exclude=${exclude}`]);
121
+
}
122
+
123
+
if (!Deno.env.get("DENO_DEPLOY_TOKEN")) {
124
+
throw new Error("DENO_DEPLOY_TOKEN environment variable is not set");
125
+
}
126
+
127
+
if (!project) {
128
+
throw new Error("DENO_PROJECT environment variable is not set");
129
+
}
130
+
131
+
const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx";
132
+
command = command.concat([`--project=${project}`, script]);
133
+
134
+
if (existsSync("devbox.json")) {
135
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
136
+
installDeployCtl = [
137
+
"sh",
138
+
"-c",
139
+
`devbox run -- ${installDeployCtl.join(" ")}`,
140
+
];
141
+
}
142
+
143
+
const ctr = baseCtr(client, Job.deploy)
144
+
.from("denoland/deno:alpine")
145
+
.withDirectory("/app", context, {
146
+
exclude: [".git", ".devbox", ".fluentci"],
147
+
})
148
+
.withWorkdir("/app")
149
+
.withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true })
150
+
.withEnvVariable("DENO_DEPLOY_TOKEN", Deno.env.get("DENO_DEPLOY_TOKEN")!)
151
+
.withEnvVariable(
152
+
"DENO_MAIN_SCRIPT",
153
+
Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"
154
+
)
155
+
.withExec(installDeployCtl)
156
+
.withExec(command);
157
+
158
+
const result = await ctr.stdout();
159
+
160
+
console.log(result);
161
+
};
162
+
163
+
export type JobExec = (
164
+
client: Client,
165
+
src?: string
166
+
) =>
167
+
| Promise<void>
168
+
| ((
169
+
client: Client,
170
+
src?: string,
171
+
options?: {
172
+
ignore: string[];
173
+
}
174
+
) => Promise<void>);
175
+
176
+
export const runnableJobs: Record<Job, JobExec> = {
177
+
[Job.fmt]: fmt,
178
+
[Job.lint]: lint,
179
+
[Job.test]: test,
180
+
[Job.deploy]: deploy,
181
+
};
182
+
183
+
export const jobDescriptions: Record<Job, string> = {
184
+
[Job.fmt]: "Format your code",
185
+
[Job.lint]: "Lint your code",
186
+
[Job.test]: "Run your tests",
187
+
[Job.deploy]: "Deploy your code to Deno Deploy",
188
+
};
+21
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/runner.ts
+3
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/dagger/runner.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/index.ts
+4
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/index.ts
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/example/.fluentci/.fluentci/example/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+3
.fluentci/example/.fluentci/.fluentci/example/.vscode/settings.json
+3
.fluentci/example/.fluentci/.fluentci/example/.vscode/settings.json
+16
.fluentci/example/.fluentci/.fluentci/example/README.md
+16
.fluentci/example/.fluentci/.fluentci/example/README.md
···
···
1
+
# Deno Pipeline Example
2
+
3
+
This is an example using the [Deno Pipeline](https://github.com/fluent-ci-templates/deno-pipeline).
4
+
5
+
## ๐ Usage
6
+
7
+
You need to set the following environment variables:
8
+
9
+
- `DENO_DEPLOY_TOKEN`: Your Deno Deploy token.
10
+
- `DENO_PROJECT`: Your project name.
11
+
12
+
Then, run the following command:
13
+
14
+
```bash
15
+
dagger run fluentci . fmt lint deploy
16
+
```
+20
.fluentci/example/.fluentci/.fluentci/example/main.tsx
+20
.fluentci/example/.fluentci/.fluentci/example/main.tsx
···
···
1
+
/** @jsx h */
2
+
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";
3
+
import html, { h } from "https://deno.land/x/htm@0.2.1/mod.ts";
4
+
5
+
const handler = (req: Request) =>
6
+
html({
7
+
title: "Hello World!",
8
+
styles: [
9
+
"html, body { margin: 0; height: 100%; }",
10
+
"body { background: #86efac; display: flex; flex-direction: column; align-items: center; justify-content: center; }",
11
+
],
12
+
body: (
13
+
<body>
14
+
<img width="64" src="https://dash.deno.com/assets/logo.svg" />
15
+
<h1>Hello Patricia!</h1>
16
+
</body>
17
+
),
18
+
});
19
+
20
+
serve(handler);
+19
.fluentci/example/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
+19
.fluentci/example/.fluentci/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent GitLab CI
2
+
3
+
image: denoland/deno:alpine
4
+
5
+
fmt:
6
+
image: denoland/deno:alpine
7
+
script:
8
+
- deno fmt --check
9
+
10
+
lint:
11
+
image: denoland/deno:alpine
12
+
script:
13
+
- deno lint
14
+
15
+
test:
16
+
image: denoland/deno:alpine
17
+
script:
18
+
- deno test
19
+
+61
.fluentci/example/.fluentci/.fluentci/flake.lock
+61
.fluentci/example/.fluentci/.fluentci/flake.lock
···
···
1
+
{
2
+
"nodes": {
3
+
"flake-utils": {
4
+
"inputs": {
5
+
"systems": "systems"
6
+
},
7
+
"locked": {
8
+
"lastModified": 1687709756,
9
+
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
10
+
"owner": "numtide",
11
+
"repo": "flake-utils",
12
+
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
13
+
"type": "github"
14
+
},
15
+
"original": {
16
+
"owner": "numtide",
17
+
"repo": "flake-utils",
18
+
"type": "github"
19
+
}
20
+
},
21
+
"nixpkgs": {
22
+
"locked": {
23
+
"lastModified": 1688910226,
24
+
"narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=",
25
+
"owner": "nixos",
26
+
"repo": "nixpkgs",
27
+
"rev": "2540432a940aee979be6ccfefba9ea0652c273a0",
28
+
"type": "github"
29
+
},
30
+
"original": {
31
+
"owner": "nixos",
32
+
"ref": "release-23.05",
33
+
"repo": "nixpkgs",
34
+
"type": "github"
35
+
}
36
+
},
37
+
"root": {
38
+
"inputs": {
39
+
"flake-utils": "flake-utils",
40
+
"nixpkgs": "nixpkgs"
41
+
}
42
+
},
43
+
"systems": {
44
+
"locked": {
45
+
"lastModified": 1681028828,
46
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
47
+
"owner": "nix-systems",
48
+
"repo": "default",
49
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
50
+
"type": "github"
51
+
},
52
+
"original": {
53
+
"owner": "nix-systems",
54
+
"repo": "default",
55
+
"type": "github"
56
+
}
57
+
}
58
+
},
59
+
"root": "root",
60
+
"version": 7
61
+
}
+26
.fluentci/example/.fluentci/.fluentci/flake.nix
+26
.fluentci/example/.fluentci/.fluentci/flake.nix
···
···
1
+
{
2
+
description = "A Nix-flake-based Deno development environment";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "github:nixos/nixpkgs/release-23.05";
6
+
flake-utils.url = "github:numtide/flake-utils";
7
+
};
8
+
9
+
outputs = {
10
+
self,
11
+
nixpkgs,
12
+
flake-utils,
13
+
}:
14
+
flake-utils.lib.eachDefaultSystem
15
+
(system: let
16
+
pkgs = import nixpkgs {
17
+
inherit system;
18
+
};
19
+
in {
20
+
devShells.default = pkgs.mkShell {
21
+
buildInputs = [
22
+
pkgs.deno
23
+
];
24
+
};
25
+
});
26
+
}
+28
.fluentci/example/.fluentci/.fluentci/import_map.json
+28
.fluentci/example/.fluentci/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.6.3",
4
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts",
5
+
"fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.1.2/mod.ts",
6
+
"url": "node:url",
7
+
"readline": "node:readline",
8
+
"process": "node:process",
9
+
"path": "node:path",
10
+
"os": "node:os",
11
+
"fs": "node:fs",
12
+
"crypto": "node:crypto"
13
+
},
14
+
"scopes": {
15
+
"https://esm.sh/v128/": {
16
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
17
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
18
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
19
+
"execa": "https://esm.sh/v128/execa@7.1.1",
20
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
21
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
22
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
23
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
24
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
25
+
"tar": "https://esm.sh/v128/tar@6.1.15"
26
+
}
27
+
}
28
+
}
+4
.fluentci/example/.fluentci/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/mod.ts
+4
.fluentci/example/.fluentci/.fluentci/src/dagger/index.ts
+4
.fluentci/example/.fluentci/.fluentci/src/dagger/index.ts
+197
.fluentci/example/.fluentci/.fluentci/src/dagger/jobs.ts
+197
.fluentci/example/.fluentci/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client from "@dagger.io/dagger";
2
+
import { upload } from "https://deno.land/x/codecov_pipeline@v0.1.1/src/dagger/jobs.ts";
3
+
import { withDevbox } from "https://deno.land/x/nix_installer_pipeline@v0.3.6/src/dagger/steps.ts";
4
+
import { existsSync } from "fs";
5
+
6
+
export enum Job {
7
+
fmt = "fmt",
8
+
lint = "lint",
9
+
test = "test",
10
+
deploy = "deploy",
11
+
codecov = "codecov",
12
+
}
13
+
14
+
const baseCtr = (client: Client, pipeline: string) => {
15
+
if (existsSync("devbox.json")) {
16
+
return withDevbox(
17
+
client
18
+
.pipeline(pipeline)
19
+
.container()
20
+
.from("alpine:latest")
21
+
.withExec(["apk", "update"])
22
+
.withExec(["apk", "add", "bash", "curl"])
23
+
.withMountedCache("/nix", client.cacheVolume("nix"))
24
+
.withMountedCache("/etc/nix", client.cacheVolume("nix-etc"))
25
+
);
26
+
}
27
+
return client.pipeline(pipeline).container().from("denoland/deno:alpine");
28
+
};
29
+
30
+
export const lint = async (client: Client, src = ".") => {
31
+
const context = client.host().directory(src);
32
+
let command = ["deno", "lint"];
33
+
34
+
if (existsSync("devbox.json")) {
35
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
36
+
}
37
+
38
+
const ctr = baseCtr(client, Job.lint)
39
+
.withDirectory("/app", context, {
40
+
exclude: [".git", ".devbox", ".fluentci"],
41
+
})
42
+
.withWorkdir("/app")
43
+
.withExec(command);
44
+
45
+
const result = await ctr.stdout();
46
+
47
+
console.log(result);
48
+
};
49
+
50
+
export const fmt = async (client: Client, src = ".") => {
51
+
const context = client.host().directory(src);
52
+
let command = ["deno", "fmt"];
53
+
54
+
if (existsSync("devbox.json")) {
55
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
56
+
}
57
+
58
+
const ctr = baseCtr(client, Job.fmt)
59
+
.withDirectory("/app", context, {
60
+
exclude: [".git", ".devbox", ".fluentci"],
61
+
})
62
+
.withWorkdir("/app")
63
+
.withExec(command);
64
+
65
+
const result = await ctr.stdout();
66
+
67
+
console.log(result);
68
+
};
69
+
70
+
export const test = async (
71
+
client: Client,
72
+
src = ".",
73
+
options: { ignore: string[] } = { ignore: [] }
74
+
) => {
75
+
const context = client.host().directory(src);
76
+
let command = ["deno", "test", "-A", "--coverage=coverage", "--lock-write"];
77
+
78
+
if (options.ignore.length > 0) {
79
+
command = command.concat([`--ignore=${options.ignore.join(",")}`]);
80
+
}
81
+
82
+
if (existsSync("devbox.json")) {
83
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
84
+
}
85
+
86
+
const ctr = baseCtr(client, Job.test)
87
+
.from("denoland/deno:alpine")
88
+
.withDirectory("/app", context, {
89
+
exclude: [".git", ".devbox", ".fluentci"],
90
+
})
91
+
.withWorkdir("/app")
92
+
.withMountedCache("/root/.cache/deno", client.cacheVolume("deno-cache"))
93
+
.withExec(command)
94
+
.withExec(["sh", "-c", "deno coverage ./coverage --lcov > coverage.lcov"]);
95
+
96
+
const result = await ctr.stdout();
97
+
98
+
await ctr.file("/app/coverage.lcov").export("./coverage.lcov");
99
+
100
+
console.log(result);
101
+
};
102
+
103
+
export const deploy = async (client: Client, src = ".") => {
104
+
const context = client.host().directory(src);
105
+
let installDeployCtl = [
106
+
"deno",
107
+
"install",
108
+
"--allow-all",
109
+
"--no-check",
110
+
"-r",
111
+
"-f",
112
+
"https://deno.land/x/deploy/deployctl.ts",
113
+
];
114
+
const project = Deno.env.get("DENO_PROJECT");
115
+
const noStatic = Deno.env.get("NO_STATIC");
116
+
const exclude = Deno.env.get("EXCLUDE");
117
+
118
+
let command = ["deployctl", "deploy"];
119
+
120
+
if (noStatic) {
121
+
command = command.concat(["--no-static"]);
122
+
}
123
+
124
+
if (exclude) {
125
+
command = command.concat([`--exclude=${exclude}`]);
126
+
}
127
+
128
+
if (!Deno.env.get("DENO_DEPLOY_TOKEN")) {
129
+
throw new Error("DENO_DEPLOY_TOKEN environment variable is not set");
130
+
}
131
+
132
+
if (!project) {
133
+
throw new Error("DENO_PROJECT environment variable is not set");
134
+
}
135
+
136
+
const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx";
137
+
command = command.concat([`--project=${project}`, script]);
138
+
139
+
if (existsSync("devbox.json")) {
140
+
command = ["sh", "-c", `devbox run -- ${command.join(" ")}`];
141
+
installDeployCtl = [
142
+
"sh",
143
+
"-c",
144
+
`devbox run -- ${installDeployCtl.join(" ")}`,
145
+
];
146
+
}
147
+
148
+
const ctr = baseCtr(client, Job.deploy)
149
+
.from("denoland/deno:alpine")
150
+
.withDirectory("/app", context, {
151
+
exclude: [".git", ".devbox", ".fluentci"],
152
+
})
153
+
.withWorkdir("/app")
154
+
.withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true })
155
+
.withEnvVariable("DENO_DEPLOY_TOKEN", Deno.env.get("DENO_DEPLOY_TOKEN")!)
156
+
.withEnvVariable(
157
+
"DENO_MAIN_SCRIPT",
158
+
Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"
159
+
)
160
+
.withExec(installDeployCtl)
161
+
.withExec(command);
162
+
163
+
const result = await ctr.stdout();
164
+
165
+
console.log(result);
166
+
};
167
+
168
+
export type JobExec = (
169
+
client: Client,
170
+
src?: string
171
+
) =>
172
+
| Promise<void>
173
+
| ((
174
+
client: Client,
175
+
src?: string,
176
+
options?: {
177
+
ignore: string[];
178
+
}
179
+
) => Promise<void>);
180
+
181
+
export const codecov = upload;
182
+
183
+
export const runnableJobs: Record<Job, JobExec> = {
184
+
[Job.fmt]: fmt,
185
+
[Job.lint]: lint,
186
+
[Job.test]: test,
187
+
[Job.deploy]: deploy,
188
+
[Job.codecov]: upload,
189
+
};
190
+
191
+
export const jobDescriptions: Record<Job, string> = {
192
+
[Job.fmt]: "Format your code",
193
+
[Job.lint]: "Lint your code",
194
+
[Job.test]: "Run your tests",
195
+
[Job.deploy]: "Deploy your code to Deno Deploy",
196
+
[Job.codecov]: "Upload your code coverage to Codecov",
197
+
};
+21
.fluentci/example/.fluentci/.fluentci/src/dagger/list_jobs.ts
+21
.fluentci/example/.fluentci/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
import { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
4
+
5
+
const tree = {
6
+
name: brightGreen("deno_pipeline"),
7
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
8
+
name: jobDescriptions[job]
9
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
10
+
: brightGreen(job),
11
+
children: [],
12
+
})),
13
+
};
14
+
15
+
console.log(
16
+
stringifyTree(
17
+
tree,
18
+
(t) => t.name,
19
+
(t) => t.children
20
+
)
21
+
);
+27
.fluentci/example/.fluentci/.fluentci/src/dagger/pipeline.ts
+27
.fluentci/example/.fluentci/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import Client, { connect } from "@dagger.io/dagger";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { fmt, lint, test, runnableJobs } = jobs;
5
+
6
+
export default function pipeline(src = ".", args: string[] = []) {
7
+
connect(async (client: Client) => {
8
+
if (args.length > 0) {
9
+
await runSpecificJobs(client, args as jobs.Job[]);
10
+
return;
11
+
}
12
+
13
+
await fmt(client, src);
14
+
await lint(client, src);
15
+
await test(client, src);
16
+
});
17
+
}
18
+
19
+
async function runSpecificJobs(client: Client, args: jobs.Job[]) {
20
+
for (const name of args) {
21
+
const job = runnableJobs[name];
22
+
if (!job) {
23
+
throw new Error(`Job ${name} not found`);
24
+
}
25
+
await job(client);
26
+
}
27
+
}
+3
.fluentci/example/.fluentci/.fluentci/src/dagger/runner.ts
+3
.fluentci/example/.fluentci/.fluentci/src/dagger/runner.ts
+52
.fluentci/example/.fluentci/.fluentci/src/github/config.ts
+52
.fluentci/example/.fluentci/.fluentci/src/github/config.ts
···
···
1
+
import { JobSpec, Workflow } from "fluent_github_actions";
2
+
3
+
export function generateYaml() {
4
+
const workflow = new Workflow("Codecov");
5
+
6
+
const push = {
7
+
branches: ["main"],
8
+
};
9
+
10
+
const setupDagger = `\
11
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
sudo mv bin/dagger /usr/local/bin
13
+
dagger version`;
14
+
15
+
const tests: JobSpec = {
16
+
"runs-on": "ubuntu-latest",
17
+
steps: [
18
+
{
19
+
uses: "actions/checkout@v2",
20
+
},
21
+
{
22
+
uses: "denoland/setup-deno@v1",
23
+
with: {
24
+
"deno-version": "v1.37",
25
+
},
26
+
},
27
+
{
28
+
name: "Setup Fluent CI CLI",
29
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
},
31
+
{
32
+
name: "Setup Dagger",
33
+
run: setupDagger,
34
+
},
35
+
{
36
+
name: "Run Dagger Pipelines",
37
+
run: "dagger run fluentci . fmt lint test",
38
+
},
39
+
{
40
+
name: "Upload to Codecov",
41
+
run: "dagger run fluentci codecov_pipeline",
42
+
env: {
43
+
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}",
44
+
},
45
+
},
46
+
],
47
+
};
48
+
49
+
workflow.on({ push }).jobs({ tests });
50
+
51
+
workflow.save(".github/workflows/ci.yml");
52
+
}
+3
.fluentci/example/.fluentci/.fluentci/src/github/init.ts
+3
.fluentci/example/.fluentci/.fluentci/src/github/init.ts
+4
.fluentci/example/.fluentci/.fluentci/src/gitlab/index.ts
+4
.fluentci/example/.fluentci/.fluentci/src/gitlab/index.ts
+9
.fluentci/example/.fluentci/.fluentci/src/gitlab/jobs.ts
+9
.fluentci/example/.fluentci/.fluentci/src/gitlab/jobs.ts
···
···
1
+
import { Job } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
3
+
export const fmt = new Job()
4
+
.image("denoland/deno:alpine")
5
+
.script("deno fmt --check");
6
+
7
+
export const lint = new Job().image("denoland/deno:alpine").script("deno lint");
8
+
9
+
export const test = new Job().image("denoland/deno:alpine").script("deno test");
+10
.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline.ts
+10
.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline.ts
···
···
1
+
import { GitlabCI } from "https://deno.land/x/fluent_gitlab_ci@v0.3.2/mod.ts";
2
+
import { fmt, lint, test } from "./jobs.ts";
3
+
4
+
const pipeline = new GitlabCI()
5
+
.image("denoland/deno:alpine")
6
+
.addJob("fmt", fmt)
7
+
.addJob("lint", lint)
8
+
.addJob("test", test);
9
+
10
+
export default pipeline;
+8
.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
+8
.fluentci/example/.fluentci/.fluentci/src/gitlab/pipeline_test.ts
···
···
1
+
import pipeline from "./pipeline.ts";
2
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
3
+
4
+
Deno.test(function pipelineTest() {
5
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
6
+
const actual = pipeline.toString();
7
+
assertEquals(actual, expected);
8
+
});
+28
.fluentci/example/.fluentci/.github/workflows/ci.yml
+28
.fluentci/example/.fluentci/.github/workflows/ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent Github Actions
2
+
3
+
name: Codecov
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
tests:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Dagger Pipelines
24
+
run: dagger run fluentci . fmt lint test
25
+
- name: Upload to Codecov
26
+
run: dagger run fluentci codecov_pipeline
27
+
env:
28
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+25
.fluentci/example/.fluentci/.github/workflows/example.yml
+25
.fluentci/example/.fluentci/.github/workflows/example.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
2
+
3
+
name: Example
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
tests:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Dagger Pipelines
24
+
run: dagger run deno run -A ../src/dagger/runner.ts
25
+
working-directory: example
+23
.fluentci/example/.fluentci/.github/workflows/zenith.yml
+23
.fluentci/example/.fluentci/.github/workflows/zenith.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
2
+
3
+
name: Zenith Example
4
+
on:
5
+
push:
6
+
branches:
7
+
- zenith
8
+
9
+
jobs:
10
+
tests:
11
+
runs-on: ubuntu-latest
12
+
steps:
13
+
- uses: actions/checkout@v2
14
+
- name: Setup Dagger Zenith
15
+
run: |
16
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.8 sh
17
+
sudo mv bin/dagger /usr/local/bin
18
+
dagger version
19
+
- name: Run Dagger Pipelines
20
+
run: |
21
+
dagger query --doc build.gql
22
+
dagger query --doc test.gql
23
+
working-directory: example
+132
.fluentci/example/.fluentci/CODE_OF_CONDUCT.md
+132
.fluentci/example/.fluentci/CODE_OF_CONDUCT.md
···
···
1
+
# Contributor Covenant Code of Conduct
2
+
3
+
## Our Pledge
4
+
5
+
We as members, contributors, and leaders pledge to make participation in our
6
+
community a harassment-free experience for everyone, regardless of age, body
7
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+
identity and expression, level of experience, education, socio-economic status,
9
+
nationality, personal appearance, race, caste, color, religion, or sexual
10
+
identity and orientation.
11
+
12
+
We pledge to act and interact in ways that contribute to an open, welcoming,
13
+
diverse, inclusive, and healthy community.
14
+
15
+
## Our Standards
16
+
17
+
Examples of behavior that contributes to a positive environment for our
18
+
community include:
19
+
20
+
- Demonstrating empathy and kindness toward other people
21
+
- Being respectful of differing opinions, viewpoints, and experiences
22
+
- Giving and gracefully accepting constructive feedback
23
+
- Accepting responsibility and apologizing to those affected by our mistakes,
24
+
and learning from the experience
25
+
- Focusing on what is best not just for us as individuals, but for the overall
26
+
community
27
+
28
+
Examples of unacceptable behavior include:
29
+
30
+
- The use of sexualized language or imagery, and sexual attention or advances of
31
+
any kind
32
+
- Trolling, insulting or derogatory comments, and personal or political attacks
33
+
- Public or private harassment
34
+
- Publishing others' private information, such as a physical or email address,
35
+
without their explicit permission
36
+
- Other conduct which could reasonably be considered inappropriate in a
37
+
professional setting
38
+
39
+
## Enforcement Responsibilities
40
+
41
+
Community leaders are responsible for clarifying and enforcing our standards of
42
+
acceptable behavior and will take appropriate and fair corrective action in
43
+
response to any behavior that they deem inappropriate, threatening, offensive,
44
+
or harmful.
45
+
46
+
Community leaders have the right and responsibility to remove, edit, or reject
47
+
comments, commits, code, wiki edits, issues, and other contributions that are
48
+
not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+
decisions when appropriate.
50
+
51
+
## Scope
52
+
53
+
This Code of Conduct applies within all community spaces, and also applies when
54
+
an individual is officially representing the community in public spaces.
55
+
Examples of representing our community include using an official e-mail address,
56
+
posting via an official social media account, or acting as an appointed
57
+
representative at an online or offline event.
58
+
59
+
## Enforcement
60
+
61
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+
reported to the community leaders responsible for enforcement at
63
+
[GitHub Issues](https://github.com/fluent-ci-templates/rust-pipeline/issues).
64
+
All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+
All community leaders are obligated to respect the privacy and security of the
67
+
reporter of any incident.
68
+
69
+
## Enforcement Guidelines
70
+
71
+
Community leaders will follow these Community Impact Guidelines in determining
72
+
the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+
### 1. Correction
75
+
76
+
**Community Impact**: Use of inappropriate language or other behavior deemed
77
+
unprofessional or unwelcome in the community.
78
+
79
+
**Consequence**: A private, written warning from community leaders, providing
80
+
clarity around the nature of the violation and an explanation of why the
81
+
behavior was inappropriate. A public apology may be requested.
82
+
83
+
### 2. Warning
84
+
85
+
**Community Impact**: A violation through a single incident or series of
86
+
actions.
87
+
88
+
**Consequence**: A warning with consequences for continued behavior. No
89
+
interaction with the people involved, including unsolicited interaction with
90
+
those enforcing the Code of Conduct, for a specified period of time. This
91
+
includes avoiding interactions in community spaces as well as external channels
92
+
like social media. Violating these terms may lead to a temporary or permanent
93
+
ban.
94
+
95
+
### 3. Temporary Ban
96
+
97
+
**Community Impact**: A serious violation of community standards, including
98
+
sustained inappropriate behavior.
99
+
100
+
**Consequence**: A temporary ban from any sort of interaction or public
101
+
communication with the community for a specified period of time. No public or
102
+
private interaction with the people involved, including unsolicited interaction
103
+
with those enforcing the Code of Conduct, is allowed during this period.
104
+
Violating these terms may lead to a permanent ban.
105
+
106
+
### 4. Permanent Ban
107
+
108
+
**Community Impact**: Demonstrating a pattern of violation of community
109
+
standards, including sustained inappropriate behavior, harassment of an
110
+
individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+
**Consequence**: A permanent ban from any sort of public interaction within the
113
+
community.
114
+
115
+
## Attribution
116
+
117
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+
version 2.1, available at
119
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+
Community Impact Guidelines were inspired by
122
+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+
For answers to common questions about this code of conduct, see the FAQ at
125
+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+
[https://www.contributor-covenant.org/translations][translations].
127
+
128
+
[homepage]: https://www.contributor-covenant.org
129
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+
[Mozilla CoC]: https://github.com/mozilla/diversity
131
+
[FAQ]: https://www.contributor-covenant.org/faq
132
+
[translations]: https://www.contributor-covenant.org/translations
+70
.fluentci/example/.fluentci/CONTRIBUTING.md
+70
.fluentci/example/.fluentci/CONTRIBUTING.md
···
···
1
+
# Contributing Guidelines
2
+
3
+
Thank you for your interest in contributing to our project. Whether it's a bug
4
+
report, new feature, correction, or additional documentation, we greatly value
5
+
feedback and contributions from our community.
6
+
7
+
Please read through this document before submitting any issues or pull requests
8
+
to ensure we have all the necessary information to effectively respond to your
9
+
bug report or contribution.
10
+
11
+
## Reporting Bugs/Feature Requests
12
+
13
+
We welcome you to use the GitHub issue tracker to report bugs or suggest
14
+
features.
15
+
16
+
When filing an issue, please check existing open, or recently closed, issues to
17
+
make sure somebody else hasn't already reported the issue. Please try to include
18
+
as much information as you can. Details like these are incredibly useful:
19
+
20
+
- A reproducible test case or series of steps
21
+
- The version of our code being used
22
+
- Any modifications you've made relevant to the bug
23
+
- Anything unusual about your environment or deployment
24
+
25
+
## Contributing via Pull Requests
26
+
27
+
Contributions via pull requests are much appreciated. Before sending us a pull
28
+
request, please ensure that:
29
+
30
+
1. You are working against the latest source on the _master_ branch.
31
+
2. You check existing open, and recently merged, pull requests to make sure
32
+
someone else hasn't addressed the problem already.
33
+
3. You open an issue to discuss any significant work - we would hate for your
34
+
time to be wasted.
35
+
36
+
To send us a pull request, please:
37
+
38
+
1. Fork the repository.
39
+
2. Modify the source; please focus on the specific change you are contributing.
40
+
If you also reformat all the code, it will be hard for us to focus on your
41
+
change.
42
+
3. Ensure local tests pass.
43
+
4. Commit to your fork using clear commit messages.
44
+
5. Send us a pull request, answering any default questions in the pull request
45
+
interface.
46
+
6. Pay attention to any automated CI failures reported in the pull request, and
47
+
stay involved in the conversation.
48
+
49
+
GitHub provides additional document on
50
+
[forking a repository](https://help.github.com/articles/fork-a-repo/) and
51
+
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
52
+
53
+
## Finding contributions to work on
54
+
55
+
Looking at the existing issues is a great way to find something to contribute
56
+
on. As our projects, by default, use the default GitHub issue labels
57
+
(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any
58
+
'help wanted' issues is a great place to start.
59
+
60
+
## Code of Conduct
61
+
62
+
This project has adopted the
63
+
[Contributor Covenant](https://www.contributor-covenant.org/), version 2.1,
64
+
available at
65
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
66
+
67
+
## Licensing
68
+
69
+
See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to
70
+
confirm the licensing of your contribution.
+19
.fluentci/example/.fluentci/LICENSE
+19
.fluentci/example/.fluentci/LICENSE
···
···
1
+
Copyright (c) 2023 Tsiry Sandratraina <tsiry.sndr@aol.com>
2
+
3
+
Permission is hereby granted, free of charge, to any person obtaining a copy
4
+
of this software and associated documentation files (the "Software"), to deal
5
+
in the Software without restriction, including without limitation the rights
6
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+
copies of the Software, and to permit persons to whom the Software is
8
+
furnished to do so, subject to the following conditions:
9
+
10
+
The above copyright notice and this permission notice shall be included in all
11
+
copies or substantial portions of the Software.
12
+
13
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+
SOFTWARE.
+61
.fluentci/example/.fluentci/README.md
+61
.fluentci/example/.fluentci/README.md
···
···
1
+
# Rust Pipeline
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
A ready-to-use CI/CD Pipeline for your Rust projects.
9
+
## ๐ Usage
10
+
11
+
Run the following command in your Rust Project:
12
+
13
+
```bash
14
+
fluentci run rust_pipeline
15
+
```
16
+
17
+
Or if you want to run specific jobs:
18
+
19
+
```bash
20
+
fluentci run rust_pipeline test build
21
+
```
22
+
23
+
24
+
if you want to use it as a template:
25
+
26
+
```bash
27
+
fluentci init -t rust
28
+
```
29
+
30
+
This will create a `.fluentci` folder in your project.
31
+
32
+
Now you can run the pipeline with:
33
+
34
+
```bash
35
+
fluentci run .
36
+
```
37
+
38
+
## Jobs
39
+
40
+
| Job | Description |
41
+
| ----- | ------------------ |
42
+
| build | build your project |
43
+
| test | Run your tests |
44
+
45
+
## Programmatic usage
46
+
47
+
You can also use this pipeline programmatically:
48
+
49
+
```ts
50
+
import Client, { connect } from "https://sdk.fluentci.io/v0.1.9/mod.ts";
51
+
import { build, test } from "https://pkg.fluentci.io/rust_pipeline@v0.5.2/mod.ts";
52
+
53
+
function pipeline(src = ".") {
54
+
connect(async (client: Client) => {
55
+
await test(client, src);
56
+
await build(client, src);
57
+
});
58
+
}
59
+
60
+
pipeline();
61
+
```
+14
.fluentci/example/.fluentci/ci.ts
+14
.fluentci/example/.fluentci/ci.ts
···
···
1
+
import Client, { connect } from "https://sdk.fluentci.io/v0.1.9/mod.ts";
2
+
import {
3
+
build,
4
+
test,
5
+
} from "https://pkg.fluentci.io/rust_pipeline@v0.5.2/mod.ts";
6
+
7
+
function pipeline(src = ".") {
8
+
connect(async (client: Client) => {
9
+
await test(client, src);
10
+
await build(client, src);
11
+
});
12
+
}
13
+
14
+
pipeline();
+5
.fluentci/example/.fluentci/dagger.json
+5
.fluentci/example/.fluentci/dagger.json
+31
.fluentci/example/.fluentci/deno.json
+31
.fluentci/example/.fluentci/deno.json
···
···
1
+
{
2
+
"importMap": "import_map.json",
3
+
"tasks": {
4
+
"esm:add": "deno run -A https://esm.sh/v128 add",
5
+
"esm:update": "deno run -A https://esm.sh/v128 update",
6
+
"esm:remove": "deno run -A https://esm.sh/v128 remove",
7
+
"schema": "deno run -A src/dagger/schema.ts",
8
+
"clean": "rm -rf gen schema.graphql"
9
+
},
10
+
"fmt": {
11
+
"exclude": [
12
+
"example/",
13
+
".fluentci/",
14
+
"gen/"
15
+
]
16
+
},
17
+
"lint": {
18
+
"exclude": [
19
+
"example/",
20
+
".fluentci/",
21
+
"gen/"
22
+
]
23
+
},
24
+
"test": {
25
+
"exclude": [
26
+
"example/",
27
+
".fluentci/",
28
+
"gen/"
29
+
]
30
+
}
31
+
}
+264
.fluentci/example/.fluentci/deno.lock
+264
.fluentci/example/.fluentci/deno.lock
···
···
1
+
{
2
+
"version": "3",
3
+
"packages": {
4
+
"specifiers": {
5
+
"npm:nexus": "npm:nexus@1.3.0_graphql@16.8.1"
6
+
},
7
+
"npm": {
8
+
"graphql@16.8.1": {
9
+
"integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==",
10
+
"dependencies": {}
11
+
},
12
+
"iterall@1.3.0": {
13
+
"integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==",
14
+
"dependencies": {}
15
+
},
16
+
"nexus@1.3.0_graphql@16.8.1": {
17
+
"integrity": "sha512-w/s19OiNOs0LrtP7pBmD9/FqJHvZLmCipVRt6v1PM8cRUYIbhEswyNKGHVoC4eHZGPSnD+bOf5A3+gnbt0A5/A==",
18
+
"dependencies": {
19
+
"graphql": "graphql@16.8.1",
20
+
"iterall": "iterall@1.3.0",
21
+
"tslib": "tslib@2.6.2"
22
+
}
23
+
},
24
+
"tslib@2.6.2": {
25
+
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
26
+
"dependencies": {}
27
+
}
28
+
}
29
+
},
30
+
"remote": {
31
+
"https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/deps.ts": "096395daebc7ed8a18f0484e4ffcc3a7f70e50946735f7df9611a7fcfd8272cc",
32
+
"https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/mod.ts": "e269d71c72ae68e82c1960e5db2a0c7419c97c9683ef717de0ab75d90f364713",
33
+
"https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/src/tar.ts": "9b02eaaa784b225ad7a23d2769cd492adf113ea7c11c02e3646849e98f4ae43b",
34
+
"https://deno.land/std@0.129.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
35
+
"https://deno.land/std@0.129.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617",
36
+
"https://deno.land/std@0.129.0/archive/tar.ts": "35ea1baddec7988cc4034765a2cee7613bc8074bd40940d3f5e98f63070a716a",
37
+
"https://deno.land/std@0.129.0/async/abortable.ts": "a896ac6b0d4237bd2d2d248217cfa1f0d85ccda93cb25ebda55e33850e526be6",
38
+
"https://deno.land/std@0.129.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0",
39
+
"https://deno.land/std@0.129.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620",
40
+
"https://deno.land/std@0.129.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a",
41
+
"https://deno.land/std@0.129.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c",
42
+
"https://deno.land/std@0.129.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f",
43
+
"https://deno.land/std@0.129.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e",
44
+
"https://deno.land/std@0.129.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082",
45
+
"https://deno.land/std@0.129.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f",
46
+
"https://deno.land/std@0.129.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
47
+
"https://deno.land/std@0.129.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
48
+
"https://deno.land/std@0.129.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9",
49
+
"https://deno.land/std@0.129.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f",
50
+
"https://deno.land/std@0.129.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130",
51
+
"https://deno.land/std@0.129.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
52
+
"https://deno.land/std@0.129.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379",
53
+
"https://deno.land/std@0.129.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f",
54
+
"https://deno.land/std@0.129.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d",
55
+
"https://deno.land/std@0.129.0/fs/ensure_file.ts": "7d353e64fee3d4d1e7c6b6726a2a5e987ba402c15fb49566309042887349c545",
56
+
"https://deno.land/std@0.129.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
57
+
"https://deno.land/std@0.129.0/io/files.ts": "d199ef64e918a256320ba8d8d44ae91de87c9077df8f8d6cca013f1b9fbbe285",
58
+
"https://deno.land/std@0.129.0/io/readers.ts": "679471f3b9929b54393c9cd75b6bd178b4bc6d9aab5c0f1f9538f862cf4746fe",
59
+
"https://deno.land/std@0.129.0/io/util.ts": "078da53bba767bec0d45f7da44411f6dbf269e51ef7fcfea5e3714e04681c674",
60
+
"https://deno.land/std@0.129.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d",
61
+
"https://deno.land/std@0.129.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9",
62
+
"https://deno.land/std@0.129.0/node/_events.mjs": "c0e3e0e290a8b81fee9d2973a529c8dcd5ebb4406782d1f91085274e2cb8490f",
63
+
"https://deno.land/std@0.129.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5",
64
+
"https://deno.land/std@0.129.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1",
65
+
"https://deno.land/std@0.129.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce",
66
+
"https://deno.land/std@0.129.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf",
67
+
"https://deno.land/std@0.129.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615",
68
+
"https://deno.land/std@0.129.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600",
69
+
"https://deno.land/std@0.129.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd",
70
+
"https://deno.land/std@0.129.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7",
71
+
"https://deno.land/std@0.129.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9",
72
+
"https://deno.land/std@0.129.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e",
73
+
"https://deno.land/std@0.129.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f",
74
+
"https://deno.land/std@0.129.0/node/internal/errors.ts": "0d3a1eb03b654beb29b8354759a6902f45a840d4f957e9a3c632a24ce4c32632",
75
+
"https://deno.land/std@0.129.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03",
76
+
"https://deno.land/std@0.129.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a",
77
+
"https://deno.land/std@0.129.0/node/internal/util.mjs": "684653b962fae84fd2bc08997291b1a50bed09b95dcfa7d35e3c4143163e879a",
78
+
"https://deno.land/std@0.129.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e",
79
+
"https://deno.land/std@0.129.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb",
80
+
"https://deno.land/std@0.129.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa",
81
+
"https://deno.land/std@0.129.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60",
82
+
"https://deno.land/std@0.129.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a",
83
+
"https://deno.land/std@0.129.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519",
84
+
"https://deno.land/std@0.129.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b",
85
+
"https://deno.land/std@0.129.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94",
86
+
"https://deno.land/std@0.129.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2",
87
+
"https://deno.land/std@0.129.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9",
88
+
"https://deno.land/std@0.129.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc",
89
+
"https://deno.land/std@0.129.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227",
90
+
"https://deno.land/std@0.129.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7",
91
+
"https://deno.land/std@0.129.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7",
92
+
"https://deno.land/std@0.129.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba",
93
+
"https://deno.land/std@0.129.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630",
94
+
"https://deno.land/std@0.129.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60",
95
+
"https://deno.land/std@0.129.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
96
+
"https://deno.land/std@0.129.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
97
+
"https://deno.land/std@0.129.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
98
+
"https://deno.land/std@0.129.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
99
+
"https://deno.land/std@0.129.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
100
+
"https://deno.land/std@0.129.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7",
101
+
"https://deno.land/std@0.129.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb",
102
+
"https://deno.land/std@0.129.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
103
+
"https://deno.land/std@0.129.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e",
104
+
"https://deno.land/std@0.129.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21",
105
+
"https://deno.land/std@0.129.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392",
106
+
"https://deno.land/std@0.129.0/testing/asserts.ts": "0a95d9e8076dd3e7f0eeb605a67c148078b4b11f4abcd5eef115b0361b0736a2",
107
+
"https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
108
+
"https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118",
109
+
"https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
110
+
"https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
111
+
"https://deno.land/std@0.191.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea",
112
+
"https://deno.land/std@0.191.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7",
113
+
"https://deno.land/std@0.191.0/testing/asserts.ts": "e16d98b4d73ffc4ed498d717307a12500ae4f2cbe668f1a215632d19fcffc22f",
114
+
"https://deno.land/std@0.203.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee",
115
+
"https://deno.land/std@0.203.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56",
116
+
"https://deno.land/std@0.203.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343",
117
+
"https://deno.land/std@0.203.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
118
+
"https://deno.land/std@0.203.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395",
119
+
"https://deno.land/std@0.203.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664",
120
+
"https://deno.land/std@0.203.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4",
121
+
"https://deno.land/std@0.203.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581",
122
+
"https://deno.land/std@0.203.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
123
+
"https://deno.land/std@0.203.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c",
124
+
"https://deno.land/std@0.203.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e",
125
+
"https://deno.land/std@0.203.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81",
126
+
"https://deno.land/std@0.203.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2",
127
+
"https://deno.land/std@0.203.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa",
128
+
"https://deno.land/std@0.203.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5",
129
+
"https://deno.land/std@0.203.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6",
130
+
"https://deno.land/std@0.203.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8",
131
+
"https://deno.land/std@0.203.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8",
132
+
"https://deno.land/std@0.203.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221",
133
+
"https://deno.land/std@0.203.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930",
134
+
"https://deno.land/std@0.203.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
135
+
"https://deno.land/std@0.203.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd",
136
+
"https://deno.land/std@0.203.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf",
137
+
"https://deno.land/std@0.203.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5",
138
+
"https://deno.land/std@0.203.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac",
139
+
"https://deno.land/std@0.203.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed",
140
+
"https://deno.land/std@0.203.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1",
141
+
"https://deno.land/std@0.203.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8",
142
+
"https://deno.land/std@0.203.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532",
143
+
"https://deno.land/std@0.203.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955",
144
+
"https://deno.land/std@0.203.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394",
145
+
"https://deno.land/std@0.203.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b",
146
+
"https://deno.land/std@0.203.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61",
147
+
"https://deno.land/std@0.203.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc",
148
+
"https://deno.land/std@0.203.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f",
149
+
"https://deno.land/std@0.203.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31",
150
+
"https://deno.land/std@0.203.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d",
151
+
"https://deno.land/std@0.203.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd",
152
+
"https://deno.land/std@0.52.0/fmt/colors.ts": "ec9d653672a9a3c7b6eafe53c5bc797364a2db2dcf766ab649c1155fea7a80b2",
153
+
"https://deno.land/x/crc32@v0.2.0/mod.ts": "de7a3fa2d4ef24b96fc21e1cc4d2d65d1d2b1dcea92f63960e3e11bfa82df0fa",
154
+
"https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts": "79cc758901d20a3573d7e3cc2db9f0a5fe56833f4d9befcedc072b94d542eec7",
155
+
"https://deno.land/x/fluent_aws_codepipeline@v0.2.3/src/buildspec.ts": "fb07cbbf9473586cea66c0c508412080c2d4ba4e7f4ea0985661afeed445710b",
156
+
"https://deno.land/x/fluent_aws_codepipeline@v0.2.3/src/spec.ts": "c0ce4c6e2685e23a3abdeb9fc18012253199dae355b06189d8248b052301a63e",
157
+
"https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts": "6f3c62419b96251dd1b5d8d6a172c0a8724a73b7feec786e540f51f0c8a0f0fd",
158
+
"https://deno.land/x/fluent_azure_pipelines@v0.2.0/src/config.ts": "619f4c64dad9b510c5788d4939a8afe013cb7dfc993dfd32f2ff4d0a2140075e",
159
+
"https://deno.land/x/fluent_azure_pipelines@v0.2.0/src/spec.ts": "cab6e4a6afb0f16e6c406cfab87264a963734720c468532c4f778228d1f1758d",
160
+
"https://deno.land/x/fluent_circleci@v0.2.5/mod.ts": "6a885bf35dbe08a7e971aa105763d724dd2a09c237b6292c9cd5de540237af37",
161
+
"https://deno.land/x/fluent_circleci@v0.2.5/src/config.ts": "d7e9902b4c2fddfa61ff6a509f3a09adee161fae9f93029dcbc8ec7a7bbd990b",
162
+
"https://deno.land/x/fluent_circleci@v0.2.5/src/job.ts": "b6ffb66ef10cf0e26460a88e1614ef864b606571e8d72376eeb09254f66a9926",
163
+
"https://deno.land/x/fluent_circleci@v0.2.5/src/spec.ts": "eda462e9ff535dbc7d3eb7e47253948d40ebaaf34d964e0931a6a25cdd823736",
164
+
"https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts": "dc62b622791da77bc27f68e33cba618983a0770a9a12dcc9e0f9a61161bb90e5",
165
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/event.ts": "d44d42356a04aea7ba64ff9e9a12090f477605c27a940bbf80aba612e4e96d1e",
166
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/job_spec.ts": "93aa5b8b79cd8baaf875901322c4c38c27d4458439a831cb0ad86401b207a3dc",
167
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/step_spec.ts": "b399949d1fd9c45873cdda70d82c92e3d9d96ba9a1d5749f3010a1f242b20e35",
168
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/workflow.ts": "c9e3b7b3a59f7edff958eae8f27a8542f2a24889ea27c8aa016d0c0b0ca416c6",
169
+
"https://deno.land/x/fluent_github_actions@v0.2.1/src/workflow_spec.ts": "b5c696dc70ee3f777a565197c6a3a379d87d026e12d59942fef5b9dc72124c3a",
170
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts": "3becefe569f5c9814dffa1b534794a42b948481753a5903fa1b48d5337206ced",
171
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/environment.ts": "f12ee4fb50e5100fccec29dc1d35aa430bfe8373e84286a8ab9f7b8e178f14e3",
172
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/gitlabci.ts": "ef36465c41412ae94b919cfcb80b99ec1c04536dbf42ad09cd73abf3ea4d52a6",
173
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/gitlabci_spec.ts": "37f4ecef3ea414f57c54a360bc0178f5fad21b4a9db59d29d1961cd368febaed",
174
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/index.ts": "b5e374a24e3bca1d6fead0861f2c1b1e09e087a17e59297263f681ee71c972fe",
175
+
"https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/job.ts": "65a5be7f5816846919907aab00530044b571570a54a8a0bc967f4269a2ce99b7",
176
+
"https://deno.land/x/spinners@v1.1.2/mod.ts": "ed5b3562d4ea6c6887bc7e9844612b08a3bc3a3678ca77cc7dfdf461c362751e",
177
+
"https://deno.land/x/spinners@v1.1.2/spinner-types.ts": "c67e6962a0c738aa57b4d3ad9fe06c8c0131f93360acbf95456f2ba200fd8826",
178
+
"https://deno.land/x/spinners@v1.1.2/terminal-spinner.ts": "1cf0c38a423781734e2e538323c1992027830d741e90f0b81f532e5bc993d035",
179
+
"https://deno.land/x/spinners@v1.1.2/util.ts": "7083203bedbda2e6144a14a7dd093747a7a01e73d95637c888bae8ac22a1c58b",
180
+
"https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20",
181
+
"https://deno.land/x/zod@v3.22.1/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea",
182
+
"https://deno.land/x/zod@v3.22.1/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef",
183
+
"https://deno.land/x/zod@v3.22.1/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe",
184
+
"https://deno.land/x/zod@v3.22.1/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c",
185
+
"https://deno.land/x/zod@v3.22.1/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7",
186
+
"https://deno.land/x/zod@v3.22.1/helpers/parseUtil.ts": "f791e6e65a0340d85ad37d26cd7a3ba67126cd9957eac2b7163162155283abb1",
187
+
"https://deno.land/x/zod@v3.22.1/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7",
188
+
"https://deno.land/x/zod@v3.22.1/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e",
189
+
"https://deno.land/x/zod@v3.22.1/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774",
190
+
"https://deno.land/x/zod@v3.22.1/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268",
191
+
"https://deno.land/x/zod@v3.22.1/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c",
192
+
"https://deno.land/x/zod@v3.22.1/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4",
193
+
"https://deno.land/x/zod@v3.22.1/types.ts": "4edc1823385f446532c8c9f676d84550c6dc54b17135e34508576647d9612d0e",
194
+
"https://esm.sh/@dagger.io/dagger@0.8.4": "424bddc1457c1fc4975c978425730be068b5414e92dca7a64f2d80e2123c4719",
195
+
"https://esm.sh/graphql-tag@2.12.6": "2d8f017bc251d9e7346bafc3f3aef4b65f7fdc302c6e0d085e3359f44c893068",
196
+
"https://esm.sh/nanoid@4.0.2": "df5af492771eb7ed903cec5e5d8ff721bc75e6c09ddf9fc9263215c8497961f4",
197
+
"https://esm.sh/stringify-tree@1.1.1": "a0515b0f4fe97a6972047a588b7982592d9079e7aeac3323b0d26448a757cf84",
198
+
"https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
199
+
"https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372",
200
+
"https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94",
201
+
"https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416",
202
+
"https://esm.sh/v128/yaml@2.3.1": "8ef3aee065e93b03cebf8fd5a3418bc30131344b7f2b8c8ae27bf9f277416087",
203
+
"https://esm.sh/v128/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5",
204
+
"https://esm.sh/v131/yaml@2.3.1": "1fe2490feb3d9c6d2c71c64dbdbed90acd4164b00628b3c68a311b6731ca38b5",
205
+
"https://esm.sh/v131/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5",
206
+
"https://esm.sh/v132/@dagger.io/dagger@0.8.4/denonext/dagger.mjs": "a090c18168360a715fcc7ff731cc6cf940e8d08b8a5b18fa80983b47666118a9",
207
+
"https://esm.sh/v132/adm-zip@0.5.10/denonext/adm-zip.mjs": "bcdc3b866e0817ac4f1b2a3021dd0a9aafa2c65f1fd254511706b7924fa8b0b7",
208
+
"https://esm.sh/v132/chownr@2.0.0/denonext/chownr.mjs": "30b8f17084dfbe475a5052b615f706b06ddd17dca0535103340d485c6b94e952",
209
+
"https://esm.sh/v132/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6",
210
+
"https://esm.sh/v132/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "7c92cdafd952c699fe01eb7a0c29c7cc112c546068ff757cb8832fa110499f11",
211
+
"https://esm.sh/v132/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956",
212
+
"https://esm.sh/v132/execa@7.2.0/denonext/execa.mjs": "5aa1c5a07843e56fd4ff4e0728d11941122d9f3c4bc37600971aa8e75c86d3a6",
213
+
"https://esm.sh/v132/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "18bcb6852f74c79ad50261e900a8c5daf2e7c38ce6662859e4f6f61d18daa6ed",
214
+
"https://esm.sh/v132/get-stream@6.0.1/denonext/get-stream.mjs": "a947a16f8cb3052fd654a84f8b36b40ce96b6a5acfb3ad4ab69d814bcf3351fb",
215
+
"https://esm.sh/v132/graphql-request@6.1.0/denonext/graphql-request.mjs": "796e05cc81ad339ef182de57452ffc00e9fef874df14fbba41338ca893499733",
216
+
"https://esm.sh/v132/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "ca4302aabfeec9e4335103f1a3eeaf26277af50b828a3bcde7f262fcd4e98e1d",
217
+
"https://esm.sh/v132/graphql@16.8.0/denonext/graphql.mjs": "e10e0db78cbbef8215b2665e5ed46cbb28fc61ecdb560f9e8d304a610f51f5bc",
218
+
"https://esm.sh/v132/human-signals@4.3.1/denonext/human-signals.mjs": "3889110cedd907804443d018cffe0a1d892d5e7467661376caf967feff55cbe9",
219
+
"https://esm.sh/v132/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7",
220
+
"https://esm.sh/v132/isexe@2.0.0/denonext/isexe.mjs": "3cfefd270d1bfdfb864ee98dbb8f41d150cbf480925158f4a8f0ade8a9e17d6c",
221
+
"https://esm.sh/v132/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55",
222
+
"https://esm.sh/v132/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61",
223
+
"https://esm.sh/v132/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138",
224
+
"https://esm.sh/v132/minipass@3.3.6/denonext/minipass.mjs": "59bbe430514455e78cb30c389b21af66efb2bf010cda071820a17d8c76d0d1cf",
225
+
"https://esm.sh/v132/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401",
226
+
"https://esm.sh/v132/minizlib@2.1.2/denonext/minizlib.mjs": "2e35ea8aa6cb4caa6f9b6c5b3c8684460698c868363e134af26c28d0e76ded5f",
227
+
"https://esm.sh/v132/mkdirp@1.0.4/denonext/mkdirp.mjs": "091be31ee8a9c0f5f716b769bf81397ac70a587a5f2b0367e1e3bda26f5a8af7",
228
+
"https://esm.sh/v132/nanoid@4.0.2/denonext/nanoid.mjs": "4f26e89bc0867e6a838069435b3d75af305017d87ce5b51c9d6edc680954b52f",
229
+
"https://esm.sh/v132/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde",
230
+
"https://esm.sh/v132/node_fetch.js": "b11355358cf61343a3c30bd5942df60a3586d13e2c979b515164bfe851662798",
231
+
"https://esm.sh/v132/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "b97d372a504bcca269c98f5d13ba0671e47230aaaaa36c3554b4a705085044df",
232
+
"https://esm.sh/v132/onetime@6.0.0/denonext/onetime.mjs": "c0be3fa6d700bb157f9a710aaf23df049f70c6a7d7e66a7d76568c5177267c51",
233
+
"https://esm.sh/v132/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667",
234
+
"https://esm.sh/v132/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0",
235
+
"https://esm.sh/v132/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417",
236
+
"https://esm.sh/v132/shebang-command@2.0.0/denonext/shebang-command.mjs": "35a3eae8fe5ccaab6598ba16e81bfc06bc1b46128028cd4cf76d63786dcd54aa",
237
+
"https://esm.sh/v132/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9",
238
+
"https://esm.sh/v132/signal-exit@3.0.7/denonext/signal-exit.mjs": "2a176e5f9b351fa8057213c627a1503d63bf308b64447ef47f1ca6fbb2a91c81",
239
+
"https://esm.sh/v132/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "eaa9333a5219638ad170d12e12603ae00ae80fc8bf02cc112cfec7294e6bcb43",
240
+
"https://esm.sh/v132/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "03d9be4e8a249d63cbbddeb2fb675a1bbbcb335283e604d4ce56c88c90e6f102",
241
+
"https://esm.sh/v132/tar@6.2.0/denonext/tar.mjs": "f55c2f94c0ba1123048c9e3fa0af3a2bebac3af5a9895610865f05ae4d0b7f58",
242
+
"https://esm.sh/v132/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1",
243
+
"https://esm.sh/v132/which@2.0.2/denonext/which.mjs": "7482079af785ec16137592b26d53cb2808b05979559f5d0d9d036a80c6b1636e",
244
+
"https://esm.sh/v132/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82",
245
+
"https://esm.sh/v132/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5",
246
+
"https://esm.sh/yaml@v2.3.1": "5471fa3592a8a9d1a4a3d8cacf54070b01aedaca82f14fdbbdd056a491db00ec",
247
+
"https://nix.fluentci.io/v0.5.1/deps.ts": "d2fee07fcb79b609f64f988990ad5d67c7bf17455f75dcbf1b3bbfa5de7c73b2",
248
+
"https://nix.fluentci.io/v0.5.1/src/dagger/steps.ts": "b766f4fa9624a032e7af884a5ca47bc666a529c4a472d38b74b55ca0d63cf81d",
249
+
"https://nix.fluentci.io/zenith/deps.ts": "a8fd3aa32faea5de2779cc6494471b4fd9588f039d199ff1a1ff1b00343aef26",
250
+
"https://nix.fluentci.io/zenith/src/dagger/steps.ts": "b766f4fa9624a032e7af884a5ca47bc666a529c4a472d38b74b55ca0d63cf81d",
251
+
"https://sdk.fluentci.io/v0.1.9/deps.ts": "1b036b7614a602b11e062a6911f26a6e2ac4e470cc74ac230125afd466cc77ea",
252
+
"https://sdk.fluentci.io/v0.1.9/mod.ts": "a3c03bdb97c5a3b998c7c9f616c7b00d4268013c3b16e8a90c1a36a85529d841",
253
+
"https://sdk.fluentci.io/v0.1.9/src/client.ts": "a8dd54861feccd11a53df39b2d45bfb3b2a8a3dff509f5700c41b517d4dff44d",
254
+
"https://sdk.fluentci.io/v0.1.9/src/connect.ts": "1bb42b4e0c5073bb2125b90f1d7d08a66fcad9ad8c453924b944be72d3a56c98",
255
+
"https://sdk.fluentci.io/v0.1.9/src/context.ts": "2939ff58d0a79d7377d5553e725c9a2110a0013035a5a57abe9a9a5da975c4ce",
256
+
"https://sdk.fluentci.io/v0.1.9/src/utils.ts": "394d131cfd465f0f3d8f876237f3bad1ab4dba73b9b7a396ee705d02aee40c16",
257
+
"https://sdk.fluentci.io/z1/deps.ts": "1b036b7614a602b11e062a6911f26a6e2ac4e470cc74ac230125afd466cc77ea",
258
+
"https://sdk.fluentci.io/z1/mod.ts": "261ba81a4728f5def4e327a5cd80664ea8449515a2f4eea5f3f416acae39a1fa",
259
+
"https://sdk.fluentci.io/z1/src/client.ts": "dde6d20c41df43e5bb7763782eb3702a8d830a827444d1fb388fc574b2e6a64c",
260
+
"https://sdk.fluentci.io/z1/src/connect.ts": "4aff111c403cf78672384a10214a9885e08319dde579ec458f98a7bb04874101",
261
+
"https://sdk.fluentci.io/z1/src/context.ts": "2939ff58d0a79d7377d5553e725c9a2110a0013035a5a57abe9a9a5da975c4ce",
262
+
"https://sdk.fluentci.io/z1/src/utils.ts": "5dcd6d83553930502069d067ff42bc44698e22c23426fdb78630c4b39769d308"
263
+
}
264
+
}
+34
.fluentci/example/.fluentci/deps.ts
+34
.fluentci/example/.fluentci/deps.ts
···
···
1
+
export { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import Client from "https://sdk.fluentci.io/z1/mod.ts";
3
+
export default Client;
4
+
5
+
export {
6
+
connect,
7
+
uploadContext,
8
+
CacheSharingMode,
9
+
} from "https://sdk.fluentci.io/z1/mod.ts";
10
+
export { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts";
11
+
export { withDevbox } from "https://nix.fluentci.io/zenith/src/dagger/steps.ts";
12
+
export { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1";
13
+
import gql from "https://esm.sh/graphql-tag@2.12.6";
14
+
export { gql };
15
+
16
+
export {
17
+
arg,
18
+
queryType,
19
+
stringArg,
20
+
intArg,
21
+
nonNull,
22
+
makeSchema,
23
+
} from "npm:nexus";
24
+
export {
25
+
dirname,
26
+
join,
27
+
resolve,
28
+
} from "https://deno.land/std@0.203.0/path/mod.ts";
29
+
30
+
export * as FluentGitlabCI from "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts";
31
+
export * as FluentGithubActions from "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts";
32
+
export * as FluentCircleCI from "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts";
33
+
export * as FluentAzurePipelines from "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts";
34
+
export * as FluentAWSCodePipeline from "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts";
+24
.fluentci/example/.fluentci/example/.github/workflows/tests.yml
+24
.fluentci/example/.fluentci/example/.github/workflows/tests.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent Github Actions
2
+
3
+
name: Test
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
test:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Tests and Build
24
+
run: dagger run fluentci rust_pipeline test build
+1
.fluentci/example/.fluentci/example/.gitignore
+1
.fluentci/example/.fluentci/example/.gitignore
···
···
1
+
target/
+7
.fluentci/example/.fluentci/example/Cargo.lock
+7
.fluentci/example/.fluentci/example/Cargo.lock
+8
.fluentci/example/.fluentci/example/Cargo.toml
+8
.fluentci/example/.fluentci/example/Cargo.toml
+5
.fluentci/example/.fluentci/example/build.gql
+5
.fluentci/example/.fluentci/example/build.gql
+14
.fluentci/example/.fluentci/example/src/lib.rs
+14
.fluentci/example/.fluentci/example/src/lib.rs
+5
.fluentci/example/.fluentci/example/test.gql
+5
.fluentci/example/.fluentci/example/test.gql
+28
.fluentci/example/.fluentci/fixtures/.gitlab-ci.yml
+28
.fluentci/example/.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_gitlab_ci
2
+
3
+
.docker:
4
+
image: denoland/deno:alpine
5
+
services:
6
+
- docker:${DOCKER_VERSION}-dind
7
+
variables:
8
+
DOCKER_HOST: tcp://docker:2376
9
+
DOCKER_TLS_VERIFY: "1"
10
+
DOCKER_TLS_CERTDIR: /certs
11
+
DOCKER_CERT_PATH: /certs/client
12
+
DOCKER_DRIVER: overlay2
13
+
DOCKER_VERSION: 20.10.16
14
+
15
+
.dagger:
16
+
extends: .docker
17
+
before_script:
18
+
- apk add docker-cli curl unzip
19
+
- deno install -A -r https://cli.fluentci.io -n fluentci
20
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
- mv bin/dagger /usr/local/bin
22
+
- dagger version
23
+
24
+
tests:
25
+
extends: .dagger
26
+
script:
27
+
- fluentci run rust_pipeline test build
28
+
+22
.fluentci/example/.fluentci/fixtures/azure-pipelines.yml
+22
.fluentci/example/.fluentci/fixtures/azure-pipelines.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_azure_pipelines
2
+
3
+
trigger:
4
+
- main
5
+
pool:
6
+
name: Default
7
+
vmImage: ubuntu-latest
8
+
steps:
9
+
- script: |
10
+
curl -fsSL https://deno.land/x/install/install.sh | sh
11
+
export DENO_INSTALL="$HOME/.deno"
12
+
export PATH="$DENO_INSTALL/bin:$PATH"
13
+
displayName: Install Deno
14
+
- script: deno install -A -r https://cli.fluentci.io -n fluentci
15
+
displayName: Setup Fluent CI CLI
16
+
- script: |
17
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
18
+
sudo mv bin/dagger /usr/local/bin
19
+
dagger version
20
+
displayName: Setup Dagger
21
+
- script: fluentci run rust_pipeline test build
22
+
displayName: Run Dagger Pipelines
+19
.fluentci/example/.fluentci/fixtures/buildspec.yml
+19
.fluentci/example/.fluentci/fixtures/buildspec.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_aws_codepipeline
2
+
3
+
version: 0.2
4
+
phases:
5
+
install:
6
+
commands:
7
+
- curl -fsSL https://deno.land/x/install/install.sh | sh
8
+
- export DENO_INSTALL="$HOME/.deno"
9
+
- export PATH="$DENO_INSTALL/bin:$PATH"
10
+
- deno install -A -r https://cli.fluentci.io -n fluentci
11
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
- mv bin/dagger /usr/local/bin
13
+
- dagger version
14
+
build:
15
+
commands:
16
+
- fluentci run rust_pipeline test build
17
+
post_build:
18
+
commands:
19
+
- echo Build completed on `date`
+26
.fluentci/example/.fluentci/fixtures/config.yml
+26
.fluentci/example/.fluentci/fixtures/config.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_circleci
2
+
3
+
version: 2.1
4
+
jobs:
5
+
tests:
6
+
steps:
7
+
- checkout
8
+
- run: sudo apt-get update && sudo apt-get install -y curl unzip
9
+
- run: |
10
+
curl -fsSL https://deno.land/x/install/install.sh | sh
11
+
export DENO_INSTALL="$HOME/.deno"
12
+
export PATH="$DENO_INSTALL/bin:$PATH"
13
+
- run: deno install -A -r https://cli.fluentci.io -n fluentci
14
+
- run: |
15
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
16
+
sudo mv bin/dagger /usr/local/bin
17
+
dagger version
18
+
- run:
19
+
name: Run Dagger Pipelines
20
+
command: fluentci run rust_pipeline test build
21
+
machine:
22
+
image: ubuntu-2004:2023.07.1
23
+
workflows:
24
+
dagger:
25
+
jobs:
26
+
- tests
+24
.fluentci/example/.fluentci/fixtures/workflow.yml
+24
.fluentci/example/.fluentci/fixtures/workflow.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
2
+
3
+
name: Test
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
test:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Tests and Build
24
+
run: fluentci run rust_pipeline test build
+139
.fluentci/example/.fluentci/gen/nexus.ts
+139
.fluentci/example/.fluentci/gen/nexus.ts
···
···
1
+
/**
2
+
* This file was generated by Nexus Schema
3
+
* Do not make changes to this file directly
4
+
*/
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
declare global {
13
+
interface NexusGen extends NexusGenTypes {}
14
+
}
15
+
16
+
export interface NexusGenInputs {
17
+
}
18
+
19
+
export interface NexusGenEnums {
20
+
}
21
+
22
+
export interface NexusGenScalars {
23
+
String: string
24
+
Int: number
25
+
Float: number
26
+
Boolean: boolean
27
+
ID: string
28
+
}
29
+
30
+
export interface NexusGenObjects {
31
+
Query: {};
32
+
}
33
+
34
+
export interface NexusGenInterfaces {
35
+
}
36
+
37
+
export interface NexusGenUnions {
38
+
}
39
+
40
+
export type NexusGenRootTypes = NexusGenObjects
41
+
42
+
export type NexusGenAllTypes = NexusGenRootTypes & NexusGenScalars
43
+
44
+
export interface NexusGenFieldTypes {
45
+
Query: { // field return type
46
+
build: string | null; // String
47
+
test: string | null; // String
48
+
}
49
+
}
50
+
51
+
export interface NexusGenFieldTypeNames {
52
+
Query: { // field return type name
53
+
build: 'String'
54
+
test: 'String'
55
+
}
56
+
}
57
+
58
+
export interface NexusGenArgTypes {
59
+
Query: {
60
+
build: { // args
61
+
src: string; // String!
62
+
}
63
+
test: { // args
64
+
src: string; // String!
65
+
}
66
+
}
67
+
}
68
+
69
+
export interface NexusGenAbstractTypeMembers {
70
+
}
71
+
72
+
export interface NexusGenTypeInterfaces {
73
+
}
74
+
75
+
export type NexusGenObjectNames = keyof NexusGenObjects;
76
+
77
+
export type NexusGenInputNames = never;
78
+
79
+
export type NexusGenEnumNames = never;
80
+
81
+
export type NexusGenInterfaceNames = never;
82
+
83
+
export type NexusGenScalarNames = keyof NexusGenScalars;
84
+
85
+
export type NexusGenUnionNames = never;
86
+
87
+
export type NexusGenObjectsUsingAbstractStrategyIsTypeOf = never;
88
+
89
+
export type NexusGenAbstractsUsingStrategyResolveType = never;
90
+
91
+
export type NexusGenFeaturesConfig = {
92
+
abstractTypeStrategies: {
93
+
isTypeOf: false
94
+
resolveType: true
95
+
__typename: false
96
+
}
97
+
}
98
+
99
+
export interface NexusGenTypes {
100
+
context: any;
101
+
inputTypes: NexusGenInputs;
102
+
rootTypes: NexusGenRootTypes;
103
+
inputTypeShapes: NexusGenInputs & NexusGenEnums & NexusGenScalars;
104
+
argTypes: NexusGenArgTypes;
105
+
fieldTypes: NexusGenFieldTypes;
106
+
fieldTypeNames: NexusGenFieldTypeNames;
107
+
allTypes: NexusGenAllTypes;
108
+
typeInterfaces: NexusGenTypeInterfaces;
109
+
objectNames: NexusGenObjectNames;
110
+
inputNames: NexusGenInputNames;
111
+
enumNames: NexusGenEnumNames;
112
+
interfaceNames: NexusGenInterfaceNames;
113
+
scalarNames: NexusGenScalarNames;
114
+
unionNames: NexusGenUnionNames;
115
+
allInputTypes: NexusGenTypes['inputNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['scalarNames'];
116
+
allOutputTypes: NexusGenTypes['objectNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['unionNames'] | NexusGenTypes['interfaceNames'] | NexusGenTypes['scalarNames'];
117
+
allNamedTypes: NexusGenTypes['allInputTypes'] | NexusGenTypes['allOutputTypes']
118
+
abstractTypes: NexusGenTypes['interfaceNames'] | NexusGenTypes['unionNames'];
119
+
abstractTypeMembers: NexusGenAbstractTypeMembers;
120
+
objectsUsingAbstractStrategyIsTypeOf: NexusGenObjectsUsingAbstractStrategyIsTypeOf;
121
+
abstractsUsingStrategyResolveType: NexusGenAbstractsUsingStrategyResolveType;
122
+
features: NexusGenFeaturesConfig;
123
+
}
124
+
125
+
126
+
declare global {
127
+
interface NexusGenPluginTypeConfig<TypeName extends string> {
128
+
}
129
+
interface NexusGenPluginInputTypeConfig<TypeName extends string> {
130
+
}
131
+
interface NexusGenPluginFieldConfig<TypeName extends string, FieldName extends string> {
132
+
}
133
+
interface NexusGenPluginInputFieldConfig<TypeName extends string, FieldName extends string> {
134
+
}
135
+
interface NexusGenPluginSchemaConfig {
136
+
}
137
+
interface NexusGenPluginArgConfig {
138
+
}
139
+
}
+34
.fluentci/example/.fluentci/import_map.json
+34
.fluentci/example/.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@fluentci.io/dagger": "https://sdk.fluentci.io/v0.1.9/mod.ts",
4
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.8.4",
5
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
6
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
7
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts",
8
+
"fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts",
9
+
"fluent_circleci": "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts",
10
+
"fluent_azure_pipelines": "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts",
11
+
"fluent_aws_codepipeline": "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts",
12
+
"crypto": "node:crypto",
13
+
"fs": "node:fs",
14
+
"os": "node:os",
15
+
"path": "node:path",
16
+
"process": "node:process",
17
+
"readline": "node:readline",
18
+
"url": "node:url"
19
+
},
20
+
"scopes": {
21
+
"https://esm.sh/v128/": {
22
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
23
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
24
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
25
+
"execa": "https://esm.sh/v128/execa@7.1.1",
26
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
27
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
28
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
29
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
30
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
31
+
"tar": "https://esm.sh/v128/tar@6.1.15"
32
+
}
33
+
}
34
+
}
+3
.fluentci/example/.fluentci/mod.ts
+3
.fluentci/example/.fluentci/mod.ts
+8
.fluentci/example/.fluentci/schema.graphql
+8
.fluentci/example/.fluentci/schema.graphql
+39
.fluentci/example/.fluentci/src/aws/README.md
+39
.fluentci/example/.fluentci/src/aws/README.md
···
···
1
+
# AWS CodePipeline
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `buildspec.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci ac init -t rust_pipeline
12
+
```
13
+
14
+
Generated file:
15
+
16
+
```yaml
17
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_aws_codepipeline
18
+
19
+
version: 0.2
20
+
phases:
21
+
install:
22
+
commands:
23
+
- curl -fsSL https://deno.land/x/install/install.sh | sh
24
+
- export DENO_INSTALL="$HOME/.deno"
25
+
- export PATH="$DENO_INSTALL/bin:$PATH"
26
+
- deno install -A -r https://cli.fluentci.io -n fluentci
27
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
28
+
- mv bin/dagger /usr/local/bin
29
+
- dagger version
30
+
build:
31
+
commands:
32
+
- fluentci run rust_pipeline test build
33
+
post_build:
34
+
commands:
35
+
- echo Build completed on `date`
36
+
37
+
```
38
+
39
+
Feel free to edit the template generator at `.fluentci/src/aws/config.ts` to your needs.
+24
.fluentci/example/.fluentci/src/aws/config.ts
+24
.fluentci/example/.fluentci/src/aws/config.ts
···
···
1
+
import { BuildSpec } from "fluent_aws_codepipeline";
2
+
3
+
export function generateYaml(): BuildSpec {
4
+
const buildspec = new BuildSpec();
5
+
buildspec
6
+
.phase("install", {
7
+
commands: [
8
+
"curl -fsSL https://deno.land/x/install/install.sh | sh",
9
+
'export DENO_INSTALL="$HOME/.deno"',
10
+
'export PATH="$DENO_INSTALL/bin:$PATH"',
11
+
"deno install -A -r https://cli.fluentci.io -n fluentci",
12
+
"curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh",
13
+
"mv bin/dagger /usr/local/bin",
14
+
"dagger version",
15
+
],
16
+
})
17
+
.phase("build", {
18
+
commands: ["fluentci run rust_pipeline test build"],
19
+
})
20
+
.phase("post_build", {
21
+
commands: ["echo Build completed on `date`"],
22
+
});
23
+
return buildspec;
24
+
}
+9
.fluentci/example/.fluentci/src/aws/config_test.ts
+9
.fluentci/example/.fluentci/src/aws/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateAWSCodePipelineTest() {
5
+
const buildspec = generateYaml();
6
+
const actual = buildspec.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/buildspec.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/example/.fluentci/src/aws/init.ts
+3
.fluentci/example/.fluentci/src/aws/init.ts
+42
.fluentci/example/.fluentci/src/azure/README.md
+42
.fluentci/example/.fluentci/src/azure/README.md
···
···
1
+
# Azure Pipelines
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `azure-pipelines.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci ap init -t rust_pipeline
12
+
```
13
+
14
+
Generated file:
15
+
16
+
```yaml
17
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_azure_pipelines
18
+
19
+
trigger:
20
+
- main
21
+
pool:
22
+
name: Default
23
+
vmImage: ubuntu-latest
24
+
steps:
25
+
- script: |
26
+
curl -fsSL https://deno.land/x/install/install.sh | sh
27
+
export DENO_INSTALL="$HOME/.deno"
28
+
export PATH="$DENO_INSTALL/bin:$PATH"
29
+
displayName: Install Deno
30
+
- script: deno install -A -r https://cli.fluentci.io -n fluentci
31
+
displayName: Setup Fluent CI CLI
32
+
- script: |
33
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
34
+
sudo mv bin/dagger /usr/local/bin
35
+
dagger version
36
+
displayName: Setup Dagger
37
+
- script: fluentci run rust_pipeline test build
38
+
displayName: Run Dagger Pipelines
39
+
40
+
```
41
+
42
+
Feel free to edit the template generator at `.fluentci/src/azure/config.ts` to your needs.
+41
.fluentci/example/.fluentci/src/azure/config.ts
+41
.fluentci/example/.fluentci/src/azure/config.ts
···
···
1
+
import { AzurePipeline } from "fluent_azure_pipelines";
2
+
3
+
export function generateYaml(): AzurePipeline {
4
+
const azurePipeline = new AzurePipeline();
5
+
6
+
const installDeno = `\
7
+
curl -fsSL https://deno.land/x/install/install.sh | sh
8
+
export DENO_INSTALL="$HOME/.deno"
9
+
export PATH="$DENO_INSTALL/bin:$PATH"
10
+
`;
11
+
12
+
const setupDagger = `\
13
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
14
+
sudo mv bin/dagger /usr/local/bin
15
+
dagger version
16
+
`;
17
+
18
+
azurePipeline
19
+
.trigger(["main"])
20
+
.pool({
21
+
name: "Default",
22
+
vmImage: "ubuntu-latest",
23
+
})
24
+
.step({
25
+
script: installDeno,
26
+
displayName: "Install Deno",
27
+
})
28
+
.step({
29
+
script: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
displayName: "Setup Fluent CI CLI",
31
+
})
32
+
.step({
33
+
script: setupDagger,
34
+
displayName: "Setup Dagger",
35
+
})
36
+
.step({
37
+
script: "fluentci run rust_pipeline test build",
38
+
displayName: "Run Dagger Pipelines",
39
+
});
40
+
return azurePipeline;
41
+
}
+9
.fluentci/example/.fluentci/src/azure/config_test.ts
+9
.fluentci/example/.fluentci/src/azure/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateAzurePipelinesTest() {
5
+
const azurepipelines = generateYaml();
6
+
const actual = azurepipelines.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/azure-pipelines.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/example/.fluentci/src/azure/init.ts
+3
.fluentci/example/.fluentci/src/azure/init.ts
+47
.fluentci/example/.fluentci/src/circleci/README.md
+47
.fluentci/example/.fluentci/src/circleci/README.md
···
···
1
+
# Circle CI
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
9
+
The following command will generate a `.circleci/config.yml` file in your project:
10
+
11
+
```bash
12
+
fluentci cci init -t rust_pipeline
13
+
```
14
+
15
+
Generated file:
16
+
17
+
```yaml
18
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_circleci
19
+
20
+
version: 2.1
21
+
jobs:
22
+
tests:
23
+
steps:
24
+
- checkout
25
+
- run: sudo apt-get update && sudo apt-get install -y curl unzip
26
+
- run: |
27
+
curl -fsSL https://deno.land/x/install/install.sh | sh
28
+
export DENO_INSTALL="$HOME/.deno"
29
+
export PATH="$DENO_INSTALL/bin:$PATH"
30
+
- run: deno install -A -r https://cli.fluentci.io -n fluentci
31
+
- run: |
32
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
33
+
sudo mv bin/dagger /usr/local/bin
34
+
dagger version
35
+
- run:
36
+
name: Upload Coverage
37
+
command: fluentci run rust_pipeline test build
38
+
machine:
39
+
image: ubuntu-2004:2023.07.1
40
+
workflows:
41
+
dagger:
42
+
jobs:
43
+
- tests
44
+
45
+
```
46
+
47
+
Feel free to edit the template generator at `.fluentci/src/circleci/config.ts` to your needs.
+37
.fluentci/example/.fluentci/src/circleci/config.ts
+37
.fluentci/example/.fluentci/src/circleci/config.ts
···
···
1
+
import { CircleCI, Job } from "fluent_circleci";
2
+
3
+
export function generateYaml(): CircleCI {
4
+
const circleci = new CircleCI();
5
+
6
+
const tests = new Job().machine({ image: "ubuntu-2004:2023.07.1" }).steps([
7
+
"checkout",
8
+
{
9
+
run: "sudo apt-get update && sudo apt-get install -y curl unzip",
10
+
},
11
+
{
12
+
run: `\
13
+
curl -fsSL https://deno.land/x/install/install.sh | sh
14
+
export DENO_INSTALL="$HOME/.deno"
15
+
export PATH="$DENO_INSTALL/bin:$PATH"`,
16
+
},
17
+
{
18
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
19
+
},
20
+
{
21
+
run: `\
22
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
23
+
sudo mv bin/dagger /usr/local/bin
24
+
dagger version`,
25
+
},
26
+
{
27
+
run: {
28
+
name: "Run Dagger Pipelines",
29
+
command: "fluentci run rust_pipeline test build",
30
+
},
31
+
},
32
+
]);
33
+
34
+
circleci.jobs({ tests }).workflow("dagger", ["tests"]);
35
+
36
+
return circleci;
37
+
}
+9
.fluentci/example/.fluentci/src/circleci/config_test.ts
+9
.fluentci/example/.fluentci/src/circleci/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateCircleCITest() {
5
+
const circleci = generateYaml();
6
+
const actual = circleci.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/config.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/example/.fluentci/src/circleci/init.ts
+3
.fluentci/example/.fluentci/src/circleci/init.ts
+4
.fluentci/example/.fluentci/src/dagger/index.ts
+4
.fluentci/example/.fluentci/src/dagger/index.ts
+67
.fluentci/example/.fluentci/src/dagger/jobs.ts
+67
.fluentci/example/.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client, { connect } from "../../deps.ts";
2
+
3
+
export enum Job {
4
+
test = "test",
5
+
build = "build",
6
+
}
7
+
8
+
export const exclude = ["target", ".git", ".devbox", ".fluentci"];
9
+
10
+
export const test = async (src = ".", options: string[] = []) => {
11
+
await connect(async (client: Client) => {
12
+
const context = client.host().directory(src);
13
+
const ctr = client
14
+
.pipeline(Job.test)
15
+
.container()
16
+
.from("rust:latest")
17
+
.withDirectory("/app", context, { exclude })
18
+
.withWorkdir("/app")
19
+
.withMountedCache("/app/target", client.cacheVolume("target"))
20
+
.withMountedCache("/root/cargo/registry", client.cacheVolume("registry"))
21
+
.withExec(["cargo", "test", ...options]);
22
+
23
+
const result = await ctr.stdout();
24
+
25
+
console.log(result);
26
+
});
27
+
return "done";
28
+
};
29
+
30
+
export const build = async (src = ".", options: string[] = []) => {
31
+
await connect(async (client: Client) => {
32
+
const context = client.host().directory(src);
33
+
const ctr = client
34
+
.pipeline(Job.build)
35
+
.container()
36
+
.from("rust:latest")
37
+
.withDirectory("/app", context, { exclude })
38
+
.withWorkdir("/app")
39
+
.withMountedCache("/app/target", client.cacheVolume("target"))
40
+
.withMountedCache("/root/cargo/registry", client.cacheVolume("registry"))
41
+
.withExec(["cargo", "build", "--release", ...options]);
42
+
43
+
const result = await ctr.stdout();
44
+
45
+
console.log(result);
46
+
});
47
+
return "done";
48
+
};
49
+
50
+
export type JobExec = (src?: string) =>
51
+
| Promise<string>
52
+
| ((
53
+
src?: string,
54
+
options?: {
55
+
ignore: string[];
56
+
}
57
+
) => Promise<string>);
58
+
59
+
export const runnableJobs: Record<Job, JobExec> = {
60
+
[Job.test]: test,
61
+
[Job.build]: build,
62
+
};
63
+
64
+
export const jobDescriptions: Record<Job, string> = {
65
+
[Job.test]: "Run tests",
66
+
[Job.build]: "Build the project",
67
+
};
+20
.fluentci/example/.fluentci/src/dagger/list_jobs.ts
+20
.fluentci/example/.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen, stringifyTree } from "../../deps.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
4
+
const tree = {
5
+
name: brightGreen("rust_pipeline"),
6
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
7
+
name: jobDescriptions[job]
8
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
9
+
: brightGreen(job),
10
+
children: [],
11
+
})),
12
+
};
13
+
14
+
console.log(
15
+
stringifyTree(
16
+
tree,
17
+
(t) => t.name,
18
+
(t) => t.children
19
+
)
20
+
);
+29
.fluentci/example/.fluentci/src/dagger/pipeline.ts
+29
.fluentci/example/.fluentci/src/dagger/pipeline.ts
···
···
1
+
import { uploadContext } from "../../deps.ts";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { build, test, exclude } = jobs;
5
+
6
+
export default async function pipeline(src = ".", args: string[] = []) {
7
+
if (Deno.env.has("FLUENTCI_SESSION_ID")) {
8
+
await uploadContext(src, exclude);
9
+
}
10
+
11
+
if (args.length > 0) {
12
+
await runSpecificJobs(args);
13
+
return;
14
+
}
15
+
16
+
await test(src);
17
+
await build(src);
18
+
}
19
+
20
+
async function runSpecificJobs(args: string[]) {
21
+
for (const name of args) {
22
+
// deno-lint-ignore no-explicit-any
23
+
const job = (jobs as any)[name];
24
+
if (!job) {
25
+
throw new Error(`Job ${name} not found`);
26
+
}
27
+
await job();
28
+
}
29
+
}
+13
.fluentci/example/.fluentci/src/dagger/queries.ts
+13
.fluentci/example/.fluentci/src/dagger/queries.ts
+3
.fluentci/example/.fluentci/src/dagger/runner.ts
+3
.fluentci/example/.fluentci/src/dagger/runner.ts
+36
.fluentci/example/.fluentci/src/dagger/schema.ts
+36
.fluentci/example/.fluentci/src/dagger/schema.ts
···
···
1
+
import {
2
+
queryType,
3
+
makeSchema,
4
+
dirname,
5
+
join,
6
+
resolve,
7
+
stringArg,
8
+
nonNull,
9
+
} from "../../deps.ts";
10
+
11
+
import { test, build } from "./jobs.ts";
12
+
13
+
const Query = queryType({
14
+
definition(t) {
15
+
t.string("test", {
16
+
args: {
17
+
src: nonNull(stringArg()),
18
+
},
19
+
resolve: async (_root, args, _ctx) => await test(args.src),
20
+
});
21
+
t.string("build", {
22
+
args: {
23
+
src: nonNull(stringArg()),
24
+
},
25
+
resolve: async (_root, args, _ctx) => await build(args.src),
26
+
});
27
+
},
28
+
});
29
+
30
+
export const schema = makeSchema({
31
+
types: [Query],
32
+
outputs: {
33
+
schema: resolve(join(dirname(".."), dirname(".."), "schema.graphql")),
34
+
typegen: resolve(join(dirname(".."), dirname(".."), "gen", "nexus.ts")),
35
+
},
36
+
});
+50
.fluentci/example/.fluentci/src/github/README.md
+50
.fluentci/example/.fluentci/src/github/README.md
···
···
1
+
# Github Actions
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `.github/workflows/tests.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci gh init -t rust_pipeline
12
+
```
13
+
14
+
Or, if you already have a `.fluentci` folder (generated from `fluentci init -t rust`) in your project:
15
+
16
+
```bash
17
+
fluentci gh init
18
+
```
19
+
20
+
Generated file:
21
+
22
+
```yaml
23
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
24
+
25
+
name: Test
26
+
on:
27
+
push:
28
+
branches:
29
+
- main
30
+
jobs:
31
+
test:
32
+
runs-on: ubuntu-latest
33
+
steps:
34
+
- uses: actions/checkout@v2
35
+
- uses: denoland/setup-deno@v1
36
+
with:
37
+
deno-version: v1.37
38
+
- name: Setup Fluent CI CLI
39
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
40
+
- name: Setup Dagger
41
+
run: |
42
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
43
+
sudo mv bin/dagger /usr/local/bin
44
+
dagger version
45
+
- name: Run Tests and Build
46
+
run: fluentci run rust_pipeline test build
47
+
48
+
```
49
+
50
+
Feel free to edit the template generator at `.fluentci/src/github/config.ts` to your needs.
+45
.fluentci/example/.fluentci/src/github/config.ts
+45
.fluentci/example/.fluentci/src/github/config.ts
···
···
1
+
import { JobSpec, Workflow } from "fluent_github_actions";
2
+
3
+
export function generateYaml(): Workflow {
4
+
const workflow = new Workflow("Test");
5
+
6
+
const push = {
7
+
branches: ["main"],
8
+
};
9
+
10
+
const setupDagger = `\
11
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
sudo mv bin/dagger /usr/local/bin
13
+
dagger version`;
14
+
15
+
const test: JobSpec = {
16
+
"runs-on": "ubuntu-latest",
17
+
steps: [
18
+
{
19
+
uses: "actions/checkout@v2",
20
+
},
21
+
{
22
+
uses: "denoland/setup-deno@v1",
23
+
with: {
24
+
"deno-version": "v1.37",
25
+
},
26
+
},
27
+
{
28
+
name: "Setup Fluent CI CLI",
29
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
},
31
+
{
32
+
name: "Setup Dagger",
33
+
run: setupDagger,
34
+
},
35
+
{
36
+
name: "Run Tests and Build",
37
+
run: "fluentci run rust_pipeline test build",
38
+
},
39
+
],
40
+
};
41
+
42
+
workflow.on({ push }).jobs({ test });
43
+
44
+
return workflow;
45
+
}
+9
.fluentci/example/.fluentci/src/github/config_test.ts
+9
.fluentci/example/.fluentci/src/github/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateGithubActionsWorkflowTest() {
5
+
const workflow = generateYaml();
6
+
const actual = workflow.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/workflow.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/example/.fluentci/src/github/init.ts
+3
.fluentci/example/.fluentci/src/github/init.ts
+48
.fluentci/example/.fluentci/src/gitlab/README.md
+48
.fluentci/example/.fluentci/src/gitlab/README.md
···
···
1
+
# Gitlab CI
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `.gitlab-ci.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci gl init -t rust_pipeline
12
+
```
13
+
14
+
Generated file:
15
+
16
+
```yaml
17
+
18
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_gitlab_ci
19
+
20
+
.docker:
21
+
image: denoland/deno:alpine
22
+
services:
23
+
- docker:${DOCKER_VERSION}-dind
24
+
variables:
25
+
DOCKER_HOST: tcp://docker:2376
26
+
DOCKER_TLS_VERIFY: "1"
27
+
DOCKER_TLS_CERTDIR: /certs
28
+
DOCKER_CERT_PATH: /certs/client
29
+
DOCKER_DRIVER: overlay2
30
+
DOCKER_VERSION: 20.10.16
31
+
32
+
.dagger:
33
+
extends: .docker
34
+
before_script:
35
+
- apk add docker-cli curl unzip
36
+
- deno install -A -r https://cli.fluentci.io -n fluentci
37
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
38
+
- mv bin/dagger /usr/local/bin
39
+
- dagger version
40
+
41
+
tests:
42
+
extends: .dagger
43
+
script:
44
+
- fluentci run rust_pipeline test build
45
+
46
+
```
47
+
48
+
Feel free to edit the template generator at `.fluentci/src/gitlab/config.ts` to your needs.
+34
.fluentci/example/.fluentci/src/gitlab/config.ts
+34
.fluentci/example/.fluentci/src/gitlab/config.ts
···
···
1
+
import { GitlabCI, Job } from "fluent_gitlab_ci";
2
+
3
+
export function generateYaml(): GitlabCI {
4
+
const docker = new Job()
5
+
.image("denoland/deno:alpine")
6
+
.services(["docker:${DOCKER_VERSION}-dind"])
7
+
.variables({
8
+
DOCKER_HOST: "tcp://docker:2376",
9
+
DOCKER_TLS_VERIFY: "1",
10
+
DOCKER_TLS_CERTDIR: "/certs",
11
+
DOCKER_CERT_PATH: "/certs/client",
12
+
DOCKER_DRIVER: "overlay2",
13
+
DOCKER_VERSION: "20.10.16",
14
+
});
15
+
16
+
const dagger = new Job().extends(".docker").beforeScript(
17
+
`
18
+
apk add docker-cli curl unzip
19
+
deno install -A -r https://cli.fluentci.io -n fluentci
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
`
24
+
);
25
+
26
+
const tests = new Job()
27
+
.extends(".dagger")
28
+
.script("fluentci run rust_pipeline test build");
29
+
30
+
return new GitlabCI()
31
+
.addJob(".docker", docker)
32
+
.addJob(".dagger", dagger)
33
+
.addJob("tests", tests);
34
+
}
+9
.fluentci/example/.fluentci/src/gitlab/config_test.ts
+9
.fluentci/example/.fluentci/src/gitlab/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateGitlabCITest() {
5
+
const gitlabci = generateYaml();
6
+
const actual = gitlabci.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/example/.fluentci/src/gitlab/init.ts
+3
.fluentci/example/.fluentci/src/gitlab/init.ts
+24
.fluentci/example/.github/workflows/tests.yml
+24
.fluentci/example/.github/workflows/tests.yml
···
···
1
+
# Do not edit this file directly. It is generated by Fluent Github Actions
2
+
3
+
name: Test
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
test:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Tests and Build
24
+
run: dagger run fluentci rust_pipeline test build
+1
.fluentci/example/.gitignore
+1
.fluentci/example/.gitignore
···
···
1
+
target/
+7
.fluentci/example/Cargo.lock
+7
.fluentci/example/Cargo.lock
+8
.fluentci/example/Cargo.toml
+8
.fluentci/example/Cargo.toml
+5
.fluentci/example/dagger.json
+5
.fluentci/example/dagger.json
+14
.fluentci/example/src/lib.rs
+14
.fluentci/example/src/lib.rs
+28
.fluentci/fixtures/.gitlab-ci.yml
+28
.fluentci/fixtures/.gitlab-ci.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_gitlab_ci
2
+
3
+
.docker:
4
+
image: denoland/deno:alpine
5
+
services:
6
+
- docker:${DOCKER_VERSION}-dind
7
+
variables:
8
+
DOCKER_HOST: tcp://docker:2376
9
+
DOCKER_TLS_VERIFY: "1"
10
+
DOCKER_TLS_CERTDIR: /certs
11
+
DOCKER_CERT_PATH: /certs/client
12
+
DOCKER_DRIVER: overlay2
13
+
DOCKER_VERSION: 20.10.16
14
+
15
+
.dagger:
16
+
extends: .docker
17
+
before_script:
18
+
- apk add docker-cli curl unzip
19
+
- deno install -A -r https://cli.fluentci.io -n fluentci
20
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
- mv bin/dagger /usr/local/bin
22
+
- dagger version
23
+
24
+
tests:
25
+
extends: .dagger
26
+
script:
27
+
- fluentci run rust_pipeline test build
28
+
+22
.fluentci/fixtures/azure-pipelines.yml
+22
.fluentci/fixtures/azure-pipelines.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_azure_pipelines
2
+
3
+
trigger:
4
+
- main
5
+
pool:
6
+
name: Default
7
+
vmImage: ubuntu-latest
8
+
steps:
9
+
- script: |
10
+
curl -fsSL https://deno.land/x/install/install.sh | sh
11
+
export DENO_INSTALL="$HOME/.deno"
12
+
export PATH="$DENO_INSTALL/bin:$PATH"
13
+
displayName: Install Deno
14
+
- script: deno install -A -r https://cli.fluentci.io -n fluentci
15
+
displayName: Setup Fluent CI CLI
16
+
- script: |
17
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
18
+
sudo mv bin/dagger /usr/local/bin
19
+
dagger version
20
+
displayName: Setup Dagger
21
+
- script: fluentci run rust_pipeline test build
22
+
displayName: Run Dagger Pipelines
+19
.fluentci/fixtures/buildspec.yml
+19
.fluentci/fixtures/buildspec.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_aws_codepipeline
2
+
3
+
version: 0.2
4
+
phases:
5
+
install:
6
+
commands:
7
+
- curl -fsSL https://deno.land/x/install/install.sh | sh
8
+
- export DENO_INSTALL="$HOME/.deno"
9
+
- export PATH="$DENO_INSTALL/bin:$PATH"
10
+
- deno install -A -r https://cli.fluentci.io -n fluentci
11
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
- mv bin/dagger /usr/local/bin
13
+
- dagger version
14
+
build:
15
+
commands:
16
+
- fluentci run rust_pipeline test build
17
+
post_build:
18
+
commands:
19
+
- echo Build completed on `date`
+26
.fluentci/fixtures/config.yml
+26
.fluentci/fixtures/config.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_circleci
2
+
3
+
version: 2.1
4
+
jobs:
5
+
tests:
6
+
steps:
7
+
- checkout
8
+
- run: sudo apt-get update && sudo apt-get install -y curl unzip
9
+
- run: |
10
+
curl -fsSL https://deno.land/x/install/install.sh | sh
11
+
export DENO_INSTALL="$HOME/.deno"
12
+
export PATH="$DENO_INSTALL/bin:$PATH"
13
+
- run: deno install -A -r https://cli.fluentci.io -n fluentci
14
+
- run: |
15
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
16
+
sudo mv bin/dagger /usr/local/bin
17
+
dagger version
18
+
- run:
19
+
name: Run Dagger Pipelines
20
+
command: fluentci run rust_pipeline test build
21
+
machine:
22
+
image: ubuntu-2004:2023.07.1
23
+
workflows:
24
+
dagger:
25
+
jobs:
26
+
- tests
+24
.fluentci/fixtures/workflow.yml
+24
.fluentci/fixtures/workflow.yml
···
···
1
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
2
+
3
+
name: Test
4
+
on:
5
+
push:
6
+
branches:
7
+
- main
8
+
jobs:
9
+
test:
10
+
runs-on: ubuntu-latest
11
+
steps:
12
+
- uses: actions/checkout@v2
13
+
- uses: denoland/setup-deno@v1
14
+
with:
15
+
deno-version: v1.37
16
+
- name: Setup Fluent CI CLI
17
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
18
+
- name: Setup Dagger
19
+
run: |
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
sudo mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
- name: Run Tests and Build
24
+
run: fluentci run rust_pipeline test build
+139
.fluentci/gen/nexus.ts
+139
.fluentci/gen/nexus.ts
···
···
1
+
/**
2
+
* This file was generated by Nexus Schema
3
+
* Do not make changes to this file directly
4
+
*/
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
declare global {
13
+
interface NexusGen extends NexusGenTypes {}
14
+
}
15
+
16
+
export interface NexusGenInputs {
17
+
}
18
+
19
+
export interface NexusGenEnums {
20
+
}
21
+
22
+
export interface NexusGenScalars {
23
+
String: string
24
+
Int: number
25
+
Float: number
26
+
Boolean: boolean
27
+
ID: string
28
+
}
29
+
30
+
export interface NexusGenObjects {
31
+
Query: {};
32
+
}
33
+
34
+
export interface NexusGenInterfaces {
35
+
}
36
+
37
+
export interface NexusGenUnions {
38
+
}
39
+
40
+
export type NexusGenRootTypes = NexusGenObjects
41
+
42
+
export type NexusGenAllTypes = NexusGenRootTypes & NexusGenScalars
43
+
44
+
export interface NexusGenFieldTypes {
45
+
Query: { // field return type
46
+
build: string | null; // String
47
+
test: string | null; // String
48
+
}
49
+
}
50
+
51
+
export interface NexusGenFieldTypeNames {
52
+
Query: { // field return type name
53
+
build: 'String'
54
+
test: 'String'
55
+
}
56
+
}
57
+
58
+
export interface NexusGenArgTypes {
59
+
Query: {
60
+
build: { // args
61
+
src: string; // String!
62
+
}
63
+
test: { // args
64
+
src: string; // String!
65
+
}
66
+
}
67
+
}
68
+
69
+
export interface NexusGenAbstractTypeMembers {
70
+
}
71
+
72
+
export interface NexusGenTypeInterfaces {
73
+
}
74
+
75
+
export type NexusGenObjectNames = keyof NexusGenObjects;
76
+
77
+
export type NexusGenInputNames = never;
78
+
79
+
export type NexusGenEnumNames = never;
80
+
81
+
export type NexusGenInterfaceNames = never;
82
+
83
+
export type NexusGenScalarNames = keyof NexusGenScalars;
84
+
85
+
export type NexusGenUnionNames = never;
86
+
87
+
export type NexusGenObjectsUsingAbstractStrategyIsTypeOf = never;
88
+
89
+
export type NexusGenAbstractsUsingStrategyResolveType = never;
90
+
91
+
export type NexusGenFeaturesConfig = {
92
+
abstractTypeStrategies: {
93
+
isTypeOf: false
94
+
resolveType: true
95
+
__typename: false
96
+
}
97
+
}
98
+
99
+
export interface NexusGenTypes {
100
+
context: any;
101
+
inputTypes: NexusGenInputs;
102
+
rootTypes: NexusGenRootTypes;
103
+
inputTypeShapes: NexusGenInputs & NexusGenEnums & NexusGenScalars;
104
+
argTypes: NexusGenArgTypes;
105
+
fieldTypes: NexusGenFieldTypes;
106
+
fieldTypeNames: NexusGenFieldTypeNames;
107
+
allTypes: NexusGenAllTypes;
108
+
typeInterfaces: NexusGenTypeInterfaces;
109
+
objectNames: NexusGenObjectNames;
110
+
inputNames: NexusGenInputNames;
111
+
enumNames: NexusGenEnumNames;
112
+
interfaceNames: NexusGenInterfaceNames;
113
+
scalarNames: NexusGenScalarNames;
114
+
unionNames: NexusGenUnionNames;
115
+
allInputTypes: NexusGenTypes['inputNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['scalarNames'];
116
+
allOutputTypes: NexusGenTypes['objectNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['unionNames'] | NexusGenTypes['interfaceNames'] | NexusGenTypes['scalarNames'];
117
+
allNamedTypes: NexusGenTypes['allInputTypes'] | NexusGenTypes['allOutputTypes']
118
+
abstractTypes: NexusGenTypes['interfaceNames'] | NexusGenTypes['unionNames'];
119
+
abstractTypeMembers: NexusGenAbstractTypeMembers;
120
+
objectsUsingAbstractStrategyIsTypeOf: NexusGenObjectsUsingAbstractStrategyIsTypeOf;
121
+
abstractsUsingStrategyResolveType: NexusGenAbstractsUsingStrategyResolveType;
122
+
features: NexusGenFeaturesConfig;
123
+
}
124
+
125
+
126
+
declare global {
127
+
interface NexusGenPluginTypeConfig<TypeName extends string> {
128
+
}
129
+
interface NexusGenPluginInputTypeConfig<TypeName extends string> {
130
+
}
131
+
interface NexusGenPluginFieldConfig<TypeName extends string, FieldName extends string> {
132
+
}
133
+
interface NexusGenPluginInputFieldConfig<TypeName extends string, FieldName extends string> {
134
+
}
135
+
interface NexusGenPluginSchemaConfig {
136
+
}
137
+
interface NexusGenPluginArgConfig {
138
+
}
139
+
}
+34
.fluentci/import_map.json
+34
.fluentci/import_map.json
···
···
1
+
{
2
+
"imports": {
3
+
"@fluentci.io/dagger": "https://sdk.fluentci.io/v0.1.9/mod.ts",
4
+
"@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.8.4",
5
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
6
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
7
+
"fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts",
8
+
"fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts",
9
+
"fluent_circleci": "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts",
10
+
"fluent_azure_pipelines": "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts",
11
+
"fluent_aws_codepipeline": "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts",
12
+
"crypto": "node:crypto",
13
+
"fs": "node:fs",
14
+
"os": "node:os",
15
+
"path": "node:path",
16
+
"process": "node:process",
17
+
"readline": "node:readline",
18
+
"url": "node:url"
19
+
},
20
+
"scopes": {
21
+
"https://esm.sh/v128/": {
22
+
"@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1",
23
+
"adm-zip": "https://esm.sh/v128/adm-zip@0.5.10",
24
+
"env-paths": "https://esm.sh/v128/env-paths@3.0.0",
25
+
"execa": "https://esm.sh/v128/execa@7.1.1",
26
+
"graphql-request": "https://esm.sh/v128/graphql-request@6.1.0",
27
+
"graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6",
28
+
"graphql": "https://esm.sh/v128/graphql@16.7.1",
29
+
"node-color-log": "https://esm.sh/v128/node-color-log@10.0.2",
30
+
"node-fetch": "https://esm.sh/v128/node-fetch@3.3.1",
31
+
"tar": "https://esm.sh/v128/tar@6.1.15"
32
+
}
33
+
}
34
+
}
+3
.fluentci/mod.ts
+3
.fluentci/mod.ts
+8
.fluentci/schema.graphql
+8
.fluentci/schema.graphql
+39
.fluentci/src/aws/README.md
+39
.fluentci/src/aws/README.md
···
···
1
+
# AWS CodePipeline
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `buildspec.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci ac init -t rust_pipeline
12
+
```
13
+
14
+
Generated file:
15
+
16
+
```yaml
17
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_aws_codepipeline
18
+
19
+
version: 0.2
20
+
phases:
21
+
install:
22
+
commands:
23
+
- curl -fsSL https://deno.land/x/install/install.sh | sh
24
+
- export DENO_INSTALL="$HOME/.deno"
25
+
- export PATH="$DENO_INSTALL/bin:$PATH"
26
+
- deno install -A -r https://cli.fluentci.io -n fluentci
27
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
28
+
- mv bin/dagger /usr/local/bin
29
+
- dagger version
30
+
build:
31
+
commands:
32
+
- fluentci run rust_pipeline test build
33
+
post_build:
34
+
commands:
35
+
- echo Build completed on `date`
36
+
37
+
```
38
+
39
+
Feel free to edit the template generator at `.fluentci/src/aws/config.ts` to your needs.
+24
.fluentci/src/aws/config.ts
+24
.fluentci/src/aws/config.ts
···
···
1
+
import { BuildSpec } from "fluent_aws_codepipeline";
2
+
3
+
export function generateYaml(): BuildSpec {
4
+
const buildspec = new BuildSpec();
5
+
buildspec
6
+
.phase("install", {
7
+
commands: [
8
+
"curl -fsSL https://deno.land/x/install/install.sh | sh",
9
+
'export DENO_INSTALL="$HOME/.deno"',
10
+
'export PATH="$DENO_INSTALL/bin:$PATH"',
11
+
"deno install -A -r https://cli.fluentci.io -n fluentci",
12
+
"curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh",
13
+
"mv bin/dagger /usr/local/bin",
14
+
"dagger version",
15
+
],
16
+
})
17
+
.phase("build", {
18
+
commands: ["fluentci run rust_pipeline test build"],
19
+
})
20
+
.phase("post_build", {
21
+
commands: ["echo Build completed on `date`"],
22
+
});
23
+
return buildspec;
24
+
}
+9
.fluentci/src/aws/config_test.ts
+9
.fluentci/src/aws/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateAWSCodePipelineTest() {
5
+
const buildspec = generateYaml();
6
+
const actual = buildspec.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/buildspec.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/src/aws/init.ts
+3
.fluentci/src/aws/init.ts
+42
.fluentci/src/azure/README.md
+42
.fluentci/src/azure/README.md
···
···
1
+
# Azure Pipelines
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `azure-pipelines.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci ap init -t rust_pipeline
12
+
```
13
+
14
+
Generated file:
15
+
16
+
```yaml
17
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_azure_pipelines
18
+
19
+
trigger:
20
+
- main
21
+
pool:
22
+
name: Default
23
+
vmImage: ubuntu-latest
24
+
steps:
25
+
- script: |
26
+
curl -fsSL https://deno.land/x/install/install.sh | sh
27
+
export DENO_INSTALL="$HOME/.deno"
28
+
export PATH="$DENO_INSTALL/bin:$PATH"
29
+
displayName: Install Deno
30
+
- script: deno install -A -r https://cli.fluentci.io -n fluentci
31
+
displayName: Setup Fluent CI CLI
32
+
- script: |
33
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
34
+
sudo mv bin/dagger /usr/local/bin
35
+
dagger version
36
+
displayName: Setup Dagger
37
+
- script: fluentci run rust_pipeline test build
38
+
displayName: Run Dagger Pipelines
39
+
40
+
```
41
+
42
+
Feel free to edit the template generator at `.fluentci/src/azure/config.ts` to your needs.
+41
.fluentci/src/azure/config.ts
+41
.fluentci/src/azure/config.ts
···
···
1
+
import { AzurePipeline } from "fluent_azure_pipelines";
2
+
3
+
export function generateYaml(): AzurePipeline {
4
+
const azurePipeline = new AzurePipeline();
5
+
6
+
const installDeno = `\
7
+
curl -fsSL https://deno.land/x/install/install.sh | sh
8
+
export DENO_INSTALL="$HOME/.deno"
9
+
export PATH="$DENO_INSTALL/bin:$PATH"
10
+
`;
11
+
12
+
const setupDagger = `\
13
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
14
+
sudo mv bin/dagger /usr/local/bin
15
+
dagger version
16
+
`;
17
+
18
+
azurePipeline
19
+
.trigger(["main"])
20
+
.pool({
21
+
name: "Default",
22
+
vmImage: "ubuntu-latest",
23
+
})
24
+
.step({
25
+
script: installDeno,
26
+
displayName: "Install Deno",
27
+
})
28
+
.step({
29
+
script: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
displayName: "Setup Fluent CI CLI",
31
+
})
32
+
.step({
33
+
script: setupDagger,
34
+
displayName: "Setup Dagger",
35
+
})
36
+
.step({
37
+
script: "fluentci run rust_pipeline test build",
38
+
displayName: "Run Dagger Pipelines",
39
+
});
40
+
return azurePipeline;
41
+
}
+9
.fluentci/src/azure/config_test.ts
+9
.fluentci/src/azure/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateAzurePipelinesTest() {
5
+
const azurepipelines = generateYaml();
6
+
const actual = azurepipelines.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/azure-pipelines.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/src/azure/init.ts
+3
.fluentci/src/azure/init.ts
+47
.fluentci/src/circleci/README.md
+47
.fluentci/src/circleci/README.md
···
···
1
+
# Circle CI
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
9
+
The following command will generate a `.circleci/config.yml` file in your project:
10
+
11
+
```bash
12
+
fluentci cci init -t rust_pipeline
13
+
```
14
+
15
+
Generated file:
16
+
17
+
```yaml
18
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_circleci
19
+
20
+
version: 2.1
21
+
jobs:
22
+
tests:
23
+
steps:
24
+
- checkout
25
+
- run: sudo apt-get update && sudo apt-get install -y curl unzip
26
+
- run: |
27
+
curl -fsSL https://deno.land/x/install/install.sh | sh
28
+
export DENO_INSTALL="$HOME/.deno"
29
+
export PATH="$DENO_INSTALL/bin:$PATH"
30
+
- run: deno install -A -r https://cli.fluentci.io -n fluentci
31
+
- run: |
32
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
33
+
sudo mv bin/dagger /usr/local/bin
34
+
dagger version
35
+
- run:
36
+
name: Upload Coverage
37
+
command: fluentci run rust_pipeline test build
38
+
machine:
39
+
image: ubuntu-2004:2023.07.1
40
+
workflows:
41
+
dagger:
42
+
jobs:
43
+
- tests
44
+
45
+
```
46
+
47
+
Feel free to edit the template generator at `.fluentci/src/circleci/config.ts` to your needs.
+37
.fluentci/src/circleci/config.ts
+37
.fluentci/src/circleci/config.ts
···
···
1
+
import { CircleCI, Job } from "fluent_circleci";
2
+
3
+
export function generateYaml(): CircleCI {
4
+
const circleci = new CircleCI();
5
+
6
+
const tests = new Job().machine({ image: "ubuntu-2004:2023.07.1" }).steps([
7
+
"checkout",
8
+
{
9
+
run: "sudo apt-get update && sudo apt-get install -y curl unzip",
10
+
},
11
+
{
12
+
run: `\
13
+
curl -fsSL https://deno.land/x/install/install.sh | sh
14
+
export DENO_INSTALL="$HOME/.deno"
15
+
export PATH="$DENO_INSTALL/bin:$PATH"`,
16
+
},
17
+
{
18
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
19
+
},
20
+
{
21
+
run: `\
22
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
23
+
sudo mv bin/dagger /usr/local/bin
24
+
dagger version`,
25
+
},
26
+
{
27
+
run: {
28
+
name: "Run Dagger Pipelines",
29
+
command: "fluentci run rust_pipeline test build",
30
+
},
31
+
},
32
+
]);
33
+
34
+
circleci.jobs({ tests }).workflow("dagger", ["tests"]);
35
+
36
+
return circleci;
37
+
}
+9
.fluentci/src/circleci/config_test.ts
+9
.fluentci/src/circleci/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateCircleCITest() {
5
+
const circleci = generateYaml();
6
+
const actual = circleci.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/config.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/src/circleci/init.ts
+3
.fluentci/src/circleci/init.ts
+4
.fluentci/src/dagger/index.ts
+4
.fluentci/src/dagger/index.ts
+90
.fluentci/src/dagger/jobs.ts
+90
.fluentci/src/dagger/jobs.ts
···
···
1
+
import Client, { connect } from "../../deps.ts";
2
+
3
+
export enum Job {
4
+
test = "test",
5
+
build = "build",
6
+
}
7
+
8
+
export const exclude = ["target", ".git", ".devbox", ".fluentci"];
9
+
10
+
export const test = async (src = ".", options: string[] = []) => {
11
+
await connect(async (client: Client) => {
12
+
const context = client.host().directory(src);
13
+
const ctr = client
14
+
.pipeline(Job.test)
15
+
.container()
16
+
.from("rust:latest")
17
+
.withDirectory("/app", context, { exclude })
18
+
.withWorkdir("/app")
19
+
.withMountedCache("/app/target", client.cacheVolume("target"))
20
+
.withMountedCache("/root/cargo/registry", client.cacheVolume("registry"))
21
+
.withExec(["cargo", "test", ...options]);
22
+
23
+
const result = await ctr.stdout();
24
+
25
+
console.log(result);
26
+
});
27
+
return "done";
28
+
};
29
+
30
+
export const build = async (src = ".") => {
31
+
await connect(async (client: Client) => {
32
+
const context = client.host().directory(src);
33
+
const ctr = client
34
+
.pipeline(Job.build)
35
+
.container()
36
+
.from("rust:1.73-bullseye")
37
+
.withExec(["apt-get", "update"])
38
+
.withExec([
39
+
"apt-get",
40
+
"install",
41
+
"-y",
42
+
"build-essential",
43
+
"libasound2-dev",
44
+
"protobuf-compiler",
45
+
])
46
+
.withDirectory("/app", context, { exclude })
47
+
.withWorkdir("/app")
48
+
.withMountedCache("/app/target", client.cacheVolume("target"))
49
+
.withMountedCache("/root/cargo/registry", client.cacheVolume("registry"))
50
+
.withMountedCache("/assets", client.cacheVolume("gh-release-assets"))
51
+
.withEnvVariable("TAG", Deno.env.get("TAG") || "latest")
52
+
.withEnvVariable(
53
+
"TARGET",
54
+
Deno.env.get("TARGET") || "x86_64-unknown-linux-gnu"
55
+
)
56
+
.withExec(["sh", "-c", "cargo build --release --target $TARGET"])
57
+
.withExec([
58
+
"sh",
59
+
"-c",
60
+
"tar czvf /assets/tunein_${TAG}_${TARGET}.tar.gz target/$TARGET/release/tunein",
61
+
])
62
+
.withExec([
63
+
"sh",
64
+
"-c",
65
+
"shasum -a 256 /assets/tunein_${TAG}_${TARGET}.tar.gz > /assets/tunein_${TAG}_${TARGET}.tar.gz.sha256",
66
+
]);
67
+
68
+
await ctr.stdout();
69
+
});
70
+
return "Done";
71
+
};
72
+
73
+
export type JobExec = (src?: string) =>
74
+
| Promise<string>
75
+
| ((
76
+
src?: string,
77
+
options?: {
78
+
ignore: string[];
79
+
}
80
+
) => Promise<string>);
81
+
82
+
export const runnableJobs: Record<Job, JobExec> = {
83
+
[Job.test]: test,
84
+
[Job.build]: build,
85
+
};
86
+
87
+
export const jobDescriptions: Record<Job, string> = {
88
+
[Job.test]: "Run tests",
89
+
[Job.build]: "Build the project",
90
+
};
+20
.fluentci/src/dagger/list_jobs.ts
+20
.fluentci/src/dagger/list_jobs.ts
···
···
1
+
import { brightGreen, stringifyTree } from "../../deps.ts";
2
+
import { runnableJobs, jobDescriptions, Job } from "./jobs.ts";
3
+
4
+
const tree = {
5
+
name: brightGreen("rust_pipeline"),
6
+
children: (Object.keys(runnableJobs) as Job[]).map((job) => ({
7
+
name: jobDescriptions[job]
8
+
? `${brightGreen(job)} - ${jobDescriptions[job]}`
9
+
: brightGreen(job),
10
+
children: [],
11
+
})),
12
+
};
13
+
14
+
console.log(
15
+
stringifyTree(
16
+
tree,
17
+
(t) => t.name,
18
+
(t) => t.children
19
+
)
20
+
);
+29
.fluentci/src/dagger/pipeline.ts
+29
.fluentci/src/dagger/pipeline.ts
···
···
1
+
import { uploadContext } from "../../deps.ts";
2
+
import * as jobs from "./jobs.ts";
3
+
4
+
const { build, test, exclude } = jobs;
5
+
6
+
export default async function pipeline(src = ".", args: string[] = []) {
7
+
if (Deno.env.has("FLUENTCI_SESSION_ID")) {
8
+
await uploadContext(src, exclude);
9
+
}
10
+
11
+
if (args.length > 0) {
12
+
await runSpecificJobs(args);
13
+
return;
14
+
}
15
+
16
+
await test(src);
17
+
await build(src);
18
+
}
19
+
20
+
async function runSpecificJobs(args: string[]) {
21
+
for (const name of args) {
22
+
// deno-lint-ignore no-explicit-any
23
+
const job = (jobs as any)[name];
24
+
if (!job) {
25
+
throw new Error(`Job ${name} not found`);
26
+
}
27
+
await job();
28
+
}
29
+
}
+13
.fluentci/src/dagger/queries.ts
+13
.fluentci/src/dagger/queries.ts
+3
.fluentci/src/dagger/runner.ts
+3
.fluentci/src/dagger/runner.ts
+36
.fluentci/src/dagger/schema.ts
+36
.fluentci/src/dagger/schema.ts
···
···
1
+
import {
2
+
queryType,
3
+
makeSchema,
4
+
dirname,
5
+
join,
6
+
resolve,
7
+
stringArg,
8
+
nonNull,
9
+
} from "../../deps.ts";
10
+
11
+
import { test, build } from "./jobs.ts";
12
+
13
+
const Query = queryType({
14
+
definition(t) {
15
+
t.string("test", {
16
+
args: {
17
+
src: nonNull(stringArg()),
18
+
},
19
+
resolve: async (_root, args, _ctx) => await test(args.src),
20
+
});
21
+
t.string("build", {
22
+
args: {
23
+
src: nonNull(stringArg()),
24
+
},
25
+
resolve: async (_root, args, _ctx) => await build(args.src),
26
+
});
27
+
},
28
+
});
29
+
30
+
export const schema = makeSchema({
31
+
types: [Query],
32
+
outputs: {
33
+
schema: resolve(join(dirname(".."), dirname(".."), "schema.graphql")),
34
+
typegen: resolve(join(dirname(".."), dirname(".."), "gen", "nexus.ts")),
35
+
},
36
+
});
+50
.fluentci/src/github/README.md
+50
.fluentci/src/github/README.md
···
···
1
+
# Github Actions
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `.github/workflows/tests.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci gh init -t rust_pipeline
12
+
```
13
+
14
+
Or, if you already have a `.fluentci` folder (generated from `fluentci init -t rust`) in your project:
15
+
16
+
```bash
17
+
fluentci gh init
18
+
```
19
+
20
+
Generated file:
21
+
22
+
```yaml
23
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions
24
+
25
+
name: Test
26
+
on:
27
+
push:
28
+
branches:
29
+
- main
30
+
jobs:
31
+
test:
32
+
runs-on: ubuntu-latest
33
+
steps:
34
+
- uses: actions/checkout@v2
35
+
- uses: denoland/setup-deno@v1
36
+
with:
37
+
deno-version: v1.37
38
+
- name: Setup Fluent CI CLI
39
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
40
+
- name: Setup Dagger
41
+
run: |
42
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
43
+
sudo mv bin/dagger /usr/local/bin
44
+
dagger version
45
+
- name: Run Tests and Build
46
+
run: fluentci run rust_pipeline test build
47
+
48
+
```
49
+
50
+
Feel free to edit the template generator at `.fluentci/src/github/config.ts` to your needs.
+45
.fluentci/src/github/config.ts
+45
.fluentci/src/github/config.ts
···
···
1
+
import { JobSpec, Workflow } from "fluent_github_actions";
2
+
3
+
export function generateYaml(): Workflow {
4
+
const workflow = new Workflow("Test");
5
+
6
+
const push = {
7
+
branches: ["main"],
8
+
};
9
+
10
+
const setupDagger = `\
11
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
12
+
sudo mv bin/dagger /usr/local/bin
13
+
dagger version`;
14
+
15
+
const test: JobSpec = {
16
+
"runs-on": "ubuntu-latest",
17
+
steps: [
18
+
{
19
+
uses: "actions/checkout@v2",
20
+
},
21
+
{
22
+
uses: "denoland/setup-deno@v1",
23
+
with: {
24
+
"deno-version": "v1.37",
25
+
},
26
+
},
27
+
{
28
+
name: "Setup Fluent CI CLI",
29
+
run: "deno install -A -r https://cli.fluentci.io -n fluentci",
30
+
},
31
+
{
32
+
name: "Setup Dagger",
33
+
run: setupDagger,
34
+
},
35
+
{
36
+
name: "Run Tests and Build",
37
+
run: "fluentci run rust_pipeline test build",
38
+
},
39
+
],
40
+
};
41
+
42
+
workflow.on({ push }).jobs({ test });
43
+
44
+
return workflow;
45
+
}
+9
.fluentci/src/github/config_test.ts
+9
.fluentci/src/github/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateGithubActionsWorkflowTest() {
5
+
const workflow = generateYaml();
6
+
const actual = workflow.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/workflow.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/src/github/init.ts
+3
.fluentci/src/github/init.ts
+48
.fluentci/src/gitlab/README.md
+48
.fluentci/src/gitlab/README.md
···
···
1
+
# Gitlab CI
2
+
3
+
[](https://pkg.fluentci.io/rust_pipeline)
4
+
[](https://deno.land/x/rust_pipeline)
5
+

6
+
[](https://codecov.io/gh/fluent-ci-templates/rust-pipeline)
7
+
8
+
The following command will generate a `.gitlab-ci.yml` file in your project:
9
+
10
+
```bash
11
+
fluentci gl init -t rust_pipeline
12
+
```
13
+
14
+
Generated file:
15
+
16
+
```yaml
17
+
18
+
# Do not edit this file directly. It is generated by https://deno.land/x/fluent_gitlab_ci
19
+
20
+
.docker:
21
+
image: denoland/deno:alpine
22
+
services:
23
+
- docker:${DOCKER_VERSION}-dind
24
+
variables:
25
+
DOCKER_HOST: tcp://docker:2376
26
+
DOCKER_TLS_VERIFY: "1"
27
+
DOCKER_TLS_CERTDIR: /certs
28
+
DOCKER_CERT_PATH: /certs/client
29
+
DOCKER_DRIVER: overlay2
30
+
DOCKER_VERSION: 20.10.16
31
+
32
+
.dagger:
33
+
extends: .docker
34
+
before_script:
35
+
- apk add docker-cli curl unzip
36
+
- deno install -A -r https://cli.fluentci.io -n fluentci
37
+
- curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
38
+
- mv bin/dagger /usr/local/bin
39
+
- dagger version
40
+
41
+
tests:
42
+
extends: .dagger
43
+
script:
44
+
- fluentci run rust_pipeline test build
45
+
46
+
```
47
+
48
+
Feel free to edit the template generator at `.fluentci/src/gitlab/config.ts` to your needs.
+34
.fluentci/src/gitlab/config.ts
+34
.fluentci/src/gitlab/config.ts
···
···
1
+
import { GitlabCI, Job } from "fluent_gitlab_ci";
2
+
3
+
export function generateYaml(): GitlabCI {
4
+
const docker = new Job()
5
+
.image("denoland/deno:alpine")
6
+
.services(["docker:${DOCKER_VERSION}-dind"])
7
+
.variables({
8
+
DOCKER_HOST: "tcp://docker:2376",
9
+
DOCKER_TLS_VERIFY: "1",
10
+
DOCKER_TLS_CERTDIR: "/certs",
11
+
DOCKER_CERT_PATH: "/certs/client",
12
+
DOCKER_DRIVER: "overlay2",
13
+
DOCKER_VERSION: "20.10.16",
14
+
});
15
+
16
+
const dagger = new Job().extends(".docker").beforeScript(
17
+
`
18
+
apk add docker-cli curl unzip
19
+
deno install -A -r https://cli.fluentci.io -n fluentci
20
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh
21
+
mv bin/dagger /usr/local/bin
22
+
dagger version
23
+
`
24
+
);
25
+
26
+
const tests = new Job()
27
+
.extends(".dagger")
28
+
.script("fluentci run rust_pipeline test build");
29
+
30
+
return new GitlabCI()
31
+
.addJob(".docker", docker)
32
+
.addJob(".dagger", dagger)
33
+
.addJob("tests", tests);
34
+
}
+9
.fluentci/src/gitlab/config_test.ts
+9
.fluentci/src/gitlab/config_test.ts
···
···
1
+
import { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts";
2
+
import { generateYaml } from "./config.ts";
3
+
4
+
Deno.test(function generateGitlabCITest() {
5
+
const gitlabci = generateYaml();
6
+
const actual = gitlabci.toString();
7
+
const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml");
8
+
assertEquals(actual, expected);
9
+
});
+3
.fluentci/src/gitlab/init.ts
+3
.fluentci/src/gitlab/init.ts
+17
-9
.github/workflows/release-for-mac.yml
+17
-9
.github/workflows/release-for-mac.yml
···
11
matrix:
12
include:
13
- target: x86_64-apple-darwin
14
-
archive: tar.gz tar.xz
15
- target: aarch64-apple-darwin
16
-
archive: tar.gz tar.xz
17
18
steps:
19
- name: Installing needed dependencies
20
run: brew install protobuf
21
- name: Installing Rust toolchain
···
43
cd target/${{ matrix.target }}/release
44
tar czvf tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz tunein
45
shasum -a 256 tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz > tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz.sha256
46
-
- name: Releasing assets
47
-
uses: softprops/action-gh-release@v1
48
-
with:
49
-
files: |
50
-
target/${{ matrix.target }}/release/tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz
51
-
target/${{ matrix.target }}/release/tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz.sha256
52
env:
53
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
···
11
matrix:
12
include:
13
- target: x86_64-apple-darwin
14
+
extensions: tar.gz tar.gz.sha256
15
- target: aarch64-apple-darwin
16
+
extensions: tar.gz tar.gz.sha256
17
18
steps:
19
+
- uses: denoland/setup-deno@v1
20
+
with:
21
+
deno-version: v1.37
22
+
- name: Setup Fluent CI CLI
23
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
24
+
- name: Setup Dagger
25
+
run: |
26
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.8 sh
27
+
sudo mv bin/dagger /usr/local/bin
28
+
dagger version
29
- name: Installing needed dependencies
30
run: brew install protobuf
31
- name: Installing Rust toolchain
···
53
cd target/${{ matrix.target }}/release
54
tar czvf tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz tunein
55
shasum -a 256 tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz > tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.tar.gz.sha256
56
+
- name: Upload release assets
57
+
run: fluentci run github_pipeline release_upload
58
env:
59
+
TAG: ${{ env.RELEASE_VERSION }}
60
+
FILE: target/${{ matrix.target }}/release/tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.${{ matrix.extensions }}
61
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+24
-40
.github/workflows/release.yml
+24
-40
.github/workflows/release.yml
···
1
on:
2
release:
3
types: [created]
4
5
jobs:
6
-
release:
7
-
name: release ${{ matrix.target }}
8
-
runs-on: ubuntu-20.04
9
strategy:
10
-
fail-fast: false
11
matrix:
12
include:
13
-
- target: x86_64-pc-windows-gnu
14
-
archive: zip
15
- target: x86_64-unknown-linux-gnu
16
-
archive: tar.gz tar.xz
17
steps:
18
-
- uses: actions/checkout@master
19
-
- uses: actions/cache@v3
20
-
with:
21
-
path: |
22
-
~/.cargo/bin/
23
-
~/.cargo/registry/index/
24
-
~/.cargo/registry/cache/
25
-
~/.cargo/git/db/
26
-
target/
27
-
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
28
-
- name: Installing needed dependencies
29
-
run: sudo apt-get install -y libasound2-dev protobuf-compiler
30
-
- name: Running cargo build
31
-
if: matrix.target == 'x86_64-unknown-linux-gnu'
32
-
uses: actions-rs/cargo@v1
33
with:
34
-
command: build
35
-
toolchain: stable
36
-
args: --locked --release --target x86_64-unknown-linux-gnu
37
- name: Set env
38
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
39
-
- name: Packaging final binary
40
-
if: matrix.target == 'x86_64-unknown-linux-gnu'
41
-
shell: bash
42
-
run: |
43
-
cd target/x86_64-unknown-linux-gnu/release
44
-
tar czvf tunein_${{ env.RELEASE_VERSION }}_x86_64-unknown-linux-gnu.tar.gz tunein
45
-
shasum -a 256 tunein_${{ env.RELEASE_VERSION }}_x86_64-unknown-linux-gnu.tar.gz > tunein_${{ env.RELEASE_VERSION }}_x86_64-unknown-linux-gnu.tar.gz.sha256
46
-
- name: Releasing assets
47
-
if: matrix.target == 'x86_64-unknown-linux-gnu'
48
-
uses: softprops/action-gh-release@v1
49
-
with:
50
-
files: |
51
-
target/x86_64-unknown-linux-gnu/release/tunein_${{ env.RELEASE_VERSION }}_x86_64-unknown-linux-gnu.tar.gz
52
-
target/x86_64-unknown-linux-gnu/release/tunein_${{ env.RELEASE_VERSION }}_x86_64-unknown-linux-gnu.tar.gz.sha256
53
env:
54
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
···
1
+
name: release
2
on:
3
release:
4
types: [created]
5
6
jobs:
7
+
build:
8
+
runs-on: ubuntu-latest
9
strategy:
10
matrix:
11
include:
12
- target: x86_64-unknown-linux-gnu
13
+
extensions: tar.gz tar.gz.sha256
14
steps:
15
+
- uses: actions/checkout@v3
16
+
- uses: denoland/setup-deno@v1
17
with:
18
+
deno-version: v1.37
19
+
- name: Setup Fluent CI CLI
20
+
run: deno install -A -r https://cli.fluentci.io -n fluentci
21
+
- name: Setup Dagger
22
+
run: |
23
+
curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.8 sh
24
+
sudo mv bin/dagger /usr/local/bin
25
+
dagger version
26
- name: Set env
27
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
28
+
- name: Build
29
+
run: fluentci run . build
30
env:
31
+
TAG: ${{ env.RELEASE_VERSION }}
32
+
TARGET: ${{ matrix.target }}
33
+
- name: Upload release assets
34
+
run: fluentci run github_pipeline release_upload
35
+
env:
36
+
TAG: ${{ env.RELEASE_VERSION }}
37
+
FILE: /assets/tunein_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.${{ matrix.extensions }}
38
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}