Commit Graph

361 Commits

Author SHA1 Message Date
hykocx 242ea69664 feat(storage): refactor storage config and remove module registry
Introduce a dedicated `storage-config.js` for registering public
prefixes and access policies via `configureStorageApi()`, replacing the
previous `getAllStoragePublicPrefixes` / `getAllStorageAccessPolicies`
imports from the module registry.

Remove `getAllApiRoutes()` from the router so module-level routes are no
longer auto-collected; feature routes must now be registered explicitly
via `registerFeatureRoutes()` during `initializeZen()`.

Update `.env.example` to document separate `ZEN_STORAGE_PROVIDER`,
`ZEN_STORAGE_B2_*` variables for Backblaze B2 alongside the existing
Cloudflare R2 variables, making provider selection explicit.

Clean up admin navigation and page components to drop module-injected
nav entries, keeping only core and system sections.
2026-04-14 17:43:06 -04:00
hykocx 4a06cace5d refactor: remove modules system from core package
- Remove all module-related entry points from package.json exports
- Remove module source files from tsup build configuration
- Clean up external dependencies related to modules
- Update DEV.md to reflect modules removal from architecture
- Clarify package description to specify Next.js CMS
2026-04-14 17:27:04 -04:00
hykocx 936d21fdec docs/feat: add storage policies to discovery and refactor utils
- Add `storagePublicPrefixes` and `storageAccessPolicies` fields to
  both internal and external module config loading in discovery.js
- Add a module-level `MIME_TYPES` constant in storage/utils.js to
  avoid recreating the object on every `getMimeType` call
- Remove unused `validateImageDimensions` export from storage/index.js
- Remove dead `isFinite` check after `Math.min/max` in `getPresignedUrl`
  (result is always finite at that point)
- Remove unused `warn` import from storage/utils.js
- Add documentation rule in DEV.md: comments must always reflect the
  actual behavior of the code they describe
2026-04-14 17:23:43 -04:00
hykocx 2e348a1608 feat(storage): add configurable storage access policies
Replace hardcoded `users/` path-based access control with a
declarative `storageAccessPolicies` system defined per module via
`defineModule()`.

- Add `storageAccessPolicies` field to `defineModule()` defaults with
  support for `owner` and `admin` policy types
- Expose `getAllStorageAccessPolicies()` from the modules/storage layer
- Refactor `handleGetFile` in `storage/api.js` to resolve access
  control dynamically from registered policies instead of hardcoded
  path checks
- Add `ZEN_STORAGE_ENDPOINT` env var and update `.env.example` to
  support S3-compatible backends (Cloudflare R2, Backblaze B2)
- Document the env/doc sync convention in `DEV.md`
2026-04-14 17:09:27 -04:00
hykocx 67de464e1d refactor(pdf): simplify PDF module by removing redundant utilities
Remove helper functions (cmToPoints, inchesToPoints, mmToPoints,
createElement, PAGE_SIZES) and consolidate re-exports from
@react-pdf/renderer into a single export statement. Retain only
the getFilename utility and streamline the module to reduce
unnecessary abstraction over the underlying library.
2026-04-13 18:50:13 -04:00
hykocx dd6eda3a8a refactor(payments): simplify Stripe module with singleton and static imports
- Replace dynamic `import('stripe')` with static import for clarity
- Introduce singleton pattern for Stripe instance to avoid re-initialization
- Convert `getStripe()` from async to sync function
- Remove redundant JSDoc comments to reduce verbosity
- Remove `paymentMethodTypes` option from `createCheckoutSession`
- Remove default export of `stripe` instance from payments index
- Add webhook signature verification and idempotency key helpers
- Add customer and subscription management utilities
2026-04-13 18:42:48 -04:00
hykocx 87a04db04b feat(email): refactor email module and improve config handling
- Simplify `sendEmail` by extracting `resolveFrom` and `buildPayload` helpers
- Remove `sendAuthEmail` and `sendAppEmail` exports, keeping only `sendEmail` and `sendBatchEmails`
- Replace hardcoded fallback sender with env-based validation (throws if missing)
- Update `BaseLayout` to resolve `supportEmail` from `ZEN_SUPPORT_EMAIL` env var instead of hardcoded default
- Conditionally render support section only when a support email is available
- Remove verbose JSDoc comments and reduce overall code verbosity
2026-04-13 18:37:06 -04:00
hykocx 59fce3cd91 refactor(api): update README and refactor api route registration
Restructure the core API to separate infrastructure routes from feature
routes. Key changes:

- Add `runtime.js` for global state: session resolver and feature route
  registry
- Add `file-response.js` for streaming file responses (storage endpoint)
- Remove feature routes (auth/users) from `core-routes.js`, keeping only
  true infrastructure routes (health, storage)
- Introduce `registerFeatureRoutes()` so features self-register during
  `initializeZen()` instead of being hardcoded in `core-routes.js`
- Add `UserFacingError` class to safely surface client-facing errors
  without leaking internal details
- Fix import path for `rateLimit.js` to use shared lib location
- Update README to reflect new two-step registration flow and clarify
  the role of `core-routes.js`
2026-04-13 17:20:14 -04:00
hykocx a3921a0b98 feat(database): refactor CLI, add column whitelist, and SSL config
- Add `ZEN_DB_SSL_DISABLED` env variable to allow disabling SSL for database connections
- Refactor database CLI to split init logic into `initFeatures` and `initModules` for modular table initialization, with graceful fallback when modules are absent
- Extract `printHelp` and `askConfirmation` helpers for cleaner CLI structure
- Ensure `closePool` is called on both success and error paths in CLI
- Add `filterAllowedColumns` utility in `crud.js` to enforce column whitelists, preventing mass-assignment of privileged fields (e.g. `role`, `email_verified`)
- Update drop command description from "auth tables" to "all tables"
2026-04-13 16:35:23 -04:00
hykocx 6521179e10 feat(cron): refactor cron utility with validation and metadata
- Add input validation for name, schedule expression, and handler
- Store full CronEntry metadata (handler, schedule, timezone, registeredAt)
  instead of raw job instance to support introspection
- Add JSDoc typedefs for CronEntry and improve all function docs
- Use globalThis symbol store to survive Next.js hot-reload
- Remove verbose per-run info logs to reduce noise
- Replace `||` with `??` for runOnInit default to handle falsy correctly
- Fix stop/stopAll to access `entry.job` from new storage structure
2026-04-13 15:30:17 -04:00
hykocx 060eb367d8 build(tsup): add @zen/core/api to external list and document rule
- Add `@zen/core/api` to the `external` array in `tsup.config.js` to
  prevent build failures caused by unresolved `dist/` imports at build time
- Document the externals rule in `docs/DEV.md`: any `@zen/core/*` import
  used in bundled module files must be declared as external, with an
  explanation of why and a code example to follow
2026-04-13 15:16:02 -04:00
hykocx df9378cae0 chore: bump version from 1.3.12 to 1.3.13 2026-04-13 15:13:43 -04:00
hykocx 4ddf834990 refactor(api): refactor API module with route definitions and response utilities
Restructure the core API module to improve clarity, consistency, and
maintainability:

- Introduce `defineApiRoutes()` helper for declarative route definitions
  with built-in config validation at startup
- Add `apiSuccess()` / `apiError()` response utilities; enforce their
  use across all handlers (core and modules)
- Move auth enforcement to route definitions (`auth: 'public' | 'user' |
  'admin'`), removing manual auth checks from handlers
- Extract core routes into `core-routes.js`; router now has no knowledge
  of specific features
- Rename `nx-route.js` to `route-handler.js` and update package.json
  export accordingly
- Update ARCHITECTURE.md to reflect new API conventions and point to
  `src/core/api/README.md` for details
2026-04-13 15:13:03 -04:00
hykocx 89741d4460 docs: add project context note in DEV.md 2026-04-13 14:51:43 -04:00
hykocx 260fcfc4f8 docs: extract publication and architecture sections to dedicated files
Move the "Publier le package" section from DEV.md to a new
PUBLICATION.md file, and add references to ARCHITECTURE.md and
PUBLICATION.md in the main DEV.md index. This reduces the size of
DEV.md and improves discoverability by grouping related content
into focused documents.
2026-04-13 13:52:15 -04:00
hykocx 16db807004 docs: rewrite DEV.md with detailed dev and security guidelines
Replace the terse DEV.md with a comprehensive French-language guide
covering code standards, security rules, and the npm publish workflow.

Key changes:
- Expand code principles into readable prose (single responsibility,
  control flow, input validation, promise handling, minimal scope)
- Add concrete security sections: parameterized queries, secret
  management via env vars, dependency auditing, and opaque error
  messages
- Document the full publish procedure (version bump, build, audit,
  npm publish with provenance, git tag)
- Remove the NASA Power of Ten bullet list in favor of actionable,
  project-specific guidelines
2026-04-13 13:34:17 -04:00
hykocx 0e43ea103c docs: update git banner image asset 2026-04-13 13:26:28 -04:00
hykocx 21a5469c0a docs: update git banner image asset 2026-04-13 13:16:58 -04:00
hykocx 4d65a48b01 docs: update banner image and reorder README elements
- Move banner image above the warning notice for better visual hierarchy
- Update git-banner.png with new version
2026-04-13 12:57:53 -04:00
hykocx 8aa97f4782 docs: update README with capitalized title and banner image 2026-04-13 12:10:15 -04:00
hykocx 57dcd2c4d1 chore: bump version to 1.3.12 and expose logger module
- Bump package version from 1.3.11 to 1.3.12
- Add `src/shared/lib/logger.js` to tsup build entry points to expose the logger module as a public export
2026-04-12 22:00:29 -04:00
hykocx 1cd4f322e8 chore: bump version from 1.3.10 to 1.3.11 2026-04-12 21:44:11 -04:00
hykocx e87bd05fa4 refactor: replace console.log with structured logger calls
Replace raw `console.log`/`console.error` calls across CLI, API
handlers, and module files with structured logger functions (`step`,
`done`, `warn`, `fail`) from the shared logger library.

This improves log consistency, readability, and makes it easier to
control output formatting and log levels from a single place.
2026-04-12 21:44:00 -04:00
hykocx dd7c54d913 feat: add modules/storage export and bundle config files
- Add `./modules/storage` package export pointing to `modules.storage.js`
- Add `modules/*/config.js` to tsup build entries for server-only configs
- Add `@zen/core/modules/storage` to external dependencies in tsup config
- Add `src/modules/modules.storage.js` to the second tsup build target
- Update storage handler to import via `@zen/core/modules/storage` alias
- Rename unused `request` param to `_request` in `handleGetFile`
2026-04-12 20:45:55 -04:00
hykocx 35c5ac7ff7 chore: bump version from 1.3.9 to 1.3.10 2026-04-12 20:41:53 -04:00
hykocx d9ba777028 feat(storage): replace hardcoded blog prefix with module-declared public prefixes
Refactor storage access control to use dynamic public prefixes
sourced from `getAllStoragePublicPrefixes()` instead of a hardcoded
`blog` check. Each module can now declare its own public storage
prefixes via `defineModule()` storagePublicPrefixes, making the
system extensible without modifying the core handler.

Also adds a `posts` path handler requiring admin access for private
post types, removes the deprecated `version` API endpoint and its
rate-limit exemption, and minor whitespace/comment cleanup.
2026-04-12 20:41:37 -04:00
hykocx c65d028a20 chore: bump version from 1.3.8 to 1.3.9 2026-04-12 19:09:13 -04:00
hykocx fbe046c5ca refactor(csrf): replace ZEN_APP_URL with NEXT_PUBLIC_URL env vars
Replace the single `ZEN_APP_URL` environment variable with the
existing `NEXT_PUBLIC_URL` and `NEXT_PUBLIC_URL_DEV` variables for
CSRF origin resolution.

- Add `resolveAppUrl()` helper that prefers `NEXT_PUBLIC_URL_DEV`
  in development and falls back to `NEXT_PUBLIC_URL` in production
- Update `passesCsrfCheck()` to use the new helper
- Update error log messages to reference the new variable names
2026-04-12 19:09:00 -04:00
hykocx 33c65d9871 chore: bump version to 1.3.8 and fix module import path
- Bump package version from 1.3.7 to 1.3.8
- Update modules.actions.js import to use package alias
  `@zen/core/core/modules` instead of relative path
2026-04-12 19:05:00 -04:00
hykocx fd228a9e49 chore: bump version from 1.3.6 to 1.3.7 2026-04-12 18:58:33 -04:00
hykocx 3e633e981a docs/refactor: rename getModuleMetadata and update route auth format
- Rename `getModuleMetadata` to `getModuleMetadataGenerator` in registry,
  index, and client exports to clarify its purpose (returns a generator
  function, not a metadata object)
- Add new `getModuleMetadata` and `getMetadataGenerator` exports from
  `modules.metadata.js` for server-side metadata object retrieval
- Update route auth format in docs from `requireAuth`/`requireAdmin`
  flags to a single `auth` field with values: `'admin'`, `'user'`,
  or `'public'`
- Fix `isModuleEnabledInEnv` to replace hyphens with underscores in
  env var names (e.g. `my-module` → `ZEN_MODULE_MY_MODULE`)
- Replace `useState` initializer in `ZenProvider` with `useRef` guard
  to avoid React strict mode double-invocation issues
2026-04-12 18:58:01 -04:00
hykocx c806c8d8d4 docs: replace project structure with dev philosophy section
Replace the project directory tree and PR integration/versioning
sections with a new "Philosophie de développement" section covering
the NASA Power of Ten rules and security-by-design principles.
2026-04-12 18:49:53 -04:00
hykocx 8fd5e361f0 chore: add TypeScript as explicit dev dependency
Add `typescript@^6.0.2` as an explicit devDependency instead of
relying on it being pulled in transitively. This ensures consistent
TypeScript version usage across the project and makes the dependency
requirement clear.
2026-04-12 18:42:45 -04:00
hykocx 8c66ca60d7 chore: bump version to 1.3.6 and remove unused dependencies
- Remove `react-email`, `react-grid-layout` from dependencies
- Remove `tailwindcss`, `@tailwindcss/cli`, `@tailwindcss/postcss`,
  `autoprefixer`, `postcss`, and `typescript` from devDependencies
- Update package-lock.json to reflect dependency removals
- Bump package version from 1.3.5 to 1.3.6
2026-04-12 18:42:10 -04:00
hykocx 8852ce4705 chore: bump version from 1.3.4 to 1.3.5 2026-04-12 18:33:05 -04:00
hykocx 98f1cd9688 fix: harden API security against info leakage and MIME sniffing
- Sanitize route handler errors: only surface known auth messages
  ('Unauthorized', 'Admin access required'); log all other exceptions
  server-side and return a generic 'Internal Server Error' to clients
- Derive profile picture content-type from validated file extension
  instead of attacker-controlled file.type to prevent MIME spoofing
- Always emit explicit Content-Disposition headers on file responses;
  serve known image types as 'inline', force download for all others
  to prevent in-browser rendering of potentially dangerous content
- Add X-Content-Type-Options: nosniff and X-Frame-Options: DENY to
  file response headers
2026-04-12 18:26:33 -04:00
hykocx 49ddcc02fc fix: harden security across CSRF, storage, version, and SQL handling
- **CSRF**: Change missing `ZEN_APP_URL` behavior from bypass (return
  `true`) to enforced deny (return `false`) with an error-level log,
  preventing unauthenticated access when the env var is misconfigured

- **Version endpoint**: Require authentication on the `/version` route
  by passing `request` to `handleVersion`; add session/token validation
  inside the handler so version info is no longer publicly accessible

- **Storage handler**: Enforce a minimum path depth of 3 segments for
  public blog file access to prevent unintentional root-prefix exposure;
  strip raw storage error messages (bucket names, keys) from all client
  responses, logging full details server-side only

- **SQL injection hardening**: Wrap the whitelisted `sortColumn`
  identifier in double-quotes in the `handleListUsers` query to enforce
  identifier boundaries and prevent any edge case from being interpreted
  as SQL syntax

- **Misc**: Improve log clarity for orphaned profile picture deletion
  failures; add inline comments explaining security rationale throughout
2026-04-12 17:49:12 -04:00
hykocx 7fc14fece7 chore: bump version from 1.3.3 to 1.3.4 2026-04-12 17:40:52 -04:00
hykocx 8209503395 feat(api): add CSRF protection and rate limiting to routers
- Add `passesCsrfCheck()` to both `router.js` and `dynamic-router.js`
  to block cross-site request forgery on state-mutating methods
  (POST/PUT/PATCH/DELETE) by validating Origin/Referer headers against
  `ZEN_APP_URL`
- Apply global IP-based rate limiting in `dynamic-router.js` mirroring
  the policy already present in `router.js`; exempt health and version
  GET endpoints from throttling
- Sanitize 404 response in `dynamic-router.js` to prevent route
  structure enumeration
- Strip internal error details from user-facing error messages (e.g.
  profile picture deletion) to avoid information leakage
2026-04-12 17:40:34 -04:00
hykocx 2017f9791b docs: remove zen-setup CLI and simplify installation guide
- Remove `zen-setup` binary from package.json and package-lock.json
- Replace manual setup steps with `npx @zen/start` CLI command
- Simplify INSTALL.md by reducing steps from 6 to 4
- Update DEV.md to reflect removal of zen-setup from CLI scripts
- Fix relative path to `.env.example` in documentation
2026-04-12 17:07:33 -04:00
hykocx 6e33726862 refactor: remove ZEN_DESCRIPTION env variable usage
Remove the `ZEN_DESCRIPTION` environment variable from `.env.example`
and its usage in `generateMetadata`. The description field is no longer
needed in the default metadata configuration.
2026-04-12 16:09:03 -04:00
hykocx 06e4d8c963 refactor: remove unused files 2026-04-12 16:05:04 -04:00
hykocx a57bf3607b docs(posts): add API and Next.js integration documentation
Add three documentation files for the posts module:
- `api.md`: public API reference (list, slug, categories, images)
- `admin-api.md`: admin API reference with all CRUD endpoints
- `integration.md`: Next.js integration examples with code snippets
2026-04-12 15:59:37 -04:00
hykocx 66314481a0 docs(posts): simplify README by removing verbose examples and details 2026-04-12 15:59:11 -04:00
hykocx 881aa75d2a docs(posts): simplify README by removing verbose examples 2026-04-12 15:58:58 -04:00
hykocx 27a5887527 docs: add development and security links to README 2026-04-12 15:29:16 -04:00
hykocx b8a6b3e86c docs: update org name from hykocx to zen and expand DEV guide
- Replace `hykocx` with `zen`/`HYKO` in LICENSE copyright notices
- Update npm registry scope from `@hykocx` to `@zen` in INSTALL.md
- Update npm auth token config path to use `zen` org in DEV.md
- Add project structure overview to DEV.md
- Add contribution standards section referencing GUIDE.md and REDACTION.md
- Add semver versioning bump reference table to DEV.md
2026-04-12 15:13:11 -04:00
hykocx 81172bda94 chore: rename package from @hykocx/zen to @zen/core
Update all references across source files, documentation, and
configuration to reflect the new package scope and name. This includes
updating `.npmrc` registry config, install instructions, module
examples, and all import path comments throughout the codebase.
2026-04-12 15:09:26 -04:00
hykocx 30067a699d refactor: remove old modules dashboard exports from package.json 2026-04-12 14:51:15 -04:00
hykocx 134008daea chore: bump version to 1.3.2 2026-04-12 14:42:01 -04:00