modelence 0.2.1 → 0.4.2

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "modelence",
4
- "version": "0.2.1",
4
+ "version": "0.4.2",
5
5
  "description": "Full-stack JavaScript framework for startups",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/global.d.ts",
@@ -9,14 +9,14 @@
9
9
  ".": "./dist/index.js",
10
10
  "./client": "./dist/client.js",
11
11
  "./server": "./dist/server.js",
12
- "./cli": "./dist/cli/setup.js"
12
+ "./mongodb": "./dist/mongo.js"
13
13
  },
14
14
  "files": [
15
15
  "dist",
16
- "dist/cli"
16
+ "dist/bin"
17
17
  ],
18
18
  "bin": {
19
- "modelence-setup": "./dist/cli/setup.js"
19
+ "modelence": "./dist/bin/modelence.js"
20
20
  },
21
21
  "scripts": {
22
22
  "build": "tsup",
@@ -36,37 +36,41 @@
36
36
  },
37
37
  "homepage": "https://modelence.com",
38
38
  "devDependencies": {
39
+ "@types/archiver": "^6.0.3",
39
40
  "@types/bcrypt": "^5.0.2",
40
41
  "@types/express": "^5.0.0",
41
- "@types/node": "^22.5.1",
42
42
  "@types/fs-extra": "^11.0.4",
43
+ "@types/node": "^22.5.1",
43
44
  "@types/react": "^19.0.0",
44
45
  "@types/react-dom": "^19.0.1",
45
46
  "@typescript-eslint/eslint-plugin": "^8.17.0",
46
47
  "@typescript-eslint/parser": "^8.17.0",
47
48
  "react": "^19.0.0",
48
49
  "react-dom": "^19.0.0",
49
- "tsup": "^8.3.5",
50
50
  "typedoc": "^0.27.6",
51
51
  "typedoc-plugin-markdown": "^4.4.1",
52
52
  "typescript": "^5.7.2"
53
53
  },
54
54
  "dependencies": {
55
+ "@octokit/rest": "^20.0.2",
55
56
  "@vitejs/plugin-react": "^4.3.4",
57
+ "archiver": "^7.0.1",
56
58
  "bcrypt": "^5.1.1",
57
59
  "commander": "^12.0.0",
58
60
  "dotenv": "^16.4.5",
59
61
  "elastic-apm-node": "^4.8.0",
60
62
  "express": "^4.21.0",
63
+ "fs-extra": "^11.2.0",
64
+ "jiti": "^2.4.2",
61
65
  "mongodb": "^6.8.1",
66
+ "open": "^10.1.0",
67
+ "tsup": "^8.3.6",
62
68
  "vite": "^6.0.3",
63
69
  "vite-plugin-eslint": "^1.8.1",
64
70
  "winston": "^3.15.0",
65
71
  "winston-elasticsearch": "^0.19.0",
66
72
  "zod": "^3.23.8",
67
- "zustand": "^5.0.2",
68
- "@octokit/rest": "^20.0.2",
69
- "fs-extra": "^11.2.0"
73
+ "zustand": "^5.0.2"
70
74
  },
71
75
  "peerDependencies": {
72
76
  "react": ">=18.0.0",
package/dist/cli/setup.js DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import {Command}from'commander';import {promises}from'fs';import {join}from'path';import {parse}from'dotenv';import {createInterface}from'readline';var i=".modelence.env";async function m(n,e){let o=await fetch(`${e}/api/setup`,{method:"GET",headers:{"X-Modelence-Setup-Token":n}});if(!o.ok){let t=await o.text();throw new Error(t||`Request failed with status ${o.status}`)}return o.json()}async function f(){let n=createInterface({input:process.stdin,output:process.stdout});return new Promise(e=>{n.question(`Warning: ${i} already exists. Do you want to overwrite it? (y/N) `,o=>{n.close(),e(o.toLowerCase()==="y");});})}function g(n){return String(n).replace(/"/g,'\\"')}async function w(n){try{let e=n.replace(".env",".backup.env");await promises.copyFile(n,e),console.log(`Backup created at ${e}`);}catch(e){console.warn("Failed to create backup file:",e);}}var v=new Command().name("modelence-setup").description("Setup Modelence environment variables").requiredOption("-t, --token <token>","Modelence setup token").option("-h, --host <host>","Modelence host","https://cloud.modelence.com").action(async n=>{try{let e=join(process.cwd(),i),o={};try{let r=await promises.readFile(e,"utf8");o=parse(r),await w(e),await f()||(console.log("Setup canceled"),process.exit(0));}catch{}console.log("Fetching service configuration...");let t=await m(n.token,n.host),a={...o,MODELENCE_CRON_ENABLED:"true",MODELENCE_TELEMETRY_ENABLED:"false",MODELENCE_DEPLOYMENT_ID:t.deploymentId,MODELENCE_SERVICE_ENDPOINT:n.host,MODELENCE_SERVICE_TOKEN:t.serviceToken,MODELENCE_CONTAINER_ID:t.containerId},E=Object.entries(a).map(([r,c])=>`${r}="${g(c)}"`).join(`
3
- `);await promises.writeFile(e,E.trim()+`
4
- `),console.log(`Successfully configured ${i} file`);}catch(e){console.error(`Setup failed: ${e instanceof Error?e.message:"Unknown error"}`),process.exit(1);}});v.parse(process.argv);//# sourceMappingURL=setup.js.map
5
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../cli/setup.ts"],"names":["MODELENCE_ENV_FILE","fetchServiceConfig","setupToken","host","response","errorText","confirmOverwrite","rl","createInterface","resolve","answer","escapeEnvValue","value","backupEnvFile","envPath","backupPath","fs","error","program","Command","options","join","existingEnv","envContent","parseEnv","config","newEnv","key"],"mappings":"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","file":"setup.js","sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseEnv } from 'dotenv';\nimport { createInterface } from 'readline';\n\nconst MODELENCE_ENV_FILE = '.modelence.env';\n\ninterface SetupResponse {\n deploymentId: string;\n serviceEndpoint: string;\n serviceToken: string;\n containerId: string;\n}\n\nasync function fetchServiceConfig(setupToken: string, host: string): Promise<SetupResponse> {\n const response = await fetch(`${host}/api/setup`, {\n method: 'GET',\n headers: {\n 'X-Modelence-Setup-Token': setupToken,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(errorText || `Request failed with status ${response.status}`);\n }\n\n return response.json();\n}\n\nasync function confirmOverwrite(): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(`Warning: ${MODELENCE_ENV_FILE} already exists. Do you want to overwrite it? (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y');\n });\n });\n}\n\nfunction escapeEnvValue(value: string | number): string {\n // Convert to string and escape quotes\n return String(value).replace(/\"/g, '\\\\\"');\n}\n\nasync function backupEnvFile(envPath: string): Promise<void> {\n try {\n const backupPath = envPath.replace('.env', '.backup.env');\n await fs.copyFile(envPath, backupPath);\n console.log(`Backup created at ${backupPath}`);\n } catch (error) {\n console.warn('Failed to create backup file:', error);\n }\n}\n\nconst program = new Command()\n .name('modelence-setup')\n .description('Setup Modelence environment variables')\n .requiredOption('-t, --token <token>', 'Modelence setup token')\n .option('-h, --host <host>', 'Modelence host', 'https://cloud.modelence.com')\n .action(async (options) => {\n try {\n const envPath = join(process.cwd(), MODELENCE_ENV_FILE);\n let existingEnv = {};\n\n try {\n // Check if .modelence.env exists\n const envContent = await fs.readFile(envPath, 'utf8');\n existingEnv = parseEnv(envContent);\n\n // Create backup before overwriting\n await backupEnvFile(envPath);\n\n // Ask for confirmation before overwriting\n const shouldContinue = await confirmOverwrite();\n if (!shouldContinue) {\n console.log('Setup canceled');\n process.exit(0);\n }\n } catch (error) {\n // File doesn't exist, we'll create it\n }\n\n // Fetch service configuration using setup token\n console.log('Fetching service configuration...');\n const config = await fetchServiceConfig(options.token, options.host);\n\n // Update environment variables\n const newEnv = {\n ...existingEnv,\n MODELENCE_CRON_ENABLED: 'true',\n MODELENCE_TELEMETRY_ENABLED: 'false', // TODO: Remove after all usages are gone\n MODELENCE_DEPLOYMENT_ID: config.deploymentId,\n MODELENCE_SERVICE_ENDPOINT: options.host, // TODO: Replace with config.serviceEndpoint in the future\n MODELENCE_SERVICE_TOKEN: config.serviceToken,\n MODELENCE_CONTAINER_ID: config.containerId,\n };\n\n // Convert to .env format with escaped values\n const envContent = Object.entries(newEnv)\n .map(([key, value]) => `${key}=\"${escapeEnvValue(value)}\"`)\n .join('\\n');\n\n // Write the file\n await fs.writeFile(envPath, envContent.trim() + '\\n');\n console.log(`Successfully configured ${MODELENCE_ENV_FILE} file`);\n\n } catch (error: unknown) {\n console.error(`Setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);"]}
package/dist/cli.d.ts DELETED
@@ -1 +0,0 @@
1
- #!/usr/bin/env node