modelence 0.6.6 → 0.6.7

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.
@@ -1,10 +1,10 @@
1
1
  declare function logInfo(message: string, args: object): void;
2
2
  declare function logError(message: string, args: object): void;
3
3
  interface WrappedTransaction {
4
- end(result?: string, context?: Record<string, any>): void;
5
- setContext(context: Record<string, any>): void;
4
+ end(result?: string, context?: Record<string, unknown>): void;
5
+ setContext(context: Record<string, unknown>): void;
6
6
  }
7
- declare function startTransaction(type: 'method' | 'cron' | 'ai' | 'custom', name: string, context?: Record<string, any>): WrappedTransaction;
7
+ declare function startTransaction(type: 'method' | 'cron' | 'ai' | 'custom', name: string, context?: Record<string, unknown>): WrappedTransaction;
8
8
  declare function captureError(error: Error): void;
9
9
 
10
10
  export { captureError, logError, logInfo, startTransaction };
package/dist/telemetry.js CHANGED
@@ -1,2 +1,2 @@
1
- export{k as captureError,i as logError,h as logInfo,j as startTransaction}from'./chunk-2QLNYYBR.js';//# sourceMappingURL=telemetry.js.map
1
+ export{k as captureError,i as logError,h as logInfo,j as startTransaction}from'./chunk-SOW7YLKS.js';//# sourceMappingURL=telemetry.js.map
2
2
  //# sourceMappingURL=telemetry.js.map
@@ -40,14 +40,14 @@ type canAccessChannel = (props: {
40
40
  session: Session | null;
41
41
  roles: string[];
42
42
  }) => Promise<boolean>;
43
- declare class ServerChannel<T = any> {
43
+ declare class ServerChannel<T = unknown> {
44
44
  readonly category: string;
45
45
  readonly canAccessChannel: canAccessChannel | null;
46
46
  constructor(category: string, canAccessChannel?: canAccessChannel);
47
47
  broadcast(id: string, data: T): void;
48
48
  }
49
49
 
50
- declare class ClientChannel<T = any> {
50
+ declare class ClientChannel<T = unknown> {
51
51
  readonly category: string;
52
52
  private readonly onMessage;
53
53
  constructor(category: string, onMessage: (data: T) => void);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "modelence",
4
- "version": "0.6.6",
4
+ "version": "0.6.7",
5
5
  "description": "The Node.js Framework for Real-Time MongoDB Apps",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/global.d.ts",
@@ -26,6 +26,10 @@
26
26
  "scripts": {
27
27
  "build": "tsup",
28
28
  "dev": "tsup --watch",
29
+ "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"",
30
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"",
31
+ "lint": "eslint src --ext .ts,.tsx --fix",
32
+ "lint:check": "eslint src --ext .ts,.tsx",
29
33
  "prepublishOnly": "npm run build",
30
34
  "test": "echo \"Error: no test specified\" && exit 1",
31
35
  "postversion": "git push && git push --tags"
@@ -47,12 +51,13 @@
47
51
  "@types/express": "^5.0.0",
48
52
  "@types/fs-extra": "^11.0.4",
49
53
  "@types/node": "^22.5.1",
50
- "@types/passport-google-oauth20": "^2.0.16",
51
54
  "@types/react": "^19.0.0",
52
55
  "@types/react-dom": "^19.0.1",
53
56
  "@types/socket.io": "^3.0.1",
54
57
  "@typescript-eslint/eslint-plugin": "^8.17.0",
55
58
  "@typescript-eslint/parser": "^8.17.0",
59
+ "eslint": "^9.37.0",
60
+ "prettier": "^3.6.2",
56
61
  "react": "^19.0.0",
57
62
  "react-dom": "^19.0.0"
58
63
  },
@@ -70,8 +75,6 @@
70
75
  "jiti": "^2.4.2",
71
76
  "mongodb": "^6.8.1",
72
77
  "open": "^10.1.0",
73
- "passport": "^0.7.0",
74
- "passport-google-oauth20": "^2.0.0",
75
78
  "socket.io": "^4.8.1",
76
79
  "socket.io-client": "^4.8.1",
77
80
  "tsup": "^8.3.6",
@@ -1 +0,0 @@
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","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","appAlias","environmentAlias","environmentId","serviceName","elasticApm","esTransport","ElasticsearchTransport","error","winston","getApm","getLogger","message","startTransaction","name","context","transaction","result","endTime","captureError"],"mappings":"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","file":"chunk-2QLNYYBR.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\n * @returns \n */\nexport function getConfig(key: ConfigKey) {\n return config[key]?.value;\n}\n\nexport function getPublicConfigs() {\n if (!isInitialized) {\n throw new Error('Config is not initialized: an attempt was made to access configs before they were loaded');\n }\n\n return Object.fromEntries(\n Object.entries(configSchema).filter(([_, schema]) => schema.isPublic).map(([key, schema]) => {\n return [key, {\n key,\n type: schema.type,\n value: config[key]?.value ?? schema.default,\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 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({ elasticCloudId, elasticApiKey }: { elasticCloudId: string, elasticApiKey: string }) {\n const originalStdoutWrite = process.stdout.write;\n const originalStderrWrite = process.stderr.write;\n\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 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\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}","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 { getAppAlias, getEnvironmentAlias, getEnvironmentId, getTelemetryServiceName, isTelemetryEnabled } 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(\n winston.format.json(),\n ),\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\n\n\nexport function getApm() {\n if (!apm) {\n throw new Error('APM is not initialized');\n }\n return apm;\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 } from '@/app/metrics';\nimport { isTelemetryEnabled } from '@/app/state';\n\nexport function logInfo(message: string, args: object) {\n if (isTelemetryEnabled()) {\n getLogger().info(message, args);\n }\n}\n\nexport function logError(message: string, args: object) {\n if (isTelemetryEnabled()) {\n getLogger().error(message, args);\n }\n}\n\ninterface WrappedTransaction {\n end(result?: string, context?: Record<string, any>): void;\n setContext(context: Record<string, any>): void;\n}\n\nexport function startTransaction(type: 'method' | 'cron' | 'ai' | 'custom', name: string, context?: Record<string, any>): 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: (result?: string, { endTime, context }: { endTime?: number, context?: Record<string, any> } = {}) => {\n if (context) {\n apm.setCustomContext(context);\n }\n transaction.end(result, endTime);\n },\n setContext: (context: Record<string, any>) => {\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,2 +0,0 @@
1
- function s(n){if(n instanceof Date)return {type:"date"};if(Array.isArray(n)){let e={};for(let r=0;r<n.length;r++){let t=n[r],o=s(t);o&&(e[r]=o);}return Object.keys(e).length>0?{type:"array",elements:e}:null}if(typeof n=="object"&&n!==null){let e={};for(let[r,t]of Object.entries(n)){let o=s(t);o&&(e[r]=o);}return Object.keys(e).length>0?{type:"object",props:e}:null}return null}function i(n,e){return e?e.type==="date"?new Date(n):e.type==="array"?n.map((r,t)=>i(r,e.elements[t])):e.type==="object"?Object.fromEntries(Object.entries(n).map(([r,t])=>[r,i(t,e.props[r])])):n:n}export{s as a,i as b};//# sourceMappingURL=chunk-DN5SVAO2.js.map
2
- //# sourceMappingURL=chunk-DN5SVAO2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/methods/serialize.ts"],"names":["getResponseTypeMap","result","elements","i","item","subTypeMap","props","key","value","reviveResponseTypes","data","typeMap","index"],"mappings":"AAAO,SAASA,EAAmBC,CAAAA,CAAa,CAC9C,GAAIA,CAAAA,YAAkB,KACpB,OAAO,CAAE,IAAA,CAAM,MAAO,EAGxB,GAAI,KAAA,CAAM,QAAQA,CAAM,CAAA,CAAG,CACzB,IAAMC,CAAAA,CAAgC,EAAC,CACvC,QAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAO,OAAQE,CAAAA,EAAAA,CAAK,CACtC,IAAMC,CAAAA,CAAOH,EAAOE,CAAC,CAAA,CACfE,EAAaL,CAAAA,CAAmBI,CAAI,EACtCC,CAAAA,GACFH,CAAAA,CAASC,CAAC,CAAA,CAAIE,GAElB,CACA,OAAO,MAAA,CAAO,IAAA,CAAKH,CAAQ,CAAA,CAAE,MAAA,CAAS,CAAA,CAAI,CACxC,KAAM,OAAA,CACN,QAAA,CAAAA,CACF,CAAA,CAAI,IACN,CAEA,GAAI,OAAOD,CAAAA,EAAW,QAAA,EAAYA,IAAW,IAAA,CAAM,CACjD,IAAMK,CAAAA,CAA6B,GACnC,IAAA,GAAW,CAACC,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQP,CAAM,CAAA,CAAG,CACjD,IAAMI,CAAAA,CAAaL,CAAAA,CAAmBQ,CAAK,CAAA,CACvCH,IACFC,CAAAA,CAAMC,CAAG,CAAA,CAAIF,CAAAA,EAEjB,CACA,OAAO,MAAA,CAAO,IAAA,CAAKC,CAAK,EAAE,MAAA,CAAS,CAAA,CAAI,CACrC,IAAA,CAAM,QAAA,CACN,MAAAA,CACF,CAAA,CAAI,IACN,CAEA,OAAO,IACT,CAEO,SAASG,CAAAA,CAA6BC,CAAAA,CAAWC,EAAkC,CACxF,OAAKA,CAAAA,CAIDA,CAAAA,CAAQ,OAAS,MAAA,CACZ,IAAI,KAAKD,CAAI,CAAA,CAGlBC,EAAQ,IAAA,GAAS,OAAA,CACZD,CAAAA,CAAK,GAAA,CAAI,CAACN,CAAAA,CAAWQ,CAAAA,GAAkBH,CAAAA,CAAoBL,CAAAA,CAAMO,EAAQ,QAAA,CAASC,CAAK,CAAC,CAAC,EAG9FD,CAAAA,CAAQ,IAAA,GAAS,SACZ,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQD,CAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAACH,CAAAA,CAAKC,CAAK,CAAA,GAAM,CAACD,EAAKE,CAAAA,CAAoBD,CAAAA,CAAOG,CAAAA,CAAQ,KAAA,CAAMJ,CAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAGtHG,EAfEA,CAgBX","file":"chunk-DN5SVAO2.js","sourcesContent":["export function getResponseTypeMap(result: any) {\n if (result instanceof Date) {\n return { type: 'date' };\n }\n\n if (Array.isArray(result)) {\n const elements: Record<string, any> = {};\n for (let i = 0; i < result.length; i++) {\n const item = result[i];\n const subTypeMap = getResponseTypeMap(item);\n if (subTypeMap) {\n elements[i] = subTypeMap;\n }\n }\n return Object.keys(elements).length > 0 ? {\n type: 'array',\n elements\n } : null;\n }\n\n if (typeof result === 'object' && result !== null) {\n const props: Record<string, any> = {};\n for (const [key, value] of Object.entries(result)) {\n const subTypeMap = getResponseTypeMap(value);\n if (subTypeMap) {\n props[key] = subTypeMap;\n }\n }\n return Object.keys(props).length > 0 ? {\n type: 'object',\n props\n } : null;\n }\n\n return null;\n}\n\nexport function reviveResponseTypes<T = any>(data: any, typeMap?: Record<string, any>): T {\n if (!typeMap) {\n return data;\n }\n\n if (typeMap.type === 'date') {\n return new Date(data) as T;\n }\n\n if (typeMap.type === 'array') {\n return data.map((item: any, index: number) => reviveResponseTypes(item, typeMap.elements[index]));\n }\n\n if (typeMap.type === 'object') {\n return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, reviveResponseTypes(value, typeMap.props[key])])) as T;\n }\n\n return data;\n}\n"]}
@@ -1,3 +0,0 @@
1
- var s="module",i="modelence",o="0.6.6",p="The Node.js Framework for Real-Time MongoDB Apps",r="dist/index.js",n="dist/global.d.ts",d={".":"./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"}},c=["dist","dist/bin"],l={modelence:"./dist/bin/modelence.js"},a={build:"tsup",dev:"tsup --watch",prepublishOnly:"npm run build",test:'echo "Error: no test specified" && exit 1',postversion:"git push && git push --tags"},m={type:"git",url:"git+https://github.com/modelence/modelence.git"},y="Modelence",u="SEE LICENSE IN LICENSE",g={url:"https://github.com/modelence/modelence/issues"},h="https://modelence.com",b={"@types/archiver":"^6.0.3","@types/bcrypt":"^5.0.2","@types/cookie-parser":"^1.4.9","@types/express":"^5.0.0","@types/fs-extra":"^11.0.4","@types/node":"^22.5.1","@types/passport-google-oauth20":"^2.0.16","@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",react:"^19.0.0","react-dom":"^19.0.0"},v={"@socket.io/mongo-adapter":"^0.4.0","@vitejs/plugin-react":"^4.3.4",archiver:"^7.0.1",bcrypt:"^5.1.1",commander:"^12.0.0","cookie-parser":"^1.4.7",dotenv:"^16.4.5","elastic-apm-node":"^4.8.0",express:"^4.21.0","fs-extra":"^11.2.0",jiti:"^2.4.2",mongodb:"^6.8.1",open:"^10.1.0",passport:"^0.7.0","passport-google-oauth20":"^2.0.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"},j={react:">=18.0.0","react-dom":">=18.0.0"},x={type:s,name:i,version:o,description:p,main:r,types:n,exports:d,files:c,bin:l,scripts:a,repository:m,author:y,license:u,bugs:g,homepage:h,devDependencies:b,dependencies:v,peerDependencies:j};
2
- export{s as a,i as b,o as c,p as d,r as e,n as f,d as g,c as h,l as i,a as j,m as k,y as l,u as m,g as n,h as o,b as p,v as q,j as r,x as s};//# sourceMappingURL=chunk-I4YP3GP3.js.map
3
- //# sourceMappingURL=chunk-I4YP3GP3.js.map
@@ -1 +0,0 @@
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":"AACE,IAAAA,CAAAA,CAAQ,SACRC,CAAAA,CAAQ,WAAA,CACRC,EAAW,OAAA,CACXC,CAAAA,CAAe,mDACfC,CAAAA,CAAQ,eAAA,CACRC,EAAS,kBAAA,CACTC,CAAAA,CAAW,CACT,GAAA,CAAK,iBAAA,CACL,WAAY,kBAAA,CACZ,UAAA,CAAY,kBAAA,CACZ,aAAA,CAAe,qBAAA,CACf,WAAA,CAAa,kBACb,SAAA,CAAW,CACT,MAAS,mBAAA,CACT,OAAA,CAAW,iBACb,CACF,CAAA,CACAC,CAAAA,CAAS,CACP,MAAA,CACA,UACF,EACAC,CAAAA,CAAO,CACL,UAAa,yBACf,CAAA,CACAC,EAAW,CACT,KAAA,CAAS,MAAA,CACT,GAAA,CAAO,cAAA,CACP,cAAA,CAAkB,gBAClB,IAAA,CAAQ,2CAAA,CACR,YAAe,6BACjB,CAAA,CACAC,EAAc,CACZ,IAAA,CAAQ,KAAA,CACR,GAAA,CAAO,gDACT,CAAA,CACAC,EAAU,WAAA,CACVC,CAAAA,CAAW,yBACXC,CAAAA,CAAQ,CACN,IAAO,+CACT,CAAA,CACAC,CAAAA,CAAY,uBAAA,CACZC,CAAAA,CAAmB,CACjB,kBAAmB,QAAA,CACnB,eAAA,CAAiB,SACjB,sBAAA,CAAwB,QAAA,CACxB,iBAAkB,QAAA,CAClB,iBAAA,CAAmB,SAAA,CACnB,aAAA,CAAe,SAAA,CACf,gCAAA,CAAkC,UAClC,cAAA,CAAgB,SAAA,CAChB,mBAAoB,SAAA,CACpB,kBAAA,CAAoB,SACpB,kCAAA,CAAoC,SAAA,CACpC,2BAAA,CAA6B,SAAA,CAC7B,KAAA,CAAS,SAAA,CACT,YAAa,SACf,CAAA,CACAC,EAAgB,CACd,0BAAA,CAA4B,SAC5B,sBAAA,CAAwB,QAAA,CACxB,QAAA,CAAY,QAAA,CACZ,MAAA,CAAU,QAAA,CACV,UAAa,SAAA,CACb,eAAA,CAAiB,SACjB,MAAA,CAAU,SAAA,CACV,mBAAoB,QAAA,CACpB,OAAA,CAAW,SAAA,CACX,UAAA,CAAY,SAAA,CACZ,IAAA,CAAQ,SACR,OAAA,CAAW,QAAA,CACX,KAAQ,SAAA,CACR,QAAA,CAAY,SACZ,yBAAA,CAA2B,QAAA,CAC3B,WAAA,CAAa,QAAA,CACb,kBAAA,CAAoB,QAAA,CACpB,KAAQ,QAAA,CACR,GAAA,CAAO,UACP,UAAA,CAAc,QAAA,CACd,KAAQ,QAAA,CACR,oBAAA,CAAsB,QAAA,CACtB,OAAA,CAAW,SAAA,CACX,uBAAA,CAAyB,UACzB,GAAA,CAAO,SAAA,CACP,QAAW,QACb,CAAA,CACAC,EAAoB,CAClB,KAAA,CAAS,UAAA,CACT,WAAA,CAAa,UACf,CAAA,CAzFFC,EAAA,CACE,IAAA,CAAAlB,EACA,IAAA,CAAAC,CAAAA,CACA,QAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CAWA,MAAAC,CAAAA,CAIA,GAAA,CAAAC,EAGA,OAAA,CAAAC,CAAAA,CAOA,UAAA,CAAAC,CAAAA,CAIA,MAAA,CAAAC,CAAAA,CACA,QAAAC,CAAAA,CACA,IAAA,CAAAC,EAGA,QAAA,CAAAC,CAAAA,CACA,gBAAAC,CAAAA,CAgBA,YAAA,CAAAC,CAAAA,CA4BA,gBAAA,CAAAC,CAIF","file":"chunk-I4YP3GP3.js","sourcesContent":["{\n \"type\": \"module\",\n \"name\": \"modelence\",\n \"version\": \"0.6.6\",\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 \"prepublishOnly\": \"npm run build\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"postversion\": \"git push && git push --tags\"\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\": \"^5.0.2\",\n \"@types/cookie-parser\": \"^1.4.9\",\n \"@types/express\": \"^5.0.0\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/node\": \"^22.5.1\",\n \"@types/passport-google-oauth20\": \"^2.0.16\",\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 \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\"\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\": \"^5.1.1\",\n \"commander\": \"^12.0.0\",\n \"cookie-parser\": \"^1.4.7\",\n \"dotenv\": \"^16.4.5\",\n \"elastic-apm-node\": \"^4.8.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 \"passport\": \"^0.7.0\",\n \"passport-google-oauth20\": \"^2.0.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"]}