Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .github/workflows/build-and-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ jobs:
run: npm ci
- name: Build
run: npm run build
- name: Create Package
- name: Create CLI Package
run: |
cd apps/cli

if npm version --no-git-tag-version from-git > /dev/null 2>&1; then
echo "Using auto version based on git tag"
else
Expand All @@ -38,10 +40,10 @@ jobs:
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: package
path: out/
path: apps/cli/out/
- name: Attach build artifact to release
if: github.event_name == 'release'
uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # 2.0.8
with:
files: out/*.tgz
files: apps/cli/out/*.tgz

151 changes: 3 additions & 148 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,148 +1,3 @@
# Created by https://www.toptal.com/developers/gitignore/api/node
# Edit at https://www.toptal.com/developers/gitignore?templates=node

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional stylelint cache
.stylelintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# vuepress v2.x temp and cache directory
.temp

# Docusaurus cache and generated files
.docusaurus

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

### Node Patch ###
# Serverless Webpack directories
.webpack/

# Optional stylelint cache

# SvelteKit build / generate output
.svelte-kit

# End of https://www.toptal.com/developers/gitignore/api/node

/.react-email
# For storing development cache
/emails/static/cache
.turbo
node_modules
dist
1 change: 1 addition & 0 deletions apps/cli/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/out
24 changes: 24 additions & 0 deletions apps/cli/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "@watonomous/watcloud-email-cli",
"bin": {
"watcloud-emails": "dist/index.js"
},
"files": [
"dist"
],
"scripts": {
"dev": "tsup --watch",
"build": "tsup",
"check-types": "tsc --noEmit",
"clean": "rm -rf dist"
},
"devDependencies": {
"@react-email/components": "^0.1.1",
"commander": "^12.1.0",
"@repo/ts-config": "*",
"@repo/utils": "*",
"@watonomous/watcloud-email-templates": "*",
"tsup": "^8.5.0",
"typescript": "^5.6.3"
}
}
15 changes: 7 additions & 8 deletions cli/index.ts → apps/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
import { render } from '@react-email/components';
import { Command } from 'commander';
import fs from 'fs';
import { waitForAssets } from '../utils/watcloud-uri';
import { waitForAssets } from '@repo/utils/watcloud-uri';
import { Emails } from '@watonomous/watcloud-email-templates';

const program = new Command();

// Returns the email template with the given name and performs any necessary initialization.
async function getTemplate(template_name: string, props_array: any[] = []) {
const mod = require(`../emails/${template_name}`);
const mod = Emails[template_name];
if (!mod) {
throw new Error(`Template ${template_name} not found`);
}
if (mod.init) {
await Promise.all(props_array.map(mod.init));
}
Expand Down Expand Up @@ -89,12 +93,7 @@ program
.command('list')
.description('List all available templates')
.action(() => {
const files = fs.readdirSync(__dirname + '/../emails');
const templates = files.map((file) => file.replace(/\.jsx?$|\.tsx?$/, ''));
console.log('Available templates:');
for (const template of templates) {
console.log(template);
}
console.log('Available templates: ' + Object.keys(Emails).join(','));
});

program.parse();
10 changes: 10 additions & 0 deletions apps/cli/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "@repo/ts-config/tsconfig.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist"
},
"include": [
"src"
]
}
14 changes: 14 additions & 0 deletions apps/cli/tsup.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { defineConfig } from 'tsup';

export default defineConfig((options) => ({
entry: ['src/index.ts'],
format: ['cjs'],
// Don't need QoL features when building the final bundle
dts: Boolean(options.watch),
sourcemap: Boolean(options.watch),
minify: !options.watch,
// Include all dependencies in the final bundle
noExternal: options.watch ? [] : [ /.*/ ],
// Clean the output directory before building when building the final bundle
clean: !options.watch,
}));
Loading