a homebrewed DnD campaign based in the Honkai: Star Rail universe
hsr honkaistarrail dnd
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ci: initial ci workflow (#77)

authored by

Samantha and committed by
GitHub
e0166f45 543139bf

+275 -125
+47 -47
.github/dependabot.yml
··· 5 5 6 6 version: 2 7 7 updates: 8 - - package-ecosystem: "npm" 9 - directory: "/" 8 + - package-ecosystem: 'npm' 9 + directory: '/' 10 10 schedule: 11 - interval: "monthly" 11 + interval: 'monthly' 12 12 commit-message: 13 - prefix: "deps(npm):" 13 + prefix: 'deps(npm):' 14 14 groups: 15 15 typescript: 16 16 patterns: 17 - - "node-modules-inspector" 18 - - "typescript" 19 - - "type-fest" 20 - - "@types/node" 17 + - 'node-modules-inspector' 18 + - 'typescript' 19 + - 'type-fest' 20 + - '@types/node' 21 21 svelte: 22 22 patterns: 23 - - "bits-ui" 24 - - "svelte" 25 - - "svelte-*" 26 - - "@sveltejs/*" 27 - - "mdsvex" 28 - - "mode-watcher" 29 - - "chromatic" 30 - - "storybook" 31 - - "@storybook/*" 32 - - "@lucide/svelte" 33 - - "@tanstack/svelte-table" 23 + - 'bits-ui' 24 + - 'svelte' 25 + - 'svelte-*' 26 + - '@sveltejs/*' 27 + - 'mdsvex' 28 + - 'mode-watcher' 29 + - 'chromatic' 30 + - 'storybook' 31 + - '@storybook/*' 32 + - '@lucide/svelte' 33 + - '@tanstack/svelte-table' 34 34 frontend-backend: 35 35 patterns: 36 - - "@cloudflare/*" 37 - - "tailwind-*" 38 - - "tailwindcss" 39 - - "@tailwindcss/*" 40 - - "lightningcss" 41 - - "lorem-ipsum" 42 - - "supabase" 43 - - "@supabase/*" 36 + - '@cloudflare/*' 37 + - 'tailwind-*' 38 + - 'tailwindcss' 39 + - '@tailwindcss/*' 40 + - 'lightningcss' 41 + - 'lorem-ipsum' 42 + - 'supabase' 43 + - '@supabase/*' 44 44 voidzero-vite: 45 45 patterns: 46 - - "eslint-plugin-svelte" 47 - - "oxfmt" 48 - - "oxlint" 49 - - "oxlint-tsgolint" 50 - - "publint" 51 - - "playwright" 52 - - "rolldown" 53 - - "rolldown-vite" 54 - - "rolldown-plugin-*" 55 - - "vite" 56 - - "vitest" 57 - - "vitest-*" 58 - - "@vitest/*" 59 - - "tsdown" 46 + - 'eslint-plugin-svelte' 47 + - 'oxfmt' 48 + - 'oxlint' 49 + - 'oxlint-tsgolint' 50 + - 'publint' 51 + - 'playwright' 52 + - 'rolldown' 53 + - 'rolldown-vite' 54 + - 'rolldown-plugin-*' 55 + - 'vite' 56 + - 'vitest' 57 + - 'vitest-*' 58 + - '@vitest/*' 59 + - 'tsdown' 60 60 open-pull-requests-limit: 4 61 61 62 - - package-ecosystem: "github-actions" 63 - directory: "/" 62 + - package-ecosystem: 'github-actions' 63 + directory: '/' 64 64 schedule: 65 - interval: "daily" 65 + interval: 'daily' 66 66 commit-message: 67 - prefix: "deps(gha):" 67 + prefix: 'deps(gha):' 68 68 groups: 69 69 github: 70 70 patterns: 71 - - "github/*" 72 - - "actions/*" 71 + - 'github/*' 72 + - 'actions/*' 73 73 open-pull-requests-limit: 4
+71
.github/workflows/ci.yml
··· 1 + name: Node.js CI 2 + 3 + on: 4 + push: 5 + branches: 6 + - main 7 + pull_request: 8 + branches: 9 + - main 10 + workflow_dispatch: 11 + 12 + concurrency: 13 + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 14 + cancel-in-progress: true 15 + 16 + jobs: 17 + build: 18 + name: build (Node @${{ matrix.label }}) 19 + runs-on: ubuntu-latest 20 + strategy: 21 + matrix: 22 + include: 23 + - node-version: latest 24 + label: Latest 25 + steps: 26 + - name: Checkout repository 27 + uses: actions/checkout@v6 28 + - name: Install Node.js ${{ matrix.node-version }} 29 + uses: actions/setup-node@v6 30 + with: 31 + node-version: ${{ matrix.node-version }} 32 + cache: 'npm' 33 + - name: Install dependencies 34 + run: npm ci --verbose 35 + - name: Build packages 36 + run: npm run build 37 + env: 38 + PUBLIC_SUPABASE_URL: ${{ secrets.PUBLIC_SUPABASE_URL }} 39 + PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.PUBLIC_SUPABASE_ANON_KEY }} 40 + PUBLIC_SUPABASE_PUBLISHABLE_KEY: ${{ secrets.PUBLIC_SUPABASE_PUBLISHABLE_KEY }} 41 + DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }} 42 + DISCORD_CLIENT_SECRET: ${{ secrets.DISCORD_CLIENT_SECRET }} 43 + - name: Run tests 44 + run: npm run test-ci 45 + 46 + codequality: 47 + name: codequality (${{ matrix.tool }}) 48 + runs-on: ubuntu-latest 49 + strategy: 50 + matrix: 51 + include: 52 + - tool: oxfmt 53 + tool-purpose: formatter 54 + npm-script: fmt-ci 55 + - tool: oxlint 56 + tool-purpose: linter 57 + npm-script: lint 58 + steps: 59 + - name: Checkout repository 60 + uses: actions/checkout@v6 61 + - name: Install Node.js 62 + uses: actions/setup-node@v6 63 + with: 64 + node-version: latest 65 + cache: 'npm' 66 + - name: Install dependencies 67 + run: npm ci --verbose 68 + - name: Print environment info 69 + run: npx ${{ matrix.tool }} --version 70 + - name: Run ${{ matrix.tool-purpose }} checks 71 + run: npm run ${{ matrix.npm-script }}
+3 -14
.oxlintrc.json
··· 1 1 { 2 2 "$schema": "./node_modules/oxlint/configuration_schema.json", 3 - "plugins": [ 4 - "oxc", 5 - "promise", 6 - "unicorn", 7 - "typescript" 8 - ], 3 + "plugins": ["oxc", "promise", "unicorn", "typescript"], 9 4 "categories": { 10 5 "correctness": "error" 11 6 }, 12 7 "env": { 13 8 "builtin": true 14 9 }, 15 - "ignorePatterns": [ 16 - "**/dist/", 17 - "docs/typedoc" 18 - ], 10 + "ignorePatterns": ["**/dist/", "docs/typedoc"], 19 11 "rules": { 20 12 "no-array-constructor": "error", 21 13 "no-empty-function": "error", ··· 53 45 "typescript/ban-tslint-comment": "error", 54 46 "typescript/consistent-generic-constructors": "error", 55 47 "typescript/consistent-indexed-object-style": "error", 56 - "typescript/consistent-type-definitions": [ 57 - "error", 58 - "type" 59 - ], 48 + "typescript/consistent-type-definitions": ["error", "type"], 60 49 "typescript/no-confusing-non-null-assertion": "error", 61 50 "typescript/no-inferrable-types": "error", 62 51 "typescript/prefer-for-of": "error",
+5
README.md
··· 1 1 # Drifting Starlight 2 2 3 3 ## Developing 4 + 4 5 Create `app/.env.local` file and setup local environment variables: 6 + 5 7 ``` 6 8 PUBLIC_SUPABASE_URL= 7 9 PUBLIC_SUPABASE_ANON_KEY= ··· 11 13 ``` 12 14 13 15 Run the following: 16 + 14 17 ```sh 15 18 npm i 16 19 npm run build # production environment ··· 18 21 ``` 19 22 20 23 ## Todo-list 24 + 21 25 ### Spells 26 + 22 27 - [ ] School (Abjuration, Conjuration, Divination, Enchantment, Evocation, Illusion, Necromany, Transmutation) 23 28 - [ ] Casting time 24 29 - [ ] Components (Verbal, Somatic, Material)
+9 -9
app/.storybook/preview-head.html
··· 1 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/Hsr-Universal-Script.otf"> 2 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/Hsr-Universal-Script.otf"> 3 - <link type="font/ttf" rel="prefetch" as="font" href="/fonts/Fliege-Mono-Variable.ttf"> 4 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro.otf"> 5 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Italic.otf"> 6 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Medium.otf"> 7 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Medium-Italic.otf"> 8 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Bold.otf"> 9 - <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Bold-Italic.otf"> 1 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/Hsr-Universal-Script.otf" /> 2 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/Hsr-Universal-Script.otf" /> 3 + <link type="font/ttf" rel="prefetch" as="font" href="/fonts/Fliege-Mono-Variable.ttf" /> 4 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro.otf" /> 5 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Italic.otf" /> 6 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Medium.otf" /> 7 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Medium-Italic.otf" /> 8 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Bold.otf" /> 9 + <link type="font/otf" rel="prefetch" as="font" href="/fonts/DinPro/DinPro-Bold-Italic.otf" />
+5
app/docs/guidelines.md
··· 1 1 # Coding Guidelines 2 + 2 3 This document is a living style guide for documenting coding conventions that tend to naturally pop up. 3 4 4 5 ## Project structure 6 + 5 7 Some notable folders and files: 8 + 6 9 - `/app`: a SvelteKit project containing the main web application. 7 10 - `/app/src/lib/components`: Foundational, lower-level UI components 8 11 - `/app/src/lib/patterns`: Higher-level UI components composed of multiple lower-level components ··· 17 20 - `/wrangler.toml`: config file used for CloudFlare to customize CloudFlare Workers deployments 18 21 19 22 ## Creating a Svelte component 23 + 20 24 The basic foundation/boilerplate for writing a svelte component is as follows: 21 25 22 26 ```svelte ··· 38 42 ``` 39 43 40 44 Notes: 45 + 41 46 - The `<ComponentName>RootElement` type allows inheriting built-in attributes of the HTML element that you're providing. 42 47 - The `<ComponentName>Props` type is a type union between built-in attributes and custom properties. It also defines whether the component accepts children.
+11 -3
app/src/app.css
··· 1 1 @import 'tailwindcss'; 2 2 3 3 @theme { 4 - --color-hsr-gold: #9F7755; 4 + --color-hsr-gold: #9f7755; 5 5 --color-hsr-dark: #151512; 6 6 7 - --font-sans: 'DIN Pro', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; 7 + --font-sans: 8 + 'DIN Pro', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 9 + 'Segoe UI Symbol', 'Noto Color Emoji'; 8 10 --font-script: 'Hsr _ Jariloivhertaspacestation', sans-serif; 9 11 --font-serif: 'Fraunces', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; 10 12 } 11 13 12 14 @utility bg-diagonal-lines { 13 - background-image: repeating-linear-gradient(-45deg, currentColor 0, currentColor 1px, transparent 0, transparent 50%); 15 + background-image: repeating-linear-gradient( 16 + -45deg, 17 + currentColor 0, 18 + currentColor 1px, 19 + transparent 0, 20 + transparent 50% 21 + ); 14 22 background-size: 10px 10px; 15 23 } 16 24
+85 -17
app/src/app.html
··· 3 3 <head> 4 4 <meta charset="utf-8" /> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/Hsr-Universal-Script.otf"> 7 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/DinPro/DinPro.otf"> 8 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/DinPro/DinPro-Italic.otf"> 9 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/DinPro/DinPro-Medium.otf"> 10 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/DinPro/DinPro-Medium-Italic.otf"> 11 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/DinPro/DinPro-Bold.otf"> 12 - <link rel="prefetch" type="font/otf" as="font" href="%sveltekit.assets%/fonts/DinPro/DinPro-Bold-Italic.otf"> 6 + <link 7 + rel="prefetch" 8 + type="font/otf" 9 + as="font" 10 + href="%sveltekit.assets%/fonts/Hsr-Universal-Script.otf" 11 + /> 12 + <link 13 + rel="prefetch" 14 + type="font/otf" 15 + as="font" 16 + href="%sveltekit.assets%/fonts/DinPro/DinPro.otf" 17 + /> 18 + <link 19 + rel="prefetch" 20 + type="font/otf" 21 + as="font" 22 + href="%sveltekit.assets%/fonts/DinPro/DinPro-Italic.otf" 23 + /> 24 + <link 25 + rel="prefetch" 26 + type="font/otf" 27 + as="font" 28 + href="%sveltekit.assets%/fonts/DinPro/DinPro-Medium.otf" 29 + /> 30 + <link 31 + rel="prefetch" 32 + type="font/otf" 33 + as="font" 34 + href="%sveltekit.assets%/fonts/DinPro/DinPro-Medium-Italic.otf" 35 + /> 36 + <link 37 + rel="prefetch" 38 + type="font/otf" 39 + as="font" 40 + href="%sveltekit.assets%/fonts/DinPro/DinPro-Bold.otf" 41 + /> 42 + <link 43 + rel="prefetch" 44 + type="font/otf" 45 + as="font" 46 + href="%sveltekit.assets%/fonts/DinPro/DinPro-Bold-Italic.otf" 47 + /> 13 48 <link rel="icon" href="%sveltekit.assets%/favicons/favicon.svg" /> 14 - <link rel="icon" href="%sveltekit.assets%/favicons/favicon.ico"> 15 - <link type="image/png" sizes="16x16" rel="icon" href="%sveltekit.assets%/favicons/favicon-16x16.png"> 16 - <link type="image/png" sizes="32x32" rel="icon" href="%sveltekit.assets%/favicons/favicon-32x32.png"> 17 - <link type="image/png" sizes="192x192" rel="icon" href="%sveltekit.assets%/favicons/android-chrome-192x192.png"> 18 - <link type="image/png" sizes="512x512" rel="icon" href="%sveltekit.assets%/favicons/android-chrome-512x512.png"> 19 - <link type="image/png" sizes="180x180" rel="apple-touch-icon" href="%sveltekit.assets%/favicons/apple-touch-icon.png"> 20 - <link type="image/png" sizes="180x180" rel="apple-touch-icon-precomposed" href="%sveltekit.assets%/favicons/apple-touch-icon-precomposed.png"> 21 - <link rel="preconnect" href="https://fonts.googleapis.com"> 22 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> 23 - <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,100..900;1,9..144,100..900&display=swap"> 49 + <link rel="icon" href="%sveltekit.assets%/favicons/favicon.ico" /> 50 + <link 51 + type="image/png" 52 + sizes="16x16" 53 + rel="icon" 54 + href="%sveltekit.assets%/favicons/favicon-16x16.png" 55 + /> 56 + <link 57 + type="image/png" 58 + sizes="32x32" 59 + rel="icon" 60 + href="%sveltekit.assets%/favicons/favicon-32x32.png" 61 + /> 62 + <link 63 + type="image/png" 64 + sizes="192x192" 65 + rel="icon" 66 + href="%sveltekit.assets%/favicons/android-chrome-192x192.png" 67 + /> 68 + <link 69 + type="image/png" 70 + sizes="512x512" 71 + rel="icon" 72 + href="%sveltekit.assets%/favicons/android-chrome-512x512.png" 73 + /> 74 + <link 75 + type="image/png" 76 + sizes="180x180" 77 + rel="apple-touch-icon" 78 + href="%sveltekit.assets%/favicons/apple-touch-icon.png" 79 + /> 80 + <link 81 + type="image/png" 82 + sizes="180x180" 83 + rel="apple-touch-icon-precomposed" 84 + href="%sveltekit.assets%/favicons/apple-touch-icon-precomposed.png" 85 + /> 86 + <link rel="preconnect" href="https://fonts.googleapis.com" /> 87 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="" /> 88 + <link 89 + rel="stylesheet" 90 + href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,100..900;1,9..144,100..900&display=swap" 91 + /> 24 92 %sveltekit.head% 25 93 </head> 26 94 <body data-sveltekit-preload-data="hover">
+21 -21
app/src/fonts.css
··· 1 1 /** Fonts */ 2 2 @font-face { 3 - font-family: "Hsr _ Jariloivhertaspacestation"; 3 + font-family: 'Hsr _ Jariloivhertaspacestation'; 4 4 font-style: normal; 5 5 font-weight: 400; 6 6 src: 7 - local("Hsr _ Jariloivhertaspacestation"), 8 - url("/fonts/Hsr-Universal-Script.otf") format("opentype"); 7 + local('Hsr _ Jariloivhertaspacestation'), 8 + url('/fonts/Hsr-Universal-Script.otf') format('opentype'); 9 9 font-display: swap; 10 10 } 11 11 12 12 @font-face { 13 - font-family: "DIN Pro"; 13 + font-family: 'DIN Pro'; 14 14 font-style: normal; 15 15 src: 16 - local("DIN Pro"), 17 - url("/fonts/DinPro/DinPro.otf") format("opentype"); 16 + local('DIN Pro'), 17 + url('/fonts/DinPro/DinPro.otf') format('opentype'); 18 18 font-weight: 400; 19 19 } 20 20 21 21 @font-face { 22 - font-family: "DIN Pro"; 22 + font-family: 'DIN Pro'; 23 23 font-style: normal; 24 24 src: 25 - local("DIN Pro"), 26 - url("/fonts/DinPro/DinPro-Medium.otf") format("opentype"); 25 + local('DIN Pro'), 26 + url('/fonts/DinPro/DinPro-Medium.otf') format('opentype'); 27 27 font-weight: 500; 28 28 } 29 29 30 30 @font-face { 31 - font-family: "DIN Pro"; 31 + font-family: 'DIN Pro'; 32 32 font-style: normal; 33 33 src: 34 - local("DIN Pro"), 35 - url("/fonts/DinPro/DinPro-Bold.otf") format("opentype"); 34 + local('DIN Pro'), 35 + url('/fonts/DinPro/DinPro-Bold.otf') format('opentype'); 36 36 font-weight: 700; 37 37 } 38 38 39 39 @font-face { 40 - font-family: "DIN Pro"; 40 + font-family: 'DIN Pro'; 41 41 font-style: italic; 42 42 src: 43 - local("DIN Pro"), 44 - url("/fonts/DinPro/DinPro-Italic.otf") format("opentype"); 43 + local('DIN Pro'), 44 + url('/fonts/DinPro/DinPro-Italic.otf') format('opentype'); 45 45 font-weight: 400; 46 46 } 47 47 48 48 @font-face { 49 - font-family: "DIN Pro"; 49 + font-family: 'DIN Pro'; 50 50 font-style: italic; 51 51 src: 52 - local("DIN Pro"), 53 - url("/fonts/DinPro/DinPro-Medium-Italic.otf") format("opentype"); 52 + local('DIN Pro'), 53 + url('/fonts/DinPro/DinPro-Medium-Italic.otf') format('opentype'); 54 54 font-weight: 500; 55 55 } 56 56 57 57 @font-face { 58 - font-family: "DIN Pro"; 58 + font-family: 'DIN Pro'; 59 59 font-style: italic; 60 60 src: 61 - local("DIN Pro"), 62 - url("/fonts/DinPro/DinPro-Bold-Italic.otf") format("opentype"); 61 + local('DIN Pro'), 62 + url('/fonts/DinPro/DinPro-Bold-Italic.otf') format('opentype'); 63 63 font-weight: 700; 64 64 }
+3 -5
app/tsconfig.json
··· 1 1 { 2 2 "extends": "./.svelte-kit/tsconfig.json", 3 - "exclude": [ 4 - "**/node_modules/*" 5 - ], 3 + "exclude": ["**/node_modules/*"], 6 4 "compilerOptions": { 7 5 "allowJs": true, 8 6 "checkJs": true, ··· 12 10 "skipLibCheck": true, 13 11 "sourceMap": true, 14 12 "strict": true, 15 - "moduleResolution": "bundler" 16 - } 13 + "moduleResolution": "bundler", 14 + }, 17 15 // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias 18 16 // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files 19 17 //
+4 -2
package.json
··· 14 14 "build": "./scripts/build.sh", 15 15 "storybook": "npm run storybook --workspace=app", 16 16 "fmt": "oxfmt", 17 + "fmt-ci": "oxfmt --check", 17 18 "lint": "oxlint", 18 19 "lint-types": "oxlint --type-check --type-aware", 19 20 "lint-fix": "oxlint --fix", 20 - "test": "vitest --coverage --typecheck.enabled", 21 - "test-ui": "vitest --ui --coverage --typecheck.enabled", 21 + "test": "vitest --coverage", 22 + "test-ci": "vitest --run --coverage", 23 + "test-ui": "vitest --ui --coverage", 22 24 "bench": "vitest bench", 23 25 "inspect": "node-modules-inspector" 24 26 },
+2 -2
packages/icons/tsconfig.json
··· 11 11 "sourceMap": true, 12 12 "strict": true, 13 13 "module": "NodeNext", 14 - "moduleResolution": "NodeNext" 15 - } 14 + "moduleResolution": "NodeNext", 15 + }, 16 16 }
+1
packages/tokenizer/package.json
··· 19 19 "scripts": { 20 20 "build": "tsdown", 21 21 "test": "vitest", 22 + "test-ci": "vitest --run", 22 23 "test-ui": "vitest --ui", 23 24 "fmt": "oxfmt --config=../../.oxfmtrc.json", 24 25 "lint": "oxlint --config=../../.oxlintrc.json",
+1 -5
scripts/build.sh
··· 1 1 #!/bin/sh 2 2 3 - npm i 4 - npm run build --workspace=packages/color 3 + npx tsdown 5 4 npm run build --workspace=packages/icons 6 - npm run build --workspace=packages/types 7 - npm run build --workspace=packages/storybook-utils 8 - npm run build --workspace=packages/tokenizer 9 5 npm run build --workspace=app
+7
tsdown.config.ts
··· 1 + import { defineConfig } from 'tsdown' 2 + 3 + export default defineConfig({ 4 + workspace: { 5 + include: ['packages/*'], 6 + }, 7 + })