modelence 0.14.1 → 0.15.0
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.
- package/README.md +9 -59
- package/dist/{chunk-DIWBKGBL.js → chunk-3SPXJEOR.js} +2 -2
- package/dist/chunk-3SPXJEOR.js.map +1 -0
- package/dist/{chunk-ZGSW7HE6.js → chunk-PR4HPMGW.js} +3 -3
- package/dist/{chunk-ZGSW7HE6.js.map → chunk-PR4HPMGW.js.map} +1 -1
- package/dist/client.d.ts +146 -12
- package/dist/client.js +1 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/{package-2Z6OSR3A.js → package-WAK3BC65.js} +2 -2
- package/dist/{package-2Z6OSR3A.js.map → package-WAK3BC65.js.map} +1 -1
- package/dist/server.d.ts +40 -17
- package/dist/server.js +11 -11
- package/dist/server.js.map +1 -1
- package/dist/telemetry.js +1 -1
- package/dist/{types-BtENzxGq.d.ts → types-BCHsd3qn.d.ts} +76 -9
- package/dist/{types-CSQ5Qjb4.d.ts → types-Cm6x0ToB.d.ts} +12 -7
- package/dist/types.d.ts +2 -2
- package/package.json +1 -1
- package/dist/chunk-DIWBKGBL.js.map +0 -1
package/README.md
CHANGED
|
@@ -17,72 +17,22 @@
|
|
|
17
17
|
[](https://discord.gg/ghxu5PDnkZ)
|
|
18
18
|
</div>
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Modelence is a full-stack framework for building and running production web applications, with built-in authentication, database setup, scheduled jobs, monitoring and more.
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
## Example Projects
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
<table>
|
|
26
|
-
<tr>
|
|
27
|
-
<td align="center">
|
|
28
|
-
<a href="https://finchat.modelence.app/" target="_blank">
|
|
29
|
-
<img src="/assets/finchat-preview.png" alt="FinChat" style="object-fit: cover; border-radius: 12px; box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); transition: transform 0.2s ease, box-shadow 0.2s ease;" />
|
|
30
|
-
</a>
|
|
31
|
-
<br />
|
|
32
|
-
<strong>FinChat</strong>
|
|
33
|
-
<br />
|
|
34
|
-
<small>AI-powered financial chat assistant</small>
|
|
35
|
-
</td>
|
|
36
|
-
<td align="center">
|
|
37
|
-
<a href="https://smartrepos.modelence.app/" target="_blank">
|
|
38
|
-
<img src="/assets/smartrepos-preview.png" alt="SmartRepos" style="object-fit: cover; border-radius: 12px; box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); transition: transform 0.2s ease, box-shadow 0.2s ease;" />
|
|
39
|
-
</a>
|
|
40
|
-
<br />
|
|
41
|
-
<strong>SmartRepos</strong>
|
|
42
|
-
<br />
|
|
43
|
-
<small>Intelligent repository management</small>
|
|
44
|
-
</td>
|
|
45
|
-
<td align="center">
|
|
46
|
-
<a href="https://typesonic.modelence.app/" target="_blank">
|
|
47
|
-
<img src="/assets/typesonic-preview.png" alt="TypeSonic" style="object-fit: cover; border-radius: 12px; box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); transition: transform 0.2s ease, box-shadow 0.2s ease;" />
|
|
48
|
-
</a>
|
|
49
|
-
<br />
|
|
50
|
-
<strong>TypeSonic</strong>
|
|
51
|
-
<br />
|
|
52
|
-
<small>Compete on typing speed</small>
|
|
53
|
-
</td>
|
|
54
|
-
</tr>
|
|
55
|
-
</table>
|
|
56
|
-
</div>
|
|
24
|
+
Visit https://cloud.modelence.com/showcase to see examples of what users have built with Modelence.
|
|
57
25
|
|
|
58
26
|
## Getting Started
|
|
59
|
-
Modelence is an all-in-one TypeScript framework for startups shipping production apps, with the mission to eliminate all boilerplate for standard features that modern web applications need, like authentication, database setup, cron jobs, AI observability, email and more.
|
|
60
|
-
|
|
61
|
-
> **Prerequisites:** Modelence requires [Node.js 20.20](https://nodejs.org/en/download) or higher.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
### Quick Start
|
|
65
|
-
|
|
66
|
-
#### 1. Create a new project
|
|
67
|
-
```bash
|
|
68
|
-
npx create-modelence-app@latest my-app
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
#### 2. Install dependencies
|
|
72
|
-
```bash
|
|
73
|
-
cd my-app
|
|
74
|
-
npm install
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
#### 3. Start the development server
|
|
78
|
-
```bash
|
|
79
|
-
npm run dev
|
|
80
|
-
```
|
|
81
27
|
|
|
82
|
-
|
|
28
|
+
The fastest way to create an application is through the App Builder:
|
|
29
|
+
1. Go to https://cloud.modelence.com
|
|
30
|
+
1. Describe the app you want to build
|
|
31
|
+
1. Submit your prompt - the App Builder will generate and deploy your app
|
|
83
32
|
|
|
33
|
+
That’s it. No setup, no CLI, no configuration required.
|
|
84
34
|
|
|
85
|
-
For a more detailed guide, check out the [
|
|
35
|
+
For a more detailed guide, check out the [Quick Start](https://docs.modelence.com/quickstart) section in our documentation.
|
|
86
36
|
|
|
87
37
|
---
|
|
88
38
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import N from'elastic-apm-node';import A from'winston';import {ElasticsearchTransport}from'winston-elasticsearch';import c from'process';var g={},L={},x=false;function p(t){return L[t]?.value??g[t]?.default}function G(){if(!x)throw new Error("Config is not initialized: an attempt was made to access configs before they were loaded");return Object.fromEntries(Object.entries(g).filter(([t,e])=>e.isPublic).map(([t,e])=>[t,{key:t,type:e.type,value:L[t]?.value??e.default}]))}function V(t){t.forEach(({key:e,type:o,value:r})=>{!e.toLowerCase().startsWith("_system.")&&!g[e]||(L[e]={key:e,type:o,value:r});}),x=true;}function $(){return g}function F(t){Object.entries(t).forEach(([e,o])=>{let{type:r,isPublic:n}=o;if(r==="secret"&&n)throw new Error(`Config ${e} with type "secret" cannot be public`)}),g=t;}var i={stdout:[{log:"",timestamp:null}],stderr:[{log:"",timestamp:null}]},z=1;function S({elasticCloudId:t,elasticApiKey:e}){let o=c.stdout.write,r=c.stderr.write;c.stdout.write=function(n,...s){return h(n.toString(),i.stdout),o.call(c.stdout,n,...s)},c.stderr.write=function(n,...s){return h(n.toString(),i.stderr),r.call(c.stderr,n,...s)},I();}function h(t,e){if(t.length===0)return;let o=new Date;for(let r=0;r<t.length;r++){let n=e[e.length-1];n.timestamp||(n.timestamp=o,n.sequenceId=z++),t[r]===`
|
|
2
|
-
`?e.push({log:"",timestamp:null}):n.log+=t[r];}}async function O(){let t=i.stdout.slice(0,-1);i.stdout=[i.stdout[i.stdout.length-1]];let e=i.stderr.slice(0,-1);i.stderr=[i.stderr[i.stderr.length-1]],t.forEach(({log:o,timestamp:r,sequenceId:n})=>{
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
`?e.push({log:"",timestamp:null}):n.log+=t[r];}}async function O(){let t=i.stdout.slice(0,-1);i.stdout=[i.stdout[i.stdout.length-1]];let e=i.stderr.slice(0,-1);i.stderr=[i.stderr[i.stderr.length-1]],t.forEach(({log:o,timestamp:r,sequenceId:n})=>{b(o,{timestamp:r,source:"console",sequenceId:n});}),e.forEach(({log:o,timestamp:r,sequenceId:n})=>{v(o,{timestamp:r,source:"console",sequenceId:n});});}function I(){setTimeout(()=>{O(),I();},1e3);}var l=null;function Y(){}function Z(t){l=Object.assign({},l,t);}function T(){return l?.environmentId}function K(){return l?.appAlias}function M(){return l?.environmentAlias}function j(){return l?.telemetry?.serviceName}function a(){return !!l?.telemetry?.isEnabled}var R=false,d=null,m=null,st=async()=>{if(R)throw new Error('Metrics are already initialized, duplicate "initMetrics" call received');R=true,a()&&await D();};async function D(){let t=p("_system.elastic.apmEndpoint"),e=p("_system.elastic.cloudId"),o=p("_system.elastic.apiKey"),r=K()??"unknown",n=M()??"unknown",s=T()??"unknown",f=j();d=N.start({serviceName:f,apiKey:o,serverUrl:t,transactionSampleRate:1,centralConfig:false,globalLabels:{modelenceEnv:"dev",appEnv:"dev",environmentId:s,appAlias:r,environmentAlias:n}});let u=new ElasticsearchTransport({apm:d,level:"debug",clientOpts:{cloud:{id:e},auth:{apiKey:o},requestTimeout:1e4,tls:{rejectUnauthorized:false}},bufferLimit:1e3,silent:false});u.on("error",_=>{console.error("Elasticsearch Transport Error:",_);}),m=A.createLogger({level:"debug",defaultMeta:{serviceName:f},format:A.format.combine(A.format.json()),transports:[u]}),S({elasticCloudId:e,elasticApiKey:o});}function C(){if(!d)throw new Error("APM is not initialized");return d}function E(){return m!==null}function y(){if(!m)throw new Error("Logger is not initialized");return m}function w(){let t="";return a()||(t="info"),process.env.MODELENCE_LOG_LEVEL||t}function W(t,e){a()&&E()&&y().debug(t,e),w()==="debug"&&console.debug(t,e);}function b(t,e){a()&&E()&&y().info(t,e),["debug","info"].includes(w())&&console.info(t,e);}function v(t,e){a()&&E()&&y().error(t,e),["debug","info","error"].includes(w())&&console.error(t,e);}function q(t,e,o){if(!a())return {end:()=>{},setContext:()=>{}};let r=C(),n=r.startTransaction(e,t);return o&&r.setCustomContext(o),{end:(s,{endTime:f,context:u}={})=>{u&&r.setCustomContext(u),n.end(s,f);},setContext:s=>{r.setCustomContext(s);}}}function U(t){if(!a()){console.error(t);return}C().captureError(t);}export{p as a,G as b,V as c,$ as d,F as e,Y as f,Z as g,st as h,W as i,b as j,v as k,q as l,U as m};//# sourceMappingURL=chunk-3SPXJEOR.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-3SPXJEOR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/server.ts","../src/app/loggerProcess.ts","../src/app/state.ts","../src/app/metrics.ts","../src/telemetry/index.ts"],"names":["configSchema","config","isInitialized","getConfig","key","getPublicConfigs","_","schema","loadConfigs","configs","type","value","getSchema","setSchema","isPublic","buffer","sequenceId","startLoggerProcess","_elasticCloudId","_elasticApiKey","originalStdoutWrite","process","originalStderrWrite","chunk","args","addToBuffer","loopSendLogs","timestamp","i","current","sendLogs","stdoutLogs","stderrLogs","log","logInfo","logError","metadata","markAppStarted","setMetadata","_metadata","getEnvironmentId","getAppAlias","getEnvironmentAlias","getTelemetryServiceName","isTelemetryEnabled","apm","logger","initMetrics","initElasticApm","elasticApmEndpoint","elasticCloudId","elasticApiKey","appAlias","environmentAlias","environmentId","serviceName","elasticApm","esTransport","ElasticsearchTransport","error","winston","getApm","isLoggerReady","getLogger","getLogLevel","defaultLoglevel","logDebug","message","startTransaction","name","context","transaction","result","endTime","captureError"],"mappings":"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","file":"chunk-3SPXJEOR.js","sourcesContent":["import { AppConfig, ConfigKey, ConfigSchema } from './types';\n\nlet configSchema: ConfigSchema = {};\nlet config: Record<ConfigKey, AppConfig> = {};\nlet isInitialized = false;\n\n/**\n * @sidebarTitle getConfig (server)\n *\n * @param key - The configuration key to retrieve\n * @returns The configuration value (string, number, or boolean)\n *\n * @example\n * ```ts\n * import { getConfig } from 'modelence/server';\n *\n * // Get the site URL\n * const siteUrl = getConfig('_system.site.url');\n * ```\n *\n * Set via environment variable:\n * ```bash\n * MODELENCE_SITE_URL=https://myapp.com\n * ```\n *\n * @example\n * ```ts\n * import { getConfig } from 'modelence/server';\n *\n * // Get the current environment (e.g., 'development', 'staging', 'production')\n * const env = getConfig('_system.env');\n *\n * if (env === 'production') {\n * // Enable production features\n * }\n * ```\n *\n * Set via environment variable:\n * ```bash\n * MODELENCE_SITE_ENV=production\n * ```\n */\nexport function getConfig(key: ConfigKey): string | number | boolean | undefined {\n return config[key]?.value ?? configSchema[key]?.default;\n}\n\nexport function getPublicConfigs() {\n if (!isInitialized) {\n throw new Error(\n 'Config is not initialized: an attempt was made to access configs before they were loaded'\n );\n }\n\n return Object.fromEntries(\n Object.entries(configSchema)\n .filter(([_, schema]) => schema.isPublic)\n .map(([key, schema]) => {\n return [\n key,\n {\n key,\n type: schema.type,\n value: config[key]?.value ?? schema.default,\n },\n ];\n })\n );\n}\n\nexport function loadConfigs(configs: AppConfig[]) {\n configs.forEach(({ key, type, value }) => {\n const isSystemConfig = key.toLowerCase().startsWith('_system.');\n\n if (!isSystemConfig && !configSchema[key]) {\n // Ignore unknown configs\n return;\n }\n\n config[key] = {\n key,\n type,\n value,\n };\n });\n\n isInitialized = true;\n}\n\nexport function getSchema() {\n return configSchema;\n}\n\nexport function setSchema(schema: ConfigSchema) {\n // TODO: more validation on the schema structure\n Object.entries(schema).forEach(([key, value]) => {\n const { type, isPublic } = value;\n\n if (type === 'secret' && isPublic) {\n throw new Error(`Config ${key} with type \"secret\" cannot be public`);\n }\n });\n\n configSchema = schema;\n}\n","// import { spawn } from 'child_process';\n// import { fileURLToPath } from 'url';\n// import { dirname, join } from 'path';\nimport { logInfo, logError } from '@/telemetry';\nimport process from 'process';\n\ntype LogEntry = { log: string; timestamp: Date | null; sequenceId?: number };\ntype LogBuffer = LogEntry[];\n\nconst buffer: { stdout: LogBuffer; stderr: LogBuffer } = {\n stdout: [{ log: '', timestamp: null }],\n stderr: [{ log: '', timestamp: null }],\n};\n\nlet sequenceId = 1;\n\nexport function startLoggerProcess({\n elasticCloudId: _elasticCloudId,\n elasticApiKey: _elasticApiKey,\n}: {\n elasticCloudId: string;\n elasticApiKey: string;\n}) {\n const originalStdoutWrite = process.stdout.write;\n const originalStderrWrite = process.stderr.write;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n process.stdout.write = function (chunk: string | Uint8Array, ...args: any[]) {\n addToBuffer(chunk.toString(), buffer.stdout);\n return originalStdoutWrite.call(process.stdout, chunk, ...args);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n process.stderr.write = function (chunk: string | Uint8Array, ...args: any[]) {\n addToBuffer(chunk.toString(), buffer.stderr);\n return originalStderrWrite.call(process.stderr, chunk, ...args);\n };\n\n loopSendLogs();\n\n // const currentFilePath = fileURLToPath(import.meta.url);\n // const projectRoot = dirname(dirname(currentFilePath));\n // const loggerPath = join(projectRoot, 'bin', 'modelence-logger', 'index.js');\n // const logger = spawn(process.execPath, [loggerPath], {\n // env: {\n // NODE_ENV: process.env.NODE_ENV,\n // ELASTIC_CLOUD_ID: elasticCloudId,\n // ELASTIC_API_KEY: elasticApiKey\n // },\n // stdio: ['pipe', 'inherit', 'inherit'],\n // detached: true\n // });\n\n // const originalStdoutWrite = process.stdout.write;\n // const originalStderrWrite = process.stderr.write;\n\n // process.stdout.write = function(chunk: any, ...args: any[]) {\n // logger.stdin.write(chunk);\n // return originalStdoutWrite.apply(process.stdout, [chunk, ...args]);\n // };\n\n // process.stderr.write = function(chunk: any, ...args: any[]) {\n // logger.stdin.write(chunk);\n // return originalStderrWrite.apply(process.stderr, [chunk, ...args]);\n // };\n\n // process.on('exit', () => {\n // process.stdout.write = originalStdoutWrite;\n // process.stderr.write = originalStderrWrite;\n // });\n\n // logger.unref();\n}\n\nfunction addToBuffer(chunk: string, buffer: LogBuffer) {\n if (chunk.length === 0) {\n return;\n }\n\n const timestamp = new Date();\n\n for (let i = 0; i < chunk.length; i++) {\n const current = buffer[buffer.length - 1];\n if (!current.timestamp) {\n current.timestamp = timestamp;\n current.sequenceId = sequenceId++;\n }\n\n if (chunk[i] === '\\n') {\n buffer.push({ log: '', timestamp: null });\n } else {\n current.log += chunk[i];\n }\n }\n}\n\nasync function sendLogs() {\n const stdoutLogs = buffer.stdout.slice(0, -1);\n buffer.stdout = [buffer.stdout[buffer.stdout.length - 1]];\n\n const stderrLogs = buffer.stderr.slice(0, -1);\n buffer.stderr = [buffer.stderr[buffer.stderr.length - 1]];\n\n stdoutLogs.forEach(({ log, timestamp, sequenceId }: LogEntry) => {\n logInfo(log, { timestamp, source: 'console', sequenceId });\n });\n stderrLogs.forEach(({ log, timestamp, sequenceId }: LogEntry) => {\n logError(log, { timestamp, source: 'console', sequenceId });\n });\n}\n\nfunction loopSendLogs() {\n setTimeout(() => {\n sendLogs();\n loopSendLogs();\n }, 1000);\n}\n","type AppMetadata = {\n environmentId: string;\n appAlias: string;\n environmentAlias: string;\n telemetry: {\n isEnabled: boolean;\n serviceName: string;\n };\n};\n\nlet appStarted = false;\nlet metadata: AppMetadata | null = null;\n\nexport function markAppStarted() {\n appStarted = true;\n}\n\nexport function isAppStarted() {\n return appStarted;\n}\n\nexport function setMetadata(_metadata: AppMetadata) {\n metadata = Object.assign({}, metadata, _metadata);\n}\n\nexport function getEnvironmentId() {\n return metadata?.environmentId;\n}\n\nexport function getAppAlias() {\n return metadata?.appAlias;\n}\n\nexport function getEnvironmentAlias() {\n return metadata?.environmentAlias;\n}\n\nexport function getTelemetryServiceName() {\n return metadata?.telemetry?.serviceName;\n}\n\nexport function isTelemetryEnabled() {\n return Boolean(metadata?.telemetry?.isEnabled);\n}\n","import elasticApm from 'elastic-apm-node';\nimport winston from 'winston';\nimport { ElasticsearchTransport } from 'winston-elasticsearch';\n\nimport { getConfig } from '../config/server';\nimport { startLoggerProcess } from './loggerProcess';\nimport {\n getAppAlias,\n getEnvironmentAlias,\n getEnvironmentId,\n getTelemetryServiceName,\n isTelemetryEnabled,\n} from './state';\n\nlet isInitialized = false;\nlet apm: typeof elasticApm | null = null;\nlet logger: winston.Logger | null = null;\n\nexport const initMetrics = async () => {\n if (isInitialized) {\n throw new Error('Metrics are already initialized, duplicate \"initMetrics\" call received');\n }\n\n isInitialized = true;\n\n if (isTelemetryEnabled()) {\n await initElasticApm();\n }\n};\n\nasync function initElasticApm() {\n const elasticApmEndpoint = getConfig('_system.elastic.apmEndpoint') as string;\n const elasticCloudId = getConfig('_system.elastic.cloudId') as string;\n const elasticApiKey = getConfig('_system.elastic.apiKey') as string;\n\n const appAlias = getAppAlias() ?? 'unknown';\n const environmentAlias = getEnvironmentAlias() ?? 'unknown';\n const environmentId = getEnvironmentId() ?? 'unknown';\n const serviceName = getTelemetryServiceName();\n\n apm = elasticApm.start({\n serviceName,\n apiKey: elasticApiKey,\n serverUrl: elasticApmEndpoint,\n // environment: 'dev',\n transactionSampleRate: 1.0,\n centralConfig: false,\n globalLabels: {\n modelenceEnv: 'dev',\n appEnv: 'dev',\n environmentId,\n appAlias,\n environmentAlias,\n },\n // logLevel: 'debug'\n });\n\n const esTransport = new ElasticsearchTransport({\n apm,\n level: 'debug',\n clientOpts: {\n cloud: {\n id: elasticCloudId,\n },\n auth: {\n apiKey: elasticApiKey,\n },\n requestTimeout: 10000,\n tls: {\n rejectUnauthorized: false,\n },\n },\n bufferLimit: 1000,\n silent: false,\n });\n\n esTransport.on('error', (error) => {\n console.error('Elasticsearch Transport Error:', error);\n });\n\n logger = winston.createLogger({\n level: 'debug',\n defaultMeta: {\n serviceName,\n },\n format: winston.format.combine(winston.format.json()),\n transports: [\n // new winston.transports.Console(), // TODO: remove, just for debugging\n esTransport,\n ],\n });\n\n startLoggerProcess({\n elasticCloudId,\n elasticApiKey,\n });\n}\n\nexport function getApm() {\n if (!apm) {\n throw new Error('APM is not initialized');\n }\n return apm;\n}\n\nexport function isLoggerReady() {\n return logger !== null;\n}\n\nexport function getLogger() {\n if (!logger) {\n throw new Error('Logger is not initialized');\n }\n return logger;\n}\n","import { getLogger, getApm, isLoggerReady } from '@/app/metrics';\nimport { isTelemetryEnabled } from '@/app/state';\n\ntype LogLevel = 'error' | 'info' | 'debug' | '';\n\n/**\n * Gets the logging level for console logs based on the MODELENCE_LOG_LEVEL environment variable.\n *\n * @returns The log level ('error' | 'info' | 'debug' | '')\n *\n * Behavior:\n * - If MODELENCE_LOG_LEVEL is set, returns that value\n * - If telemetry is disabled and MODELENCE_LOG_LEVEL is not set, defaults to 'info'\n * - If telemetry is enabled and MODELENCE_LOG_LEVEL is not set, returns '' (no console logging)\n */\nfunction getLogLevel(): LogLevel {\n let defaultLoglevel: LogLevel = '';\n if (!isTelemetryEnabled()) {\n defaultLoglevel = 'info';\n }\n\n return (process.env.MODELENCE_LOG_LEVEL as LogLevel) || defaultLoglevel;\n}\n\nexport function logDebug(message: string, args: object) {\n if (isTelemetryEnabled() && isLoggerReady()) {\n getLogger().debug(message, args);\n }\n if (getLogLevel() === 'debug') {\n console.debug(message, args);\n }\n}\n\nexport function logInfo(message: string, args: object) {\n if (isTelemetryEnabled() && isLoggerReady()) {\n getLogger().info(message, args);\n }\n if (['debug', 'info'].includes(getLogLevel())) {\n console.info(message, args);\n }\n}\n\nexport function logError(message: string, args: object) {\n if (isTelemetryEnabled() && isLoggerReady()) {\n getLogger().error(message, args);\n }\n if (['debug', 'info', 'error'].includes(getLogLevel())) {\n console.error(message, args);\n }\n}\n\ninterface WrappedTransaction {\n end(result?: string, context?: Record<string, unknown>): void;\n setContext(context: Record<string, unknown>): void;\n}\n\nexport function startTransaction(\n type: 'method' | 'cron' | 'ai' | 'custom' | 'route',\n name: string,\n context?: Record<string, unknown>\n): WrappedTransaction {\n if (!isTelemetryEnabled()) {\n return {\n end: () => {\n // do nothing\n },\n setContext: () => {\n // do nothing\n },\n };\n }\n\n const apm = getApm();\n const transaction = apm.startTransaction(name, type);\n if (context) {\n apm.setCustomContext(context);\n }\n\n return {\n end: (\n result?: string,\n { endTime, context }: { endTime?: number; context?: Record<string, unknown> } = {}\n ) => {\n if (context) {\n apm.setCustomContext(context);\n }\n transaction.end(result, endTime);\n },\n setContext: (context: Record<string, unknown>) => {\n apm.setCustomContext(context);\n },\n };\n}\n\nexport function captureError(error: Error) {\n if (!isTelemetryEnabled()) {\n console.error(error);\n return;\n }\n\n getApm().captureError(error);\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var s="module",i="modelence",r="0.
|
|
2
|
-
export{s as a,i as b,r as c,o as d,n as e,p as f,c as g,d as h,l as i,a as j,m as k,y as l,u as m,j as n,g as o,h as p,x as q,v as r,b as s};//# sourceMappingURL=chunk-
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
var s="module",i="modelence",r="0.15.0",o="The Node.js Framework for Real-Time MongoDB Apps",n="dist/index.js",p="dist/global.d.ts",c={".":"./dist/index.js","./client":"./dist/client.js","./server":"./dist/server.js","./telemetry":"./dist/telemetry.js","./mongodb":"./dist/mongo.js","./types":{types:"./dist/types.d.ts",default:"./dist/types.js"}},d=["dist","dist/bin"],l={modelence:"./dist/bin/modelence.js"},a={build:"tsup",dev:"tsup --watch",format:'prettier --write "src/**/*.{ts,tsx,js,jsx,json,css,md}"',"format:check":'prettier --check "src/**/*.{ts,tsx,js,jsx,json,css,md}"',lint:"eslint src --ext .ts,.tsx --fix","lint:check":"eslint src --ext .ts,.tsx",prepublishOnly:"npm run build",test:"NODE_OPTIONS=--experimental-vm-modules jest","test:watch":"NODE_OPTIONS=--experimental-vm-modules jest --watch","test:coverage":"NODE_OPTIONS=--experimental-vm-modules jest --coverage",postversion:"git push && git push --tags",prepare:"cd ../.. && git config core.hooksPath .husky"},m={type:"git",url:"git+https://github.com/modelence/modelence.git"},y="Modelence",u="SEE LICENSE IN LICENSE",j={url:"https://github.com/modelence/modelence/issues"},g="https://modelence.com",h={"@types/archiver":"^6.0.3","@types/bcrypt":"^6.0.0","@types/cookie-parser":"^1.4.9","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@types/jest":"^30.0.0","@types/node":"^22.5.1","@types/react":"^19.0.0","@types/react-dom":"^19.0.1","@types/socket.io":"^3.0.1","@typescript-eslint/eslint-plugin":"^8.17.0","@typescript-eslint/parser":"^8.17.0",eslint:"^9.37.0",husky:"^9.1.7",jest:"^30.2.0","lint-staged":"^16.2.7",prettier:"^3.6.2",react:"^19.0.0","react-dom":"^19.0.0","ts-jest":"^29.4.5","ts-node":"^10.9.2"},x={"@socket.io/mongo-adapter":"^0.4.0","@vitejs/plugin-react":"^4.3.4",archiver:"^7.0.1",bcrypt:"^6.0.0",commander:"^12.0.0","cookie-parser":"^1.4.7",dotenv:"^16.4.5","elastic-apm-node":"^4.15.0",express:"^4.21.0","fs-extra":"^11.2.0",jiti:"^2.4.2",mongodb:"^6.8.1",open:"^10.1.0","socket.io":"^4.8.1","socket.io-client":"^4.8.1",tsup:"^8.3.6",tsx:"^4.19.3",typescript:"^5.7.2",vite:"^6.0.3","vite-plugin-eslint":"^1.8.1",winston:"^3.15.0","winston-elasticsearch":"^0.19.0",zod:"^3.23.8",zustand:"^5.0.2"},v={react:">=18.0.0","react-dom":">=18.0.0"},b={type:s,name:i,version:r,description:o,main:n,types:p,exports:c,files:d,bin:l,scripts:a,"lint-staged":{"src/**/*.{ts,tsx,js,jsx,json,css,md}":"prettier --write"},repository:m,author:y,license:u,bugs:j,homepage:g,devDependencies:h,dependencies:x,peerDependencies:v};
|
|
2
|
+
export{s as a,i as b,r as c,o as d,n as e,p as f,c as g,d as h,l as i,a as j,m as k,y as l,u as m,j as n,g as o,h as p,x as q,v as r,b as s};//# sourceMappingURL=chunk-PR4HPMGW.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-PR4HPMGW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json"],"names":["type","name","version","description","main","types","exports","files","bin","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies","peerDependencies","package_default"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../package.json"],"names":["type","name","version","description","main","types","exports","files","bin","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies","peerDependencies","package_default"],"mappings":"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","file":"chunk-PR4HPMGW.js","sourcesContent":["{\n \"type\": \"module\",\n \"name\": \"modelence\",\n \"version\": \"0.15.0\",\n \"description\": \"The Node.js Framework for Real-Time MongoDB Apps\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/global.d.ts\",\n \"exports\": {\n \".\": \"./dist/index.js\",\n \"./client\": \"./dist/client.js\",\n \"./server\": \"./dist/server.js\",\n \"./telemetry\": \"./dist/telemetry.js\",\n \"./mongodb\": \"./dist/mongo.js\",\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"default\": \"./dist/types.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"dist/bin\"\n ],\n \"bin\": {\n \"modelence\": \"./dist/bin/modelence.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,css,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,css,md}\\\"\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run build\",\n \"test\": \"NODE_OPTIONS=--experimental-vm-modules jest\",\n \"test:watch\": \"NODE_OPTIONS=--experimental-vm-modules jest --watch\",\n \"test:coverage\": \"NODE_OPTIONS=--experimental-vm-modules jest --coverage\",\n \"postversion\": \"git push && git push --tags\",\n \"prepare\": \"cd ../.. && git config core.hooksPath .husky\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js,jsx,json,css,md}\": \"prettier --write\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/modelence/modelence.git\"\n },\n \"author\": \"Modelence\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"bugs\": {\n \"url\": \"https://github.com/modelence/modelence/issues\"\n },\n \"homepage\": \"https://modelence.com\",\n \"devDependencies\": {\n \"@types/archiver\": \"^6.0.3\",\n \"@types/bcrypt\": \"^6.0.0\",\n \"@types/cookie-parser\": \"^1.4.9\",\n \"@types/express\": \"^5.0.0\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^22.5.1\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.1\",\n \"@types/socket.io\": \"^3.0.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.17.0\",\n \"@typescript-eslint/parser\": \"^8.17.0\",\n \"eslint\": \"^9.37.0\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.2.0\",\n \"lint-staged\": \"^16.2.7\",\n \"prettier\": \"^3.6.2\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"ts-jest\": \"^29.4.5\",\n \"ts-node\": \"^10.9.2\"\n },\n \"dependencies\": {\n \"@socket.io/mongo-adapter\": \"^0.4.0\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"archiver\": \"^7.0.1\",\n \"bcrypt\": \"^6.0.0\",\n \"commander\": \"^12.0.0\",\n \"cookie-parser\": \"^1.4.7\",\n \"dotenv\": \"^16.4.5\",\n \"elastic-apm-node\": \"^4.15.0\",\n \"express\": \"^4.21.0\",\n \"fs-extra\": \"^11.2.0\",\n \"jiti\": \"^2.4.2\",\n \"mongodb\": \"^6.8.1\",\n \"open\": \"^10.1.0\",\n \"socket.io\": \"^4.8.1\",\n \"socket.io-client\": \"^4.8.1\",\n \"tsup\": \"^8.3.6\",\n \"tsx\": \"^4.19.3\",\n \"typescript\": \"^5.7.2\",\n \"vite\": \"^6.0.3\",\n \"vite-plugin-eslint\": \"^1.8.1\",\n \"winston\": \"^3.15.0\",\n \"winston-elasticsearch\": \"^0.19.0\",\n \"zod\": \"^3.23.8\",\n \"zustand\": \"^5.0.2\"\n },\n \"peerDependencies\": {\n \"react\": \">=18.0.0\",\n \"react-dom\": \">=18.0.0\"\n }\n}\n"]}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as ConfigKey, a as WebsocketClientProvider,
|
|
1
|
+
import { b as ConfigKey, c as ConfigParams, A as AnyMethodShape, V as ValueType, d as ConfigType, O as OAuthProvider, a as WebsocketClientProvider, e as ClientChannel } from './types-Cm6x0ToB.js';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { F as FileVisibility } from './types-DLDzAym7.js';
|
|
4
4
|
import 'http';
|
|
@@ -10,16 +10,7 @@ import 'mongodb';
|
|
|
10
10
|
* @param key
|
|
11
11
|
* @returns
|
|
12
12
|
*/
|
|
13
|
-
declare function getConfig(key: ConfigKey): string | number | boolean;
|
|
14
|
-
|
|
15
|
-
type ErrorHandler = (error: Error, methodName: string) => void;
|
|
16
|
-
|
|
17
|
-
declare function renderApp({ loadingElement, routesElement, favicon, errorHandler, }: {
|
|
18
|
-
loadingElement: React.ReactNode;
|
|
19
|
-
routesElement: React.ReactNode;
|
|
20
|
-
favicon?: string;
|
|
21
|
-
errorHandler?: ErrorHandler;
|
|
22
|
-
}): void;
|
|
13
|
+
declare function getConfig(key: ConfigKey): string | number | boolean | undefined;
|
|
23
14
|
|
|
24
15
|
declare class MethodError extends Error {
|
|
25
16
|
status: number;
|
|
@@ -31,6 +22,123 @@ type CallMethodOptions = {
|
|
|
31
22
|
};
|
|
32
23
|
declare function callMethod<T = unknown>(methodName: string, args?: MethodArgs, options?: CallMethodOptions): Promise<T>;
|
|
33
24
|
|
|
25
|
+
type ExtractArgs<M> = M extends (args: infer A, ...rest: any[]) => any ? A : M extends {
|
|
26
|
+
handler: (args: infer A, ...rest: any[]) => any;
|
|
27
|
+
} ? A : MethodArgs;
|
|
28
|
+
type ExtractResult<M> = M extends (...args: any[]) => Promise<infer R> ? R : M extends {
|
|
29
|
+
handler: (...args: any[]) => Promise<infer R>;
|
|
30
|
+
} ? R : unknown;
|
|
31
|
+
type PublicKeyOf<TSchema extends Record<string, ConfigParams>> = {
|
|
32
|
+
[K in keyof TSchema as TSchema[K] extends ConfigParams<ConfigType, true> ? string & K : never]: ValueType<TSchema[K]['type']>;
|
|
33
|
+
};
|
|
34
|
+
type AnyModule = {
|
|
35
|
+
name: string;
|
|
36
|
+
configSchema: Record<string, ConfigParams>;
|
|
37
|
+
queries: Record<string, AnyMethodShape>;
|
|
38
|
+
mutations: Record<string, AnyMethodShape>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Creates a typed client accessor for a module's public configs, queries, and mutations.
|
|
42
|
+
*
|
|
43
|
+
* Use `import type` to reference the module so no server code is bundled on the client.
|
|
44
|
+
* Arg and return types for queries and mutations are inferred automatically from the
|
|
45
|
+
* server-side handler signatures.
|
|
46
|
+
*
|
|
47
|
+
* @param moduleName - The module's name as passed to `new Module(name, ...)`.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* // src/client/payments.ts
|
|
52
|
+
* import type paymentsModule from '../server/payments';
|
|
53
|
+
* import { createClientModule } from 'modelence/client';
|
|
54
|
+
*
|
|
55
|
+
* export const payments = createClientModule<typeof paymentsModule>('payments');
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* ```ts
|
|
59
|
+
* // src/components/Checkout.tsx
|
|
60
|
+
* import { useQuery, useMutation } from '@tanstack/react-query';
|
|
61
|
+
* import { payments } from '../client/payments';
|
|
62
|
+
*
|
|
63
|
+
* // Typed config — public keys only, private and secret keys excluded:
|
|
64
|
+
* const currency = payments.getConfig('currency'); // string | undefined
|
|
65
|
+
*
|
|
66
|
+
* // Typed query — pass directly to useQuery:
|
|
67
|
+
* const { data: products } = useQuery(payments.query('getProducts', { page: 1 }));
|
|
68
|
+
*
|
|
69
|
+
* // Typed mutation — pass directly to useMutation:
|
|
70
|
+
* const { mutate: charge } = useMutation(payments.mutation('charge'));
|
|
71
|
+
* charge({ amount: 100 }); // args typed from handler signature
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
declare function createClientModule<TModule extends AnyModule>(moduleName: string): {
|
|
75
|
+
getConfig<K extends keyof PublicKeyOf<TModule["configSchema"]> & string>(key: K): PublicKeyOf<TModule["configSchema"]>[K] | undefined;
|
|
76
|
+
query<K extends keyof TModule["queries"] & string>(name: K, ...rest: {} extends ExtractArgs<TModule["queries"][K]> ? [args?: ExtractArgs<TModule["queries"][K]>] : [args: ExtractArgs<TModule["queries"][K]>]): {
|
|
77
|
+
queryKey: readonly [string, K, ExtractArgs<TModule["queries"][K]>];
|
|
78
|
+
queryFn: () => Promise<ExtractResult<TModule["queries"][K]>>;
|
|
79
|
+
};
|
|
80
|
+
mutation<K extends keyof TModule["mutations"] & string>(name: K): {
|
|
81
|
+
mutationFn: (args: ExtractArgs<TModule["mutations"][K]>) => Promise<ExtractResult<TModule["mutations"][K]>>;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Returns options for `useInfiniteQuery`. The `getArgs` callback receives the
|
|
85
|
+
* current `pageParam` and returns the args to pass to the query handler.
|
|
86
|
+
* Spread the result into `useInfiniteQuery` alongside `getNextPageParam`.
|
|
87
|
+
*
|
|
88
|
+
* Annotate the `pageParam` type in the callback so TypeScript can infer the
|
|
89
|
+
* page param type — no manual generic needed on `useInfiniteQuery`.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* useInfiniteQuery({
|
|
94
|
+
* ...appFilesClient.infiniteQuery('listFiles', (cursor: string | undefined) => ({
|
|
95
|
+
* environmentId,
|
|
96
|
+
* ...(cursor ? { cursor } : {}),
|
|
97
|
+
* })),
|
|
98
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,
|
|
99
|
+
* });
|
|
100
|
+
* // data is typed as InfiniteData<{ files: AppFile[]; nextCursor: string | null }>
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
infiniteQuery<K extends keyof TModule["queries"] & string, TPageParam = unknown>(name: K, getArgs: (pageParam: TPageParam | undefined) => ExtractArgs<TModule["queries"][K]>): {
|
|
104
|
+
queryKey: readonly [string, K, "infinite", ExtractArgs<TModule["queries"][K]>];
|
|
105
|
+
initialPageParam: TPageParam | undefined;
|
|
106
|
+
queryFn: ({ pageParam, }: {
|
|
107
|
+
pageParam: TPageParam | undefined;
|
|
108
|
+
}) => Promise<ExtractResult<TModule["queries"][K]>>;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
declare const systemConfig: {
|
|
113
|
+
getConfig<K extends "env.type" | "site.url">(key: K): {
|
|
114
|
+
'env.type': string;
|
|
115
|
+
'site.url': string;
|
|
116
|
+
}[K] | undefined;
|
|
117
|
+
query<K extends string>(name: K, args?: any): {
|
|
118
|
+
queryKey: readonly [string, K, any];
|
|
119
|
+
queryFn: () => Promise<unknown>;
|
|
120
|
+
};
|
|
121
|
+
mutation<K extends string>(name: K): {
|
|
122
|
+
mutationFn: (args: any) => Promise<unknown>;
|
|
123
|
+
};
|
|
124
|
+
infiniteQuery<K extends string, TPageParam = unknown>(name: K, getArgs: (pageParam: TPageParam | undefined) => any): {
|
|
125
|
+
queryKey: readonly [string, K, "infinite", any];
|
|
126
|
+
initialPageParam: TPageParam | undefined;
|
|
127
|
+
queryFn: ({ pageParam, }: {
|
|
128
|
+
pageParam: TPageParam | undefined;
|
|
129
|
+
}) => Promise<unknown>;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
type ErrorHandler = (error: Error, methodName: string) => void;
|
|
134
|
+
|
|
135
|
+
declare function renderApp({ loadingElement, routesElement, favicon, errorHandler, }: {
|
|
136
|
+
loadingElement: React.ReactNode;
|
|
137
|
+
routesElement: React.ReactNode;
|
|
138
|
+
favicon?: string;
|
|
139
|
+
errorHandler?: ErrorHandler;
|
|
140
|
+
}): void;
|
|
141
|
+
|
|
34
142
|
type User = {
|
|
35
143
|
id: string;
|
|
36
144
|
handle: string;
|
|
@@ -188,6 +296,32 @@ declare function resetPassword(options: {
|
|
|
188
296
|
token: string;
|
|
189
297
|
password: string;
|
|
190
298
|
}): Promise<void>;
|
|
299
|
+
/**
|
|
300
|
+
* Link an OAuth provider to the currently signed-in user's account.
|
|
301
|
+
* Redirects the browser to the OAuth provider's authorization page.
|
|
302
|
+
* The provider will redirect back and the account will be linked.
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* ```ts
|
|
306
|
+
* linkOAuthProvider({ provider: 'google' });
|
|
307
|
+
* ```
|
|
308
|
+
* @param options.provider - The OAuth provider to link ('google' or 'github').
|
|
309
|
+
*/
|
|
310
|
+
declare function linkOAuthProvider(options: {
|
|
311
|
+
provider: OAuthProvider;
|
|
312
|
+
}): Promise<void>;
|
|
313
|
+
/**
|
|
314
|
+
* Unlink an OAuth provider from the currently signed-in user's account.
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```ts
|
|
318
|
+
* await unlinkOAuthProvider({ provider: 'github' });
|
|
319
|
+
* ```
|
|
320
|
+
* @param options.provider - The OAuth provider to unlink ('google' or 'github').
|
|
321
|
+
*/
|
|
322
|
+
declare function unlinkOAuthProvider(options: {
|
|
323
|
+
provider: OAuthProvider;
|
|
324
|
+
}): Promise<void>;
|
|
191
325
|
|
|
192
326
|
declare function subscribeLiveQuery<T = unknown>(method: string, args: Record<string, unknown>, onData: (data: T) => void, onError?: (error: string) => void): () => void;
|
|
193
327
|
|
|
@@ -219,4 +353,4 @@ declare function getFileUrl(filePath: string): Promise<{
|
|
|
219
353
|
|
|
220
354
|
declare const AppProvider: any;
|
|
221
355
|
|
|
222
|
-
export { AppProvider, ClientChannel, type MethodArgs, MethodError, type UserInfo, callMethod, deleteFile, downloadFile, getConfig, getFileUrl, getLocalStorageSession, getWebsocketClientProvider, loginWithPassword, logout, renderApp, resendEmailVerification, resetPassword, sendResetPasswordToken, setWebsocketClientProvider, signupWithPassword, startWebsockets, subscribeLiveQuery, updateProfile, uploadFile, useSession, verifyEmail };
|
|
356
|
+
export { AppProvider, ClientChannel, type MethodArgs, MethodError, type UserInfo, ValueType, callMethod, createClientModule, deleteFile, downloadFile, getConfig, getFileUrl, getLocalStorageSession, getWebsocketClientProvider, linkOAuthProvider, loginWithPassword, logout, renderApp, resendEmailVerification, resetPassword, sendResetPasswordToken, setWebsocketClientProvider, signupWithPassword, startWebsockets, subscribeLiveQuery, systemConfig, unlinkOAuthProvider, updateProfile, uploadFile, useSession, verifyEmail };
|
package/dist/client.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {b as b$1}from'./chunk-3S2FFBNS.js';import {a}from'./chunk-DO5TZLF5.js';import
|
|
1
|
+
import {b as b$1}from'./chunk-3S2FFBNS.js';import {a}from'./chunk-DO5TZLF5.js';import V,{useState,useEffect}from'react';import {create}from'zustand';import {z as z$1}from'zod';import {jsx}from'react/jsx-runtime';import me from'react-dom/client';import he from'socket.io-client';function k(){let e=localStorage.getItem("modelence.session");try{return e?JSON.parse(e):null}catch(t){return console.error("Error parsing session from localStorage",t),null}}function U(e){localStorage.setItem("modelence.session",JSON.stringify(e));}async function J(e){let{email:t,password:r,handle:n,firstName:o,lastName:s,avatarUrl:l}=e;await i("_system.user.signupWithPassword",{email:t,password:r,...n!==void 0?{handle:n}:{},...o!==void 0?{firstName:o}:{},...s!==void 0?{lastName:s}:{},...l!==void 0?{avatarUrl:l}:{}});}async function B(e){let{email:t,password:r}=e,{user:n}=await i("_system.user.loginWithPassword",{email:t,password:r});return w(n)}async function G(e){let{firstName:t,lastName:r,avatarUrl:n,handle:o}=e,{user:s}=await i("_system.user.updateProfile",{...t!==void 0?{firstName:t}:{},...r!==void 0?{lastName:r}:{},...n!==void 0?{avatarUrl:n}:{},...o!==void 0?{handle:o}:{}});return w(s)}async function X(e){let{token:t}=e;await i("_system.user.verifyEmail",{token:t});}async function Y(e){let{email:t}=e;await i("_system.user.resendEmailVerification",{email:t});}async function Z(){await i("_system.user.logout"),w(null);}async function ee(e){let{email:t}=e;await i("_system.user.sendResetPasswordToken",{email:t});}async function te(e){let{token:t,password:r}=e;await i("_system.user.resetPassword",{token:t,password:r});}async function re(e){let{provider:t}=e,r=c();if(r&&!(await fetch("/api/_internal/auth/set-link-cookie",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({authToken:r}),credentials:"include"})).ok)throw new Error("Failed to initialize OAuth linking. Please ensure you are logged in.");window.location.href=`/api/_internal/auth/${t}?mode=link`;}async function ne(e){let{provider:t}=e;await i("_system.user.unlinkOAuthProvider",{provider:t});}function c(){return k()?.authToken}function p(){return {screenWidth:window.screen.width,screenHeight:window.screen.height,windowWidth:window.innerWidth,windowHeight:window.innerHeight,pixelRatio:window.devicePixelRatio,orientation:window.screen.orientation?.type??null}}var K=(e,t)=>{console.error(`Error calling method '${t}':`,e);};function N(e){K=e;}function I(e,t){return K(e,t)}var P=class extends Error{constructor(t,r){super(t),this.name="MethodError",this.status=r;}};async function i(e,t={},r={}){try{return await oe(`/api/_internal/method/${e}`,t)}catch(n){throw (r.errorHandler??I)(n,e),n}}async function oe(e,t){let r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({args:t,authToken:c(),clientInfo:p()})});if(!r.ok){let s=await r.text();throw new P(s,r.status)}let n=await r.text(),o=n?JSON.parse(n):void 0;if(!o)throw new Error("Invalid response from server");return b$1(o.data,o.typeMap)}var O={};function T(e){return O[e]?.value}function W(e){O=e;}var b=create(e=>({user:null,setUser:t=>e({user:t})})),F=false,se=a.seconds(30),le=z$1.object({id:z$1.string(),handle:z$1.string(),roles:z$1.array(z$1.string()),firstName:z$1.string().optional(),lastName:z$1.string().optional(),avatarUrl:z$1.string().optional()});function q(e){if(!e)return null;let t=le.safeParse(e);if(!t.success)return console.error("Session Error: Invalid user payload",t.error),null;let r=t.data;return Object.freeze({...r,firstName:r.firstName??void 0,lastName:r.lastName??void 0,avatarUrl:r.avatarUrl??void 0,hasRole:n=>r.roles.includes(n),requireRole:n=>{if(!r.roles.includes(n))throw new Error(`Access denied - role '${n}' required`)}})}async function _(){if(F)return;F=true;let{configs:e,session:t,user:r}=await i("_system.session.init");W(e),U(t),b.getState().setUser(q(r)),await L();}async function L(){try{await i("_system.session.heartbeat",{},{errorHandler:()=>{}});}catch{}setTimeout(L,se);}function w(e){let t=q(e);return b.getState().setUser(t),t}function de(){return {user:b(t=>t.user)}}var H=false;function C({children:e,loadingElement:t}){let[r,n]=useState(true);return useEffect(()=>{async function o(){H||(H=true,await _(),n(false));}o();},[]),r?t??jsx("div",{children:"Loading..."}):e}function M(e){return {getConfig(t){return T(`${e}.${t}`)},query(t,...r){let n=r[0]??{};return {queryKey:[e,t,n],queryFn:()=>i(`${e}.${t}`,n)}},mutation(t){return {mutationFn:r=>i(`${e}.${t}`,r)}},infiniteQuery(t,r){return {queryKey:[e,t,"infinite",r(void 0)],initialPageParam:void 0,queryFn:({pageParam:n})=>i(`${e}.${t}`,r(n))}}}}var pe=M("_system");function ye({loadingElement:e,routesElement:t,favicon:r,errorHandler:n}){if(n&&N(n),window.addEventListener("unload",()=>{}),me.createRoot(document.getElementById("root")).render(jsx(V.StrictMode,{children:jsx(D,{loadingElement:e,children:t})})),r){let o=document.querySelector("link[rel~='icon']");if(o)o.href=r;else {let s=document.createElement("link");s.rel="icon",s.href=r,document.head.appendChild(s);}}}var g=null,m=new Map;function y(){if(!g)throw new Error("WebSocket not initialized. Call startWebsockets() first.");return g}function ve(){let e=c(),t=p();for(let r of m.values())g?.emit("subscribeLiveQuery",{subscriptionId:r.subscriptionId,method:r.method,args:r.args,authToken:e,clientInfo:t});}function we(e){g=he("/",{transports:["websocket"],auth:{token:c()}}),g.on("connect",()=>{m.size>0&&(console.log(`[Modelence] WebSocket reconnected, re-subscribing to ${m.size} live queries`),ve());}),e.channels?.forEach(t=>t.init());}function Pe({category:e,listener:t}){y().on(e,t);}function xe({category:e,listener:t}){y().once(e,t);}function ke({category:e,listener:t}){y().off(e,t);}function S({eventName:e,category:t,id:r}){y().emit(e,`${t}:${r}`);}function Te({category:e,id:t}){S({eventName:"joinChannel",category:e,id:t});}function be({category:e,id:t}){S({eventName:"leaveChannel",category:e,id:t});}var Ce=0;function Q(e,t,r,n){let o=`sub-${++Ce}-${Date.now()}`,s=({subscriptionId:u,data:f,typeMap:x})=>{u===o&&r(b$1(f,x));},l=({subscriptionId:u,error:f})=>{u===o&&(console.error(`[Modelence] Live query error for ${e}:`,f),n?.(f));},a=y();return a.on("liveQueryData",s),a.on("liveQueryError",l),m.set(o,{subscriptionId:o,method:e,args:t}),a.connected&&a.emit("subscribeLiveQuery",{subscriptionId:o,method:e,args:t,authToken:c(),clientInfo:p()}),()=>{m.delete(o),a.emit("unsubscribeLiveQuery",{subscriptionId:o}),a.off("liveQueryData",s),a.off("liveQueryError",l);}}var Me={init:we,on:Pe,once:xe,off:ke,emit:S,joinChannel:Te,leaveChannel:be},j=Me;var E=null;function z(e){E=e;}function h(){return E}function Se(e){if(E){console.warn("WebSocket already initialized. Skipping initialization.");return}let t=e?.provider||j;t.init({channels:e?.channels}),z(t);}var R=class{constructor(t,r){this.category=t,this.onMessage=r;}init(){h()?.on({category:this.category,listener:this.onMessage});}joinChannel(t){h()?.joinChannel({category:this.category,id:t});}leaveChannel(t){h()?.leaveChannel({category:this.category,id:t});}};async function Ee(e,{filePath:t,contentType:r,visibility:n}){let{url:o,fields:s,filePath:l}=await i("_system.files.getUploadUrl",{filePath:t,contentType:r,visibility:n}),a=new FormData;for(let[f,x]of Object.entries(s))a.append(f,x);a.append("file",e);let u=await fetch(o,{method:"POST",body:a});if(!u.ok)throw new Error(`Failed to upload file: HTTP status: ${u.status}`);return {filePath:l}}async function Re(e){await i("_system.files.deleteFile",{filePath:e});}async function Ae(e){return i("_system.files.downloadFile",{filePath:e})}async function Ue(e){return i("_system.files.getFileUrl",{filePath:e})}var D="useClient"in V?V.useClient(C):C;export{D as AppProvider,R as ClientChannel,P as MethodError,i as callMethod,M as createClientModule,Re as deleteFile,Ae as downloadFile,T as getConfig,Ue as getFileUrl,k as getLocalStorageSession,h as getWebsocketClientProvider,re as linkOAuthProvider,B as loginWithPassword,Z as logout,ye as renderApp,Y as resendEmailVerification,te as resetPassword,ee as sendResetPasswordToken,z as setWebsocketClientProvider,J as signupWithPassword,Se as startWebsockets,Q as subscribeLiveQuery,pe as systemConfig,ne as unlinkOAuthProvider,G as updateProfile,Ee as uploadFile,de as useSession,X as verifyEmail};//# sourceMappingURL=client.js.map
|
|
2
2
|
//# sourceMappingURL=client.js.map
|