├── apps
├── admin
│ ├── public
│ │ ├── .gitkeep
│ │ └── favicon.ico
│ ├── src
│ │ ├── components
│ │ │ ├── admin
│ │ │ │ └── pages
│ │ │ │ │ ├── security
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── signatures
│ │ │ │ │ └── index.ts
│ │ │ ├── ui
│ │ │ │ ├── aspect-ratio.tsx
│ │ │ │ ├── skeleton.tsx
│ │ │ │ ├── collapsible.tsx
│ │ │ │ ├── spinner.tsx
│ │ │ │ ├── DocumentVaultAnimation.tsx
│ │ │ │ ├── textarea.tsx
│ │ │ │ ├── label.tsx
│ │ │ │ ├── input.tsx
│ │ │ │ ├── separator.tsx
│ │ │ │ ├── progress.tsx
│ │ │ │ ├── kbd.tsx
│ │ │ │ ├── sonner.tsx
│ │ │ │ ├── slider.tsx
│ │ │ │ ├── checkbox.tsx
│ │ │ │ ├── switch.tsx
│ │ │ │ ├── badge.tsx
│ │ │ │ ├── hover-card.tsx
│ │ │ │ └── tooltip.tsx
│ │ │ └── dashboard
│ │ │ │ ├── hooks
│ │ │ │ ├── index.ts
│ │ │ │ ├── useOnClickOutside.ts
│ │ │ │ └── useHeaderDropdowns.ts
│ │ │ │ └── types.ts
│ │ ├── app
│ │ │ ├── api
│ │ │ │ └── hello
│ │ │ │ │ └── route.ts
│ │ │ ├── dashboard
│ │ │ │ ├── page.tsx
│ │ │ │ ├── activity
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── roles
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── [id]
│ │ │ │ │ │ └── page.tsx
│ │ │ │ ├── users
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── [id]
│ │ │ │ │ │ └── page.tsx
│ │ │ │ ├── templates
│ │ │ │ │ ├── [id]
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── permissions
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── [id]
│ │ │ │ │ │ └── page.tsx
│ │ │ │ └── layout.tsx
│ │ │ ├── admin
│ │ │ │ └── dashboard
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── activity
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── roles
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── users
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── onboarding
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── [id]
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── permissions
│ │ │ │ │ └── page.tsx
│ │ │ │ │ └── layout.tsx
│ │ │ └── layout.tsx
│ │ ├── lib
│ │ │ ├── utils.ts
│ │ │ └── pdf
│ │ │ │ └── fonts.ts
│ │ ├── contexts
│ │ │ └── scroll
│ │ │ │ └── ScrollContext.tsx
│ │ └── hooks
│ │ │ └── use-mobile.tsx
│ ├── index.d.ts
│ ├── vercel.json
│ ├── next-env.d.ts
│ ├── specs
│ │ └── index.spec.tsx
│ ├── eslint.config.mjs
│ ├── jest.config.cts
│ ├── postcss.config.js
│ ├── components.json
│ ├── tsconfig.spec.json
│ ├── .swcrc
│ ├── next.config.js
│ ├── .env.example
│ └── .env
├── api
│ ├── src
│ │ ├── assets
│ │ │ └── .gitkeep
│ │ └── app
│ │ │ ├── emails
│ │ │ └── templates
│ │ │ │ └── index.ts
│ │ │ ├── app.service.ts
│ │ │ ├── prisma
│ │ │ ├── prisma.module.ts
│ │ │ └── prisma.service.ts
│ │ │ ├── app.controller.ts
│ │ │ ├── users
│ │ │ └── user.module.ts
│ │ │ ├── otp
│ │ │ └── otp.module.ts
│ │ │ ├── auth
│ │ │ └── auth.module.ts
│ │ │ ├── security
│ │ │ └── security.module.ts
│ │ │ ├── documents
│ │ │ └── documents.module.ts
│ │ │ ├── dashboard
│ │ │ └── dashboard.module.ts
│ │ │ ├── onboarding
│ │ │ └── onboarding.module.ts
│ │ │ ├── admin
│ │ │ └── admin.module.ts
│ │ │ ├── app.service.spec.ts
│ │ │ ├── app.controller.spec.ts
│ │ │ └── graphql
│ │ │ └── graphql.module.ts
│ ├── eslint.config.mjs
│ ├── tsconfig.json
│ ├── tsconfig.tsbuildinfo
│ ├── .spec.swcrc
│ ├── jest.config.cts
│ ├── package.json
│ ├── tsconfig.spec.json
│ ├── project.json
│ └── tsconfig.app.json
├── nuo-nx
│ ├── public
│ │ ├── .gitkeep
│ │ └── favicon.ico
│ ├── src
│ │ ├── components
│ │ │ ├── dashboard
│ │ │ │ ├── index.ts
│ │ │ │ ├── signatures
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useOnClickOutside.ts
│ │ │ │ │ ├── useStats.ts
│ │ │ │ │ └── useHeaderDropdowns.ts
│ │ │ │ └── pages
│ │ │ │ │ └── documents
│ │ │ │ │ ├── TemplateGallery.tsx
│ │ │ │ │ └── signage
│ │ │ │ │ ├── DocumentSignHeader.tsx
│ │ │ │ │ └── DocumentSignEmpty.tsx
│ │ │ ├── ui
│ │ │ │ ├── aspect-ratio.tsx
│ │ │ │ ├── skeleton.tsx
│ │ │ │ ├── collapsible.tsx
│ │ │ │ ├── spinner.tsx
│ │ │ │ ├── DocumentVaultAnimation.tsx
│ │ │ │ ├── textarea.tsx
│ │ │ │ ├── label.tsx
│ │ │ │ ├── input.tsx
│ │ │ │ ├── separator.tsx
│ │ │ │ ├── progress.tsx
│ │ │ │ ├── kbd.tsx
│ │ │ │ ├── sonner.tsx
│ │ │ │ ├── slider.tsx
│ │ │ │ ├── checkbox.tsx
│ │ │ │ ├── switch.tsx
│ │ │ │ ├── badge.tsx
│ │ │ │ ├── hover-card.tsx
│ │ │ │ └── tooltip.tsx
│ │ │ └── main
│ │ │ │ └── layout
│ │ │ │ └── footer
│ │ │ │ └── ConditionalFooter.tsx
│ │ ├── app
│ │ │ ├── favicon.ico
│ │ │ ├── api
│ │ │ │ ├── hello
│ │ │ │ │ └── route.ts
│ │ │ │ └── graphql
│ │ │ │ │ └── route.ts
│ │ │ ├── (main)
│ │ │ │ ├── (marketing)
│ │ │ │ │ └── (client)
│ │ │ │ │ │ ├── security
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── services
│ │ │ │ │ │ ├── page.tsx
│ │ │ │ │ │ ├── bank-setup
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── ip-protection
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ └── incorporation
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── careers
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── incorporate
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── layout.tsx
│ │ │ │ │ │ ├── about
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ └── contact
│ │ │ │ │ │ └── page.tsx
│ │ │ │ ├── (policies)
│ │ │ │ │ ├── privacy-policy
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── terms-of-service
│ │ │ │ │ │ └── page.tsx
│ │ │ │ ├── (auth)
│ │ │ │ │ └── login
│ │ │ │ │ │ └── page.tsx
│ │ │ │ └── (documentation)
│ │ │ │ │ └── docs
│ │ │ │ │ └── layout.tsx
│ │ │ ├── (dashboard)
│ │ │ │ └── dashboard
│ │ │ │ │ ├── documents
│ │ │ │ │ ├── drafts
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── signage
│ │ │ │ │ │ └── [documentId]
│ │ │ │ │ │ │ └── edit
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── storage
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── [id]
│ │ │ │ │ │ └── edit
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── profile
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── account
│ │ │ │ │ ├── info
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── billing
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── support
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── users
│ │ │ │ │ ├── manage
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── permissions
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── trademarks
│ │ │ │ │ ├── list
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── register
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── onboarding
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── new
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── [id]
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── compliance
│ │ │ │ │ └── calendar
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── companies
│ │ │ │ │ ├── list
│ │ │ │ │ └── page.tsx
│ │ │ │ │ └── register
│ │ │ │ │ └── page.tsx
│ │ │ ├── (employee)
│ │ │ │ └── employee-dashboard
│ │ │ │ │ ├── tasks
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── projects
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── team
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── calendar
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── kanban
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── profile
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── reports
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── calendar
│ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── time-tracking
│ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ ├── page.tsx
│ │ │ ├── providers.tsx
│ │ │ └── example
│ │ │ │ └── page.tsx
│ │ ├── lib
│ │ │ ├── utils.ts
│ │ │ └── pdf
│ │ │ │ └── fonts.ts
│ │ ├── contexts
│ │ │ └── scroll
│ │ │ │ └── ScrollContext.tsx
│ │ └── hooks
│ │ │ ├── use-mobile.ts
│ │ │ └── use-mobile.tsx
│ ├── vercel.json
│ ├── index.d.ts
│ ├── next-env.d.ts
│ ├── specs
│ │ └── index.spec.tsx
│ ├── eslint.config.mjs
│ ├── jest.config.cts
│ ├── postcss.config.js
│ ├── components.json
│ ├── tsconfig.spec.json
│ ├── .swcrc
│ └── next.config.js
├── worker
│ ├── src
│ │ ├── assets
│ │ │ └── .gitkeep
│ │ ├── app
│ │ │ ├── app.service.ts
│ │ │ ├── app.module.ts
│ │ │ ├── app.controller.ts
│ │ │ ├── app.service.spec.ts
│ │ │ ├── app.controller.spec.ts
│ │ │ └── jobs
│ │ │ │ └── example.job.ts
│ │ └── main.ts
│ ├── eslint.config.mjs
│ ├── tsconfig.json
│ ├── .spec.swcrc
│ ├── tsconfig.spec.json
│ ├── jest.config.cts
│ ├── webpack.config.js
│ └── tsconfig.app.json
├── admin-e2e
│ ├── package.json
│ ├── src
│ │ └── example.spec.ts
│ ├── eslint.config.mjs
│ └── tsconfig.json
├── api-e2e
│ ├── eslint.config.mjs
│ ├── src
│ │ ├── api
│ │ │ └── api.spec.ts
│ │ └── support
│ │ │ ├── test-setup.ts
│ │ │ ├── global-teardown.ts
│ │ │ └── global-setup.ts
│ ├── tsconfig.json
│ ├── package.json
│ ├── .spec.swcrc
│ └── jest.config.cts
├── nuo-nx-e2e
│ ├── package.json
│ ├── src
│ │ └── example.spec.ts
│ ├── eslint.config.mjs
│ └── tsconfig.json
├── nuo-dashboard-ui
│ ├── public
│ │ ├── apple-icon.png
│ │ ├── placeholder.jpg
│ │ ├── icon-dark-32x32.png
│ │ ├── icon-light-32x32.png
│ │ ├── placeholder-logo.png
│ │ ├── placeholder-user.jpg
│ │ ├── placeholder-user.png
│ │ └── icon.svg
│ ├── pnpm-lock.yaml
│ ├── postcss.config.mjs
│ ├── lib
│ │ └── utils.ts
│ ├── next.config.mjs
│ ├── app
│ │ ├── page.tsx
│ │ └── layout.tsx
│ ├── components
│ │ ├── ui
│ │ │ ├── aspect-ratio.tsx
│ │ │ ├── skeleton.tsx
│ │ │ ├── spinner.tsx
│ │ │ ├── use-mobile.tsx
│ │ │ ├── sonner.tsx
│ │ │ ├── label.tsx
│ │ │ ├── separator.tsx
│ │ │ ├── textarea.tsx
│ │ │ ├── progress.tsx
│ │ │ ├── toaster.tsx
│ │ │ ├── collapsible.tsx
│ │ │ ├── kbd.tsx
│ │ │ ├── input.tsx
│ │ │ ├── switch.tsx
│ │ │ ├── avatar.tsx
│ │ │ └── checkbox.tsx
│ │ ├── theme-provider.tsx
│ │ └── dashboard
│ │ │ └── quick-actions.tsx
│ ├── components.json
│ ├── hooks
│ │ └── use-mobile.ts
│ └── tsconfig.json
└── worker-e2e
│ ├── eslint.config.mjs
│ ├── src
│ ├── worker
│ │ └── worker.spec.ts
│ └── support
│ │ ├── test-setup.ts
│ │ ├── global-teardown.ts
│ │ └── global-setup.ts
│ ├── tsconfig.json
│ ├── .spec.swcrc
│ ├── package.json
│ └── jest.config.cts
├── .prettierrc
├── packages
├── types
│ ├── src
│ │ ├── index.ts
│ │ └── lib
│ │ │ └── types.ts
│ ├── README.md
│ ├── tsconfig.json
│ ├── tsconfig.lib.json
│ └── package.json
├── utils
│ ├── src
│ │ ├── index.ts
│ │ └── lib
│ │ │ └── utils.ts
│ ├── README.md
│ ├── tsconfig.json
│ ├── tsconfig.lib.json
│ └── package.json
├── auth
│ ├── .env
│ ├── src
│ │ ├── lib
│ │ │ ├── auth.ts
│ │ │ ├── types.ts
│ │ │ ├── jwt.ts
│ │ │ └── middleware
│ │ │ │ └── tenant.ts
│ │ └── index.ts
│ ├── README.md
│ ├── tsconfig.json
│ ├── tsconfig.lib.json
│ └── package.json
├── ui
│ ├── src
│ │ ├── index.ts
│ │ └── lib
│ │ │ ├── ui.tsx
│ │ │ └── components
│ │ │ └── base.tsx
│ ├── README.md
│ ├── tsconfig.json
│ ├── .babelrc
│ ├── tailwind.config.js
│ ├── package.json
│ └── tsconfig.lib.json
├── config
│ ├── src
│ │ └── index.ts
│ ├── README.md
│ ├── tsconfig.json
│ ├── tsconfig.lib.json
│ └── package.json
├── prisma
│ ├── src
│ │ ├── lib
│ │ │ ├── prisma.ts
│ │ │ ├── server-only.ts
│ │ │ └── client.ts
│ │ └── index.ts
│ ├── README.md
│ ├── migrations
│ │ └── migration_lock.toml
│ ├── tsconfig.json
│ ├── prisma.config.ts
│ ├── tsconfig.lib.json
│ └── .env.example
├── storage
│ ├── src
│ │ └── index.ts
│ ├── tsconfig.lib.json
│ ├── tsconfig.json
│ └── package.json
├── graphql
│ ├── src
│ │ ├── lib
│ │ │ ├── graphql.ts
│ │ │ ├── schema.ts
│ │ │ ├── schema.graphql
│ │ │ ├── typeDefs.ts
│ │ │ └── codegen.ts
│ │ └── index.ts
│ ├── README.md
│ ├── tsconfig.json
│ ├── tsconfig.lib.json
│ └── package.json
├── generated
│ └── nuo-prisma
│ │ ├── wasm-worker-loader.mjs
│ │ └── wasm-edge-light-loader.mjs
└── document-utils
│ ├── src
│ ├── index.ts
│ ├── pdf
│ │ └── fonts.ts
│ └── types
│ │ └── packages.d.ts
│ ├── tsconfig.json
│ ├── tsconfig.lib.json
│ └── package.json
├── jest.preset.js
├── .prettierignore
├── jest.config.ts
├── vercel.json
├── .vscode
└── extensions.json
├── .editorconfig
├── prisma.config.ts
├── eslint.config.mjs
├── tsconfig.json
├── tsconfig.base.json
└── .gitignore
/apps/admin/public/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/api/src/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/nuo-nx/public/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/worker/src/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true
3 | }
4 |
--------------------------------------------------------------------------------
/packages/types/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './lib/types.js';
2 |
--------------------------------------------------------------------------------
/packages/utils/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './lib/utils.js';
2 |
--------------------------------------------------------------------------------
/packages/auth/.env:
--------------------------------------------------------------------------------
1 | JWT_SECRET=1Ewe9920
2 | JWT_EXPIRES_IN=1d
3 |
--------------------------------------------------------------------------------
/packages/ui/src/index.ts:
--------------------------------------------------------------------------------
1 | // Export all UI components
2 | export * from './lib/ui';
--------------------------------------------------------------------------------
/packages/config/src/index.ts:
--------------------------------------------------------------------------------
1 | export { loadEnv, getEnv, type Env } from "./lib/env";
2 |
--------------------------------------------------------------------------------
/packages/auth/src/lib/auth.ts:
--------------------------------------------------------------------------------
1 | export function auth(): string {
2 | return 'auth';
3 | }
4 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/index.ts:
--------------------------------------------------------------------------------
1 | // Types and data
2 | export * from './types';
3 |
--------------------------------------------------------------------------------
/packages/types/src/lib/types.ts:
--------------------------------------------------------------------------------
1 | export function types(): string {
2 | return 'types';
3 | }
4 |
--------------------------------------------------------------------------------
/packages/utils/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | export function utils(): string {
2 | return 'utils';
3 | }
4 |
--------------------------------------------------------------------------------
/packages/prisma/src/lib/prisma.ts:
--------------------------------------------------------------------------------
1 | export function prisma(): string {
2 | return 'prisma';
3 | }
4 |
--------------------------------------------------------------------------------
/packages/storage/src/index.ts:
--------------------------------------------------------------------------------
1 | // S3 storage exports
2 | export * from './s3/document-storage.js';
3 |
--------------------------------------------------------------------------------
/packages/graphql/src/lib/graphql.ts:
--------------------------------------------------------------------------------
1 | export function graphql(): string {
2 | return 'graphql';
3 | }
4 |
--------------------------------------------------------------------------------
/apps/admin/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/admin/public/favicon.ico
--------------------------------------------------------------------------------
/apps/nuo-nx/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-nx/public/favicon.ico
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-nx/src/app/favicon.ico
--------------------------------------------------------------------------------
/jest.preset.js:
--------------------------------------------------------------------------------
1 | const nxPreset = require('@nx/jest/preset').default;
2 |
3 | module.exports = { ...nxPreset };
4 |
--------------------------------------------------------------------------------
/apps/admin-e2e/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/admin-e2e",
3 | "version": "0.0.1",
4 | "private": true
5 | }
6 |
--------------------------------------------------------------------------------
/apps/api/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import baseConfig from '../../eslint.config.mjs';
2 |
3 | export default [...baseConfig];
4 |
--------------------------------------------------------------------------------
/apps/api-e2e/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import baseConfig from '../../eslint.config.mjs';
2 |
3 | export default [...baseConfig];
4 |
--------------------------------------------------------------------------------
/apps/nuo-nx-e2e/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/nuo-nx-e2e",
3 | "version": "0.0.1",
4 | "private": true
5 | }
6 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/signatures/index.ts:
--------------------------------------------------------------------------------
1 | export { SignatureDashboard } from './SignatureDashboard';
2 |
3 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Add files here to ignore them from prettier formatting
2 | /dist
3 | /coverage
4 | /.nx/cache
5 | /.nx/workspace-data
--------------------------------------------------------------------------------
/apps/admin/src/components/admin/pages/security/index.ts:
--------------------------------------------------------------------------------
1 | export { AdminSecuritySettingsPage } from './AdminSecuritySettingsPage';
2 |
3 |
--------------------------------------------------------------------------------
/apps/worker/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import baseConfig from "../../eslint.config.mjs";
2 |
3 | export default [
4 | ...baseConfig
5 | ];
6 |
--------------------------------------------------------------------------------
/packages/config/README.md:
--------------------------------------------------------------------------------
1 | # Config Library
2 |
3 | Environment configuration with Zod validation for type-safe environment variables.
4 |
--------------------------------------------------------------------------------
/apps/admin/src/app/api/hello/route.ts:
--------------------------------------------------------------------------------
1 | export async function GET(request: Request) {
2 | return new Response('Hello, from API!');
3 | }
4 |
--------------------------------------------------------------------------------
/apps/admin/src/components/admin/pages/signatures/index.ts:
--------------------------------------------------------------------------------
1 | export { AdminSignatureReportsPage } from './AdminSignatureReportsPage';
2 |
3 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/apple-icon.png
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/api/hello/route.ts:
--------------------------------------------------------------------------------
1 | export async function GET(request: Request) {
2 | return new Response('Hello, from API!');
3 | }
4 |
--------------------------------------------------------------------------------
/apps/worker-e2e/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import baseConfig from "../../eslint.config.mjs";
2 |
3 | export default [
4 | ...baseConfig
5 | ];
6 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/placeholder.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/placeholder.jpg
--------------------------------------------------------------------------------
/packages/graphql/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './lib/typeDefs.js';
2 | export * from './lib/resolvers.js';
3 | export * from './lib/schema.js';
4 |
--------------------------------------------------------------------------------
/apps/api/src/app/emails/templates/index.ts:
--------------------------------------------------------------------------------
1 | export * from './otp-verification.template';
2 | export * from './signature-invitation.template';
3 |
4 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/icon-dark-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/icon-dark-32x32.png
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/icon-light-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/icon-light-32x32.png
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/placeholder-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/placeholder-logo.png
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/placeholder-user.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/placeholder-user.jpg
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/placeholder-user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/disruption-hub/nuonx/main/apps/nuo-dashboard-ui/public/placeholder-user.png
--------------------------------------------------------------------------------
/packages/auth/README.md:
--------------------------------------------------------------------------------
1 | # auth
2 |
3 | This library was generated with [Nx](https://nx.dev).
4 |
5 | ## Building
6 |
7 | Run `nx build auth` to build the library.
8 |
--------------------------------------------------------------------------------
/packages/types/README.md:
--------------------------------------------------------------------------------
1 | # types
2 |
3 | This library was generated with [Nx](https://nx.dev).
4 |
5 | ## Building
6 |
7 | Run `nx build types` to build the library.
8 |
--------------------------------------------------------------------------------
/packages/utils/README.md:
--------------------------------------------------------------------------------
1 | # utils
2 |
3 | This library was generated with [Nx](https://nx.dev).
4 |
5 | ## Building
6 |
7 | Run `nx build utils` to build the library.
8 |
--------------------------------------------------------------------------------
/packages/graphql/README.md:
--------------------------------------------------------------------------------
1 | # graphql
2 |
3 | This library was generated with [Nx](https://nx.dev).
4 |
5 | ## Building
6 |
7 | Run `nx build graphql` to build the library.
8 |
--------------------------------------------------------------------------------
/packages/prisma/README.md:
--------------------------------------------------------------------------------
1 | # prisma
2 |
3 | This library was generated with [Nx](https://nx.dev).
4 |
5 | ## Building
6 |
7 | Run `nx build prisma` to build the library.
8 |
--------------------------------------------------------------------------------
/packages/graphql/src/lib/schema.ts:
--------------------------------------------------------------------------------
1 | import { typeDefs } from './typeDefs.js';
2 |
3 | // Re-export typeDefs as schema for backward compatibility
4 | export { typeDefs as schema };
5 |
--------------------------------------------------------------------------------
/apps/nuo-nx/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "buildCommand": "npx nx build nuo-nx",
3 | "outputDirectory": ".next",
4 | "installCommand": "npm install",
5 | "framework": "nextjs"
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/packages/prisma/migrations/migration_lock.toml:
--------------------------------------------------------------------------------
1 | # Please do not edit this file manually
2 | # It should be added in your version-control system (e.g., Git)
3 | provider = "postgresql"
4 |
--------------------------------------------------------------------------------
/packages/ui/src/lib/ui.tsx:
--------------------------------------------------------------------------------
1 | // Base UI components
2 | export { NuoNxUi } from './components/base';
3 |
4 | // Export all components here as they are added
5 | export * from './components/base';
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/security/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | // Security page temporarily disabled per request
3 | export default function Page() {
4 | return null;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/apps/admin/index.d.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-explicit-any */
2 | declare module '*.svg' {
3 | const content: any;
4 | export const ReactComponent: any;
5 | export default content;
6 | }
7 |
--------------------------------------------------------------------------------
/apps/nuo-nx/index.d.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-explicit-any */
2 | declare module '*.svg' {
3 | const content: any;
4 | export const ReactComponent: any;
5 | export default content;
6 | }
7 |
--------------------------------------------------------------------------------
/packages/ui/src/lib/components/base.tsx:
--------------------------------------------------------------------------------
1 | export function NuoNxUi() {
2 | return (
3 |
4 |
Welcome to NuoNxUi!
5 |
6 | );
7 | }
8 |
9 | export default NuoNxUi;
10 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | '@tailwindcss/postcss': {},
5 | },
6 | }
7 |
8 | export default config
9 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/jest.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from 'jest';
2 | import { getJestProjectsAsync } from '@nx/jest';
3 |
4 | export default async (): Promise => ({
5 | projects: await getJestProjectsAsync(),
6 | });
7 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminDashboardPage } from "../../components/admin/pages/AdminDashboardPage";
2 |
3 | export default function Dashboard() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/packages/ui/README.md:
--------------------------------------------------------------------------------
1 | # @nuo-nx/ui
2 |
3 | This library was generated with [Nx](https://nx.dev).
4 |
5 | ## Running unit tests
6 |
7 | Run `nx test @nuo-nx/ui` to execute the unit tests via [Jest](https://jestjs.io).
8 |
--------------------------------------------------------------------------------
/packages/ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "include": [],
4 | "references": [
5 | {
6 | "path": "./tsconfig.lib.json"
7 | }
8 | ],
9 | "extends": "../../tsconfig.base.json"
10 | }
11 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/aspect-ratio.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
4 |
5 | const AspectRatio = AspectRatioPrimitive.Root
6 |
7 | export { AspectRatio }
8 |
--------------------------------------------------------------------------------
/apps/api/src/app/app.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 |
3 | @Injectable()
4 | export class AppService {
5 | getData(): { message: string } {
6 | return { message: 'Hello API' };
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from 'clsx'
2 | import { twMerge } from 'tailwind-merge'
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/aspect-ratio.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
4 |
5 | const AspectRatio = AspectRatioPrimitive.Root
6 |
7 | export { AspectRatio }
8 |
--------------------------------------------------------------------------------
/packages/auth/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "files": [],
4 | "include": [],
5 | "references": [
6 | {
7 | "path": "./tsconfig.lib.json"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/config/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "files": [],
4 | "include": [],
5 | "references": [
6 | {
7 | "path": "./tsconfig.lib.json"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/prisma/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "files": [],
4 | "include": [],
5 | "references": [
6 | {
7 | "path": "./tsconfig.lib.json"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/types/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "files": [],
4 | "include": [],
5 | "references": [
6 | {
7 | "path": "./tsconfig.lib.json"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/utils/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "files": [],
4 | "include": [],
5 | "references": [
6 | {
7 | "path": "./tsconfig.lib.json"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/apps/worker/src/app/app.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 |
3 | @Injectable()
4 | export class AppService {
5 | getData(): { message: string } {
6 | return ({ message: 'Hello API' });
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminDashboardPage } from '@/components/admin/pages/AdminDashboardPage';
2 |
3 | export default function AdminDashboard() {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/activity/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminActivityPage } from '@/components/admin/pages/activity/AdminActivityPage';
2 |
3 | export default function ActivityPage() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/services/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { ServicesPage } from "@/components/main/pages/ServicesPage";
3 | export default function Page() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/packages/ui/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "@nx/react/babel",
5 | {
6 | "runtime": "automatic",
7 | "useBuiltIns": "usage"
8 | }
9 | ]
10 | ],
11 | "plugins": []
12 | }
13 |
--------------------------------------------------------------------------------
/apps/admin/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/documents/drafts/page.tsx:
--------------------------------------------------------------------------------
1 | import { DraftsList } from '@/components/dashboard/pages/documents/DraftsList';
2 |
3 | export default function DraftsPage() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/careers/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { CareersPage } from "@/components/main/pages/CareersPage";
4 |
5 | export default function Page() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/activity/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminActivityPage } from '@/components/admin/pages/activity/AdminActivityPage';
2 |
3 | export default function ActivityPage() {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/roles/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminRoleManagementPage } from '@/components/admin/pages/roles/AdminRoleManagementPage';
2 |
3 | export default function RolesPage() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/packages/generated/nuo-prisma/wasm-worker-loader.mjs:
--------------------------------------------------------------------------------
1 |
2 | /* !!! This is code generated by Prisma. Do not edit directly. !!!
3 | /* eslint-disable */
4 | // biome-ignore-all lint: generated file
5 | export default import('./query_compiler_bg.wasm')
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "buildCommand": "npx nx build nuo-nx",
3 | "outputDirectory": "apps/nuo-nx/.next",
4 | "installCommand": "npm install && npx prisma generate --schema=packages/prisma/schema.prisma",
5 | "framework": "nextjs"
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/users/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminUserManagementPage } from '../../../components/admin/pages/users/AdminUserManagementPage';
2 |
3 | export default function UsersPage() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "nrwl.angular-console",
4 | "esbenp.prettier-vscode",
5 | "dbaeumer.vscode-eslint",
6 | "ms-playwright.playwright",
7 | "firsttris.vscode-jest-runner"
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/roles/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminRoleManagementPage } from '@/components/admin/pages/roles/AdminRoleManagementPage';
2 |
3 | export default function RolesPage() {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/users/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminUserManagementPage } from '@/components/admin/pages/users/AdminUserManagementPage';
2 |
3 | export default function UsersPage() {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/profile/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { ProfilePage } from '@/components/dashboard/profile/ProfilePage';
4 |
5 | export default function ProfilePageRoute() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/tasks/page.tsx:
--------------------------------------------------------------------------------
1 | import { EmployeeTasksPage } from '@/components/employee/dashboard/pages/EmployeeTasksPage';
2 |
3 | export default function EmployeeTasks() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(policies)/privacy-policy/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { PrivacyPolicyPage } from "@/components/main/pages/PrivacyPolicyPage";
4 |
5 | export default function Page() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/packages/auth/src/lib/types.ts:
--------------------------------------------------------------------------------
1 | export interface AuthUser {
2 | id: string;
3 | email: string;
4 | tenantId: string;
5 | name?: string;
6 | }
7 |
8 | export interface AuthContext {
9 | user?: AuthUser;
10 | tenantId?: string;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/generated/nuo-prisma/wasm-edge-light-loader.mjs:
--------------------------------------------------------------------------------
1 |
2 | /* !!! This is code generated by Prisma. Do not edit directly. !!!
3 | /* eslint-disable */
4 | // biome-ignore-all lint: generated file
5 | export default import('./query_compiler_bg.wasm?module')
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/account/info/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { AccountInfo } from '@/components/dashboard/pages/account/AccountInfo';
4 |
5 | export default function AccountInfoPage() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/support/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { SupportSection } from '@/components/dashboard/pages/support/SupportSection';
4 |
5 | export default function SupportPage() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/services/bank-setup/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { BankSetupPage } from "@/components/main/pages/BankSetupPage";
4 |
5 | export default function Page() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(policies)/terms-of-service/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { TermsOfServicePage } from "@/components/main/pages/TermsOfServicePage";
4 |
5 | export default function Page() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/packages/prisma/src/index.ts:
--------------------------------------------------------------------------------
1 | // Export Prisma client instance
2 | export { prisma, default as prismaClient } from './lib/client.js';
3 |
4 | // Re-export all Prisma generated types from the generated client TypeScript files
5 | export * from '@prisma/client';
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/templates/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | import { TemplateEditorPage } from '../../../../components/admin/pages/templates/TemplateEditorPage';
2 |
3 | export default function TemplateEditPage() {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/incorporate/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { IncorporationFormPage } from "@/components/main/pages/IncorporationFormPage";
3 | export default function Page() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/services/ip-protection/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { IPProtectionPage } from "@/components/main/pages/IPProtectionPage";
3 |
4 | export default function Page() {
5 | return ;
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/apps/admin/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "buildCommand": "cd ../.. && npx nx build admin",
3 | "outputDirectory": ".next",
4 | "installCommand": "cd ../.. && npm install && npx prisma generate --schema=packages/prisma/schema.prisma",
5 | "framework": "nextjs"
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/users/manage/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { UserManagement } from '@/components/dashboard/pages/users/UserManagement';
4 |
5 | export default function UserManagementPage() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/templates/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminTemplateManagementPage } from '../../../components/admin/pages/templates/AdminTemplateManagementPage';
2 |
3 | export default function TemplatesPage() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | typescript: {
4 | ignoreBuildErrors: true,
5 | },
6 | images: {
7 | unoptimized: true,
8 | },
9 | }
10 |
11 | export default nextConfig
12 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/account/billing/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { AccountBilling } from '@/components/dashboard/pages/account/AccountBilling';
4 |
5 | export default function AccountBillingPage() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/users/permissions/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { UserPermissions } from '@/components/dashboard/pages/users/UserPermissions';
4 |
5 | export default function UserPermissionsPage() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/packages/auth/src/index.ts:
--------------------------------------------------------------------------------
1 | // JWT utilities
2 | export * from './lib/jwt.js';
3 |
4 | // Middleware
5 | export * from './lib/middleware/tenant.js';
6 |
7 | // Guards (NestJS)
8 | export * from './lib/guards.js';
9 |
10 | // Types
11 | export * from './lib/types.js';
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/onboarding/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { AdminOnboardingPage } from '@/components/admin/pages/onboarding/AdminOnboardingPage';
4 |
5 | export default function AdminOnboardingPageRoute() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/permissions/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminPermissionManagementPage } from '../../../components/admin/pages/permissions/AdminPermissionManagementPage';
2 |
3 | export default function PermissionsPage() {
4 | return ;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/trademarks/list/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { TrademarksSection } from '@/components/dashboard/pages/trademarks/TrademarksSection';
4 |
5 | export default function TrademarksListPage() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/worker/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "files": [],
4 | "include": [],
5 | "references": [
6 | {
7 | "path": "./tsconfig.app.json"
8 | },
9 | {
10 | "path": "./tsconfig.spec.json"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/apps/admin-e2e/src/example.spec.ts:
--------------------------------------------------------------------------------
1 | import { test, expect } from '@playwright/test';
2 |
3 | test('has title', async ({ page }) => {
4 | await page.goto('/');
5 |
6 | // Expect h1 to contain a substring.
7 | expect(await page.locator('h1').innerText()).toContain('Welcome');
8 | });
9 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/permissions/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminPermissionManagementPage } from '@/components/admin/pages/permissions/AdminPermissionManagementPage';
2 |
3 | export default function PermissionsPage() {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/onboarding/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { OnboardingRequestsPage } from '@/components/dashboard/onboarding/OnboardingRequestsPage';
4 |
5 | export default function OnboardingPage() {
6 | return ;
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import { DashboardPageWrapper } from '@/components/dashboard/pages/DashboardPageWrapper';
2 |
3 | export const dynamic = 'force-dynamic';
4 |
5 | export default async function Dashboard() {
6 | return ;
7 | }
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/services/incorporation/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { IncorporationServicesPage } from "@/components/main/pages/IncorporationServicesPage";
3 |
4 | export default function Page() {
5 | return ;
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/apps/nuo-nx-e2e/src/example.spec.ts:
--------------------------------------------------------------------------------
1 | import { test, expect } from '@playwright/test';
2 |
3 | test('has title', async ({ page }) => {
4 | await page.goto('/');
5 |
6 | // Expect h1 to contain a substring.
7 | expect(await page.locator('h1').innerText()).toContain('Welcome');
8 | });
9 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { ReactNode } from 'react'
2 |
3 | export default function ClientLayout({ children }: { children: ReactNode }) {
4 | return (
5 |
6 | {children}
7 |
8 | )
9 | }
10 |
--------------------------------------------------------------------------------
/packages/graphql/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": "../.."
5 | },
6 | "files": [],
7 | "include": [],
8 | "references": [
9 | {
10 | "path": "./tsconfig.lib.json"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/apps/admin/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | import "./.next/dev/types/routes.d.ts";
4 |
5 | // NOTE: This file should not be edited
6 | // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
7 |
--------------------------------------------------------------------------------
/apps/api/src/app/prisma/prisma.module.ts:
--------------------------------------------------------------------------------
1 | import { Global, Module } from '@nestjs/common';
2 | import { PrismaService } from './prisma.service.js';
3 |
4 | @Global()
5 | @Module({
6 | providers: [PrismaService],
7 | exports: [PrismaService],
8 | })
9 | export class PrismaModule {}
10 |
--------------------------------------------------------------------------------
/apps/nuo-nx/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | import "./.next/dev/types/routes.d.ts";
4 |
5 | // NOTE: This file should not be edited
6 | // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
7 |
--------------------------------------------------------------------------------
/packages/ui/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | './src/**/*.{ts,tsx,js,jsx,html}',
5 | '!./src/**/*.{stories,spec}.{ts,tsx,js,jsx,html}',
6 | ],
7 | theme: {
8 | extend: {},
9 | },
10 | plugins: [],
11 | };
12 |
--------------------------------------------------------------------------------
/packages/prisma/src/lib/server-only.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Server-only Prisma client for Next.js
3 | * Use this import in Next.js server components, API routes, and server actions
4 | */
5 | import 'server-only';
6 | import { prisma } from './client.js';
7 |
8 | export { prisma };
9 | export default prisma;
10 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/roles/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminRoleDetailPage } from '../../../../components/admin/pages/roles/AdminRoleDetailPage';
2 |
3 | export default function RoleDetailPage({ params }: { params: Promise<{ id: string }> }) {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/users/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminUserDetailPage } from '../../../../components/admin/pages/users/AdminUserDetailPage';
2 |
3 | export default function UserDetailPage({ params }: { params: Promise<{ id: string }> }) {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/apps/api-e2e/src/api/api.spec.ts:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | describe('GET /api', () => {
4 | it('should return a message', async () => {
5 | const res = await axios.get(`/api`);
6 |
7 | expect(res.status).toBe(200);
8 | expect(res.data).toEqual({ message: 'Hello API' });
9 | });
10 | });
11 |
--------------------------------------------------------------------------------
/apps/worker/src/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | @Module({
6 | imports: [],
7 | controllers: [AppController],
8 | providers: [AppService],
9 | })
10 | export class AppModule {}
11 |
--------------------------------------------------------------------------------
/apps/worker-e2e/src/worker/worker.spec.ts:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | describe('GET /api', () => {
4 | it('should return a message', async () => {
5 | const res = await axios.get(`/api`);
6 |
7 | expect(res.status).toBe(200);
8 | expect(res.data).toEqual({ message: 'Hello API' });
9 | });
10 | })
11 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/layout.tsx:
--------------------------------------------------------------------------------
1 | import { AdminDashboardLayout } from '../../components/admin/layout/AdminDashboardLayout';
2 |
3 | export default function AdminLayout({
4 | children,
5 | }: {
6 | children: React.ReactNode;
7 | }) {
8 | return {children} ;
9 | }
10 |
11 |
--------------------------------------------------------------------------------
/apps/api-e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "out-tsc/@nuo-nx/api-e2e",
5 | "esModuleInterop": true,
6 | "noUnusedLocals": false,
7 | "noImplicitAny": false
8 | },
9 | "include": ["jest.config.ts", "src/**/*.ts"],
10 | "references": []
11 | }
12 |
--------------------------------------------------------------------------------
/apps/api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": "../.."
5 | },
6 | "files": [],
7 | "include": [],
8 | "references": [
9 | {
10 | "path": "./tsconfig.app.json"
11 | },
12 | {
13 | "path": "./tsconfig.spec.json"
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/apps/admin/specs/index.spec.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { render } from '@testing-library/react';
3 | import Page from '../src/app/page';
4 |
5 | describe('Page', () => {
6 | it('should render successfully', () => {
7 | const { baseElement } = render( );
8 | expect(baseElement).toBeTruthy();
9 | });
10 | });
11 |
--------------------------------------------------------------------------------
/apps/admin/src/app/dashboard/permissions/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | import { AdminPermissionDetailPage } from '../../../../components/admin/pages/permissions/AdminPermissionDetailPage';
2 |
3 | export default function PermissionDetailPage({ params }: { params: Promise<{ id: string }> }) {
4 | return ;
5 | }
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/api-e2e/src/support/test-setup.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | import axios from 'axios';
3 |
4 | module.exports = async function () {
5 | // Configure axios for tests to use.
6 | const host = process.env.HOST ?? 'localhost';
7 | const port = process.env.PORT ?? '3000';
8 | axios.defaults.baseURL = `http://${host}:${port}`;
9 | };
10 |
--------------------------------------------------------------------------------
/apps/nuo-nx/specs/index.spec.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { render } from '@testing-library/react';
3 | import Page from '../src/app/page';
4 |
5 | describe('Page', () => {
6 | it('should render successfully', () => {
7 | const { baseElement } = render( );
8 | expect(baseElement).toBeTruthy();
9 | });
10 | });
11 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/compliance/calendar/page.tsx:
--------------------------------------------------------------------------------
1 | import { ComplianceCalendar } from '@/components/dashboard/pages/compliance/calendar/ComplianceCalendar';
2 |
3 | export default function ComplianceCalendarPage() {
4 | return (
5 |
6 |
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/apps/worker-e2e/src/support/test-setup.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | import axios from 'axios';
3 |
4 | module.exports = async function() {
5 | // Configure axios for tests to use.
6 | const host = process.env.HOST ?? 'localhost';
7 | const port = process.env.PORT ?? '3000';
8 | axios.defaults.baseURL = `http://${host}:${port}`;
9 | };
10 |
--------------------------------------------------------------------------------
/apps/admin/src/components/dashboard/hooks/index.ts:
--------------------------------------------------------------------------------
1 | export { useOnClickOutside } from './useOnClickOutside';
2 | export { useUserData } from './useUserData';
3 | export { useNotifications } from './useNotifications';
4 | export { useHeaderNavigation } from './useHeaderNavigation';
5 | export { useHeaderDropdowns } from './useHeaderDropdowns';
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/apps/api/src/app/app.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get } from '@nestjs/common';
2 | import { AppService } from './app.service';
3 |
4 | @Controller()
5 | export class AppController {
6 | constructor(private readonly appService: AppService) {}
7 |
8 | @Get()
9 | getData() {
10 | return this.appService.getData();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/about/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { AboutPage } from "@/components/main/pages/AboutPage";
3 | import { useLanguage } from "@/contexts/lang/LanguageContext";
4 |
5 | export default function Page() {
6 | const { language } = useLanguage();
7 | return ;
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/apps/worker/src/app/app.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get } from '@nestjs/common';
2 | import { AppService } from './app.service';
3 |
4 | @Controller()
5 | export class AppController {
6 | constructor(private readonly appService: AppService) {}
7 |
8 | @Get()
9 | getData() {
10 | return this.appService.getData();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/packages/graphql/src/lib/schema.graphql:
--------------------------------------------------------------------------------
1 | type Query {
2 | hello: String!
3 | users: [User!]!
4 | }
5 |
6 | type Mutation {
7 | createUser(email: String!, name: String): User!
8 | }
9 |
10 | type User {
11 | id: ID!
12 | email: String!
13 | name: String
14 | tenantId: ID!
15 | createdAt: String!
16 | updatedAt: String!
17 | }
18 |
--------------------------------------------------------------------------------
/apps/admin-e2e/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import playwright from 'eslint-plugin-playwright';
2 | import baseConfig from '../../eslint.config.mjs';
3 |
4 | export default [
5 | playwright.configs['flat/recommended'],
6 | ...baseConfig,
7 | {
8 | files: ['**/*.ts', '**/*.js'],
9 | // Override or add rules here
10 | rules: {},
11 | },
12 | ];
13 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/layout.tsx:
--------------------------------------------------------------------------------
1 | import { AdminDashboardLayout } from '@/components/admin/layout/AdminDashboardLayout';
2 |
3 | export default function AdminDashboardLayoutWrapper({
4 | children,
5 | }: {
6 | children: React.ReactNode;
7 | }) {
8 | return {children} ;
9 | }
10 |
11 |
12 |
--------------------------------------------------------------------------------
/apps/nuo-nx-e2e/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import playwright from 'eslint-plugin-playwright';
2 | import baseConfig from '../../eslint.config.mjs';
3 |
4 | export default [
5 | playwright.configs['flat/recommended'],
6 | ...baseConfig,
7 | {
8 | files: ['**/*.ts', '**/*.js'],
9 | // Override or add rules here
10 | rules: {},
11 | },
12 | ];
13 |
--------------------------------------------------------------------------------
/apps/api/tsconfig.tsbuildinfo:
--------------------------------------------------------------------------------
1 | {"fileNames":[],"fileInfos":[],"root":[],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":true,"importHelpers":true,"module":99,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"skipLibCheck":true,"strict":true,"target":9},"version":"5.9.3"}
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/app/page.tsx:
--------------------------------------------------------------------------------
1 | import { DashboardLayout } from "@/components/dashboard/dashboard-layout"
2 | import { DashboardOverview } from "@/components/dashboard/dashboard-overview"
3 |
4 | export default function DashboardPage() {
5 | return (
6 |
7 |
8 |
9 | )
10 | }
11 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(marketing)/(client)/contact/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { ContactPage } from "@/components/main/pages/ContactPage";
3 | import { useLanguage } from "@/contexts/lang/LanguageContext";
4 |
5 | export default function Page() {
6 | const { language } = useLanguage();
7 | return ;
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/skeleton.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils"
2 |
3 | function Skeleton({
4 | className,
5 | ...props
6 | }: React.HTMLAttributes) {
7 | return (
8 |
12 | )
13 | }
14 |
15 | export { Skeleton }
16 |
--------------------------------------------------------------------------------
/apps/worker-e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "out-tsc/@nuo-nx/worker-e2e",
5 | "esModuleInterop": true,
6 | "noUnusedLocals": false,
7 | "noImplicitAny": false
8 | },
9 | "include": [
10 | "jest.config.ts",
11 | "src/**/*.ts"
12 | ],
13 | "references": []
14 | }
15 |
--------------------------------------------------------------------------------
/packages/ui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/ui",
3 | "version": "0.0.1",
4 | "main": "./src/index.ts",
5 | "types": "./src/index.ts",
6 | "exports": {
7 | ".": {
8 | "types": "./src/index.ts",
9 | "import": "./src/index.ts",
10 | "default": "./src/index.ts"
11 | },
12 | "./package.json": "./package.json"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/aspect-ratio.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'
4 |
5 | function AspectRatio({
6 | ...props
7 | }: React.ComponentProps) {
8 | return
9 | }
10 |
11 | export { AspectRatio }
12 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/skeleton.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils"
2 |
3 | function Skeleton({
4 | className,
5 | ...props
6 | }: React.HTMLAttributes) {
7 | return (
8 |
12 | )
13 | }
14 |
15 | export { Skeleton }
16 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/skeleton.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from '@/lib/utils'
2 |
3 | function Skeleton({ className, ...props }: React.ComponentProps<'div'>) {
4 | return (
5 |
10 | )
11 | }
12 |
13 | export { Skeleton }
14 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/onboarding/new/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { OnboardingRequestForm } from '@/components/dashboard/onboarding/OnboardingRequestForm';
4 |
5 | export default function NewOnboardingRequestPage() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/theme-provider.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import {
5 | ThemeProvider as NextThemesProvider,
6 | type ThemeProviderProps,
7 | } from 'next-themes'
8 |
9 | export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
10 | return {children}
11 | }
12 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/onboarding/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { OnboardingRequestDetail } from '@/components/dashboard/onboarding/OnboardingRequestDetail';
4 |
5 | export default function OnboardingRequestDetailPage({
6 | params,
7 | }: {
8 | params: { id: string };
9 | }) {
10 | return ;
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/apps/admin/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import nextEslintPluginNext from '@next/eslint-plugin-next';
2 | import nx from '@nx/eslint-plugin';
3 | import baseConfig from '../../eslint.config.mjs';
4 |
5 | export default [
6 | { plugins: { '@next/next': nextEslintPluginNext } },
7 | ...baseConfig,
8 | ...nx.configs['flat/react-typescript'],
9 | {
10 | ignores: ['.next/**/*', '**/out-tsc'],
11 | },
12 | ];
13 |
--------------------------------------------------------------------------------
/apps/admin/src/app/admin/dashboard/onboarding/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { AdminOnboardingRequestDetail } from '@/components/admin/pages/onboarding/AdminOnboardingRequestDetail';
4 |
5 | export default function AdminOnboardingRequestDetailPage({
6 | params,
7 | }: {
8 | params: { id: string };
9 | }) {
10 | return ;
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/apps/admin/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import './global.css';
2 |
3 | export const metadata = {
4 | title: 'Welcome to admin',
5 | description: 'Generated by create-nx-workspace',
6 | };
7 |
8 | export default function RootLayout({
9 | children,
10 | }: {
11 | children: React.ReactNode;
12 | }) {
13 | return (
14 |
15 | {children}
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/apps/nuo-nx/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import nextEslintPluginNext from '@next/eslint-plugin-next';
2 | import nx from '@nx/eslint-plugin';
3 | import baseConfig from '../../eslint.config.mjs';
4 |
5 | export default [
6 | { plugins: { '@next/next': nextEslintPluginNext } },
7 | ...baseConfig,
8 | ...nx.configs['flat/react-typescript'],
9 | {
10 | ignores: ['.next/**/*', '**/out-tsc'],
11 | },
12 | ];
13 |
--------------------------------------------------------------------------------
/packages/graphql/src/lib/typeDefs.ts:
--------------------------------------------------------------------------------
1 | export const typeDefs = `
2 | type Query {
3 | hello: String!
4 | users: [User!]!
5 | }
6 |
7 | type Mutation {
8 | createUser(email: String!, name: String): User!
9 | }
10 |
11 | type User {
12 | id: ID!
13 | email: String!
14 | name: String
15 | tenantId: ID!
16 | createdAt: String!
17 | updatedAt: String!
18 | }
19 | `;
20 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/collapsible.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"
4 |
5 | const Collapsible = CollapsiblePrimitive.Root
6 |
7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger
8 |
9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent
10 |
11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent }
12 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/collapsible.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"
4 |
5 | const Collapsible = CollapsiblePrimitive.Root
6 |
7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger
8 |
9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent
10 |
11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent }
12 |
--------------------------------------------------------------------------------
/apps/api/src/app/users/user.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { UserController } from './user.controller.js';
3 | import { UserService } from './user.service.js';
4 | import { UserRepository } from './user.repository.js';
5 |
6 | @Module({
7 | controllers: [UserController],
8 | providers: [UserService, UserRepository],
9 | exports: [UserService],
10 | })
11 | export class UserModule { }
12 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(auth)/login/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Suspense } from "react";
3 | import { LoginPage } from "@/components/main/auth/login/LoginPage";
4 |
5 | function LoginPageWrapper() {
6 | return ;
7 | }
8 |
9 | export default function Page() {
10 | return (
11 | Loading...}>
12 |
13 |
14 | );
15 | }
16 |
17 |
--------------------------------------------------------------------------------
/packages/document-utils/src/index.ts:
--------------------------------------------------------------------------------
1 | // PDF exports
2 | export * from './pdf/export.js';
3 | export * from './pdf/simple-pdf.js';
4 | export * from './pdf/parse.js';
5 | export * from './pdf/signature-manager.js';
6 | export * from './pdf/fonts.js';
7 | export * from './pdf/styles.js';
8 | export * from './pdf/hyphenation.js';
9 |
10 | // Document utilities
11 | export * from './transformers.js';
12 | export * from './utils.js';
13 |
--------------------------------------------------------------------------------
/packages/graphql/src/lib/codegen.ts:
--------------------------------------------------------------------------------
1 | import type { CodegenConfig } from '@graphql-codegen/cli';
2 |
3 | const config: CodegenConfig = {
4 | schema: './src/lib/schema.graphql',
5 | generates: {
6 | './src/generated/graphql.ts': {
7 | plugins: ['typescript', 'typescript-resolvers'],
8 | config: {
9 | useIndexSignature: true,
10 | },
11 | },
12 | },
13 | };
14 |
15 | export default config;
16 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/spinner.tsx:
--------------------------------------------------------------------------------
1 | import { Loader2Icon } from "lucide-react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
6 | return (
7 |
13 | )
14 | }
15 |
16 | export { Spinner }
17 |
--------------------------------------------------------------------------------
/apps/api/src/app/otp/otp.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { OtpController } from './otp.controller.js';
3 | import { OtpService } from './otp.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 |
6 | @Module({
7 | imports: [PrismaModule],
8 | controllers: [OtpController],
9 | providers: [OtpService],
10 | exports: [OtpService],
11 | })
12 | export class OtpModule {}
13 |
14 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/spinner.tsx:
--------------------------------------------------------------------------------
1 | import { Loader2Icon } from "lucide-react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
6 | return (
7 |
13 | )
14 | }
15 |
16 | export { Spinner }
17 |
--------------------------------------------------------------------------------
/apps/api/src/app/auth/auth.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { AuthController } from './auth.controller.js';
3 | import { AuthService } from './auth.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 |
6 | @Module({
7 | imports: [PrismaModule],
8 | controllers: [AuthController],
9 | providers: [AuthService],
10 | exports: [AuthService],
11 | })
12 | export class AuthModule {}
13 |
14 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/spinner.tsx:
--------------------------------------------------------------------------------
1 | import { Loader2Icon } from 'lucide-react'
2 |
3 | import { cn } from '@/lib/utils'
4 |
5 | function Spinner({ className, ...props }: React.ComponentProps<'svg'>) {
6 | return (
7 |
13 | )
14 | }
15 |
16 | export { Spinner }
17 |
--------------------------------------------------------------------------------
/apps/api-e2e/src/support/global-teardown.ts:
--------------------------------------------------------------------------------
1 | import { killPort } from '@nx/node/utils';
2 | /* eslint-disable */
3 |
4 | module.exports = async function () {
5 | // Put clean up logic here (e.g. stopping services, docker-compose, etc.).
6 | // Hint: `globalThis` is shared between setup and teardown.
7 | const port = process.env.PORT ? Number(process.env.PORT) : 3000;
8 | await killPort(port);
9 | console.log(globalThis.__TEARDOWN_MESSAGE__);
10 | };
11 |
--------------------------------------------------------------------------------
/apps/worker-e2e/src/support/global-teardown.ts:
--------------------------------------------------------------------------------
1 | import { killPort } from '@nx/node/utils';
2 | /* eslint-disable */
3 |
4 | module.exports = async function() {
5 | // Put clean up logic here (e.g. stopping services, docker-compose, etc.).
6 | // Hint: `globalThis` is shared between setup and teardown.
7 | const port = process.env.PORT ? Number(process.env.PORT) : 3000;
8 | await killPort(port);
9 | console.log(globalThis.__TEARDOWN_MESSAGE__);
10 | };
11 |
--------------------------------------------------------------------------------
/packages/prisma/prisma.config.ts:
--------------------------------------------------------------------------------
1 | import path from 'node:path';
2 | import { defineConfig, PrismaConfig } from 'prisma/config';
3 | import { config } from 'dotenv';
4 |
5 | // Load environment variables from .env file
6 | config({ path: path.join(__dirname, '../../.env') });
7 |
8 | export default defineConfig({
9 | schema: path.join(__dirname, 'schema.prisma'),
10 | datasource: {
11 | url: process.env.DATABASE_URL || '',
12 | },
13 | }) as PrismaConfig;
14 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/DocumentVaultAnimation.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export function DocumentVaultAnimation() {
4 | return (
5 |
6 |
7 |
8 |
Loading documents...
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/apps/api-e2e/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/api-e2e",
3 | "version": "0.0.1",
4 | "private": true,
5 | "nx": {
6 | "targets": {
7 | "e2e": {
8 | "executor": "@nx/jest:jest",
9 | "outputs": [
10 | "{projectRoot}/test-output/jest/coverage"
11 | ],
12 | "options": {
13 | "jestConfig": "apps/api-e2e/jest.config.cts",
14 | "passWithNoTests": true
15 | }
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/DocumentVaultAnimation.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export function DocumentVaultAnimation() {
4 | return (
5 |
6 |
7 |
8 |
Loading documents...
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/packages/storage/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"]
13 | },
14 | "include": ["src/**/*.ts"]
15 | }
16 |
--------------------------------------------------------------------------------
/apps/api/src/app/security/security.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { SecurityController } from './security.controller.js';
3 | import { SecurityService } from './security.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 |
6 | @Module({
7 | imports: [PrismaModule],
8 | controllers: [SecurityController],
9 | providers: [SecurityService],
10 | exports: [SecurityService],
11 | })
12 | export class SecurityModule {}
13 |
14 |
--------------------------------------------------------------------------------
/apps/api/src/app/documents/documents.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { DocumentsController } from './documents.controller.js';
3 | import { DocumentsService } from './documents.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 |
6 | @Module({
7 | imports: [PrismaModule],
8 | controllers: [DocumentsController],
9 | providers: [DocumentsService],
10 | exports: [DocumentsService],
11 | })
12 | export class DocumentsModule {}
13 |
--------------------------------------------------------------------------------
/apps/api/src/app/dashboard/dashboard.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { DashboardController } from './dashboard.controller.js';
3 | import { DashboardService } from './dashboard.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 |
6 | @Module({
7 | imports: [PrismaModule],
8 | controllers: [DashboardController],
9 | providers: [DashboardService],
10 | exports: [DashboardService],
11 | })
12 | export class DashboardModule {}
13 |
14 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/hooks/index.ts:
--------------------------------------------------------------------------------
1 | export { useDashboardData } from './useDashboardData';
2 | export { useStats } from './useStats';
3 | export { useRecentActivities } from './useRecentActivities';
4 | export { useOnClickOutside } from './useOnClickOutside';
5 | export { useUserData } from './useUserData';
6 | export { useNotifications } from './useNotifications';
7 | export { useHeaderNavigation } from './useHeaderNavigation';
8 | export { useHeaderDropdowns } from './useHeaderDropdowns';
9 |
--------------------------------------------------------------------------------
/packages/config/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"]
13 | },
14 | "include": ["src/**/*.ts"],
15 | "references": []
16 | }
17 |
--------------------------------------------------------------------------------
/apps/api/.spec.swcrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsc": {
3 | "target": "es2017",
4 | "parser": {
5 | "syntax": "typescript",
6 | "decorators": true,
7 | "dynamicImport": true
8 | },
9 | "transform": {
10 | "decoratorMetadata": true,
11 | "legacyDecorator": true
12 | },
13 | "keepClassNames": true,
14 | "externalHelpers": true,
15 | "loose": true
16 | },
17 | "module": {
18 | "type": "es6"
19 | },
20 | "sourceMaps": true,
21 | "exclude": []
22 | }
23 |
--------------------------------------------------------------------------------
/apps/api/src/app/onboarding/onboarding.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { OnboardingController } from './onboarding.controller.js';
3 | import { OnboardingService } from './onboarding.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 |
6 | @Module({
7 | imports: [PrismaModule],
8 | controllers: [OnboardingController],
9 | providers: [OnboardingService],
10 | exports: [OnboardingService],
11 | })
12 | export class OnboardingModule {}
13 |
14 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/trademarks/register/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import TrademarkRegister from '@/components/dashboard/pages/trademarks/TrademarkRegister';
4 | import { useRouter } from 'next/navigation';
5 |
6 | export default function TrademarkRegistrationPage() {
7 | const router = useRouter();
8 | const onNavigateToList = () => {
9 | router.push('/dashboard/trademarks/list');
10 | }
11 | return ;
12 | }
13 |
--------------------------------------------------------------------------------
/packages/types/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"]
13 | },
14 | "include": ["src/**/*.ts"],
15 | "references": []
16 | }
17 |
--------------------------------------------------------------------------------
/packages/utils/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"]
13 | },
14 | "include": ["src/**/*.ts"],
15 | "references": []
16 | }
17 |
--------------------------------------------------------------------------------
/apps/api-e2e/.spec.swcrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsc": {
3 | "target": "es2017",
4 | "parser": {
5 | "syntax": "typescript",
6 | "decorators": true,
7 | "dynamicImport": true
8 | },
9 | "transform": {
10 | "decoratorMetadata": true,
11 | "legacyDecorator": true
12 | },
13 | "keepClassNames": true,
14 | "externalHelpers": true,
15 | "loose": true
16 | },
17 | "module": {
18 | "type": "es6"
19 | },
20 | "sourceMaps": true,
21 | "exclude": []
22 | }
23 |
--------------------------------------------------------------------------------
/apps/worker-e2e/.spec.swcrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsc": {
3 | "target": "es2017",
4 | "parser": {
5 | "syntax": "typescript",
6 | "decorators": true,
7 | "dynamicImport": true
8 | },
9 | "transform": {
10 | "decoratorMetadata": true,
11 | "legacyDecorator": true
12 | },
13 | "keepClassNames": true,
14 | "externalHelpers": true,
15 | "loose": true
16 | },
17 | "module": {
18 | "type": "es6"
19 | },
20 | "sourceMaps": true,
21 | "exclude": []
22 | }
23 |
--------------------------------------------------------------------------------
/apps/worker/.spec.swcrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsc": {
3 | "target": "es2017",
4 | "parser": {
5 | "syntax": "typescript",
6 | "decorators": true,
7 | "dynamicImport": true
8 | },
9 | "transform": {
10 | "decoratorMetadata": true,
11 | "legacyDecorator": true
12 | },
13 | "keepClassNames": true,
14 | "externalHelpers": true,
15 | "loose": true
16 | },
17 | "module": {
18 | "type": "es6"
19 | },
20 | "sourceMaps": true,
21 | "exclude": []
22 | }
23 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/companies/list/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { CompaniesList } from '@/components/dashboard/pages/companies/CompaniesList';
4 | import { useRouter } from 'next/navigation';
5 | export default function CompaniesListPage() {
6 | const router = useRouter();
7 | const onNavigateToRegister = () => {
8 | router.push('/dashboard/companies/register');
9 | }
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/storage/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "module": "ESNext",
5 | "moduleResolution": "bundler",
6 | "target": "ES2020",
7 | "lib": ["ES2020"],
8 | "declaration": true,
9 | "outDir": "./dist",
10 | "rootDir": "./src",
11 | "composite": true,
12 | "declarationMap": true,
13 | "sourceMap": true
14 | },
15 | "include": ["src/**/*"],
16 | "exclude": ["node_modules", "dist", "**/*.spec.ts", "**/*.test.ts"]
17 | }
18 |
--------------------------------------------------------------------------------
/apps/api/src/app/prisma/prisma.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2 | import { prisma } from '@nuo-nx/prisma';
3 |
4 | @Injectable()
5 | export class PrismaService implements OnModuleInit, OnModuleDestroy {
6 | get client() {
7 | return prisma;
8 | }
9 |
10 | async onModuleInit() {
11 | // Optional: Verify database connection
12 | await prisma.$connect();
13 | }
14 |
15 | async onModuleDestroy() {
16 | await prisma.$disconnect();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/companies/register/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { CompanyRegistrationWizard } from '@/components/dashboard/pages/companies/CompanyRegistrationWizard';
4 | import { useRouter } from 'next/navigation';
5 |
6 | export default function CompanyRegistrationPage() {
7 | const router = useRouter();
8 | const onNavigateToList = () => {
9 | router.push('/dashboard/companies/list');
10 | }
11 | return ;
12 | }
13 |
--------------------------------------------------------------------------------
/prisma.config.ts:
--------------------------------------------------------------------------------
1 | import 'dotenv/config';
2 | import { defineConfig, env } from 'prisma/config';
3 |
4 | export default defineConfig({
5 | // The main entry for your schema
6 | schema: 'packages/prisma/schema.prisma',
7 |
8 | // Where migrations should be generated
9 | migrations: {
10 | path: 'packages/prisma/migrations',
11 | seed: 'tsx packages/prisma/seed.ts',
12 | },
13 |
14 | // The database URL from environment variables
15 | datasource: {
16 | url: env('DATABASE_URL'),
17 | },
18 | });
19 |
--------------------------------------------------------------------------------
/apps/admin/src/contexts/scroll/ScrollContext.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { createContext, useContext } from 'react';
4 |
5 | // Create context for scroll function
6 | const ScrollContext = createContext<(() => void) | null>(null);
7 |
8 | export const useScrollToForm = () => {
9 | const scrollToForm = useContext(ScrollContext);
10 | if (!scrollToForm) {
11 | throw new Error('useScrollToForm must be used within a ScrollContext.Provider');
12 | }
13 | return scrollToForm;
14 | };
15 |
16 | export { ScrollContext };
17 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/contexts/scroll/ScrollContext.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { createContext, useContext } from 'react';
4 |
5 | // Create context for scroll function
6 | const ScrollContext = createContext<(() => void) | null>(null);
7 |
8 | export const useScrollToForm = () => {
9 | const scrollToForm = useContext(ScrollContext);
10 | if (!scrollToForm) {
11 | throw new Error('useScrollToForm must be used within a ScrollContext.Provider');
12 | }
13 | return scrollToForm;
14 | };
15 |
16 | export { ScrollContext };
17 |
--------------------------------------------------------------------------------
/apps/admin/jest.config.cts:
--------------------------------------------------------------------------------
1 | const nextJest = require('next/jest.js');
2 |
3 | const createJestConfig = nextJest({
4 | dir: './',
5 | });
6 |
7 | const config = {
8 | displayName: '@nuo-nx/admin',
9 | preset: '../../jest.preset.js',
10 | transform: {
11 | '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nx/react/plugins/jest',
12 | },
13 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
14 | coverageDirectory: '../../coverage/apps/admin',
15 | testEnvironment: 'jsdom',
16 | };
17 |
18 | module.exports = createJestConfig(config);
19 |
--------------------------------------------------------------------------------
/apps/api/src/app/admin/admin.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { AdminController } from './admin.controller.js';
3 | import { AdminService } from './admin.service.js';
4 | import { PrismaModule } from '../prisma/prisma.module.js';
5 | import { OnboardingModule } from '../onboarding/onboarding.module.js';
6 |
7 | @Module({
8 | imports: [PrismaModule, OnboardingModule],
9 | controllers: [AdminController],
10 | providers: [AdminService],
11 | exports: [AdminService],
12 | })
13 | export class AdminModule {}
14 |
15 |
--------------------------------------------------------------------------------
/apps/nuo-nx/jest.config.cts:
--------------------------------------------------------------------------------
1 | const nextJest = require('next/jest.js');
2 |
3 | const createJestConfig = nextJest({
4 | dir: './',
5 | });
6 |
7 | const config = {
8 | displayName: '@nuo-nx/nuo-nx',
9 | preset: '../../jest.preset.js',
10 | transform: {
11 | '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nx/react/plugins/jest',
12 | },
13 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
14 | coverageDirectory: '../../coverage/apps/nuo-nx',
15 | testEnvironment: 'jsdom',
16 | };
17 |
18 | module.exports = createJestConfig(config);
19 |
--------------------------------------------------------------------------------
/apps/admin/postcss.config.js:
--------------------------------------------------------------------------------
1 | const { join } = require('path');
2 |
3 | // Note: If you use library-specific PostCSS/Tailwind configuration then you should remove the `postcssConfig` build
4 | // option from your application's configuration (i.e. project.json).
5 | //
6 | // See: https://nx.dev/guides/using-tailwind-css-in-react#step-4:-applying-configuration-to-libraries
7 |
8 | module.exports = {
9 | plugins: {
10 | tailwindcss: {
11 | config: join(__dirname, 'tailwind.config.js'),
12 | },
13 | autoprefixer: {},
14 | },
15 | };
16 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "",
8 | "css": "app/globals.css",
9 | "baseColor": "neutral",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/components/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
22 |
--------------------------------------------------------------------------------
/apps/nuo-nx/postcss.config.js:
--------------------------------------------------------------------------------
1 | const { join } = require('path');
2 |
3 | // Note: If you use library-specific PostCSS/Tailwind configuration then you should remove the `postcssConfig` build
4 | // option from your application's configuration (i.e. project.json).
5 | //
6 | // See: https://nx.dev/guides/using-tailwind-css-in-react#step-4:-applying-configuration-to-libraries
7 |
8 | module.exports = {
9 | plugins: {
10 | tailwindcss: {
11 | config: join(__dirname, 'tailwind.config.js'),
12 | },
13 | autoprefixer: {},
14 | },
15 | };
16 |
--------------------------------------------------------------------------------
/apps/admin/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.js",
8 | "css": "src/app/global.css",
9 | "baseColor": "neutral",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "iconLibrary": "lucide",
14 | "aliases": {
15 | "components": "@/components",
16 | "utils": "@/lib/utils",
17 | "ui": "@/components/ui",
18 | "lib": "@/lib",
19 | "hooks": "@/hooks"
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/apps/nuo-nx/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.js",
8 | "css": "src/app/globals.css",
9 | "baseColor": "neutral",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "iconLibrary": "lucide",
14 | "aliases": {
15 | "components": "@/components",
16 | "utils": "@/lib/utils",
17 | "ui": "@/components/ui",
18 | "lib": "@/lib",
19 | "hooks": "@/hooks"
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/packages/types/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/types",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/packages/utils/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/utils",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/pages/documents/TemplateGallery.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { AnimatePresence } from 'framer-motion';
4 | import { TemplateGrid } from './TemplateGrid';
5 |
6 | interface TemplateGalleryProps {
7 | tenantId: string | null;
8 | onClose: () => void;
9 | }
10 |
11 | export function TemplateGallery({ tenantId, onClose }: TemplateGalleryProps) {
12 |
13 | return (
14 |
15 |
19 |
20 | );
21 | }
--------------------------------------------------------------------------------
/packages/auth/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"]
13 | },
14 | "include": ["src/**/*.ts"],
15 | "references": [
16 | {
17 | "path": "../config/tsconfig.lib.json"
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/packages/prisma/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"]
13 | },
14 | "include": ["src/**/*.ts"],
15 | "references": [
16 | {
17 | "path": "../config/tsconfig.lib.json"
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/packages/config/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/config",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0",
20 | "zod": "^3.22.4"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/apps/api/src/app/app.service.spec.ts:
--------------------------------------------------------------------------------
1 | import { Test } from '@nestjs/testing';
2 | import { AppService } from './app.service';
3 |
4 | describe('AppService', () => {
5 | let service: AppService;
6 |
7 | beforeAll(async () => {
8 | const app = await Test.createTestingModule({
9 | providers: [AppService],
10 | }).compile();
11 |
12 | service = app.get(AppService);
13 | });
14 |
15 | describe('getData', () => {
16 | it('should return "Hello API"', () => {
17 | expect(service.getData()).toEqual({ message: 'Hello API' });
18 | });
19 | });
20 | });
21 |
--------------------------------------------------------------------------------
/apps/worker/src/app/app.service.spec.ts:
--------------------------------------------------------------------------------
1 | import { Test } from '@nestjs/testing';
2 | import { AppService } from './app.service';
3 |
4 | describe('AppService', () => {
5 | let service: AppService;
6 |
7 | beforeAll(async () => {
8 | const app = await Test.createTestingModule({
9 | providers: [AppService],
10 | }).compile();
11 |
12 | service = app.get(AppService);
13 | });
14 |
15 | describe('getData', () => {
16 | it('should return "Hello API"', () => {
17 | expect(service.getData()).toEqual({message: 'Hello API'});
18 | });
19 | });
20 | });
21 |
--------------------------------------------------------------------------------
/apps/admin-e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "allowJs": true,
5 | "outDir": "out-tsc/playwright",
6 | "sourceMap": false
7 | },
8 | "include": [
9 | "**/*.ts",
10 | "**/*.js",
11 | "playwright.config.ts",
12 | "src/**/*.spec.ts",
13 | "src/**/*.spec.js",
14 | "src/**/*.test.ts",
15 | "src/**/*.test.js",
16 | "src/**/*.d.ts"
17 | ],
18 | "exclude": [
19 | "out-tsc",
20 | "test-output",
21 | "eslint.config.js",
22 | "eslint.config.mjs",
23 | "eslint.config.cjs"
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx-e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "allowJs": true,
5 | "outDir": "out-tsc/playwright",
6 | "sourceMap": false
7 | },
8 | "include": [
9 | "**/*.ts",
10 | "**/*.js",
11 | "playwright.config.ts",
12 | "src/**/*.spec.ts",
13 | "src/**/*.spec.js",
14 | "src/**/*.test.ts",
15 | "src/**/*.test.js",
16 | "src/**/*.d.ts"
17 | ],
18 | "exclude": [
19 | "out-tsc",
20 | "test-output",
21 | "eslint.config.js",
22 | "eslint.config.mjs",
23 | "eslint.config.cjs"
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/pages/documents/signage/DocumentSignHeader.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | export function DocumentSignHeader() {
4 | return (
5 |
6 |
Document Signing Center
7 |
8 | Manage document signatures, track signing progress, and ensure all parties complete their required signatures.
9 | Documents can be signed electronically with digital signatures and comments.
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/apps/worker/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./out-tsc/jest",
5 | "types": [
6 | "jest",
7 | "node"
8 | ],
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "experimentalDecorators": true,
12 | "emitDecoratorMetadata": true
13 | },
14 | "include": [
15 | "jest.config.ts",
16 | "jest.config.cts",
17 | "src/**/*.test.ts",
18 | "src/**/*.spec.ts",
19 | "src/**/*.d.ts"
20 | ],
21 | "references": [
22 | {
23 | "path": "./tsconfig.app.json"
24 | }
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/apps/admin/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./out-tsc/jest",
5 | "jsx": "preserve",
6 | "types": ["jest", "node"]
7 | },
8 | "include": [
9 | "jest.config.ts",
10 | "jest.config.cts",
11 | "src/**/*.test.ts",
12 | "src/**/*.spec.ts",
13 | "src/**/*.test.tsx",
14 | "src/**/*.spec.tsx",
15 | "src/**/*.test.js",
16 | "src/**/*.spec.js",
17 | "src/**/*.test.jsx",
18 | "src/**/*.spec.jsx",
19 | "src/**/*.d.ts"
20 | ],
21 | "references": [
22 | {
23 | "path": "./tsconfig.json"
24 | }
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/apps/nuo-nx/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "./out-tsc/jest",
5 | "jsx": "preserve",
6 | "types": ["jest", "node"]
7 | },
8 | "include": [
9 | "jest.config.ts",
10 | "jest.config.cts",
11 | "src/**/*.test.ts",
12 | "src/**/*.spec.ts",
13 | "src/**/*.test.tsx",
14 | "src/**/*.spec.tsx",
15 | "src/**/*.test.js",
16 | "src/**/*.spec.js",
17 | "src/**/*.test.jsx",
18 | "src/**/*.spec.jsx",
19 | "src/**/*.d.ts"
20 | ],
21 | "references": [
22 | {
23 | "path": "./tsconfig.json"
24 | }
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/apps/worker/src/main.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * This is not a production server yet!
3 | * This is only a minimal backend to get started.
4 | */
5 |
6 | import { Logger } from '@nestjs/common';
7 | import { NestFactory } from '@nestjs/core';
8 | import { AppModule } from './app/app.module';
9 |
10 | async function bootstrap() {
11 | const app = await NestFactory.create(AppModule);
12 | const globalPrefix = 'api';
13 | app.setGlobalPrefix(globalPrefix);
14 | const port = process.env.PORT || 3000;
15 | await app.listen(port);
16 | Logger.log(`🚀 Application is running on: http://localhost:${port}/${globalPrefix}`);
17 | }
18 |
19 | bootstrap();
20 |
--------------------------------------------------------------------------------
/apps/api-e2e/src/support/global-setup.ts:
--------------------------------------------------------------------------------
1 | import { waitForPortOpen } from '@nx/node/utils';
2 |
3 | /* eslint-disable */
4 | var __TEARDOWN_MESSAGE__: string;
5 |
6 | module.exports = async function () {
7 | // Start services that that the app needs to run (e.g. database, docker-compose, etc.).
8 | console.log('\nSetting up...\n');
9 |
10 | const host = process.env.HOST ?? 'localhost';
11 | const port = process.env.PORT ? Number(process.env.PORT) : 3000;
12 | await waitForPortOpen(port, { host });
13 |
14 | // Hint: Use `globalThis` to pass variables to global teardown.
15 | globalThis.__TEARDOWN_MESSAGE__ = '\nTearing down...\n';
16 | };
17 |
--------------------------------------------------------------------------------
/apps/worker-e2e/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/worker-e2e",
3 | "version": "0.0.1",
4 | "private": true,
5 | "nx": {
6 | "implicitDependencies": [
7 | "worker"
8 | ],
9 | "targets": {
10 | "e2e": {
11 | "executor": "@nx/jest:jest",
12 | "outputs": [
13 | "{projectRoot}/test-output/jest/coverage"
14 | ],
15 | "options": {
16 | "jestConfig": "apps/worker-e2e/jest.config.cts",
17 | "passWithNoTests": true
18 | },
19 | "dependsOn": [
20 | "worker:build",
21 | "worker:serve"
22 | ]
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/apps/admin/src/components/dashboard/types.ts:
--------------------------------------------------------------------------------
1 | export interface Notification {
2 | id: string;
3 | type: string;
4 | title: string;
5 | message: string;
6 | isRead: boolean;
7 | relatedItemId?: string;
8 | relatedItemType?: string;
9 | createdAt: string;
10 | }
11 |
12 | export interface User {
13 | id: string;
14 | firstName?: string | null;
15 | lastName?: string | null;
16 | email: string;
17 | role?: {
18 | id: string;
19 | name: string;
20 | } | string;
21 | permissions?: string[];
22 | roles?: string[];
23 | isActive?: boolean;
24 | emailVerified?: boolean;
25 | createdAt?: string | Date;
26 | }
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/apps/worker-e2e/src/support/global-setup.ts:
--------------------------------------------------------------------------------
1 | import { waitForPortOpen } from '@nx/node/utils';
2 |
3 | /* eslint-disable */
4 | var __TEARDOWN_MESSAGE__: string;
5 |
6 | module.exports = async function() {
7 | // Start services that that the app needs to run (e.g. database, docker-compose, etc.).
8 | console.log('\nSetting up...\n');
9 |
10 | const host = process.env.HOST ?? 'localhost';
11 | const port = process.env.PORT ? Number(process.env.PORT) : 3000;
12 | await waitForPortOpen(port, { host });
13 |
14 | // Hint: Use `globalThis` to pass variables to global teardown.
15 | globalThis.__TEARDOWN_MESSAGE__ = '\nTearing down...\n';
16 | };
17 |
18 |
--------------------------------------------------------------------------------
/packages/storage/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/storage",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0",
20 | "@aws-sdk/client-s3": "^3.0.0",
21 | "@aws-sdk/s3-request-presigner": "^3.0.0"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/apps/admin/src/hooks/use-mobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | const MOBILE_BREAKPOINT = 768
4 |
5 | export function useIsMobile() {
6 | const [isMobile, setIsMobile] = React.useState(undefined)
7 |
8 | React.useEffect(() => {
9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10 | const onChange = () => {
11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12 | }
13 | mql.addEventListener("change", onChange)
14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15 | return () => mql.removeEventListener("change", onChange)
16 | }, [])
17 |
18 | return !!isMobile
19 | }
20 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/hooks/use-mobile.ts:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | const MOBILE_BREAKPOINT = 768
4 |
5 | export function useIsMobile() {
6 | const [isMobile, setIsMobile] = React.useState(undefined)
7 |
8 | React.useEffect(() => {
9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10 | const onChange = () => {
11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12 | }
13 | mql.addEventListener("change", onChange)
14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15 | return () => mql.removeEventListener("change", onChange)
16 | }, [])
17 |
18 | return !!isMobile
19 | }
20 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/hooks/use-mobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | const MOBILE_BREAKPOINT = 768
4 |
5 | export function useIsMobile() {
6 | const [isMobile, setIsMobile] = React.useState(undefined)
7 |
8 | React.useEffect(() => {
9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10 | const onChange = () => {
11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12 | }
13 | mql.addEventListener("change", onChange)
14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15 | return () => mql.removeEventListener("change", onChange)
16 | }, [])
17 |
18 | return !!isMobile
19 | }
20 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/hooks/use-mobile.ts:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | const MOBILE_BREAKPOINT = 768
4 |
5 | export function useIsMobile() {
6 | const [isMobile, setIsMobile] = React.useState(undefined)
7 |
8 | React.useEffect(() => {
9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10 | const onChange = () => {
11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12 | }
13 | mql.addEventListener('change', onChange)
14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15 | return () => mql.removeEventListener('change', onChange)
16 | }, [])
17 |
18 | return !!isMobile
19 | }
20 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/use-mobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | const MOBILE_BREAKPOINT = 768
4 |
5 | export function useIsMobile() {
6 | const [isMobile, setIsMobile] = React.useState(undefined)
7 |
8 | React.useEffect(() => {
9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10 | const onChange = () => {
11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12 | }
13 | mql.addEventListener('change', onChange)
14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15 | return () => mql.removeEventListener('change', onChange)
16 | }, [])
17 |
18 | return !!isMobile
19 | }
20 |
--------------------------------------------------------------------------------
/packages/document-utils/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "module": "ESNext",
5 | "moduleResolution": "bundler",
6 | "target": "ES2020",
7 | "lib": ["ES2020", "DOM"],
8 | "jsx": "react",
9 | "declaration": true,
10 | "outDir": "./dist",
11 | "rootDir": "./src",
12 | "composite": true,
13 | "declarationMap": true,
14 | "sourceMap": true
15 | },
16 | "include": ["src/**/*"],
17 | "exclude": ["node_modules", "dist", "**/*.spec.ts", "**/*.test.ts"],
18 | "references": [
19 | {
20 | "path": "../prisma"
21 | },
22 | {
23 | "path": "../storage"
24 | }
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/packages/graphql/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "types": ["node"],
13 | "esModuleInterop": true,
14 | "allowSyntheticDefaultImports": true,
15 | "resolveJsonModule": true
16 | },
17 | "include": ["src/**/*.ts"],
18 | "references": [
19 | {
20 | "path": "../prisma/tsconfig.lib.json"
21 | }
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/apps/admin/.swcrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsc": {
3 | "target": "es2017",
4 | "parser": {
5 | "syntax": "typescript",
6 | "decorators": true,
7 | "dynamicImport": true
8 | },
9 | "transform": {
10 | "decoratorMetadata": true,
11 | "legacyDecorator": true
12 | },
13 | "keepClassNames": true,
14 | "externalHelpers": true,
15 | "loose": true
16 | },
17 | "module": {
18 | "type": "commonjs"
19 | },
20 | "sourceMaps": true,
21 | "exclude": [
22 | "jest.config.[ct]s",
23 | ".*\\.spec.tsx?$",
24 | ".*\\.test.tsx?$",
25 | "./src/jest-setup.ts$",
26 | "./**/jest-setup.ts$",
27 | ".*.js$",
28 | ".*.d.ts$"
29 | ]
30 | }
31 |
--------------------------------------------------------------------------------
/apps/nuo-nx/.swcrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsc": {
3 | "target": "es2017",
4 | "parser": {
5 | "syntax": "typescript",
6 | "decorators": true,
7 | "dynamicImport": true
8 | },
9 | "transform": {
10 | "decoratorMetadata": true,
11 | "legacyDecorator": true
12 | },
13 | "keepClassNames": true,
14 | "externalHelpers": true,
15 | "loose": true
16 | },
17 | "module": {
18 | "type": "commonjs"
19 | },
20 | "sourceMaps": true,
21 | "exclude": [
22 | "jest.config.[ct]s",
23 | ".*\\.spec.tsx?$",
24 | ".*\\.test.tsx?$",
25 | "./src/jest-setup.ts$",
26 | "./**/jest-setup.ts$",
27 | ".*.js$",
28 | ".*.d.ts$"
29 | ]
30 | }
31 |
--------------------------------------------------------------------------------
/apps/api/jest.config.cts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | const { readFileSync } = require('fs');
3 |
4 | // Reading the SWC compilation config for the spec files
5 | const swcJestConfig = JSON.parse(
6 | readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8')
7 | );
8 |
9 | // Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves
10 | swcJestConfig.swcrc = false;
11 |
12 | module.exports = {
13 | displayName: '@nuo-nx/api',
14 | preset: '../../jest.preset.js',
15 | testEnvironment: 'node',
16 | transform: {
17 | '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig],
18 | },
19 | moduleFileExtensions: ['ts', 'js', 'html'],
20 | coverageDirectory: 'test-output/jest/coverage',
21 | };
22 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/sonner.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { useTheme } from 'next-themes'
4 | import { Toaster as Sonner, ToasterProps } from 'sonner'
5 |
6 | const Toaster = ({ ...props }: ToasterProps) => {
7 | const { theme = 'system' } = useTheme()
8 |
9 | return (
10 |
22 | )
23 | }
24 |
25 | export { Toaster }
26 |
--------------------------------------------------------------------------------
/apps/worker/jest.config.cts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | const { readFileSync } = require('fs')
3 |
4 | // Reading the SWC compilation config for the spec files
5 | const swcJestConfig = JSON.parse(
6 | readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8')
7 | );
8 |
9 | // Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves
10 | swcJestConfig.swcrc = false;
11 |
12 | module.exports = {
13 | displayName: '@nuo-nx/worker',
14 | preset: '../../jest.preset.js',
15 | testEnvironment: 'node',
16 | transform: {
17 | '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig]
18 | },
19 | moduleFileExtensions: ['ts', 'js', 'html'],
20 | coverageDirectory: 'test-output/jest/coverage'
21 | };
22 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { Hero } from "@/components/main/pages/Hero"
4 | import { BusinessInfrastructure } from "@/components/main/pages/BusinessInfrastructure"
5 | import { Markets } from "@/components/main/pages/markets/MarketsPage"
6 | import { CTA } from "@/components/main/pages/CTA"
7 | import { useLanguage } from "@/contexts/lang/LanguageContext"
8 |
9 | export default function HomePage() {
10 | const { language } = useLanguage();
11 | return (
12 |
13 |
14 |
15 |
16 |
17 |
18 | )
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/apps/api/src/app/app.controller.spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | describe('AppController', () => {
6 | let app: TestingModule;
7 |
8 | beforeAll(async () => {
9 | app = await Test.createTestingModule({
10 | controllers: [AppController],
11 | providers: [AppService],
12 | }).compile();
13 | });
14 |
15 | describe('getData', () => {
16 | it('should return "Hello API"', () => {
17 | const appController = app.get(AppController);
18 | expect(appController.getData()).toEqual({ message: 'Hello API' });
19 | });
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/apps/worker/src/app/app.controller.spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | describe('AppController', () => {
6 | let app: TestingModule;
7 |
8 | beforeAll(async () => {
9 | app = await Test.createTestingModule({
10 | controllers: [AppController],
11 | providers: [AppService],
12 | }).compile();
13 | });
14 |
15 | describe('getData', () => {
16 | it('should return "Hello API"', () => {
17 | const appController = app.get(AppController);
18 | expect(appController.getData()).toEqual({message: 'Hello API'});
19 | });
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["dom", "dom.iterable", "esnext"],
4 | "allowJs": true,
5 | "target": "ES6",
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as LabelPrimitive from '@radix-ui/react-label'
5 |
6 | import { cn } from '@/lib/utils'
7 |
8 | function Label({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
21 | )
22 | }
23 |
24 | export { Label }
25 |
--------------------------------------------------------------------------------
/apps/worker/webpack.config.js:
--------------------------------------------------------------------------------
1 | const { NxAppWebpackPlugin } = require('@nx/webpack/app-plugin');
2 | const { join } = require('path');
3 |
4 | module.exports = {
5 | output: {
6 | path: join(__dirname, 'dist'),
7 | clean: true,
8 | ...(process.env.NODE_ENV !== 'production' && {
9 | devtoolModuleFilenameTemplate: '[absolute-resource-path]',
10 | }),
11 | },
12 | plugins: [
13 | new NxAppWebpackPlugin({
14 | target: 'node',
15 | compiler: 'tsc',
16 | main: './src/main.ts',
17 | tsConfig: './tsconfig.app.json',
18 | assets: ["./src/assets"],
19 | optimization: false,
20 | outputHashing: 'none',
21 | generatePackageJson: true,
22 | sourceMaps: true,
23 | })
24 | ],
25 | };
26 |
--------------------------------------------------------------------------------
/packages/document-utils/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "rootDir": "src",
6 | "outDir": "dist",
7 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8 | "emitDeclarationOnly": false,
9 | "module": "nodenext",
10 | "moduleResolution": "nodenext",
11 | "forceConsistentCasingInFileNames": true,
12 | "jsx": "react-jsx",
13 | "skipLibCheck": true,
14 | "types": ["node"]
15 | },
16 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/types/**/*.d.ts"],
17 | "references": [
18 | {
19 | "path": "../storage/tsconfig.lib.json"
20 | },
21 | {
22 | "path": "../prisma/tsconfig.lib.json"
23 | }
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/apps/api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/api",
3 | "version": "0.0.1",
4 | "private": true,
5 | "dependencies": {
6 | "@nestjs/common": "^11.0.0",
7 | "@nestjs/core": "^11.0.0",
8 | "@nestjs/platform-express": "^11.0.0",
9 | "@nestjs/graphql": "^13.0.0",
10 | "@nestjs/apollo": "^13.0.0",
11 | "@apollo/server": "^5.0.0",
12 | "graphql": "^16.8.1",
13 | "reflect-metadata": "^0.1.13",
14 | "rxjs": "^7.8.0",
15 | "tslib": "^2.3.0",
16 | "@nuo-nx/prisma": "*",
17 | "@nuo-nx/graphql": "*",
18 | "@nuo-nx/auth": "*",
19 | "@nuo-nx/config": "*",
20 | "bcryptjs": "^2.4.3"
21 | },
22 | "devDependencies": {
23 | "@nestjs/testing": "^11.0.0",
24 | "@types/bcryptjs": "^2.4.6"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/hooks/useOnClickOutside.ts:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useEffect, RefObject } from 'react';
4 |
5 | export function useOnClickOutside(
6 | ref: RefObject,
7 | enabled: boolean,
8 | handler: () => void
9 | ) {
10 | useEffect(() => {
11 | if (!enabled) return;
12 |
13 | const handleClickOutside = (event: MouseEvent) => {
14 | if (ref.current && !ref.current.contains(event.target as Node)) {
15 | handler();
16 | }
17 | };
18 |
19 | document.addEventListener('mousedown', handleClickOutside);
20 |
21 | return () => {
22 | document.removeEventListener('mousedown', handleClickOutside);
23 | };
24 | }, [ref, enabled, handler]);
25 | }
26 |
27 |
28 |
--------------------------------------------------------------------------------
/apps/admin/src/components/dashboard/hooks/useOnClickOutside.ts:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useEffect, RefObject } from 'react';
4 |
5 | export function useOnClickOutside(
6 | ref: RefObject,
7 | enabled: boolean,
8 | handler: () => void
9 | ) {
10 | useEffect(() => {
11 | if (!enabled) return;
12 |
13 | const handleClickOutside = (event: MouseEvent) => {
14 | if (ref.current && !ref.current.contains(event.target as Node)) {
15 | handler();
16 | }
17 | };
18 |
19 | document.addEventListener('mousedown', handleClickOutside);
20 |
21 | return () => {
22 | document.removeEventListener('mousedown', handleClickOutside);
23 | };
24 | }, [ref, enabled, handler]);
25 | }
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Textarea = React.forwardRef<
6 | HTMLTextAreaElement,
7 | React.ComponentProps<"textarea">
8 | >(({ className, ...props }, ref) => {
9 | return (
10 |
18 | )
19 | })
20 | Textarea.displayName = "Textarea"
21 |
22 | export { Textarea }
23 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Textarea = React.forwardRef<
6 | HTMLTextAreaElement,
7 | React.ComponentProps<"textarea">
8 | >(({ className, ...props }, ref) => {
9 | return (
10 |
18 | )
19 | })
20 | Textarea.displayName = "Textarea"
21 |
22 | export { Textarea }
23 |
--------------------------------------------------------------------------------
/packages/auth/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/auth",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0",
20 | "@nestjs/common": "^11.0.0",
21 | "jsonwebtoken": "^9.0.2",
22 | "@nuo-nx/config": "*"
23 | },
24 | "devDependencies": {
25 | "@types/jsonwebtoken": "^9.0.5",
26 | "@types/express": "^4.17.21"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/apps/api/src/app/graphql/graphql.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { GraphQLModule } from '@nestjs/graphql';
3 | import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
4 | import { typeDefs, resolvers } from '@nuo-nx/graphql';
5 | import { RequestWithTenant } from '@nuo-nx/auth';
6 |
7 | @Module({
8 | imports: [
9 | GraphQLModule.forRoot({
10 | driver: ApolloDriver,
11 | typeDefs,
12 | resolvers,
13 | context: ({ req }) => {
14 | const request = req as RequestWithTenant;
15 | return {
16 | tenantId: request.tenantId,
17 | };
18 | },
19 | playground: process.env.NODE_ENV !== 'production',
20 | autoSchemaFile: false,
21 | }),
22 | ],
23 | })
24 | export class GraphQLAppModule {}
25 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/documents/signage/[documentId]/edit/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { use } from 'react';
4 | import { DocumentEditor } from '@/components/dashboard/pages/documents/DocumentEditor';
5 | import { useRouter } from 'next/navigation';
6 |
7 | export default function EditDocumentPage({ params }: { params: Promise<{ documentId: string }> }) {
8 | const router = useRouter();
9 | const { documentId } = use(params);
10 |
11 | const handleNavigateToStorage = () => {
12 | router.push('/dashboard/documents/storage');
13 | };
14 |
15 | return (
16 |
17 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/packages/graphql/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/graphql",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0",
20 | "graphql": "^16.8.1",
21 | "@nuo-nx/prisma": "*"
22 | },
23 | "devDependencies": {
24 | "@graphql-codegen/cli": "^5.0.0",
25 | "@graphql-codegen/typescript": "^4.0.1",
26 | "@graphql-codegen/typescript-resolvers": "^4.0.1"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/main/layout/footer/ConditionalFooter.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useEffect, useState } from 'react';
4 | import { Footer } from './Footer';
5 |
6 | export function ConditionalFooter() {
7 | const [isDashboard, setIsDashboard] = useState(false);
8 | const [isClient, setIsClient] = useState(false);
9 |
10 | useEffect(() => {
11 | setIsClient(true);
12 | if (typeof window !== 'undefined') {
13 | setIsDashboard(
14 | window.location.pathname.startsWith('/dashboard') ||
15 | window.location.pathname.startsWith('/employee-dashboard')
16 | );
17 | }
18 | }, []);
19 |
20 | // Don't render anything during SSR or if we're on a dashboard page
21 | if (!isClient || isDashboard) {
22 | return null;
23 | }
24 |
25 | return ;
26 | }
27 |
--------------------------------------------------------------------------------
/packages/ui/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "dist",
5 | "types": [
6 | "node",
7 | "@nx/react/typings/cssmodule.d.ts",
8 | "@nx/react/typings/image.d.ts"
9 | ],
10 | "rootDir": "src",
11 | "jsx": "react-jsx",
12 | "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo"
13 | },
14 | "exclude": [
15 | "out-tsc",
16 | "dist",
17 | "jest.config.ts",
18 | "jest.config.cts",
19 | "src/**/*.spec.ts",
20 | "src/**/*.test.ts",
21 | "src/**/*.spec.tsx",
22 | "src/**/*.test.tsx",
23 | "src/**/*.spec.js",
24 | "src/**/*.test.js",
25 | "src/**/*.spec.jsx",
26 | "src/**/*.test.jsx"
27 | ],
28 | "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
29 | }
30 |
--------------------------------------------------------------------------------
/packages/document-utils/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@nuo-nx/document-utils",
3 | "version": "0.0.1",
4 | "private": true,
5 | "type": "module",
6 | "main": "./dist/index.js",
7 | "module": "./dist/index.js",
8 | "types": "./dist/index.d.ts",
9 | "exports": {
10 | "./package.json": "./package.json",
11 | ".": {
12 | "@nuo-nx/source": "./src/index.ts",
13 | "types": "./dist/index.d.ts",
14 | "import": "./dist/index.js",
15 | "default": "./dist/index.js"
16 | }
17 | },
18 | "dependencies": {
19 | "tslib": "^2.3.0",
20 | "@react-pdf/renderer": "^3.1.12",
21 | "puppeteer": "^21.0.0",
22 | "mammoth": "^1.6.0",
23 | "@prisma/client": "^7.0.0",
24 | "pdf-lib": "^1.17.1",
25 | "@sparticuz/chromium": "^123.0.0",
26 | "@nuo-nx/prisma": "*"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/providers.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { LanguageProvider } from "@/contexts/lang/LanguageContext"
4 | import { RouterProvider } from "@/contexts/router/RouterContext"
5 | import { MegaMenuProvider } from "@/contexts/megamenu/MegaMenuContext"
6 | import { GlobalLoadingProvider } from "@/providers/global-loading/GlobalLoadingProvider"
7 | import { Toaster } from "@/components/ui/sonner"
8 |
9 | export default function Providers({ children }: { children: React.ReactNode }) {
10 | return (
11 |
12 |
13 |
14 |
15 | {children}
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 |
24 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as LabelPrimitive from "@radix-ui/react-label"
5 | import { cva, type VariantProps } from "class-variance-authority"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as SeparatorPrimitive from '@radix-ui/react-separator'
5 |
6 | import { cn } from '@/lib/utils'
7 |
8 | function Separator({
9 | className,
10 | orientation = 'horizontal',
11 | decorative = true,
12 | ...props
13 | }: React.ComponentProps) {
14 | return (
15 |
25 | )
26 | }
27 |
28 | export { Separator }
29 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as LabelPrimitive from "@radix-ui/react-label"
5 | import { cva, type VariantProps } from "class-variance-authority"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | import { cn } from '@/lib/utils'
4 |
5 | function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {
6 | return (
7 |
15 | )
16 | }
17 |
18 | export { Textarea }
19 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Input = React.forwardRef>(
6 | ({ className, type, ...props }, ref) => {
7 | return (
8 |
17 | )
18 | }
19 | )
20 | Input.displayName = "Input"
21 |
22 | export { Input }
23 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Input = React.forwardRef>(
6 | ({ className, type, ...props }, ref) => {
7 | return (
8 |
17 | )
18 | }
19 | )
20 | Input.displayName = "Input"
21 |
22 | export { Input }
23 |
--------------------------------------------------------------------------------
/apps/api-e2e/jest.config.cts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | import { readFileSync } from 'fs';
3 |
4 | // Reading the SWC compilation config for the spec files
5 | const swcJestConfig = JSON.parse(
6 | readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8')
7 | );
8 |
9 | // Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves
10 | swcJestConfig.swcrc = false;
11 |
12 | export default {
13 | displayName: '@nuo-nx/api-e2e',
14 | preset: '../../jest.preset.js',
15 | globalSetup: '/src/support/global-setup.ts',
16 | globalTeardown: '/src/support/global-teardown.ts',
17 | setupFiles: ['/src/support/test-setup.ts'],
18 | testEnvironment: 'node',
19 | transform: {
20 | '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig],
21 | },
22 | moduleFileExtensions: ['ts', 'js', 'html'],
23 | coverageDirectory: 'test-output/jest/coverage',
24 | };
25 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/profile/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { ProfilePage } from '@/components/employee/dashboard/pages/ProfilePage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function Profile() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/reports/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { ReportsPage } from '@/components/employee/dashboard/pages/ReportsPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function Reports() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/worker-e2e/jest.config.cts:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | import { readFileSync } from 'fs';
3 |
4 | // Reading the SWC compilation config for the spec files
5 | const swcJestConfig = JSON.parse(
6 | readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8')
7 | );
8 |
9 | // Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves
10 | swcJestConfig.swcrc = false;
11 |
12 | export default {
13 | displayName: '@nuo-nx/worker-e2e',
14 | preset: '../../jest.preset.js',
15 | globalSetup: '/src/support/global-setup.ts',
16 | globalTeardown: '/src/support/global-teardown.ts',
17 | setupFiles: ['/src/support/test-setup.ts'],
18 | testEnvironment: 'node',
19 | transform: {
20 | '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig],
21 | },
22 | moduleFileExtensions: ['ts', 'js', 'html'],
23 | coverageDirectory: 'test-output/jest/coverage',
24 | };
25 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/tasks/projects/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { ProjectsPage } from '@/components/employee/dashboard/pages/ProjectsPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function Projects() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/tasks/team/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { TeamTasksPage } from '@/components/employee/dashboard/pages/TeamTasksPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function TeamTasks() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/progress.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as ProgressPrimitive from '@radix-ui/react-progress'
5 |
6 | import { cn } from '@/lib/utils'
7 |
8 | function Progress({
9 | className,
10 | value,
11 | ...props
12 | }: React.ComponentProps) {
13 | return (
14 |
22 |
27 |
28 | )
29 | }
30 |
31 | export { Progress }
32 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/calendar/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { TaskCalendarPage } from '@/components/employee/dashboard/pages/TaskCalendarPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function TaskCalendar() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/tasks/calendar/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { TaskCalendarPage } from '@/components/employee/dashboard/pages/TaskCalendarPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function TaskCalendar() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/time-tracking/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { TimeTrackingPage } from '@/components/employee/dashboard/pages/TimeTrackingPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function TimeTracking() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/worker/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "outDir": "dist",
5 | "module": "nodenext",
6 | "types": ["node"],
7 | "rootDir": "src",
8 | "moduleResolution": "nodenext",
9 | "tsBuildInfoFile": "dist/tsconfig.app.tsbuildinfo",
10 | "experimentalDecorators": true,
11 | "emitDecoratorMetadata": true,
12 | "target": "es2021"
13 | },
14 | "include": ["src/**/*.ts"],
15 | "exclude": [
16 | "out-tsc",
17 | "dist",
18 | "jest.config.ts",
19 | "jest.config.cts",
20 | "src/**/*.spec.ts",
21 | "src/**/*.test.ts",
22 | "eslint.config.js",
23 | "eslint.config.cjs",
24 | "eslint.config.mjs"
25 | ],
26 | "references": [
27 | {
28 | "path": "../../packages/config/tsconfig.lib.json"
29 | },
30 | {
31 | "path": "../../packages/prisma/tsconfig.lib.json"
32 | }
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { EmployeeDashboardPage } from '@/components/employee/dashboard/pages/EmployeeDashboardPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function EmployeeDashboard() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SeparatorPrimitive from "@radix-ui/react-separator"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Separator = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(
12 | (
13 | { className, orientation = "horizontal", decorative = true, ...props },
14 | ref
15 | ) => (
16 |
27 | )
28 | )
29 | Separator.displayName = SeparatorPrimitive.Root.displayName
30 |
31 | export { Separator }
32 |
--------------------------------------------------------------------------------
/apps/worker/src/app/jobs/example.job.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Example job for the worker app
3 | */
4 | import { Logger } from '@nestjs/common';
5 | import { prisma } from '@nuo-nx/prisma';
6 | import { loadEnv } from '@nuo-nx/config';
7 |
8 | export class ExampleJob {
9 | private readonly logger = new Logger(ExampleJob.name);
10 |
11 | async run() {
12 | this.logger.log('Starting example job...');
13 |
14 | try {
15 | // Load environment variables
16 | const env = loadEnv();
17 | this.logger.log(`Environment: ${env.NODE_ENV}`);
18 |
19 | // Example: Query database
20 | const userCount = await prisma.user.count();
21 | this.logger.log(`Total users in database: ${userCount}`);
22 |
23 | this.logger.log('Example job completed successfully');
24 | } catch (error) {
25 | this.logger.error('Example job failed', error);
26 | throw error;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SeparatorPrimitive from "@radix-ui/react-separator"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Separator = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(
12 | (
13 | { className, orientation = "horizontal", decorative = true, ...props },
14 | ref
15 | ) => (
16 |
27 | )
28 | )
29 | Separator.displayName = SeparatorPrimitive.Root.displayName
30 |
31 | export { Separator }
32 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/progress.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as ProgressPrimitive from "@radix-ui/react-progress"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Progress = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, value, ...props }, ref) => (
12 |
20 |
24 |
25 | ))
26 | Progress.displayName = ProgressPrimitive.Root.displayName
27 |
28 | export { Progress }
29 |
--------------------------------------------------------------------------------
/apps/admin/src/lib/pdf/fonts.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Register PDF fonts with React-PDF using only system fonts
3 | * No font files are loaded - uses built-in system fonts only
4 | */
5 | export async function registerPdfFonts(): Promise {
6 | try {
7 | console.log('🔍 Font Registration: Skipping font registration - using default fonts only');
8 | // Do nothing - let React-PDF use its default fonts
9 | console.log('✅ Font Registration: Using default React-PDF fonts');
10 | } catch (error) {
11 | console.error('❌ Font Registration: Error during font registration:', error);
12 | // Don't throw - let the PDF generation continue with default fonts
13 | }
14 | }
15 |
16 | /**
17 | * Get font family for PDF rendering
18 | * Returns default font family
19 | */
20 | export function getPdfFontFamily(): string {
21 | // Use default font family - no custom fonts
22 | return 'Helvetica';
23 | }
24 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(employee)/employee-dashboard/tasks/kanban/page.tsx:
--------------------------------------------------------------------------------
1 | import { redirect } from 'next/navigation';
2 | import { TaskManagerKanbanPage } from '@/components/employee/dashboard/pages/TaskManagerKanbanPage';
3 |
4 | async function validateEmployeeAccess() {
5 | try {
6 | // This is a server-side validation
7 | // In a real implementation, you would get the request object
8 | // For now, we'll let the client-side handle the validation
9 | return { success: true };
10 | } catch (error) {
11 | console.error('Error validating employee access:', error);
12 | return { success: false };
13 | }
14 | }
15 |
16 | export default async function TaskManagerKanban() {
17 | // Server-side validation (simplified for this example)
18 | const validation = await validateEmployeeAccess();
19 |
20 | if (!validation.success) {
21 | redirect('/login');
22 | }
23 |
24 | return ;
25 | }
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/progress.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as ProgressPrimitive from "@radix-ui/react-progress"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Progress = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, value, ...props }, ref) => (
12 |
20 |
24 |
25 | ))
26 | Progress.displayName = ProgressPrimitive.Root.displayName
27 |
28 | export { Progress }
29 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/documents/storage/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useRouter } from 'next/navigation';
4 | import { DocumentStorage } from '@/components/dashboard/pages/documents/DocumentStorage';
5 |
6 | export default function DocumentStoragePage() {
7 | const router = useRouter();
8 |
9 | const handleNavigateToCreate = (template?: Record) => {
10 | if (template) {
11 | // Pass template data as URL parameters
12 | const params = new URLSearchParams({
13 | templateId: template.id as string,
14 | templateType: template.documentType as string,
15 | templateTitle: template.title as string
16 | });
17 | router.push(`/dashboard/documents/create?${params.toString()}`);
18 | } else {
19 | router.push('/dashboard/documents/create');
20 | }
21 | };
22 |
23 | return ;
24 | }
25 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/lib/pdf/fonts.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Register PDF fonts with React-PDF using only system fonts
3 | * No font files are loaded - uses built-in system fonts only
4 | */
5 | export async function registerPdfFonts(): Promise {
6 | try {
7 | console.log('🔍 Font Registration: Skipping font registration - using default fonts only');
8 | // Do nothing - let React-PDF use its default fonts
9 | console.log('✅ Font Registration: Using default React-PDF fonts');
10 | } catch (error) {
11 | console.error('❌ Font Registration: Error during font registration:', error);
12 | // Don't throw - let the PDF generation continue with default fonts
13 | }
14 | }
15 |
16 | /**
17 | * Get font family for PDF rendering
18 | * Returns default font family
19 | */
20 | export function getPdfFontFamily(): string {
21 | // Use default font family - no custom fonts
22 | return 'Helvetica';
23 | }
24 |
--------------------------------------------------------------------------------
/packages/document-utils/src/pdf/fonts.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Register PDF fonts with React-PDF using only system fonts
3 | * No font files are loaded - uses built-in system fonts only
4 | */
5 | export async function registerPdfFonts(): Promise {
6 | try {
7 | console.log('🔍 Font Registration: Skipping font registration - using default fonts only');
8 | // Do nothing - let React-PDF use its default fonts
9 | console.log('✅ Font Registration: Using default React-PDF fonts');
10 | } catch (error) {
11 | console.error('❌ Font Registration: Error during font registration:', error);
12 | // Don't throw - let the PDF generation continue with default fonts
13 | }
14 | }
15 |
16 | /**
17 | * Get font family for PDF rendering
18 | * Returns default font family
19 | */
20 | export function getPdfFontFamily(): string {
21 | // Use default font family - no custom fonts
22 | return 'Helvetica';
23 | }
24 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/pages/documents/signage/DocumentSignEmpty.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { FileSignature } from 'lucide-react';
4 | import { Card, CardContent } from '@/components/ui/card';
5 | import { DocumentSignEmptyProps } from '@/components/dashboard/types';
6 |
7 | export function DocumentSignEmpty({ searchTerm, filterStatus }: DocumentSignEmptyProps) {
8 | return (
9 |
10 |
11 |
12 | No documents found for signing
13 |
14 | {searchTerm || filterStatus !== 'all'
15 | ? 'Try adjusting your search or filters'
16 | : 'No documents are currently pending signatures'
17 | }
18 |
19 |
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/toaster.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { useToast } from '@/hooks/use-toast'
4 | import {
5 | Toast,
6 | ToastClose,
7 | ToastDescription,
8 | ToastProvider,
9 | ToastTitle,
10 | ToastViewport,
11 | } from '@/components/ui/toast'
12 |
13 | export function Toaster() {
14 | const { toasts } = useToast()
15 |
16 | return (
17 |
18 | {toasts.map(function ({ id, title, description, action, ...props }) {
19 | return (
20 |
21 |
22 | {title && {title} }
23 | {description && (
24 | {description}
25 | )}
26 |
27 | {action}
28 |
29 |
30 | )
31 | })}
32 |
33 |
34 | )
35 | }
36 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/collapsible.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'
4 |
5 | function Collapsible({
6 | ...props
7 | }: React.ComponentProps) {
8 | return
9 | }
10 |
11 | function CollapsibleTrigger({
12 | ...props
13 | }: React.ComponentProps) {
14 | return (
15 |
19 | )
20 | }
21 |
22 | function CollapsibleContent({
23 | ...props
24 | }: React.ComponentProps) {
25 | return (
26 |
30 | )
31 | }
32 |
33 | export { Collapsible, CollapsibleTrigger, CollapsibleContent }
34 |
--------------------------------------------------------------------------------
/apps/admin/next.config.js:
--------------------------------------------------------------------------------
1 | //@ts-check
2 |
3 | // eslint-disable-next-line @typescript-eslint/no-var-requires
4 | const { composePlugins, withNx } = require('@nx/next');
5 | // eslint-disable-next-line @typescript-eslint/no-var-requires
6 | const path = require('path');
7 |
8 | /**
9 | * @type {import('@nx/next/plugins/with-nx').WithNxOptions}
10 | **/
11 | const nextConfig = {
12 | // Use this to set Nx-specific options
13 | // See: https://nx.dev/recipes/next/next-config-setup
14 | nx: {},
15 | turbopack: {
16 | root: path.resolve(__dirname, '../..'),
17 | },
18 | webpack: (config) => {
19 | // Ensure @ alias resolves correctly
20 | config.resolve.alias = {
21 | ...config.resolve.alias,
22 | '@': path.resolve(__dirname, './src'),
23 | };
24 | return config;
25 | },
26 | };
27 |
28 | const plugins = [
29 | // Add more Next.js plugins to this list if needed.
30 | withNx,
31 | ];
32 |
33 | module.exports = composePlugins(...plugins)(nextConfig);
34 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/kbd.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils"
2 |
3 | function Kbd({ className, ...props }: React.ComponentProps<"kbd">) {
4 | return (
5 |
15 | )
16 | }
17 |
18 | function KbdGroup({ className, ...props }: React.ComponentProps<"div">) {
19 | return (
20 |
25 | )
26 | }
27 |
28 | export { Kbd, KbdGroup }
29 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/kbd.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils"
2 |
3 | function Kbd({ className, ...props }: React.ComponentProps<"kbd">) {
4 | return (
5 |
15 | )
16 | }
17 |
18 | function KbdGroup({ className, ...props }: React.ComponentProps<"div">) {
19 | return (
20 |
25 | )
26 | }
27 |
28 | export { Kbd, KbdGroup }
29 |
--------------------------------------------------------------------------------
/packages/prisma/.env.example:
--------------------------------------------------------------------------------
1 | # ===========================================
2 | # Prisma Package - Environment Variables
3 | # ===========================================
4 | # Copy this file to .env in packages/prisma directory
5 |
6 | # ===========================================
7 | # Database Configuration
8 | # ===========================================
9 | # PostgreSQL connection string
10 | # Note: In Prisma 7, the URL is configured via the client adapter
11 | # This is used by the prisma CLI for migrations and introspection
12 | DATABASE_URL="postgresql://username:password@localhost:5432/nuonx"
13 |
14 | # ===========================================
15 | # Instructions
16 | # ===========================================
17 | # 1. Copy this file to .env in packages/prisma directory
18 | # 2. Update DATABASE_URL with your PostgreSQL credentials
19 | # 3. Generate Prisma client: npx prisma generate
20 | # 4. Run migrations: npx prisma migrate dev
21 | # 5. Open Prisma Studio (optional): npx prisma studio
22 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/kbd.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from '@/lib/utils'
2 |
3 | function Kbd({ className, ...props }: React.ComponentProps<'kbd'>) {
4 | return (
5 |
15 | )
16 | }
17 |
18 | function KbdGroup({ className, ...props }: React.ComponentProps<'div'>) {
19 | return (
20 |
25 | )
26 | }
27 |
28 | export { Kbd, KbdGroup }
29 |
--------------------------------------------------------------------------------
/apps/admin/.env.example:
--------------------------------------------------------------------------------
1 | # ===========================================
2 | # Admin App - Environment Variables
3 | # ===========================================
4 | # Copy this file to .env.local and fill in your actual values
5 |
6 | # ===========================================
7 | # API Configuration
8 | # ===========================================
9 | # URL of the API server
10 | # This is where the admin app will send authentication and API requests
11 | NEXT_PUBLIC_API_URL="http://localhost:4000"
12 |
13 | # ===========================================
14 | # Application Configuration
15 | # ===========================================
16 | # Public URL of the admin application (for redirects, etc.)
17 | # In development, this is typically http://localhost:4005
18 | NEXT_PUBLIC_APP_URL="http://localhost:4005"
19 |
20 | # ===========================================
21 | # Node Environment
22 | # ===========================================
23 | # Node environment (development, production, test)
24 | NODE_ENV=development
25 |
--------------------------------------------------------------------------------
/apps/api/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": "../..",
5 | "outDir": "./out-tsc/jest",
6 | "types": ["jest", "node"],
7 | "module": "nodenext",
8 | "moduleResolution": "nodenext",
9 | "experimentalDecorators": true,
10 | "emitDecoratorMetadata": true,
11 | "emitDeclarationOnly": false,
12 | "esModuleInterop": true,
13 | "allowSyntheticDefaultImports": true,
14 | "resolveJsonModule": true
15 | },
16 | "include": [
17 | "jest.config.ts",
18 | "jest.config.cts",
19 | "src/**/*.test.ts",
20 | "src/**/*.spec.ts",
21 | "src/**/*.d.ts"
22 | ],
23 | "references": [
24 | {
25 | "path": "./tsconfig.app.json"
26 | },
27 | {
28 | "path": "../../packages/prisma"
29 | },
30 | {
31 | "path": "../../packages/graphql"
32 | },
33 | {
34 | "path": "../../packages/auth"
35 | },
36 | {
37 | "path": "../../packages/config"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/api/graphql/route.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Example GraphQL API route for Next.js
3 | * This queries the NestJS GraphQL endpoint
4 | */
5 | import { NextResponse } from 'next/server';
6 | import { getEnv } from '@nuo-nx/config';
7 |
8 | export async function GET() {
9 | try {
10 | const env = getEnv();
11 | const apiUrl = env.NEXT_PUBLIC_API_URL || 'http://localhost:3000';
12 |
13 | // Example query to NestJS GraphQL endpoint
14 | const query = `
15 | query {
16 | hello
17 | }
18 | `;
19 |
20 | const response = await fetch(`${apiUrl}/api/graphql`, {
21 | method: 'POST',
22 | headers: {
23 | 'Content-Type': 'application/json',
24 | },
25 | body: JSON.stringify({ query }),
26 | });
27 |
28 | const data = await response.json();
29 | return NextResponse.json(data);
30 | } catch (error) {
31 | return NextResponse.json(
32 | { error: 'Failed to fetch from GraphQL API' },
33 | { status: 500 }
34 | );
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/sonner.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { useTheme } from "next-themes"
4 | import { Toaster as Sonner } from "sonner"
5 |
6 | type ToasterProps = React.ComponentProps
7 |
8 | const Toaster = ({ ...props }: ToasterProps) => {
9 | const { theme = "system" } = useTheme()
10 |
11 | return (
12 |
28 | )
29 | }
30 |
31 | export { Toaster }
32 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/sonner.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { useTheme } from "next-themes"
4 | import { Toaster as Sonner } from "sonner"
5 |
6 | type ToasterProps = React.ComponentProps
7 |
8 | const Toaster = ({ ...props }: ToasterProps) => {
9 | const { theme = "system" } = useTheme()
10 |
11 | return (
12 |
28 | )
29 | }
30 |
31 | export { Toaster }
32 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import nx from '@nx/eslint-plugin';
2 |
3 | export default [
4 | ...nx.configs['flat/base'],
5 | ...nx.configs['flat/typescript'],
6 | ...nx.configs['flat/javascript'],
7 | {
8 | ignores: ['**/dist', '**/test-output'],
9 | },
10 | {
11 | files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
12 | rules: {
13 | '@nx/enforce-module-boundaries': [
14 | 'error',
15 | {
16 | enforceBuildableLibDependency: true,
17 | allow: ['^.*/eslint(\\.base)?\\.config\\.[cm]?[jt]s$'],
18 | depConstraints: [
19 | {
20 | sourceTag: '*',
21 | onlyDependOnLibsWithTags: ['*'],
22 | },
23 | ],
24 | },
25 | ],
26 | },
27 | },
28 | {
29 | files: [
30 | '**/*.ts',
31 | '**/*.tsx',
32 | '**/*.cts',
33 | '**/*.mts',
34 | '**/*.js',
35 | '**/*.jsx',
36 | '**/*.cjs',
37 | '**/*.mjs',
38 | ],
39 | // Override or add rules here
40 | rules: {},
41 | },
42 | ];
43 |
--------------------------------------------------------------------------------
/apps/admin/.env:
--------------------------------------------------------------------------------
1 | # ===========================================
2 | # Admin App - Environment Variables
3 | # ===========================================
4 | # Copy this file to .env.local and fill in your actual values
5 |
6 | # ===========================================
7 | # API Configuration
8 | # ===========================================
9 | # URL of the API server
10 | # This is where the admin app will send authentication and API requests
11 | NEXT_PUBLIC_API_URL="http://localhost:4000"
12 | JWT_SECRET=aDgYGsTZr6eq9RlwiyOzZEyc1E3rKNvyaO+hCJkuysc=
13 |
14 | # ===========================================
15 | # Application Configuration
16 | # ===========================================
17 | # Public URL of the admin application (for redirects, etc.)
18 | # In development, this is typically http://localhost:4005
19 | NEXT_PUBLIC_APP_URL="http://localhost:4005"
20 |
21 | # ===========================================
22 | # Node Environment
23 | # ===========================================
24 | # Node environment (development, production, test)
25 | NODE_ENV=development
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/hooks/useStats.ts:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useMemo } from 'react';
4 | import { Company, Document, Trademark, DashboardStats } from '@/components/dashboard/types';
5 |
6 | export function useStats(
7 | companies: Company[],
8 | documents: Document[],
9 | trademarks: Trademark[]
10 | ): DashboardStats {
11 | return useMemo(() => {
12 | const inProcessCompanies = companies.filter(c => c.status === 'pending').length;
13 | const pendingDocuments = documents.filter(d => d.status === 'pending').length;
14 | const completedDocuments = documents.filter(d => d.status === 'completed').length;
15 | const pendingTrademarks = trademarks.filter(t => t.status === 'pending').length;
16 |
17 | return {
18 | documents: documents.length,
19 | companies: companies.length,
20 | trademarks: trademarks.length,
21 | pendingTasks: pendingDocuments + pendingTrademarks + inProcessCompanies,
22 | completedToday: completedDocuments
23 | };
24 | }, [companies, documents, trademarks]);
25 | }
26 |
27 |
28 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | import { cn } from '@/lib/utils'
4 |
5 | function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
6 | return (
7 |
18 | )
19 | }
20 |
21 | export { Input }
22 |
--------------------------------------------------------------------------------
/packages/document-utils/src/types/packages.d.ts:
--------------------------------------------------------------------------------
1 | // Type declarations for packages without type definitions
2 |
3 | declare module '@sparticuz/chromium' {
4 | export default {
5 | executablePath(): Promise;
6 | };
7 | }
8 |
9 | declare module 'pdf-lib' {
10 | export interface PDFDocument {
11 | addPage(size: [number, number]): any;
12 | embedFont(font: any): Promise;
13 | setTitle(title: string): void;
14 | setSubject(subject: string): void;
15 | setKeywords(keywords: string[]): void;
16 | setProducer(producer: string): void;
17 | setCreator(creator: string): void;
18 | save(): Promise;
19 | }
20 |
21 | export interface PDFPage {
22 | getWidth(): number;
23 | getHeight(): number;
24 | drawText(text: string, options: any): void;
25 | }
26 |
27 | export const PDFDocument: {
28 | create(): Promise;
29 | };
30 |
31 | export const rgb: (r: number, g: number, b: number) => any;
32 |
33 | export const StandardFonts: {
34 | Helvetica: string;
35 | HelveticaBold: string;
36 | };
37 | }
38 |
39 |
--------------------------------------------------------------------------------
/packages/prisma/src/lib/client.ts:
--------------------------------------------------------------------------------
1 | import { PrismaClient } from '@prisma/client';
2 | import { PrismaPg } from '@prisma/adapter-pg';
3 | import { Pool } from 'pg';
4 | import { loadEnv } from '@nuo-nx/config';
5 |
6 | const globalForPrisma = globalThis as unknown as {
7 | prisma: PrismaClient | undefined;
8 | };
9 |
10 | function createPrismaClient(): PrismaClient {
11 | const env = loadEnv();
12 |
13 | const connectionString = env.DATABASE_URL;
14 |
15 | // Create PostgreSQL connection pool
16 | const pool = new Pool({ connectionString });
17 |
18 | // Create Prisma adapter
19 | const adapter = new PrismaPg(pool);
20 |
21 | // Create Prisma Client with adapter
22 | return new PrismaClient({
23 | adapter,
24 | log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],
25 | });
26 | }
27 |
28 | export const prisma =
29 | globalForPrisma.prisma ?? (() => {
30 | const client = createPrismaClient();
31 | if (process.env.NODE_ENV !== 'production') {
32 | globalForPrisma.prisma = client;
33 | }
34 | return client;
35 | })();
36 |
37 | export default prisma;
38 |
--------------------------------------------------------------------------------
/apps/api/project.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api",
3 | "$schema": "../../node_modules/nx/schemas/project-schema.json",
4 | "sourceRoot": "apps/api/src",
5 | "projectType": "application",
6 | "tags": [],
7 | "targets": {
8 | "build": {
9 | "executor": "nx:run-commands",
10 | "options": {
11 | "command": "webpack-cli build",
12 | "args": [
13 | "--node-env=production"
14 | ],
15 | "cwd": "apps/api"
16 | },
17 | "configurations": {
18 | "development": {
19 | "args": [
20 | "--node-env=development"
21 | ]
22 | }
23 | }
24 | },
25 | "serve": {
26 | "executor": "nx:run-commands",
27 | "defaultConfiguration": "development",
28 | "dependsOn": [
29 | "build"
30 | ],
31 | "options": {
32 | "command": "node apps/api/dist/main.js"
33 | },
34 | "configurations": {
35 | "development": {},
36 | "production": {}
37 | }
38 | },
39 | "test": {
40 | "options": {
41 | "passWithNoTests": true
42 | }
43 | }
44 | }
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/packages/auth/src/lib/jwt.ts:
--------------------------------------------------------------------------------
1 | import { sign, verify, type SignOptions } from 'jsonwebtoken';
2 | import { loadEnv } from '@nuo-nx/config';
3 |
4 | export interface JWTPayload {
5 | userId: string;
6 | tenantId: string;
7 | email: string;
8 | }
9 |
10 | /**
11 | * Sign a JWT token with user payload
12 | */
13 | export function signToken(payload: JWTPayload): string {
14 | const env = loadEnv();
15 | const expiresIn = env.JWT_EXPIRES_IN || '7d';
16 | const options: SignOptions = { expiresIn } as SignOptions;
17 | return sign(payload, env.JWT_SECRET, options);
18 | }
19 |
20 | /**
21 | * Verify and decode a JWT token
22 | */
23 | export function verifyToken(token: string): JWTPayload {
24 | const env = loadEnv();
25 | const decoded = verify(token, env.JWT_SECRET) as JWTPayload;
26 | return decoded;
27 | }
28 |
29 | /**
30 | * Extract token from Authorization header
31 | */
32 | export function extractTokenFromHeader(authHeader?: string): string | null {
33 | if (!authHeader) return null;
34 |
35 | const parts = authHeader.split(' ');
36 | if (parts.length !== 2 || parts[0] !== 'Bearer') {
37 | return null;
38 | }
39 |
40 | return parts[1];
41 | }
42 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/slider.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SliderPrimitive from "@radix-ui/react-slider"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Slider = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, ...props }, ref) => (
12 |
20 |
21 |
22 |
23 |
24 |
25 | ))
26 | Slider.displayName = SliderPrimitive.Root.displayName
27 |
28 | export { Slider }
29 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/slider.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SliderPrimitive from "@radix-ui/react-slider"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Slider = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, ...props }, ref) => (
12 |
20 |
21 |
22 |
23 |
24 |
25 | ))
26 | Slider.displayName = SliderPrimitive.Root.displayName
27 |
28 | export { Slider }
29 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/checkbox.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
5 | import { Check } from "lucide-react"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const Checkbox = React.forwardRef<
10 | React.ElementRef,
11 | React.ComponentPropsWithoutRef
12 | >(({ className, ...props }, ref) => (
13 |
21 |
24 |
25 |
26 |
27 | ))
28 | Checkbox.displayName = CheckboxPrimitive.Root.displayName
29 |
30 | export { Checkbox }
31 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/checkbox.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
5 | import { Check } from "lucide-react"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const Checkbox = React.forwardRef<
10 | React.ElementRef,
11 | React.ComponentPropsWithoutRef
12 | >(({ className, ...props }, ref) => (
13 |
21 |
24 |
25 |
26 |
27 | ))
28 | Checkbox.displayName = CheckboxPrimitive.Root.displayName
29 |
30 | export { Checkbox }
31 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.base.json",
3 | "compileOnSave": false,
4 | "compilerOptions": {
5 | "baseUrl": "."
6 | },
7 | "files": [],
8 | "references": [
9 | {
10 | "path": "./apps/nuo-nx-e2e"
11 | },
12 | {
13 | "path": "./apps/nuo-nx"
14 | },
15 | {
16 | "path": "./apps/api-e2e"
17 | },
18 | {
19 | "path": "./apps/api"
20 | },
21 | {
22 | "path": "./apps/admin-e2e"
23 | },
24 | {
25 | "path": "./apps/admin"
26 | },
27 | {
28 | "path": "./apps/worker-e2e"
29 | },
30 | {
31 | "path": "./apps/worker"
32 | },
33 | {
34 | "path": "./packages/prisma"
35 | },
36 | {
37 | "path": "./packages/graphql"
38 | },
39 | {
40 | "path": "./packages/auth"
41 | },
42 | {
43 | "path": "./packages/utils"
44 | },
45 | {
46 | "path": "./packages/types"
47 | },
48 | {
49 | "path": "./packages/ui"
50 | },
51 | {
52 | "path": "./packages/config"
53 | },
54 | {
55 | "path": "./packages/document-utils"
56 | },
57 | {
58 | "path": "./packages/storage"
59 | }
60 | ]
61 | }
62 |
--------------------------------------------------------------------------------
/tsconfig.base.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "declarationMap": true,
5 | "emitDeclarationOnly": true,
6 | "importHelpers": true,
7 | "isolatedModules": true,
8 | "lib": ["es2022"],
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "noEmitOnError": true,
12 | "noFallthroughCasesInSwitch": true,
13 | "noImplicitOverride": true,
14 | "noImplicitReturns": true,
15 | "noUnusedLocals": true,
16 | "skipLibCheck": true,
17 | "strict": true,
18 | "target": "es2022",
19 | "baseUrl": ".",
20 | "customConditions": ["@nuo-nx/source"],
21 | "paths": {
22 | "@nuo-nx/*": ["packages/*/src/index.ts"],
23 | "@nuo-nx/ui": ["packages/ui/src/index.ts"],
24 | "@nuo-nx/prisma": ["packages/prisma/src/index.ts"],
25 | "@nuo-nx/graphql": ["packages/graphql/src/index.ts"],
26 | "@nuo-nx/auth": ["packages/auth/src/index.ts"],
27 | "@nuo-nx/utils": ["packages/utils/src/index.ts"],
28 | "@nuo-nx/types": ["packages/types/src/index.ts"],
29 | "@nuo-nx/config": ["packages/config/src/index.ts"],
30 | "@generated/nuo-prisma": ["packages/generated/nuo-prisma/client.ts"]
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/example/page.tsx:
--------------------------------------------------------------------------------
1 | /**
2 | * Example page demonstrating library integration
3 | */
4 | import { NuoNxUi } from '@nuo-nx/ui';
5 |
6 | export default async function ExamplePage() {
7 | // For demonstration, we'll use a simple env check
8 | // In a real app, you'd use Next.js environment variables
9 | const nodeEnv = process.env.NODE_ENV || 'development';
10 |
11 | return (
12 |
13 |
Example Page
14 |
This page demonstrates library integration.
15 |
16 |
17 |
UI Component from @nuo-nx/ui:
18 |
19 |
20 |
21 |
22 |
23 |
24 |
Environment Config:
25 |
26 | {JSON.stringify({
27 | nodeEnv: nodeEnv,
28 | // Don't expose secrets in production
29 | }, null, 2)}
30 |
31 |
32 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
2 |
3 | # compiled output
4 | dist
5 | tmp
6 | out-tsc
7 | *.tsbuildinfo
8 |
9 | # dependencies
10 | node_modules
11 |
12 | # Environment variables
13 | .env
14 | .env.local
15 | .env.*.local
16 | !.env.example
17 |
18 | # IDEs and editors
19 | /.idea
20 | .project
21 | .classpath
22 | .c9/
23 | *.launch
24 | .settings/
25 | *.sublime-workspace
26 |
27 | # IDE - VSCode
28 | .vscode/*
29 | !.vscode/settings.json
30 | !.vscode/tasks.json
31 | !.vscode/launch.json
32 | !.vscode/extensions.json
33 |
34 | # IDE - Cursor
35 | .cursor/rules/nx-rules.mdc
36 | .cursor/projects/
37 |
38 | # misc
39 | /.sass-cache
40 | /connect.lock
41 | /coverage
42 | /libpeerconnection.log
43 | npm-debug.log
44 | yarn-error.log
45 | testem.log
46 | /typings
47 |
48 | # System Files
49 | .DS_Store
50 | Thumbs.db
51 |
52 | # Nx
53 | .nx/cache
54 | .nx/workspace-data
55 | .github/instructions/nx.instructions.md
56 |
57 | # Next.js
58 | .next
59 | out
60 |
61 | # Testing
62 | test-output
63 | coverage
64 | *.log
65 |
66 | # Build artifacts
67 | *.map
68 | *.js.map
69 | *.css.map
70 |
71 | # Prisma
72 | prisma/migrations/*.sql
73 | !prisma/migrations/migration_lock.toml
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(main)/(documentation)/docs/layout.tsx:
--------------------------------------------------------------------------------
1 | import { Metadata } from 'next';
2 | import { DocumentationSidebar } from './components/DocumentationSidebar';
3 | import { DocumentationHeader } from './components/DocumentationHeader';
4 | import { DocumentationFooter } from './components/DocumentationFooter';
5 |
6 | export const metadata: Metadata = {
7 | title: 'Documentación - Nuo',
8 | description: 'Documentación completa para la plataforma Nuo',
9 | };
10 |
11 | export default function DocumentationLayout({
12 | children,
13 | }: {
14 | children: React.ReactNode;
15 | }) {
16 | return (
17 |
18 |
19 |
20 |
21 | {/* Sidebar */}
22 |
25 |
26 | {/* Main Content */}
27 |
28 |
29 | {children}
30 |
31 |
32 |
33 |
34 |
35 |
36 | );
37 | }
38 |
39 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type React from "react"
2 | import type { Metadata } from "next"
3 | import { Inter } from "next/font/google"
4 | import { Analytics } from "@vercel/analytics/next"
5 | import "./globals.css"
6 |
7 | const inter = Inter({ subsets: ["latin"], variable: "--font-inter" })
8 |
9 | export const metadata: Metadata = {
10 | title: "NUO - Legal Infrastructure Platform",
11 | description: "Comprehensive legal infrastructure for Latin American expansion",
12 | generator: "v0.app",
13 | icons: {
14 | icon: [
15 | {
16 | url: "/icon-light-32x32.png",
17 | media: "(prefers-color-scheme: light)",
18 | },
19 | {
20 | url: "/icon-dark-32x32.png",
21 | media: "(prefers-color-scheme: dark)",
22 | },
23 | {
24 | url: "/icon.svg",
25 | type: "image/svg+xml",
26 | },
27 | ],
28 | apple: "/apple-icon.png",
29 | },
30 | }
31 |
32 | export default function RootLayout({
33 | children,
34 | }: Readonly<{
35 | children: React.ReactNode
36 | }>) {
37 | return (
38 |
39 |
40 | {children}
41 |
42 |
43 |
44 | )
45 | }
46 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/switch.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SwitchPrimitives from "@radix-ui/react-switch"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Switch = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, ...props }, ref) => (
12 |
20 |
25 |
26 | ))
27 | Switch.displayName = SwitchPrimitives.Root.displayName
28 |
29 | export { Switch }
30 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/switch.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SwitchPrimitives from "@radix-ui/react-switch"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Switch = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, ...props }, ref) => (
12 |
20 |
25 |
26 | ))
27 | Switch.displayName = SwitchPrimitives.Root.displayName
28 |
29 | export { Switch }
30 |
--------------------------------------------------------------------------------
/apps/nuo-nx/next.config.js:
--------------------------------------------------------------------------------
1 | //@ts-check
2 |
3 | // eslint-disable-next-line @typescript-eslint/no-var-requires
4 | const { composePlugins, withNx } = require('@nx/next');
5 | // eslint-disable-next-line @typescript-eslint/no-var-requires
6 | const path = require('path');
7 |
8 | /**
9 | * @type {import('@nx/next/plugins/with-nx').WithNxOptions}
10 | **/
11 | const nextConfig = {
12 | // Use this to set Nx-specific options
13 | // See: https://nx.dev/recipes/next/next-config-setup
14 | nx: {},
15 | turbopack: {
16 | root: path.resolve(__dirname, '../..'),
17 | },
18 | images: {
19 | remotePatterns: [
20 | {
21 | protocol: 'https',
22 | hostname: 'images.unsplash.com',
23 | pathname: '/**',
24 | },
25 | {
26 | protocol: 'https',
27 | hostname: 'flagcdn.com',
28 | pathname: '/**',
29 | },
30 | ],
31 | },
32 | webpack: (config) => {
33 | // Ensure @ alias resolves correctly
34 | config.resolve.alias = {
35 | ...config.resolve.alias,
36 | '@': path.resolve(__dirname, './src'),
37 | };
38 | return config;
39 | },
40 | };
41 |
42 | const plugins = [
43 | // Add more Next.js plugins to this list if needed.
44 | withNx,
45 | ];
46 |
47 | module.exports = composePlugins(...plugins)(nextConfig);
48 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/badge.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { cva, type VariantProps } from "class-variance-authority"
3 |
4 | import { cn } from "@/lib/utils"
5 |
6 | const badgeVariants = cva(
7 | "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
8 | {
9 | variants: {
10 | variant: {
11 | default:
12 | "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
13 | secondary:
14 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
15 | destructive:
16 | "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
17 | outline: "text-foreground",
18 | },
19 | },
20 | defaultVariants: {
21 | variant: "default",
22 | },
23 | }
24 | )
25 |
26 | export interface BadgeProps
27 | extends React.HTMLAttributes,
28 | VariantProps {}
29 |
30 | function Badge({ className, variant, ...props }: BadgeProps) {
31 | return (
32 |
33 | )
34 | }
35 |
36 | export { Badge, badgeVariants }
37 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/badge.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { cva, type VariantProps } from "class-variance-authority"
3 |
4 | import { cn } from "@/lib/utils"
5 |
6 | const badgeVariants = cva(
7 | "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
8 | {
9 | variants: {
10 | variant: {
11 | default:
12 | "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
13 | secondary:
14 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
15 | destructive:
16 | "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
17 | outline: "text-foreground",
18 | },
19 | },
20 | defaultVariants: {
21 | variant: "default",
22 | },
23 | }
24 | )
25 |
26 | export interface BadgeProps
27 | extends React.HTMLAttributes,
28 | VariantProps {}
29 |
30 | function Badge({ className, variant, ...props }: BadgeProps) {
31 | return (
32 |
33 | )
34 | }
35 |
36 | export { Badge, badgeVariants }
37 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/dashboard/quick-actions.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
4 |
5 | const actions = [
6 | { label: "New Document", description: "From template" },
7 | { label: "Request Signature", description: "Send for signing" },
8 | { label: "Add Company", description: "Register entity" },
9 | { label: "Upload File", description: "Import document" },
10 | ]
11 |
12 | export function QuickActions() {
13 | return (
14 |
15 |
16 | Quick Actions
17 |
18 |
19 |
20 | {actions.map((action) => (
21 |
25 | {action.label}
26 | {action.description}
27 |
28 | ))}
29 |
30 |
31 |
32 | )
33 | }
34 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/app/(dashboard)/dashboard/documents/[id]/edit/page.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useRouter } from 'next/navigation';
4 | import { useEffect, useState } from 'react';
5 | import { DocumentEditor } from '@/components/dashboard/pages/documents/DocumentEditor';
6 |
7 | interface DocumentEditPageProps {
8 | params: Promise<{ id: string }>;
9 | }
10 |
11 | export default function DocumentEditPage({ params }: DocumentEditPageProps) {
12 | const router = useRouter();
13 | const [documentId, setDocumentId] = useState(null);
14 |
15 | useEffect(() => {
16 | params.then((resolvedParams) => {
17 | setDocumentId(resolvedParams.id);
18 | });
19 | }, [params]);
20 |
21 | const handleNavigateToStorage = () => {
22 | router.push('/dashboard/documents/storage');
23 | };
24 |
25 | if (!documentId) {
26 | return (
27 |
30 | );
31 | }
32 |
33 | return (
34 |
35 |
39 |
40 | );
41 | }
42 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/switch.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as SwitchPrimitive from '@radix-ui/react-switch'
5 |
6 | import { cn } from '@/lib/utils'
7 |
8 | function Switch({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
21 |
27 |
28 | )
29 | }
30 |
31 | export { Switch }
32 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/avatar.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as AvatarPrimitive from '@radix-ui/react-avatar'
5 |
6 | import { cn } from '@/lib/utils'
7 |
8 | function Avatar({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
21 | )
22 | }
23 |
24 | function AvatarImage({
25 | className,
26 | ...props
27 | }: React.ComponentProps) {
28 | return (
29 |
34 | )
35 | }
36 |
37 | function AvatarFallback({
38 | className,
39 | ...props
40 | }: React.ComponentProps) {
41 | return (
42 |
50 | )
51 | }
52 |
53 | export { Avatar, AvatarImage, AvatarFallback }
54 |
--------------------------------------------------------------------------------
/packages/auth/src/lib/middleware/tenant.ts:
--------------------------------------------------------------------------------
1 | import { Request } from 'express';
2 | import { getEnv } from '@nuo-nx/config';
3 |
4 | export interface RequestWithTenant extends Request {
5 | tenantId?: string;
6 | }
7 |
8 | /**
9 | * Extract tenant ID from request headers
10 | * Default header: x-tenant-id
11 | */
12 | export function tenantFromRequest(req: RequestWithTenant): string | null {
13 | const env = getEnv();
14 | const tenantHeader = env.TENANT_HEADER.toLowerCase();
15 |
16 | // Try header first (most common for multi-tenant)
17 | const tenantId = req.headers[tenantHeader] || req.headers[tenantHeader.replace('x-', '')];
18 |
19 | if (typeof tenantId === 'string') {
20 | return tenantId;
21 | }
22 |
23 | // Fallback to subdomain extraction if needed
24 | const host = req.get('host');
25 | if (host) {
26 | const parts = host.split('.');
27 | // Assuming format: tenant.domain.com
28 | if (parts.length >= 3) {
29 | return parts[0];
30 | }
31 | }
32 |
33 | return null;
34 | }
35 |
36 | /**
37 | * Express middleware to extract and attach tenant ID to request
38 | */
39 | export function tenantMiddleware(
40 | req: RequestWithTenant,
41 | _res: unknown,
42 | next: () => void
43 | ) {
44 | const tenantId = tenantFromRequest(req);
45 | if (tenantId) {
46 | req.tenantId = tenantId;
47 | }
48 | next();
49 | }
50 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/components/ui/checkbox.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as CheckboxPrimitive from '@radix-ui/react-checkbox'
5 | import { CheckIcon } from 'lucide-react'
6 |
7 | import { cn } from '@/lib/utils'
8 |
9 | function Checkbox({
10 | className,
11 | ...props
12 | }: React.ComponentProps) {
13 | return (
14 |
22 |
26 |
27 |
28 |
29 | )
30 | }
31 |
32 | export { Checkbox }
33 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/hover-card.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const HoverCard = HoverCardPrimitive.Root
9 |
10 | const HoverCardTrigger = HoverCardPrimitive.Trigger
11 |
12 | const HoverCardContent = React.forwardRef<
13 | React.ElementRef,
14 | React.ComponentPropsWithoutRef
15 | >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
16 |
26 | ))
27 | HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
28 |
29 | export { HoverCard, HoverCardTrigger, HoverCardContent }
30 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/hover-card.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const HoverCard = HoverCardPrimitive.Root
9 |
10 | const HoverCardTrigger = HoverCardPrimitive.Trigger
11 |
12 | const HoverCardContent = React.forwardRef<
13 | React.ElementRef,
14 | React.ComponentPropsWithoutRef
15 | >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
16 |
26 | ))
27 | HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
28 |
29 | export { HoverCard, HoverCardTrigger, HoverCardContent }
30 |
--------------------------------------------------------------------------------
/apps/admin/src/components/ui/tooltip.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as TooltipPrimitive from "@radix-ui/react-tooltip"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const TooltipProvider = TooltipPrimitive.Provider
9 |
10 | const Tooltip = TooltipPrimitive.Root
11 |
12 | const TooltipTrigger = TooltipPrimitive.Trigger
13 |
14 | const TooltipContent = React.forwardRef<
15 | React.ElementRef,
16 | React.ComponentPropsWithoutRef
17 | >(({ className, sideOffset = 4, ...props }, ref) => (
18 |
19 |
28 |
29 | ))
30 | TooltipContent.displayName = TooltipPrimitive.Content.displayName
31 |
32 | export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
33 |
--------------------------------------------------------------------------------
/apps/nuo-dashboard-ui/public/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
14 |
15 |
17 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/ui/tooltip.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as TooltipPrimitive from "@radix-ui/react-tooltip"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const TooltipProvider = TooltipPrimitive.Provider
9 |
10 | const Tooltip = TooltipPrimitive.Root
11 |
12 | const TooltipTrigger = TooltipPrimitive.Trigger
13 |
14 | const TooltipContent = React.forwardRef<
15 | React.ElementRef,
16 | React.ComponentPropsWithoutRef
17 | >(({ className, sideOffset = 4, ...props }, ref) => (
18 |
19 |
28 |
29 | ))
30 | TooltipContent.displayName = TooltipPrimitive.Content.displayName
31 |
32 | export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
33 |
--------------------------------------------------------------------------------
/apps/nuo-nx/src/components/dashboard/hooks/useHeaderDropdowns.ts:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useState, useRef } from 'react';
4 | import { useOnClickOutside } from './useOnClickOutside';
5 |
6 | export function useHeaderDropdowns() {
7 | const [showNotifications, setShowNotifications] = useState(false);
8 | const [showUserMenu, setShowUserMenu] = useState(false);
9 |
10 | const notificationsRef = useRef(null);
11 | const userMenuRef = useRef(null);
12 |
13 | // Handle notifications dropdown toggle
14 | const toggleNotifications = () => {
15 | setShowNotifications(!showNotifications);
16 | setShowUserMenu(false); // Close user menu when opening notifications
17 | };
18 |
19 | // Handle user menu toggle
20 | const toggleUserMenu = () => {
21 | setShowUserMenu(!showUserMenu);
22 | setShowNotifications(false); // Close notifications when opening user menu
23 | };
24 |
25 | // Close notifications when clicking outside
26 | useOnClickOutside(notificationsRef, showNotifications, () => {
27 | setShowNotifications(false);
28 | });
29 |
30 | // Close user menu when clicking outside
31 | useOnClickOutside(userMenuRef, showUserMenu, () => {
32 | setShowUserMenu(false);
33 | });
34 |
35 | return {
36 | showNotifications,
37 | showUserMenu,
38 | notificationsRef,
39 | userMenuRef,
40 | toggleNotifications,
41 | toggleUserMenu
42 | };
43 | }
44 |
45 |
46 |
--------------------------------------------------------------------------------
/apps/admin/src/components/dashboard/hooks/useHeaderDropdowns.ts:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import { useState, useRef } from 'react';
4 | import { useOnClickOutside } from './useOnClickOutside';
5 |
6 | export function useHeaderDropdowns() {
7 | const [showNotifications, setShowNotifications] = useState(false);
8 | const [showUserMenu, setShowUserMenu] = useState(false);
9 |
10 | const notificationsRef = useRef(null);
11 | const userMenuRef = useRef(null);
12 |
13 | // Handle notifications dropdown toggle
14 | const toggleNotifications = () => {
15 | setShowNotifications(!showNotifications);
16 | setShowUserMenu(false); // Close user menu when opening notifications
17 | };
18 |
19 | // Handle user menu toggle
20 | const toggleUserMenu = () => {
21 | setShowUserMenu(!showUserMenu);
22 | setShowNotifications(false); // Close notifications when opening user menu
23 | };
24 |
25 | // Close notifications when clicking outside
26 | useOnClickOutside(notificationsRef, showNotifications, () => {
27 | setShowNotifications(false);
28 | });
29 |
30 | // Close user menu when clicking outside
31 | useOnClickOutside(userMenuRef, showUserMenu, () => {
32 | setShowUserMenu(false);
33 | });
34 |
35 | return {
36 | showNotifications,
37 | showUserMenu,
38 | notificationsRef,
39 | userMenuRef,
40 | toggleNotifications,
41 | toggleUserMenu
42 | };
43 | }
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/apps/api/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.base.json",
3 | "compilerOptions": {
4 | "baseUrl": "../..",
5 | "outDir": "dist",
6 | "module": "nodenext",
7 | "types": ["node"],
8 | "rootDir": "src",
9 | "moduleResolution": "nodenext",
10 | "tsBuildInfoFile": "dist/tsconfig.app.tsbuildinfo",
11 | "experimentalDecorators": true,
12 | "emitDecoratorMetadata": true,
13 | "target": "es2021",
14 | "emitDeclarationOnly": false,
15 | "esModuleInterop": true,
16 | "allowSyntheticDefaultImports": true,
17 | "resolveJsonModule": true,
18 | "jsx": "react-jsx"
19 | },
20 | "include": ["src/**/*.ts"],
21 | "exclude": [
22 | "out-tsc",
23 | "dist",
24 | "jest.config.ts",
25 | "jest.config.cts",
26 | "src/**/*.spec.ts",
27 | "src/**/*.test.ts",
28 | "eslint.config.js",
29 | "eslint.config.cjs",
30 | "eslint.config.mjs"
31 | ],
32 | "references": [
33 | {
34 | "path": "../../packages/config/tsconfig.lib.json"
35 | },
36 | {
37 | "path": "../../packages/prisma/tsconfig.lib.json"
38 | },
39 | {
40 | "path": "../../packages/graphql/tsconfig.lib.json"
41 | },
42 | {
43 | "path": "../../packages/auth/tsconfig.lib.json"
44 | },
45 | {
46 | "path": "../../packages/document-utils/tsconfig.lib.json"
47 | },
48 | {
49 | "path": "../../packages/storage/tsconfig.lib.json"
50 | }
51 | ]
52 | }
53 |
--------------------------------------------------------------------------------