webspresso 0.0.97 → 0.0.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.agents/ADMIN.md +163 -5
  2. package/.agents/AGENTS.md +1 -1
  3. package/.agents/ARCHITECTURE.md +10 -0
  4. package/.agents/AUTH.md +169 -0
  5. package/.agents/CLI.md +195 -1
  6. package/.agents/ORM.md +88 -4
  7. package/.agents/PLUGINS.md +221 -9
  8. package/.agents/QUEUE.md +127 -0
  9. package/.agents/ROUTING.md +127 -7
  10. package/AGENTS.md +1 -0
  11. package/bin/commands/add-esbuild.js +80 -0
  12. package/bin/commands/add-tailwind.js +76 -31
  13. package/bin/commands/analytics-prune.js +57 -0
  14. package/bin/commands/api.js +207 -15
  15. package/bin/commands/build.js +99 -0
  16. package/bin/commands/dev.js +64 -35
  17. package/bin/commands/doctor.js +26 -0
  18. package/bin/commands/email-prune.js +47 -0
  19. package/bin/commands/make-job.js +86 -0
  20. package/bin/commands/make-model.js +250 -0
  21. package/bin/commands/new.js +45 -28
  22. package/bin/commands/openapi.js +102 -0
  23. package/bin/commands/page.js +6 -3
  24. package/bin/commands/queue-prune.js +59 -0
  25. package/bin/commands/routes.js +52 -0
  26. package/bin/commands/service.js +6 -3
  27. package/bin/commands/typegen.js +106 -0
  28. package/bin/commands/upload-prune.js +79 -0
  29. package/bin/webspresso.js +22 -0
  30. package/core/applySchema.js +13 -6
  31. package/core/auth/hash.js +21 -12
  32. package/core/auth/index.js +60 -0
  33. package/core/auth/manager.js +134 -0
  34. package/core/auth/middleware.js +88 -0
  35. package/core/auth/oauth.js +517 -0
  36. package/core/auth/qrcode.js +499 -0
  37. package/core/auth/totp.js +504 -0
  38. package/core/compression/middleware.js +23 -17
  39. package/core/openapi/build-from-api-routes.js +160 -29
  40. package/core/orm/cache/fingerprint.js +15 -1
  41. package/core/orm/cache/memory-provider.js +27 -2
  42. package/core/orm/eager-loader.js +144 -10
  43. package/core/orm/index.js +20 -7
  44. package/core/orm/model.js +53 -7
  45. package/core/orm/query-builder.js +90 -4
  46. package/core/orm/repository.js +44 -3
  47. package/core/orm/search.js +213 -0
  48. package/core/queue/adapters/database.js +94 -0
  49. package/core/queue/adapters/memory.js +62 -0
  50. package/core/queue/adapters/redis.js +80 -0
  51. package/core/queue/cron.js +331 -0
  52. package/core/queue/index.js +8 -1
  53. package/core/queue/manager.js +205 -1
  54. package/core/queue/scheduler.js +359 -0
  55. package/core/sse/index.js +19 -0
  56. package/core/sse/stream.js +430 -0
  57. package/core/ssr/stream.js +11 -0
  58. package/index.d.ts +1188 -10
  59. package/index.js +88 -96
  60. package/package.json +1 -1
  61. package/plugins/admin-panel/api.js +279 -17
  62. package/plugins/admin-panel/app.js +114 -22
  63. package/plugins/admin-panel/client/parts/01-state-api-breadcrumb.js +314 -9
  64. package/plugins/admin-panel/client/parts/04-field-renderers.js +264 -67
  65. package/plugins/admin-panel/client/parts/05-rich-text-file-helpers.js +333 -36
  66. package/plugins/admin-panel/client/parts/06-login-setup-forms.js +119 -28
  67. package/plugins/admin-panel/client/parts/07-model-list.js +49 -8
  68. package/plugins/admin-panel/client/parts/08-record-list.js +248 -23
  69. package/plugins/admin-panel/client/parts/09-record-form.js +59 -12
  70. package/plugins/admin-panel/client/parts/10-export-registry.js +23 -0
  71. package/plugins/admin-panel/client/verify-spa-parts.js +2 -0
  72. package/plugins/admin-panel/core/admin-module.js +13 -7
  73. package/plugins/admin-panel/core/api-extensions.js +30 -2
  74. package/plugins/admin-panel/core/registry.js +96 -16
  75. package/plugins/admin-panel/field-renderers/file-upload.js +187 -104
  76. package/plugins/admin-panel/field-renderers/index.js +2 -0
  77. package/plugins/admin-panel/index.js +96 -0
  78. package/plugins/admin-panel/lib/login-rate-limiter.js +119 -0
  79. package/plugins/admin-panel/modules/admin-users.js +16 -1
  80. package/plugins/admin-panel/modules/bulk-actions.js +13 -5
  81. package/plugins/admin-panel/modules/custom-pages.js +492 -3
  82. package/plugins/admin-panel/modules/dashboard.js +283 -0
  83. package/plugins/admin-panel/modules/menu.js +56 -18
  84. package/plugins/admin-panel/modules/user-management.js +24 -6
  85. package/plugins/api-key/crypto.js +101 -0
  86. package/plugins/api-key/index.js +288 -0
  87. package/plugins/api-key/middleware.js +461 -0
  88. package/plugins/api-key/migration-template.js +48 -0
  89. package/plugins/api-key/model.js +50 -0
  90. package/plugins/api-key/scopes.js +125 -0
  91. package/plugins/audit-log/admin-component.js +487 -59
  92. package/plugins/audit-log/api-handlers.js +148 -0
  93. package/plugins/audit-log/index.js +153 -3
  94. package/plugins/audit-log/purge.js +60 -10
  95. package/plugins/dashboard/app.js +152 -27
  96. package/plugins/dashboard/index.js +143 -39
  97. package/plugins/dashboard/styles.js +78 -0
  98. package/plugins/data-exchange/export-xlsx.js +9 -2
  99. package/plugins/data-exchange/import.js +9 -2
  100. package/plugins/data-exchange/index.js +6 -3
  101. package/plugins/email/index.js +132 -2
  102. package/plugins/email/purge.js +60 -10
  103. package/plugins/file-manager/admin-component.js +20 -4
  104. package/plugins/file-manager/index.js +21 -4
  105. package/plugins/index.js +10 -0
  106. package/plugins/oauth/index.js +338 -0
  107. package/plugins/orm-cache-admin/index.js +4 -2
  108. package/plugins/queue/index.js +15 -0
  109. package/plugins/schema-explorer/admin-component.js +714 -0
  110. package/plugins/schema-explorer/relations-graph.js +205 -0
  111. package/plugins/schema-explorer.js +248 -69
  112. package/plugins/site-analytics/admin-component.js +23 -0
  113. package/plugins/site-analytics/api-handlers.js +42 -0
  114. package/plugins/site-analytics/index.js +147 -2
  115. package/plugins/site-analytics/purge.js +168 -0
  116. package/plugins/swagger.js +261 -13
  117. package/plugins/upload/index.js +26 -0
  118. package/plugins/upload/orphan-pruner.js +292 -0
  119. package/src/api/api-loader.js +4 -1
  120. package/src/bundle/index.js +517 -0
  121. package/src/bundle/manifest.js +165 -0
  122. package/src/dev/banner.js +296 -0
  123. package/src/dev/colors.js +70 -0
  124. package/src/dev/index.js +62 -0
  125. package/src/dev/profiler.js +354 -0
  126. package/src/dev/typegen.js +497 -0
  127. package/src/dev-reload/index.js +611 -0
  128. package/src/discovery/file-route-parser.js +44 -1
  129. package/src/discovery/scan-routes.js +2 -2
  130. package/src/file-router.js +347 -162
  131. package/src/helpers.js +967 -98
  132. package/src/njk-frontmatter.js +12 -0
  133. package/src/pages/page-loader.js +61 -11
  134. package/src/routing/cascading.js +378 -0
  135. package/src/routing/middleware-resolver.js +92 -0
  136. package/src/server.js +635 -63
package/index.js CHANGED
@@ -29,6 +29,8 @@ const {
29
29
  mountPages,
30
30
  filePathToRoute,
31
31
  extractMethodFromFilename,
32
+ isRouteGroupSegment,
33
+ stripRouteGroups,
32
34
  scanDirectory,
33
35
  loadI18n,
34
36
  createTranslator,
@@ -64,49 +66,8 @@ const { mountDiscoveredRoutes } = require('./src/routing/mount-discovered-routes
64
66
  // ORM exports (lazy loaded)
65
67
  const orm = require('./core/orm');
66
68
 
67
- /** Standalone experimental application kernel (event bus, plugin shell, view resolver, flows). Distinct from framework SSR `createApp`. */
68
- const kernel = require('./core/kernel');
69
-
70
- // Built-in plugins
71
- const {
72
- schemaExplorerPlugin,
73
- adminPanelPlugin,
74
- siteAnalyticsPlugin,
75
- auditLogPlugin,
76
- recaptchaPlugin,
77
- swaggerPlugin,
78
- healthCheckPlugin,
79
- restResourcePlugin,
80
- ormCacheAdminPlugin,
81
- uploadPlugin,
82
- createLocalFileProvider,
83
- dataExchangePlugin,
84
- redirectPlugin,
85
- rateLimitPlugin,
86
- contentPlugin,
87
- csrfPlugin,
88
- corsPlugin,
89
- emailPlugin,
90
- basicAuthPlugin,
91
- realtimePlugin,
92
- realtime,
93
- createRealtime,
94
- websocket,
95
- sse,
96
- socketIo,
97
- redis,
98
- createRedisAdapter,
99
- mcpPlugin,
100
- createMcpServer,
101
- McpServer,
102
- fileManagerPlugin,
103
- xlsxPlugin,
104
- xlsx,
105
- csvPlugin,
106
- csv,
107
- } = require('./plugins');
108
-
109
- const content = require('./core/content');
69
+ // Lazy-loaded built-in plugins
70
+ const plugins = require('./plugins');
110
71
 
111
72
  module.exports = {
112
73
  // Main API
@@ -185,6 +146,8 @@ module.exports = {
185
146
  mountPages,
186
147
  filePathToRoute,
187
148
  extractMethodFromFilename,
149
+ isRouteGroupSegment,
150
+ stripRouteGroups,
188
151
  scanDirectory,
189
152
  loadI18n,
190
153
  createTranslator,
@@ -198,11 +161,6 @@ module.exports = {
198
161
  createHelpers,
199
162
  utils,
200
163
 
201
- // SSR Streaming
202
- ssr: require('./core/ssr'),
203
- renderStream: require('./core/ssr').renderStream,
204
- createHtmlStream: require('./core/ssr').createHtmlStream,
205
-
206
164
  // Asset management
207
165
  AssetManager,
208
166
  configureAssets,
@@ -217,53 +175,8 @@ module.exports = {
217
175
  // ORM
218
176
  ...orm,
219
177
 
220
- /** Event bus / plugin shell / view resolver / flows (`kernel.createApp` is distinct from SSR `createApp`) */
221
- kernel,
222
-
223
- // Direct zdb & z export (for convenience)
178
+ // Direct zdb export (for convenience)
224
179
  zdb: orm.zdb,
225
- z: require('./core/validation').z,
226
-
227
- // Plugins
228
- schemaExplorerPlugin,
229
- adminPanelPlugin,
230
- siteAnalyticsPlugin,
231
- auditLogPlugin,
232
- recaptchaPlugin,
233
- swaggerPlugin,
234
- healthCheckPlugin,
235
- restResourcePlugin,
236
- ormCacheAdminPlugin,
237
- uploadPlugin,
238
- createLocalFileProvider,
239
- dataExchangePlugin,
240
- redirectPlugin,
241
- rateLimitPlugin,
242
- contentPlugin,
243
- csrfPlugin,
244
- corsPlugin,
245
- emailPlugin,
246
- basicAuthPlugin,
247
- realtimePlugin,
248
- realtime,
249
- createRealtime,
250
- websocket,
251
- sse,
252
- socketIo,
253
- redis,
254
- createRedisAdapter,
255
- queuePlugin: require('./plugins/queue'),
256
- queue: require('./core/queue'),
257
- createQueueManager: require('./core/queue').createQueueManager,
258
- QueueManager: require('./core/queue').QueueManager,
259
- mcpPlugin,
260
- createMcpServer,
261
- McpServer,
262
- fileManagerPlugin,
263
- xlsxPlugin,
264
- xlsx,
265
- csvPlugin,
266
- csv,
267
180
 
268
181
  // Discovery, Pages, API, Modules & Routing primitives
269
182
  definePage,
@@ -277,8 +190,87 @@ module.exports = {
277
190
  compileRouteTable,
278
191
  RouteTable,
279
192
  mountDiscoveredRoutes,
193
+ resolveMiddlewares: require('./src/routing/middleware-resolver').resolveMiddlewares,
194
+ };
195
+
196
+ // Define lazy getters for plugins and heavy core subsystems
197
+ Object.defineProperties(module.exports, {
198
+ ...Object.getOwnPropertyDescriptors(plugins),
199
+
200
+ // Cascading Middleware & Layouts
201
+ cascading: { get: () => require('./src/routing/cascading'), enumerable: true, configurable: true },
202
+
203
+ // SSR Streaming
204
+ ssr: { get: () => require('./core/ssr'), enumerable: true, configurable: true },
205
+ renderStream: { get: () => require('./core/ssr').renderStream, enumerable: true, configurable: true },
206
+ createHtmlStream: { get: () => require('./core/ssr').createHtmlStream, enumerable: true, configurable: true },
207
+
208
+ // Server-Sent Events (SSE) Streaming
209
+ sse: { get: () => require('./core/sse'), enumerable: true, configurable: true },
210
+ createSseStream: { get: () => require('./core/sse').createSseStream, enumerable: true, configurable: true },
211
+ ServerSentEventsStream: { get: () => require('./core/sse').ServerSentEventsStream, enumerable: true, configurable: true },
212
+
213
+ /** Event bus / plugin shell / view resolver / flows (`kernel.createApp` is distinct from SSR `createApp`) */
214
+ kernel: { get: () => require('./core/kernel'), enumerable: true, configurable: true },
215
+
216
+ // Authentication & OAuth
217
+ auth: { get: () => require('./core/auth'), enumerable: true, configurable: true },
218
+ createAuth: { get: () => require('./core/auth').createAuth, enumerable: true, configurable: true },
219
+ quickAuth: { get: () => require('./core/auth').quickAuth, enumerable: true, configurable: true },
220
+
221
+ // 2FA / TOTP (RFC 6238, RFC 4226, RFC 4648)
222
+ totp: { get: () => require('./core/auth/totp'), enumerable: true, configurable: true },
223
+ base32Encode: { get: () => require('./core/auth/totp').base32Encode, enumerable: true, configurable: true },
224
+ base32Decode: { get: () => require('./core/auth/totp').base32Decode, enumerable: true, configurable: true },
225
+ generateTotpSecret: { get: () => require('./core/auth/totp').generateTotpSecret, enumerable: true, configurable: true },
226
+ generateHotp: { get: () => require('./core/auth/totp').generateHotp, enumerable: true, configurable: true },
227
+ verifyHotp: { get: () => require('./core/auth/totp').verifyHotp, enumerable: true, configurable: true },
228
+ generateTotp: { get: () => require('./core/auth/totp').generateTotp, enumerable: true, configurable: true },
229
+ verifyTotp: { get: () => require('./core/auth/totp').verifyTotp, enumerable: true, configurable: true },
230
+ generateTotpUri: { get: () => require('./core/auth/totp').generateTotpUri, enumerable: true, configurable: true },
231
+ generateTotpQrSvg: { get: () => require('./core/auth/totp').generateTotpQrSvg, enumerable: true, configurable: true },
232
+ generateTotpQrDataUri: { get: () => require('./core/auth/totp').generateTotpQrDataUri, enumerable: true, configurable: true },
233
+ generateRecoveryCodes: { get: () => require('./core/auth/totp').generateRecoveryCodes, enumerable: true, configurable: true },
234
+ hashRecoveryCode: { get: () => require('./core/auth/totp').hashRecoveryCode, enumerable: true, configurable: true },
235
+ verifyRecoveryCode: { get: () => require('./core/auth/totp').verifyRecoveryCode, enumerable: true, configurable: true },
236
+ createTotpSetup: { get: () => require('./core/auth/totp').createTotpSetup, enumerable: true, configurable: true },
237
+ createQrMatrix: { get: () => require('./core/auth/totp').createQrMatrix, enumerable: true, configurable: true },
238
+ generateQrSvg: { get: () => require('./core/auth/qrcode').generateQrSvg, enumerable: true, configurable: true },
239
+ generateQrDataUri: { get: () => require('./core/auth/qrcode').generateQrDataUri, enumerable: true, configurable: true },
240
+ createAuthMiddleware: { get: () => require('./core/auth').createAuthMiddleware, enumerable: true, configurable: true },
241
+ setupAuthMiddleware: { get: () => require('./core/auth').setupAuthMiddleware, enumerable: true, configurable: true },
242
+
243
+ // Validation
244
+ z: { get: () => require('./core/validation').z, enumerable: true, configurable: true },
245
+
246
+ // Background jobs & queue
247
+ queue: { get: () => require('./core/queue'), enumerable: true, configurable: true },
248
+ createQueueManager: { get: () => require('./core/queue').createQueueManager, enumerable: true, configurable: true },
249
+ QueueManager: { get: () => require('./core/queue').QueueManager, enumerable: true, configurable: true },
250
+ TaskScheduler: { get: () => require('./core/queue').TaskScheduler, enumerable: true, configurable: true },
251
+ CronExpression: { get: () => require('./core/queue').CronExpression, enumerable: true, configurable: true },
252
+ parseCron: { get: () => require('./core/queue').parseCron, enumerable: true, configurable: true },
253
+ isValidCron: { get: () => require('./core/queue').isValidCron, enumerable: true, configurable: true },
280
254
 
281
255
  // Schema-driven CMS core (framework-agnostic)
282
- content,
283
- };
256
+ content: { get: () => require('./core/content'), enumerable: true, configurable: true },
257
+
258
+ // Dev live reload & bundler
259
+ createDevReloadHub: { get: () => require('./src/dev-reload').createDevReloadHub, enumerable: true, configurable: true },
260
+ createDevBundler: { get: () => require('./src/bundle').createDevBundler, enumerable: true, configurable: true },
261
+ buildBundle: { get: () => require('./src/bundle').buildBundle, enumerable: true, configurable: true },
262
+ generateManifest: { get: () => require('./src/bundle').generateManifest, enumerable: true, configurable: true },
263
+ createManifestPlugin: { get: () => require('./src/bundle').createManifestPlugin, enumerable: true, configurable: true },
264
+ findDefaultEntryPoints: { get: () => require('./src/bundle').findDefaultEntryPoints, enumerable: true, configurable: true },
265
+ findPageEntryPoints: { get: () => require('./src/bundle').findPageEntryPoints, enumerable: true, configurable: true },
266
+
267
+ // Dev & DX Tooling
268
+ dev: { get: () => require('./src/dev'), enumerable: true, configurable: true },
269
+ formatDevBanner: { get: () => require('./src/dev').formatDevBanner, enumerable: true, configurable: true },
270
+ printDevBanner: { get: () => require('./src/dev').printDevBanner, enumerable: true, configurable: true },
271
+ formatRouteTable: { get: () => require('./src/dev').formatRouteTable, enumerable: true, configurable: true },
272
+ createDevProfilerMiddleware: { get: () => require('./src/dev').createDevProfilerMiddleware, enumerable: true, configurable: true },
273
+ generateTypes: { get: () => require('./src/dev/typegen').generateTypes, enumerable: true, configurable: true },
274
+ typegen: { get: () => require('./src/dev/typegen'), enumerable: true, configurable: true },
275
+ });
284
276
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webspresso",
3
- "version": "0.0.97",
3
+ "version": "0.0.99",
4
4
  "description": "Minimal, production-ready SSR framework for Node.js with file-based routing, Nunjucks templating, built-in i18n, and CLI tooling",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",