@adbayb/stack 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +10 -0
  2. package/dist/index.cjs +7 -7
  3. package/dist/index.cjs.map +4 -4
  4. package/package.json +7 -6
  5. package/template/.changeset/README.md +8 -0
  6. package/template/.changeset/config.json.tmpl +13 -0
  7. package/template/.changeset/welcome.md.tmpl +5 -0
  8. package/template/.commitlintrc.json +3 -0
  9. package/template/.editorconfig +4 -0
  10. package/template/.eslintrc.json.tmpl +3 -0
  11. package/template/.github/ISSUE_TEMPLATE/bug_report.md +34 -0
  12. package/template/.github/ISSUE_TEMPLATE/config.yml +4 -0
  13. package/template/.github/PULL_REQUEST_TEMPLATE.md.tmpl +29 -0
  14. package/template/.github/renovate.json +69 -0
  15. package/template/.github/workflows/continuous_delivery.yml +49 -0
  16. package/template/.github/workflows/continuous_integration.yml +9 -0
  17. package/template/.github/workflows/conventional_commit.yml +48 -0
  18. package/template/.github/workflows/dependency_changelog.yml +117 -0
  19. package/template/.github/workflows/workflow.yml +96 -0
  20. package/template/.gitignore.tmpl +134 -0
  21. package/template/.npmrc.tmpl +7 -0
  22. package/template/.nvmrc.tmpl +1 -0
  23. package/template/.vscode/extensions.json +8 -0
  24. package/template/.vscode/settings.json +27 -0
  25. package/template/CONTRIBUTING.md.tmpl +21 -0
  26. package/{LICENSE → template/LICENSE.tmpl} +2 -2
  27. package/template/applications/README.md +9 -0
  28. package/template/examples/README.md +6 -0
  29. package/template/examples/default/package.json.tmpl +14 -0
  30. package/template/examples/default/src/index.ts.tmpl +3 -0
  31. package/template/examples/default/tsconfig.json +5 -0
  32. package/template/libraries/README.md +9 -0
  33. package/template/package.json.tmpl +26 -0
  34. package/template/pnpm-workspace.yaml.tmpl +6 -0
  35. package/template/tools/README.md +6 -0
  36. package/template/tsconfig.json +3 -0
  37. package/template/turbo.json +24 -0
  38. package/template/{{projectName}}/README.md.tmpl +42 -0
  39. package/template/{{projectName}}/package.json.tmpl +41 -0
  40. package/template/{{projectName}}/src/index.test.ts.tmpl +5 -0
  41. package/template/{{projectName}}/src/index.ts +1 -0
  42. package/template/{{projectName}}/tsconfig.json +5 -0
  43. package/templates/default/config.json +0 -17
  44. package/templates/default/content.tar.gz +0 -0
@@ -0,0 +1,9 @@
1
+ name: Continuous integration
2
+
3
+ on:
4
+ push:
5
+ branches-ignore: main
6
+
7
+ jobs:
8
+ main:
9
+ uses: ./.github/workflows/workflow.yml
@@ -0,0 +1,48 @@
1
+ name: Conventional commit
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, edited]
6
+
7
+ jobs:
8
+ main:
9
+ timeout-minutes: 5
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: amannn/action-semantic-pull-request@v5
13
+ id: check_pr_rule
14
+ env:
15
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
16
+ with:
17
+ types: |
18
+ build
19
+ chore
20
+ ci
21
+ docs
22
+ feat
23
+ fix
24
+ perf
25
+ refactor
26
+ revert
27
+ style
28
+ test
29
+ requireScope: false
30
+ subjectPattern: ^(?![A-Z]).+$
31
+ subjectPatternError: The subject must start with a lowercase character
32
+ # Create a sticky comment to display the detailed error
33
+ - uses: marocchino/sticky-pull-request-comment@v2
34
+ if: always() && (steps.check_pr_rule.outputs.error_message != null)
35
+ with:
36
+ header: check_pr_comment
37
+ message: |
38
+ Pull request titles must follow the [Conventional Commits specification](https://www.conventionalcommits.org/).
39
+ Please adjust your title following:
40
+ ```
41
+ ${{ steps.check_pr_rule.outputs.error_message }}
42
+ ```
43
+ # Delete a previous comment when the issue has been resolved
44
+ - if: ${{ steps.check_pr_rule.outputs.error_message == null }}
45
+ uses: marocchino/sticky-pull-request-comment@v2
46
+ with:
47
+ header: check_pr_comment
48
+ delete: true
@@ -0,0 +1,117 @@
1
+ name: Dependency changelog
2
+
3
+ on:
4
+ pull_request_target:
5
+ paths:
6
+ - "**/pnpm-lock.yaml"
7
+
8
+ jobs:
9
+ main:
10
+ timeout-minutes: 5
11
+ runs-on: ubuntu-latest
12
+ if: github.actor == 'renovate[bot]'
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v4.1.1
16
+ with:
17
+ fetch-depth: 2
18
+ ref: ${{ github.head_ref }}
19
+ - name: Configure Git
20
+ run: |
21
+ git config --global user.email adbayb@gmail.com
22
+ git config --global user.name 'Ayoub Adib'
23
+ - name: Create changelog entry
24
+ uses: actions/github-script@v7.0.1
25
+ # Credits to https://github.com/backstage/backstage/blob/bcc11651add5a2589898dfb9d665ebb9d412201b/.github/workflows/sync_renovate-changesets.yml
26
+ with:
27
+ script: |
28
+ const { promises: fs } = require("fs");
29
+
30
+ async function getPackagesNames(files) {
31
+ const names = [];
32
+
33
+ for (const file of files) {
34
+ const data = JSON.parse(await fs.readFile(file, "utf8"));
35
+
36
+ if (!data.private) {
37
+ names.push(data.name);
38
+ }
39
+ }
40
+
41
+ return names;
42
+ }
43
+
44
+ async function createChangeset(fileName, packageBumps, packages) {
45
+ let message = "";
46
+
47
+ for (const [pkg, bump] of packageBumps) {
48
+ message = message + `Updated dependency \`${pkg}\` to \`${bump}\`.\n`;
49
+ }
50
+
51
+ const pkgs = packages.map((pkg) => `"${pkg}": minor`).join("\n");
52
+ const body = `---\n${pkgs}\n---\n\n${message.trim()}\n`;
53
+
54
+ await fs.writeFile(fileName, body);
55
+ }
56
+
57
+ async function getBumps(files) {
58
+ const bumps = new Map();
59
+
60
+ for (const file of files) {
61
+ const { stdout: changes } = await exec.getExecOutput("git", [
62
+ "show",
63
+ file,
64
+ ]);
65
+
66
+ for (const change of changes.split("\n")) {
67
+ if (!change.match(/^\+\s/)) {
68
+ continue;
69
+ }
70
+
71
+ const match = change.match(/"(.*?)"/g);
72
+
73
+ bumps.set(match[0].replace(/"/g, ""), match[1].replace(/"/g, ""));
74
+ }
75
+ }
76
+
77
+ return bumps;
78
+ }
79
+
80
+ const branch = await exec.getExecOutput("git branch --show-current");
81
+
82
+ if (!branch.stdout.startsWith("renovate/")) {
83
+ console.log("Not a renovate branch, skipping");
84
+
85
+ return;
86
+ }
87
+
88
+ const diffOutput = await exec.getExecOutput("git diff --name-only HEAD~1");
89
+ const diffFiles = diffOutput.stdout.split("\n");
90
+
91
+ if (diffFiles.find((f) => f.startsWith(".changeset"))) {
92
+ console.log("Changeset already exists, skipping");
93
+
94
+ return;
95
+ }
96
+
97
+ const files = diffFiles
98
+ .filter((file) => file !== "package.json") // skip root package.json
99
+ .filter((file) => file.includes("package.json"));
100
+ const packageNames = await getPackagesNames(files);
101
+
102
+ if (!packageNames.length) {
103
+ console.log("No package.json changes to published packages, skipping");
104
+
105
+ return;
106
+ }
107
+
108
+ const { stdout: shortHash } = await exec.getExecOutput(
109
+ "git rev-parse --short HEAD"
110
+ );
111
+ const fileName = `.changeset/renovate-${shortHash.trim()}.md`;
112
+ const packageBumps = await getBumps(files);
113
+
114
+ await createChangeset(fileName, packageBumps, packageNames);
115
+ await exec.exec("git", ["add", fileName]);
116
+ await exec.exec("git commit -C HEAD --amend --no-edit");
117
+ await exec.exec("git push --force");
@@ -0,0 +1,96 @@
1
+ name: Main shareable workflow
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ jobs:
7
+ install:
8
+ timeout-minutes: 5
9
+ name: Install
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Checkout the code
13
+ uses: actions/checkout@v4
14
+ - uses: pnpm/action-setup@v2
15
+ - name: Get node version
16
+ run: echo "version=$(cat .nvmrc)" >> $GITHUB_OUTPUT
17
+ id: node
18
+ - name: Setup node ${{ steps.node.outputs.version }}
19
+ uses: actions/setup-node@v4
20
+ with:
21
+ node-version: ${{ steps.node.outputs.version }}
22
+ cache: pnpm
23
+ - name: Setup cache
24
+ id: cache
25
+ uses: actions/cache@v3
26
+ with:
27
+ path: |
28
+ ./node_modules
29
+ ./turbo
30
+ key: ${{ runner.os }}-cache-${{ github.sha }}
31
+ restore-keys: |
32
+ ${{ runner.os }}-cache-
33
+ - name: Install dependencies
34
+ run: pnpm install --frozen-lockfile
35
+ build:
36
+ timeout-minutes: 5
37
+ needs: install
38
+ name: Build
39
+ runs-on: ubuntu-latest
40
+ steps:
41
+ - name: Checkout code
42
+ uses: actions/checkout@v4
43
+ - uses: pnpm/action-setup@v2
44
+ - name: Get node version
45
+ run: echo "version=$(cat .nvmrc)" >> $GITHUB_OUTPUT
46
+ id: node
47
+ - name: Setup node ${{ steps.node.outputs.version }}
48
+ uses: actions/setup-node@v4
49
+ with:
50
+ node-version: ${{ steps.node.outputs.version }}
51
+ cache: pnpm
52
+ - name: Setup cache
53
+ id: cache
54
+ uses: actions/cache@v3
55
+ with:
56
+ path: |
57
+ ./node_modules
58
+ ./turbo
59
+ key: ${{ runner.os }}-cache-${{ github.sha }}
60
+ restore-keys: |
61
+ ${{ runner.os }}-cache-
62
+ - name: Install dependencies
63
+ run: pnpm install --frozen-lockfile
64
+ - name: Build
65
+ run: pnpm build
66
+ check:
67
+ timeout-minutes: 5
68
+ needs: build
69
+ name: Check
70
+ runs-on: ubuntu-latest
71
+ steps:
72
+ - name: Checkout the code
73
+ uses: actions/checkout@v4
74
+ - uses: pnpm/action-setup@v2
75
+ - name: Get node version
76
+ run: echo "version=$(cat .nvmrc)" >> $GITHUB_OUTPUT
77
+ id: node
78
+ - name: Setup node ${{ steps.node.outputs.version }}
79
+ uses: actions/setup-node@v4
80
+ with:
81
+ node-version: ${{ steps.node.outputs.version }}
82
+ cache: pnpm
83
+ - name: Setup cache
84
+ id: cache
85
+ uses: actions/cache@v3
86
+ with:
87
+ path: |
88
+ ./node_modules
89
+ ./turbo
90
+ key: ${{ runner.os }}-cache-${{ github.sha }}
91
+ restore-keys: |
92
+ ${{ runner.os }}-cache-
93
+ - name: Install dependencies
94
+ run: pnpm install --frozen-lockfile
95
+ - name: Check (static analysis including linters, types, and commit message)
96
+ run: pnpm check
@@ -0,0 +1,134 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ lerna-debug.log*
8
+ .pnpm-debug.log*
9
+
10
+ # Diagnostic reports (https://nodejs.org/api/report.html)
11
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12
+
13
+ # Runtime data
14
+ pids
15
+ *.pid
16
+ *.seed
17
+ *.pid.lock
18
+
19
+ # Directory for instrumented libs generated by jscoverage/JSCover
20
+ lib-cov
21
+
22
+ # Coverage directory used by tools like istanbul
23
+ coverage
24
+ *.lcov
25
+
26
+ # nyc test coverage
27
+ .nyc_output
28
+
29
+ # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30
+ .grunt
31
+
32
+ # Bower dependency directory (https://bower.io/)
33
+ bower_components
34
+
35
+ # node-waf configuration
36
+ .lock-wscript
37
+
38
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
39
+ build/Release
40
+
41
+ # Dependency directories
42
+ node_modules/
43
+ jspm_packages/
44
+
45
+ # Snowpack dependency directory (https://snowpack.dev/)
46
+ web_modules/
47
+
48
+ # TypeScript cache
49
+ *.tsbuildinfo
50
+
51
+ # Optional npm cache directory
52
+ .npm
53
+
54
+ # Optional eslint cache
55
+ .eslintcache
56
+
57
+ # Optional stylelint cache
58
+ .stylelintcache
59
+
60
+ # Microbundle cache
61
+ .rpt2_cache/
62
+ .rts2_cache_cjs/
63
+ .rts2_cache_es/
64
+ .rts2_cache_umd/
65
+
66
+ # Optional REPL history
67
+ .node_repl_history
68
+
69
+ # Output of 'npm pack'
70
+ *.tgz
71
+
72
+ # Yarn Integrity file
73
+ .yarn-integrity
74
+
75
+ # dotenv environment variable files
76
+ .env
77
+ .env.development.local
78
+ .env.test.local
79
+ .env.production.local
80
+ .env.local
81
+
82
+ # parcel-bundler cache (https://parceljs.org/)
83
+ .cache
84
+ .parcel-cache
85
+
86
+ # Next.js build output
87
+ .next
88
+ out
89
+
90
+ # Nuxt.js build / generate output
91
+ .nuxt
92
+ dist
93
+
94
+ # Gatsby files
95
+ .cache/
96
+ # Comment in the public line in if your project uses Gatsby and not Next.js
97
+ # https://nextjs.org/blog/next-9-1#public-directory-support
98
+ # public
99
+
100
+ # vuepress build output
101
+ .vuepress/dist
102
+
103
+ # vuepress v2.x temp and cache directory
104
+ .temp
105
+ .cache
106
+
107
+ # Docusaurus cache and generated files
108
+ .docusaurus
109
+
110
+ # Serverless directories
111
+ .serverless/
112
+
113
+ # FuseBox cache
114
+ .fusebox/
115
+
116
+ # DynamoDB Local files
117
+ .dynamodb/
118
+
119
+ # TernJS port file
120
+ .tern-port
121
+
122
+ # Stores VSCode versions used for testing VSCode extensions
123
+ .vscode-test
124
+
125
+ # yarn v2
126
+ .yarn/cache
127
+ .yarn/unplugged
128
+ .yarn/build-state.yml
129
+ .yarn/install-state.gz
130
+ .pnp.*
131
+
132
+ # Others
133
+ .DS_Store
134
+ .turbo
@@ -0,0 +1,7 @@
1
+ save-exact=true
2
+ public-hoist-pattern[]=*changesets*
3
+ public-hoist-pattern[]=*commitlint*
4
+ public-hoist-pattern[]=*eslint*
5
+ public-hoist-pattern[]=*prettier*
6
+ public-hoist-pattern[]=*turbo*
7
+ public-hoist-pattern[]=*typescript*
@@ -0,0 +1 @@
1
+ {{nodeVersion}}
@@ -0,0 +1,8 @@
1
+ {
2
+ "recommendations": [
3
+ "dbaeumer.vscode-eslint",
4
+ "unifiedjs.vscode-mdx",
5
+ "yoavbls.pretty-ts-errors",
6
+ "znck.grammarly"
7
+ ]
8
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "eslint.validate": [
3
+ "javascript",
4
+ "javascriptreact",
5
+ "typescript",
6
+ "typescriptreact",
7
+ "markdown",
8
+ "mdx",
9
+ "astro"
10
+ ],
11
+ "editor.codeActionsOnSave": {
12
+ "source.fixAll.eslint": "explicit"
13
+ },
14
+ "workbench.editor.labelFormat": "short",
15
+ "typescript.tsdk": "node_modules/typescript/lib",
16
+ "typescript.enablePromptUseWorkspaceTsdk": true,
17
+ "grammarly.selectors": [
18
+ {
19
+ "language": "mdx",
20
+ "scheme": "file"
21
+ },
22
+ {
23
+ "language": "md",
24
+ "scheme": "file"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,21 @@
1
+ # Contributing
2
+
3
+ Thanks for showing interest to contribute to `{{projectName}}` 🥳.
4
+ We are open to contributions, we look forward to improving it with your help!
5
+
6
+ Here you will find guidelines that will help you to know how to contribute to this repository.
7
+ It can be about reporting an issue, proposing a bug fix, adding some features, and even more...
8
+
9
+ ## 🥇 Your first contribution
10
+
11
+ TODO
12
+
13
+ ## 🗂️ Conventions
14
+
15
+ TODO
16
+
17
+ ## 👨‍🍳 Recipes
18
+
19
+ ### How to XXX?
20
+
21
+ TODO
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2018 Ayoub Adib
3
+ Copyright (c) {{licenseYear}} Ayoub Adib
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
@@ -0,0 +1,9 @@
1
+ # Applications
2
+
3
+ > [!note]
4
+ > Optional folder that can be either:
5
+ >
6
+ > - Kept if the root package needs to be moved into it (when several package types (applications, libraries, ...) need to be created and the root package is by its nature an application)
7
+ > - Otherwise, removed if no planned use case
8
+
9
+ A collection of application-like projects. An application is a runnable program (a command-line interface, a mobile/web application, ...).
@@ -0,0 +1,6 @@
1
+ # Examples
2
+
3
+ A collection of examples to:
4
+
5
+ - Showcase the artifacts' usage (mainly for libraries)
6
+ - Source some scenarios for testing purposes (test cases)
@@ -0,0 +1,14 @@
1
+ {
2
+ "private": true,
3
+ "name": "@examples/default",
4
+ "version": "0.0.0",
5
+ "scripts": {
6
+ "start": "node -r esbuild-register ./src/index.ts"
7
+ },
8
+ "dependencies": {
9
+ "{{projectName}}": "workspace:^"
10
+ },
11
+ "devDependencies": {
12
+ "esbuild-register": "3.4.2"
13
+ }
14
+ }
@@ -0,0 +1,3 @@
1
+ import { HELLO_WORLD } from "{{projectName}}";
2
+
3
+ console.log(HELLO_WORLD);
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "include": ["src"],
4
+ "exclude": ["node_modules", "dist"]
5
+ }
@@ -0,0 +1,9 @@
1
+ # Libraries
2
+
3
+ > [!note]
4
+ > Optional folder that can be either:
5
+ >
6
+ > - Kept if the root package needs to be moved into it (when several package types (applications, libraries, ...) need to be created and the root package is by its nature a library)
7
+ > - Otherwise, removed if no planned use case
8
+
9
+ A collection of internal and/or publishable libraries (referred to as packages in the Node ecosystem) that are leveraged during software development to implement/share a specific aspect/functionality. A library generally encapsulates highly cohesive modules together.
@@ -0,0 +1,26 @@
1
+ {
2
+ "private": true,
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "prepare": "stack install",
7
+ "clean": "stack clean",
8
+ "check": "stack check",
9
+ "fix": "stack fix",
10
+ "start": "stack start",
11
+ "build": "stack build",
12
+ "watch": "stack watch",
13
+ "test": "stack test",
14
+ "release:log": "stack release --log",
15
+ "release:version": "stack release --tag",
16
+ "release:publish": "stack release --publish"
17
+ },
18
+ "prettier": "@adbayb/prettier-config",
19
+ "packageManager": "pnpm@{{npmVersion}}",
20
+ "engines": {
21
+ "node": ">=18.0.0",
22
+ "pnpm": ">=8.0.0",
23
+ "npm": "please-use-pnpm",
24
+ "yarn": "please-use-pnpm"
25
+ }
26
+ }
@@ -0,0 +1,6 @@
1
+ packages:
2
+ - "applications/*"
3
+ - "examples/*"
4
+ - "libraries/*"
5
+ - "tools/*"
6
+ - "{{projectName}}"
@@ -0,0 +1,6 @@
1
+ # Tools
2
+
3
+ > [!note]
4
+ > Optional folder that can be removed if no internal scripts or packages for development purposes
5
+
6
+ A collection of internal packages and scripts that act locally on the repository codebase.
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "@adbayb/ts-config"
3
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://turborepo.org/schema.json",
3
+ "pipeline": {
4
+ "build": {
5
+ "dependsOn": ["^build"],
6
+ "outputs": ["dist/**"]
7
+ },
8
+ "start": {
9
+ "dependsOn": ["build"],
10
+ "cache": false,
11
+ "persistent": true
12
+ },
13
+ "watch": {
14
+ "dependsOn": ["^build"],
15
+ "cache": false,
16
+ "persistent": true
17
+ },
18
+ "test": {
19
+ "dependsOn": ["build"],
20
+ "cache": false,
21
+ "persistent": true
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,42 @@
1
+ <br>
2
+ <div align="center">
3
+ <h1>📦 {{projectName}}</h1>
4
+ <strong>{{projectDescription}}</strong>
5
+ </div>
6
+ <br>
7
+ <br>
8
+
9
+ ## ✨ Features
10
+
11
+ TODO
12
+
13
+ <br>
14
+
15
+ ## 🚀 Usage
16
+
17
+ This section introduces the `{{projectName}}` essentials by walking through its main commands:
18
+
19
+ 0️⃣ ...
20
+ 1️⃣ ...
21
+ 2️⃣ ...
22
+ 3️⃣ ...
23
+
24
+ <br>
25
+
26
+ ## 🏗️ Architecture
27
+
28
+ TODO
29
+
30
+ <br>
31
+
32
+ ## ✍️ Contribution
33
+
34
+ We're open to new contributions, you can find more details [here](https://github.com/{{repoId}}/blob/main/CONTRIBUTING.md).
35
+
36
+ <br>
37
+
38
+ ## 📖 License
39
+
40
+ [MIT](https://github.com/{{repoId}}/blob/main/LICENSE "License MIT")
41
+
42
+ <br>