From bcbdbe4fd640c9d8659defa08695391735032a22 Mon Sep 17 00:00:00 2001 From: Titus Mumo Date: Wed, 26 Jun 2024 20:29:23 +0300 Subject: [PATCH] convert donald to a monorepo (#31) * convert donald to a monorepo * convert donald to a monorepo #27 * rename to hercules, revert import style, test hercules with imports to stark * check prettier precommit hook * check again * cnfigure bun * check husky functionality * remove husky script * add eslint * Update pre-commit --------- Co-authored-by: Leo Ngari --- .gitignore | 194 +++++++++++++++--- .husky/pre-commit | 3 + .prettierignore | 9 +- bun.lockb | Bin 161100 -> 155912 bytes eslint.config.js | 35 ++++ package.json | 65 ++---- .../hercules/.dockerignore | 0 packages/hercules/.gitignore | 47 +++++ Dockerfile => packages/hercules/Dockerfile | 0 bunfig.toml => packages/hercules/bunfig.toml | 0 .../hercules/drizzle.config.ts | 0 .../hercules/entrypoint.sh | 0 .../hercules/eslint.config.mjs | 0 packages/hercules/package.json | 52 +++++ {src => packages/hercules/src}/app.test.ts | 0 {src => packages/hercules/src}/app.ts | 0 {src => packages/hercules/src}/bin/migrate.ts | 0 {src => packages/hercules/src}/config.ts | 0 .../hercules/src}/controllers/tag/@main.ts | 0 .../src}/controllers/tag/createTag.meta.ts | 0 .../src}/controllers/tag/createTag.test.ts | 0 .../src}/controllers/tag/createTag.ts | 0 .../hercules/src}/controllers/tag/getTag.ts | 0 .../hercules/src}/controllers/tag/index.ts | 0 .../tag/linkTagToTransaction.meta.ts | 0 .../controllers/tag/linkTagToTransaction.ts | 0 .../hercules/src}/controllers/upload/@main.ts | 0 .../upload/uploadBatchTransactions.meta.ts | 0 .../upload/uploadBatchTransactions.ts | 0 .../hercules/src}/controllers/upload/utils.ts | 0 .../hercules/src}/controllers/user/@main.ts | 0 .../controllers/user/authenticateUser.meta.ts | 0 .../src}/controllers/user/authenticateUser.ts | 0 .../hercules/src}/controllers/user/index.ts | 0 .../controllers/user/registerUser.meta.ts | 0 .../src}/controllers/user/registerUser.ts | 0 .../src}/controllers/user/user.test.ts | 0 .../user/verifyAccessToken.meta.ts | 0 .../controllers/user/verifyAccessToken.ts | 0 packages/hercules/src/hello.ts | 3 + {src => packages/hercules/src}/hooks/index.ts | 0 {src => packages/hercules/src}/index.ts | 8 + .../src}/repository/functional/tags.ts | 0 .../repository/functional/transactions.ts | 0 .../src}/repository/functional/user.ts | 0 .../hercules/src}/repository/index.ts | 0 .../hercules/src}/repository/neon/api.ts | 0 .../src}/repository/neon/functional.ts | 0 .../hercules/src}/repository/neon/index.ts | 0 .../hercules/src}/repository/neon/types.ts | 0 .../hercules/src}/repository/schema.ts | 0 .../hercules/src}/repository/seed/index.ts | 0 .../src}/repository/seed/transactionsTypes.ts | 0 .../hercules/src}/repository/setup.ts | 0 .../hercules/src}/testing/__preload__.ts | 0 .../src}/testing/authTestingTemplate.ts | 0 .../hercules/src}/testing/index.ts | 0 {src => packages/hercules/src}/types.ts | 0 {src => packages/hercules/src}/utils/index.ts | 0 {src => packages/hercules/src}/utils/jwt.ts | 0 .../hercules/supabase}/.gitignore | 0 .../hercules/supabase}/config.toml | 0 .../migrations/0000_dizzy_rick_jones.sql | 0 .../migrations/meta/0000_snapshot.json | 0 .../supabase}/migrations/meta/_journal.json | 0 .../hercules/supabase}/seed.sql | 0 packages/hercules/tsconfig.json | 16 ++ packages/stark/.gitignore | 175 ++++++++++++++++ packages/stark/README.md | 15 ++ packages/stark/index.ts | 3 + packages/stark/package.json | 17 ++ packages/stark/tsconfig.json | 28 +++ tsconfig.json | 34 ++- 73 files changed, 611 insertions(+), 93 deletions(-) create mode 100644 eslint.config.js rename .dockerignore => packages/hercules/.dockerignore (100%) create mode 100644 packages/hercules/.gitignore rename Dockerfile => packages/hercules/Dockerfile (100%) rename bunfig.toml => packages/hercules/bunfig.toml (100%) rename drizzle.config.ts => packages/hercules/drizzle.config.ts (100%) rename entrypoint.sh => packages/hercules/entrypoint.sh (100%) rename eslint.config.mjs => packages/hercules/eslint.config.mjs (100%) create mode 100644 packages/hercules/package.json rename {src => packages/hercules/src}/app.test.ts (100%) rename {src => packages/hercules/src}/app.ts (100%) rename {src => packages/hercules/src}/bin/migrate.ts (100%) rename {src => packages/hercules/src}/config.ts (100%) rename {src => packages/hercules/src}/controllers/tag/@main.ts (100%) rename {src => packages/hercules/src}/controllers/tag/createTag.meta.ts (100%) rename {src => packages/hercules/src}/controllers/tag/createTag.test.ts (100%) rename {src => packages/hercules/src}/controllers/tag/createTag.ts (100%) rename {src => packages/hercules/src}/controllers/tag/getTag.ts (100%) rename {src => packages/hercules/src}/controllers/tag/index.ts (100%) rename {src => packages/hercules/src}/controllers/tag/linkTagToTransaction.meta.ts (100%) rename {src => packages/hercules/src}/controllers/tag/linkTagToTransaction.ts (100%) rename {src => packages/hercules/src}/controllers/upload/@main.ts (100%) rename {src => packages/hercules/src}/controllers/upload/uploadBatchTransactions.meta.ts (100%) rename {src => packages/hercules/src}/controllers/upload/uploadBatchTransactions.ts (100%) rename {src => packages/hercules/src}/controllers/upload/utils.ts (100%) rename {src => packages/hercules/src}/controllers/user/@main.ts (100%) rename {src => packages/hercules/src}/controllers/user/authenticateUser.meta.ts (100%) rename {src => packages/hercules/src}/controllers/user/authenticateUser.ts (100%) rename {src => packages/hercules/src}/controllers/user/index.ts (100%) rename {src => packages/hercules/src}/controllers/user/registerUser.meta.ts (100%) rename {src => packages/hercules/src}/controllers/user/registerUser.ts (100%) rename {src => packages/hercules/src}/controllers/user/user.test.ts (100%) rename {src => packages/hercules/src}/controllers/user/verifyAccessToken.meta.ts (100%) rename {src => packages/hercules/src}/controllers/user/verifyAccessToken.ts (100%) create mode 100644 packages/hercules/src/hello.ts rename {src => packages/hercules/src}/hooks/index.ts (100%) rename {src => packages/hercules/src}/index.ts (61%) rename {src => packages/hercules/src}/repository/functional/tags.ts (100%) rename {src => packages/hercules/src}/repository/functional/transactions.ts (100%) rename {src => packages/hercules/src}/repository/functional/user.ts (100%) rename {src => packages/hercules/src}/repository/index.ts (100%) rename {src => packages/hercules/src}/repository/neon/api.ts (100%) rename {src => packages/hercules/src}/repository/neon/functional.ts (100%) rename {src => packages/hercules/src}/repository/neon/index.ts (100%) rename {src => packages/hercules/src}/repository/neon/types.ts (100%) rename {src => packages/hercules/src}/repository/schema.ts (100%) rename {src => packages/hercules/src}/repository/seed/index.ts (100%) rename {src => packages/hercules/src}/repository/seed/transactionsTypes.ts (100%) rename {src => packages/hercules/src}/repository/setup.ts (100%) rename {src => packages/hercules/src}/testing/__preload__.ts (100%) rename {src => packages/hercules/src}/testing/authTestingTemplate.ts (100%) rename {src => packages/hercules/src}/testing/index.ts (100%) rename {src => packages/hercules/src}/types.ts (100%) rename {src => packages/hercules/src}/utils/index.ts (100%) rename {src => packages/hercules/src}/utils/jwt.ts (100%) rename {supabase => packages/hercules/supabase}/.gitignore (100%) rename {supabase => packages/hercules/supabase}/config.toml (100%) rename {supabase => packages/hercules/supabase}/migrations/0000_dizzy_rick_jones.sql (100%) rename {supabase => packages/hercules/supabase}/migrations/meta/0000_snapshot.json (100%) rename {supabase => packages/hercules/supabase}/migrations/meta/_journal.json (100%) rename {supabase => packages/hercules/supabase}/seed.sql (100%) create mode 100644 packages/hercules/tsconfig.json create mode 100644 packages/stark/.gitignore create mode 100644 packages/stark/README.md create mode 100644 packages/stark/index.ts create mode 100644 packages/stark/package.json create mode 100644 packages/stark/tsconfig.json diff --git a/.gitignore b/.gitignore index c328aa4..9b1ee42 100644 --- a/.gitignore +++ b/.gitignore @@ -1,47 +1,175 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore -# dependencies -/node_modules -/.pnp -.pnp.js +# Logs -# testing -/coverage +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* -# next.js -/.next/ -/out/ +# Caches -# production -/build +.cache -# misc -.DS_Store -*.pem +# Diagnostic reports (https://nodejs.org/api/report.html) -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json -# local env files -.env* -.env.local +# 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/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# 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 -# vercel -.vercel +# vuepress build output -**/*.trace -**/*.zip -**/*.tar.gz -**/*.tgz -**/*.log -package-lock.json -**/*.bun +.vuepress/dist -neon-cache.json +# vuepress v2.x temp and cache directory -docker-compose.yaml +.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.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/.husky/pre-commit b/.husky/pre-commit index ea5a55b..e530fdf 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + bunx lint-staged diff --git a/.prettierignore b/.prettierignore index 9a9a0ef..23cdeba 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,9 @@ .devcontainer -,github +.github .vscode nodemodules -supabase -temp +supabase/ +temp/ .dockerfile .env .gitignore @@ -13,6 +13,7 @@ bunfig.toml Dockerfile entrypoint.sh package--lock.json +donald-backenackage.json +package--lock.json package.json README.md -tsconfig,json diff --git a/bun.lockb b/bun.lockb index 2d94bdb24292c2ff6180ab582dc6883a2c2cddb3..288933813605ddc7ea344a9b5b1a6d2704f21d93 100755 GIT binary patch delta 44167 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 Z1wc){B~#&p1Aab<|DBriKSHtSe*jb(jDi3F delta 46088 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%0Aiq#q%?>RZ9_{{a_PsucDfd_P=s>W>10rVjJ1( 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 b2_K=4q(;^Vx6kZFdWFV892XR#lNS6RzPx@~ diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..a001072 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,35 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; +import tsParser from "@typescript-eslint/parser"; + +export default [ + { languageOptions: { globals: globals.node } }, + + pluginJs.configs.recommended, + + ...tseslint.configs.recommended, + + { + files: ["**/*.ts", "**/*.tsx"], + languageOptions: { + parser: tsParser, + parserOptions: { + project: "./tsconfig.json", + }, + }, + rules: { + // "no-console": "warn", + quotes: [ + "warn", + "double", + { avoidEscape: true, allowTemplateLiterals: true }, + ], + semi: ["error", "always"], + "no-unused-vars": [ + "warn", + { vars: "all", args: "after-used", ignoreRestSiblings: true }, + ], + }, + }, +]; diff --git a/package.json b/package.json index afc6ccd..af01ac1 100644 --- a/package.json +++ b/package.json @@ -1,61 +1,30 @@ { "name": "donald", - "version": "1.0.50", + "module": "index.ts", + "type": "module", + "workspaces": [ + "packages/*" + ], "scripts": { - "build": "bun build --entrypoints ./src/index.ts --outdir build --target bun --splitting --minify", - "db:dev": "bunx supabase start", - "db:generate": "drizzle-kit generate:pg --config drizzle.config.ts", - "db:login": "bunx supabase login --no-browser", - "db:migrate": "bunx supabase migration up --debug && echo \"Incase, you have new seed data. Run reset\" ", - "db:pull": "bunx supabase db pull", - "db:push": "bunx supabase db push", - "db:reset": "bunx supabase db reset", - "db:status": "bunx supabase status", - "debug": "bun run --inspect=localhost:4000 src/index.ts", - "dev": "ENV=dev bun run --watch src/index.ts", - "generate:ssh": "rm -rf ./temp && mkdir ./temp && openssl genpkey -algorithm RSA -out ./temp/private_key.pem -pkeyopt rsa_keygen_bits:4096 && openssl rsa -pubout -in ./temp/private_key.pem -out ./temp/public_key.pem", - "generate:env": "echo $(bunx supabase status -o env) >> .env", - "migrate": "bun run src/bin/migrate.ts", - "neon:auth": "bunx neonctl auth", - "neon:branches-list": "bunx neonctl branches list", - "neon:setup": "bun run neon:auth && bun run neon:projects-list > neon-cache.json", - "neon:projects-list": "bunx neonctl projects list --output json", - "start": "bun run src/index.ts --env-file=.env.prod", - "test": "[ ! -f neon-cache.json ] && bun run neon:setup || echo '✅ Cache found' && bun test --env-file=.env.test" - }, - "dependencies": { - "@elysiajs/bearer": "^1.0.2", - "@elysiajs/eden": "^1.0.13", - "bun": "^1.1.12", - "drizzle-orm": "^0.31.2", - "elysia": "latest", - "elysia-rate-limit": "^2.0.1", - "jose": "^5.2.0", - "module-alias": "^2.2.3", - "postgres": "^3.4.3" + "clean": "rm -rf node_modules" }, "devDependencies": { - "@eslint/js": "9.4.0", - "@neondatabase/serverless": "^0.9.3", - "@sinclair/typebox": "^0.32.28", - "bun-types": "latest", - "drizzle-kit": "^0.22.7", - "eslint-config-prettier": "^9.1.0", - "globals": "^15.4.0", + "@eslint/js": "^9.5.0", + "@types/bun": "latest", + "eslint": "9.x", + "globals": "^15.6.0", + "hercules": "workspace:*", "husky": "^9.0.11", - "lint-staged": "^15.2.6", - "neonctl": "^1.30.0", "prettier": "3.3.2", - "supabase": "^1.127.4", - "typescript-eslint": "^7.13.0" + "stark": "workspace:*", + "typescript-eslint": "^7.13.1" }, - "module": "src/index.js", - "_moduleAliases": { - "~": "src" + "peerDependencies": { + "typescript": "^5.0.0" }, "lint-staged": { "**/*.{js,ts,tsx,json,css,md}": [ - "prettier src --write --ignore-unknown" + "prettier packages/hercules/src --write --ignore-unknown" ] } -} +} \ No newline at end of file diff --git a/.dockerignore b/packages/hercules/.dockerignore similarity index 100% rename from .dockerignore rename to packages/hercules/.dockerignore diff --git a/packages/hercules/.gitignore b/packages/hercules/.gitignore new file mode 100644 index 0000000..c328aa4 --- /dev/null +++ b/packages/hercules/.gitignore @@ -0,0 +1,47 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env* +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel + +**/*.trace +**/*.zip +**/*.tar.gz +**/*.tgz +**/*.log +package-lock.json +**/*.bun + +neon-cache.json + +docker-compose.yaml diff --git a/Dockerfile b/packages/hercules/Dockerfile similarity index 100% rename from Dockerfile rename to packages/hercules/Dockerfile diff --git a/bunfig.toml b/packages/hercules/bunfig.toml similarity index 100% rename from bunfig.toml rename to packages/hercules/bunfig.toml diff --git a/drizzle.config.ts b/packages/hercules/drizzle.config.ts similarity index 100% rename from drizzle.config.ts rename to packages/hercules/drizzle.config.ts diff --git a/entrypoint.sh b/packages/hercules/entrypoint.sh similarity index 100% rename from entrypoint.sh rename to packages/hercules/entrypoint.sh diff --git a/eslint.config.mjs b/packages/hercules/eslint.config.mjs similarity index 100% rename from eslint.config.mjs rename to packages/hercules/eslint.config.mjs diff --git a/packages/hercules/package.json b/packages/hercules/package.json new file mode 100644 index 0000000..ce81634 --- /dev/null +++ b/packages/hercules/package.json @@ -0,0 +1,52 @@ +{ + "name": "hercules", + "version": "1.0.50", + "scripts": { + "build": "bun build --entrypoints ./src/index.ts --outdir build --target bun --splitting --minify", + "db:dev": "bunx supabase start", + "db:generate": "drizzle-kit generate:pg --config drizzle.config.ts", + "db:login": "bunx supabase login --no-browser", + "db:migrate": "bunx supabase migration up --debug && echo \"Incase, you have new seed data. Run reset\" ", + "db:pull": "bunx supabase db pull", + "db:push": "bunx supabase db push", + "db:reset": "bunx supabase db reset", + "db:status": "bunx supabase status", + "debug": "bun run --inspect=localhost:4000 src/index.ts", + "dev": "ENV=dev bun run --watch src/index.ts", + "generate:ssh": "rm -rf ./temp && mkdir ./temp && openssl genpkey -algorithm RSA -out ./temp/private_key.pem -pkeyopt rsa_keygen_bits:4096 && openssl rsa -pubout -in ./temp/private_key.pem -out ./temp/public_key.pem", + "generate:env": "echo $(bunx supabase status -o env) >> .env", + "migrate": "bun run src/bin/migrate.ts", + "neon:auth": "bunx neonctl auth", + "neon:branches-list": "bunx neonctl branches list", + "neon:setup": "bun run neon:auth && bun run neon:projects-list > neon-cache.json", + "neon:projects-list": "bunx neonctl projects list --output json", + "start": "bun run src/index.ts --env-file=.env.prod", + "test": "[ ! -f neon-cache.json ] && bun run neon:setup || echo '✅ Cache found' && bun test --env-file=.env.test" + }, + "dependencies": { + "@elysiajs/bearer": "^0.8.0", + "@elysiajs/eden": "^1.0.13", + "bun": "^1.1.12", + "drizzle-orm": "^0.29.3", + "elysia": "latest", + "elysia-rate-limit": "^2.0.1", + "jose": "^5.2.0", + "module-alias": "^2.2.3", + "postgres": "^3.4.3" + }, + "devDependencies": { + "@neondatabase/serverless": "^0.9.3", + "@sinclair/typebox": "^0.32.28", + "bun-types": "latest", + "drizzle-kit": "^0.20.10", + "eslint-config-prettier": "^9.1.0", + "globals": "^15.4.0", + "neonctl": "^1.30.0", + "supabase": "^1.127.4", + "typescript-eslint": "^7.13.0" + }, + "module": "src/index.js", + "_moduleAliases": { + "~": "src" + } +} diff --git a/src/app.test.ts b/packages/hercules/src/app.test.ts similarity index 100% rename from src/app.test.ts rename to packages/hercules/src/app.test.ts diff --git a/src/app.ts b/packages/hercules/src/app.ts similarity index 100% rename from src/app.ts rename to packages/hercules/src/app.ts diff --git a/src/bin/migrate.ts b/packages/hercules/src/bin/migrate.ts similarity index 100% rename from src/bin/migrate.ts rename to packages/hercules/src/bin/migrate.ts diff --git a/src/config.ts b/packages/hercules/src/config.ts similarity index 100% rename from src/config.ts rename to packages/hercules/src/config.ts diff --git a/src/controllers/tag/@main.ts b/packages/hercules/src/controllers/tag/@main.ts similarity index 100% rename from src/controllers/tag/@main.ts rename to packages/hercules/src/controllers/tag/@main.ts diff --git a/src/controllers/tag/createTag.meta.ts b/packages/hercules/src/controllers/tag/createTag.meta.ts similarity index 100% rename from src/controllers/tag/createTag.meta.ts rename to packages/hercules/src/controllers/tag/createTag.meta.ts diff --git a/src/controllers/tag/createTag.test.ts b/packages/hercules/src/controllers/tag/createTag.test.ts similarity index 100% rename from src/controllers/tag/createTag.test.ts rename to packages/hercules/src/controllers/tag/createTag.test.ts diff --git a/src/controllers/tag/createTag.ts b/packages/hercules/src/controllers/tag/createTag.ts similarity index 100% rename from src/controllers/tag/createTag.ts rename to packages/hercules/src/controllers/tag/createTag.ts diff --git a/src/controllers/tag/getTag.ts b/packages/hercules/src/controllers/tag/getTag.ts similarity index 100% rename from src/controllers/tag/getTag.ts rename to packages/hercules/src/controllers/tag/getTag.ts diff --git a/src/controllers/tag/index.ts b/packages/hercules/src/controllers/tag/index.ts similarity index 100% rename from src/controllers/tag/index.ts rename to packages/hercules/src/controllers/tag/index.ts diff --git a/src/controllers/tag/linkTagToTransaction.meta.ts b/packages/hercules/src/controllers/tag/linkTagToTransaction.meta.ts similarity index 100% rename from src/controllers/tag/linkTagToTransaction.meta.ts rename to packages/hercules/src/controllers/tag/linkTagToTransaction.meta.ts diff --git a/src/controllers/tag/linkTagToTransaction.ts b/packages/hercules/src/controllers/tag/linkTagToTransaction.ts similarity index 100% rename from src/controllers/tag/linkTagToTransaction.ts rename to packages/hercules/src/controllers/tag/linkTagToTransaction.ts diff --git a/src/controllers/upload/@main.ts b/packages/hercules/src/controllers/upload/@main.ts similarity index 100% rename from src/controllers/upload/@main.ts rename to packages/hercules/src/controllers/upload/@main.ts diff --git a/src/controllers/upload/uploadBatchTransactions.meta.ts b/packages/hercules/src/controllers/upload/uploadBatchTransactions.meta.ts similarity index 100% rename from src/controllers/upload/uploadBatchTransactions.meta.ts rename to packages/hercules/src/controllers/upload/uploadBatchTransactions.meta.ts diff --git a/src/controllers/upload/uploadBatchTransactions.ts b/packages/hercules/src/controllers/upload/uploadBatchTransactions.ts similarity index 100% rename from src/controllers/upload/uploadBatchTransactions.ts rename to packages/hercules/src/controllers/upload/uploadBatchTransactions.ts diff --git a/src/controllers/upload/utils.ts b/packages/hercules/src/controllers/upload/utils.ts similarity index 100% rename from src/controllers/upload/utils.ts rename to packages/hercules/src/controllers/upload/utils.ts diff --git a/src/controllers/user/@main.ts b/packages/hercules/src/controllers/user/@main.ts similarity index 100% rename from src/controllers/user/@main.ts rename to packages/hercules/src/controllers/user/@main.ts diff --git a/src/controllers/user/authenticateUser.meta.ts b/packages/hercules/src/controllers/user/authenticateUser.meta.ts similarity index 100% rename from src/controllers/user/authenticateUser.meta.ts rename to packages/hercules/src/controllers/user/authenticateUser.meta.ts diff --git a/src/controllers/user/authenticateUser.ts b/packages/hercules/src/controllers/user/authenticateUser.ts similarity index 100% rename from src/controllers/user/authenticateUser.ts rename to packages/hercules/src/controllers/user/authenticateUser.ts diff --git a/src/controllers/user/index.ts b/packages/hercules/src/controllers/user/index.ts similarity index 100% rename from src/controllers/user/index.ts rename to packages/hercules/src/controllers/user/index.ts diff --git a/src/controllers/user/registerUser.meta.ts b/packages/hercules/src/controllers/user/registerUser.meta.ts similarity index 100% rename from src/controllers/user/registerUser.meta.ts rename to packages/hercules/src/controllers/user/registerUser.meta.ts diff --git a/src/controllers/user/registerUser.ts b/packages/hercules/src/controllers/user/registerUser.ts similarity index 100% rename from src/controllers/user/registerUser.ts rename to packages/hercules/src/controllers/user/registerUser.ts diff --git a/src/controllers/user/user.test.ts b/packages/hercules/src/controllers/user/user.test.ts similarity index 100% rename from src/controllers/user/user.test.ts rename to packages/hercules/src/controllers/user/user.test.ts diff --git a/src/controllers/user/verifyAccessToken.meta.ts b/packages/hercules/src/controllers/user/verifyAccessToken.meta.ts similarity index 100% rename from src/controllers/user/verifyAccessToken.meta.ts rename to packages/hercules/src/controllers/user/verifyAccessToken.meta.ts diff --git a/src/controllers/user/verifyAccessToken.ts b/packages/hercules/src/controllers/user/verifyAccessToken.ts similarity index 100% rename from src/controllers/user/verifyAccessToken.ts rename to packages/hercules/src/controllers/user/verifyAccessToken.ts diff --git a/packages/hercules/src/hello.ts b/packages/hercules/src/hello.ts new file mode 100644 index 0000000..ab30907 --- /dev/null +++ b/packages/hercules/src/hello.ts @@ -0,0 +1,3 @@ +export const helloTraveller = () => { + console.log("Hello,checking if hercules is working"); +}; diff --git a/src/hooks/index.ts b/packages/hercules/src/hooks/index.ts similarity index 100% rename from src/hooks/index.ts rename to packages/hercules/src/hooks/index.ts diff --git a/src/index.ts b/packages/hercules/src/index.ts similarity index 61% rename from src/index.ts rename to packages/hercules/src/index.ts index 27e37a2..6696a76 100644 --- a/src/index.ts +++ b/packages/hercules/src/index.ts @@ -21,3 +21,11 @@ const startApplication = () => { }; startApplication(); + +//The export below is rightfully imported in stark iff the code above is commented +//Otherwise the code above will be executed on running the index file in stark + +//I think this file can be dedicated for imports and exports if hercules has to relate with the other packages in the monorepo +import { helloTraveller } from "./hello"; + +export default helloTraveller; diff --git a/src/repository/functional/tags.ts b/packages/hercules/src/repository/functional/tags.ts similarity index 100% rename from src/repository/functional/tags.ts rename to packages/hercules/src/repository/functional/tags.ts diff --git a/src/repository/functional/transactions.ts b/packages/hercules/src/repository/functional/transactions.ts similarity index 100% rename from src/repository/functional/transactions.ts rename to packages/hercules/src/repository/functional/transactions.ts diff --git a/src/repository/functional/user.ts b/packages/hercules/src/repository/functional/user.ts similarity index 100% rename from src/repository/functional/user.ts rename to packages/hercules/src/repository/functional/user.ts diff --git a/src/repository/index.ts b/packages/hercules/src/repository/index.ts similarity index 100% rename from src/repository/index.ts rename to packages/hercules/src/repository/index.ts diff --git a/src/repository/neon/api.ts b/packages/hercules/src/repository/neon/api.ts similarity index 100% rename from src/repository/neon/api.ts rename to packages/hercules/src/repository/neon/api.ts diff --git a/src/repository/neon/functional.ts b/packages/hercules/src/repository/neon/functional.ts similarity index 100% rename from src/repository/neon/functional.ts rename to packages/hercules/src/repository/neon/functional.ts diff --git a/src/repository/neon/index.ts b/packages/hercules/src/repository/neon/index.ts similarity index 100% rename from src/repository/neon/index.ts rename to packages/hercules/src/repository/neon/index.ts diff --git a/src/repository/neon/types.ts b/packages/hercules/src/repository/neon/types.ts similarity index 100% rename from src/repository/neon/types.ts rename to packages/hercules/src/repository/neon/types.ts diff --git a/src/repository/schema.ts b/packages/hercules/src/repository/schema.ts similarity index 100% rename from src/repository/schema.ts rename to packages/hercules/src/repository/schema.ts diff --git a/src/repository/seed/index.ts b/packages/hercules/src/repository/seed/index.ts similarity index 100% rename from src/repository/seed/index.ts rename to packages/hercules/src/repository/seed/index.ts diff --git a/src/repository/seed/transactionsTypes.ts b/packages/hercules/src/repository/seed/transactionsTypes.ts similarity index 100% rename from src/repository/seed/transactionsTypes.ts rename to packages/hercules/src/repository/seed/transactionsTypes.ts diff --git a/src/repository/setup.ts b/packages/hercules/src/repository/setup.ts similarity index 100% rename from src/repository/setup.ts rename to packages/hercules/src/repository/setup.ts diff --git a/src/testing/__preload__.ts b/packages/hercules/src/testing/__preload__.ts similarity index 100% rename from src/testing/__preload__.ts rename to packages/hercules/src/testing/__preload__.ts diff --git a/src/testing/authTestingTemplate.ts b/packages/hercules/src/testing/authTestingTemplate.ts similarity index 100% rename from src/testing/authTestingTemplate.ts rename to packages/hercules/src/testing/authTestingTemplate.ts diff --git a/src/testing/index.ts b/packages/hercules/src/testing/index.ts similarity index 100% rename from src/testing/index.ts rename to packages/hercules/src/testing/index.ts diff --git a/src/types.ts b/packages/hercules/src/types.ts similarity index 100% rename from src/types.ts rename to packages/hercules/src/types.ts diff --git a/src/utils/index.ts b/packages/hercules/src/utils/index.ts similarity index 100% rename from src/utils/index.ts rename to packages/hercules/src/utils/index.ts diff --git a/src/utils/jwt.ts b/packages/hercules/src/utils/jwt.ts similarity index 100% rename from src/utils/jwt.ts rename to packages/hercules/src/utils/jwt.ts diff --git a/supabase/.gitignore b/packages/hercules/supabase/.gitignore similarity index 100% rename from supabase/.gitignore rename to packages/hercules/supabase/.gitignore diff --git a/supabase/config.toml b/packages/hercules/supabase/config.toml similarity index 100% rename from supabase/config.toml rename to packages/hercules/supabase/config.toml diff --git a/supabase/migrations/0000_dizzy_rick_jones.sql b/packages/hercules/supabase/migrations/0000_dizzy_rick_jones.sql similarity index 100% rename from supabase/migrations/0000_dizzy_rick_jones.sql rename to packages/hercules/supabase/migrations/0000_dizzy_rick_jones.sql diff --git a/supabase/migrations/meta/0000_snapshot.json b/packages/hercules/supabase/migrations/meta/0000_snapshot.json similarity index 100% rename from supabase/migrations/meta/0000_snapshot.json rename to packages/hercules/supabase/migrations/meta/0000_snapshot.json diff --git a/supabase/migrations/meta/_journal.json b/packages/hercules/supabase/migrations/meta/_journal.json similarity index 100% rename from supabase/migrations/meta/_journal.json rename to packages/hercules/supabase/migrations/meta/_journal.json diff --git a/supabase/seed.sql b/packages/hercules/supabase/seed.sql similarity index 100% rename from supabase/seed.sql rename to packages/hercules/supabase/seed.sql diff --git a/packages/hercules/tsconfig.json b/packages/hercules/tsconfig.json new file mode 100644 index 0000000..7b10e4a --- /dev/null +++ b/packages/hercules/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "~/*": ["src/*"] + }, + "target": "ES2021", + "module": "ES2022", + "moduleResolution": "node", + "types": ["bun-types"], + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/packages/stark/.gitignore b/packages/stark/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/packages/stark/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# 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/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# 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.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/stark/README.md b/packages/stark/README.md new file mode 100644 index 0000000..f81e745 --- /dev/null +++ b/packages/stark/README.md @@ -0,0 +1,15 @@ +# stark + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.13. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/packages/stark/index.ts b/packages/stark/index.ts new file mode 100644 index 0000000..5a97638 --- /dev/null +++ b/packages/stark/index.ts @@ -0,0 +1,3 @@ +import helloTraveller from "hercules"; + +helloTraveller(); diff --git a/packages/stark/package.json b/packages/stark/package.json new file mode 100644 index 0000000..8bb9117 --- /dev/null +++ b/packages/stark/package.json @@ -0,0 +1,17 @@ +{ + "name": "stark", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "bun run --watch index.ts" + }, + "dependencies":{ + "hercules": "workspace:*" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} \ No newline at end of file diff --git a/packages/stark/tsconfig.json b/packages/stark/tsconfig.json new file mode 100644 index 0000000..dd350a2 --- /dev/null +++ b/packages/stark/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/tsconfig.json b/tsconfig.json index 5299628..eb70cc6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,33 @@ { "compilerOptions": { + "baseUrl": ".", "paths": { - "~/*": ["./src/*"] + "hercules": ["packages/hercules/src"], + "stark": ["packages/stark/"] }, - "target": "ES2021", - "module": "ES2022", - "moduleResolution": "node", - "types": ["bun-types"], - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, + + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices "strict": true, - "skipLibCheck": true + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false } }