motia 0.16.0-beta.175 → 0.16.0-beta.177

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,7 +1,7 @@
1
1
  import { version } from "../version.mjs";
2
2
  import { executeCommand } from "../utils/execute-command.mjs";
3
3
  import { checkIfDirectoryExists, checkIfFileExists } from "./utils.mjs";
4
- import { getPackageManager } from "../utils/get-package-manager.mjs";
4
+ import { getPackageManager, getPackageManagerFromEnv } from "../utils/get-package-manager.mjs";
5
5
  import { generateTypes } from "../generate-types.mjs";
6
6
  import { pythonInstall } from "../install.mjs";
7
7
  import { pluginDependencies } from "../plugins/plugin-dependencies.mjs";
@@ -19,7 +19,8 @@ const installRequiredDependencies = async (packageManager, rootDir, context) =>
19
19
  const installCommand = {
20
20
  npm: "npm install --save",
21
21
  yarn: "yarn add",
22
- pnpm: "pnpm add"
22
+ pnpm: "pnpm add",
23
+ bun: "bun add"
23
24
  }[packageManager];
24
25
  const dependencies = [
25
26
  `motia@${version}`,
@@ -40,13 +41,12 @@ const installRequiredDependencies = async (packageManager, rootDir, context) =>
40
41
  console.error("❌ Failed to install dependencies:", error);
41
42
  }
42
43
  };
43
- const preparePackageManager = async (rootDir, context) => {
44
- let packageManager = "npm";
45
- const detectedPackageManager = getPackageManager(rootDir);
46
- if (detectedPackageManager !== "unknown") {
47
- context.log("package-manager-detected", (message) => message.tag("info").append("Detected package manager").append(detectedPackageManager, "gray"));
48
- packageManager = detectedPackageManager;
49
- } else context.log("package-manager-using-default", (message) => message.tag("info").append("Using default package manager").append(packageManager, "gray"));
44
+ const preparePackageManager = async (rootDir, context, detectFromParent = false) => {
45
+ const detectionDir = detectFromParent ? process.cwd() : rootDir;
46
+ const envPackageManager = getPackageManagerFromEnv();
47
+ const packageManager = getPackageManager(detectionDir, detectFromParent);
48
+ if (!envPackageManager && packageManager === "npm" && !checkIfFileExists(detectionDir, "package-lock.json")) context.log("package-manager-using-default", (message) => message.tag("info").append("Using default package manager").append(packageManager, "gray"));
49
+ else context.log("package-manager-detected", (message) => message.tag("info").append("Detected package manager").append(packageManager, "gray"));
50
50
  return packageManager;
51
51
  };
52
52
  const installNodeDependencies = async (rootDir, context) => {
@@ -162,7 +162,23 @@ const create = async ({ projectName, template, cursorEnabled, context, skipRedis
162
162
  packageManager = await installNodeDependencies(rootDir, context);
163
163
  if (template.includes("python") || template.includes("multilang")) await pythonInstall({ baseDir: rootDir });
164
164
  await generateTypes(rootDir);
165
- } else packageManager = await preparePackageManager(rootDir, context);
165
+ } else {
166
+ packageManager = await preparePackageManager(rootDir, context, true);
167
+ context.log("installing-plugin-dependencies", (message) => message.tag("info").append("Installing plugin dependencies..."));
168
+ const installCommand = {
169
+ npm: "npm install",
170
+ yarn: "yarn",
171
+ pnpm: "pnpm install",
172
+ bun: "bun install"
173
+ }[packageManager];
174
+ try {
175
+ await executeCommand(installCommand, rootDir);
176
+ context.log("plugin-dependencies-installed", (message) => message.tag("success").append("Plugin dependencies installed"));
177
+ } catch (error) {
178
+ context.log("failed-to-install-plugin-dependencies", (message) => message.tag("failed").append("Failed to install plugin dependencies"));
179
+ console.error(error);
180
+ }
181
+ }
166
182
  const projectDirName = path.basename(rootDir);
167
183
  const devCommand = `${packageManager} run dev`;
168
184
  const port = 3e3;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["packageManager: string"],"sources":["../../src/create/index.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport pc from 'picocolors'\nimport { fileURLToPath } from 'url'\nimport type { CliContext, Message } from '../cloud/config-utils'\nimport { generateTypes } from '../generate-types'\nimport { pythonInstall } from '../install'\nimport { pluginDependencies } from '../plugins/plugin-dependencies'\nimport { executeCommand } from '../utils/execute-command'\nimport { getPackageManager } from '../utils/get-package-manager'\nimport { version } from '../version'\nimport { pullRules } from './pull-rules'\nimport { setupTemplate } from './setup-template'\nimport { checkIfDirectoryExists, checkIfFileExists } from './utils'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst installRequiredDependencies = async (packageManager: string, rootDir: string, context: CliContext) => {\n context.log('installing-dependencies', (message: Message) => message.tag('info').append('Installing dependencies...'))\n\n const installCommand = {\n npm: 'npm install --save',\n yarn: 'yarn add',\n pnpm: 'pnpm add',\n }[packageManager]\n\n const dependencies = [\n `motia@${version}`,\n 'zod@4.1.12',\n `@motiadev/adapter-bullmq-events@${version}`,\n ...pluginDependencies.map((dep: string) => `${dep}@${version}`),\n ].join(' ')\n\n const devDependencies = ['ts-node@10.9.2', 'typescript@5.7.3', '@types/react@19.1.1'].join(' ')\n\n try {\n await executeCommand(`${installCommand} ${dependencies}`, rootDir)\n await executeCommand(`${installCommand} -D ${devDependencies}`, rootDir)\n\n context.log('dependencies-installed', (message: Message) => message.tag('success').append('Dependencies installed'))\n } catch (error) {\n console.error('❌ Failed to install dependencies:', error)\n }\n}\n\nconst preparePackageManager = async (rootDir: string, context: CliContext) => {\n let packageManager = 'npm'\n const detectedPackageManager = getPackageManager(rootDir)\n\n if (detectedPackageManager !== 'unknown') {\n context.log('package-manager-detected', (message: Message) =>\n message.tag('info').append('Detected package manager').append(detectedPackageManager, 'gray'),\n )\n packageManager = detectedPackageManager\n } else {\n context.log('package-manager-using-default', (message: Message) =>\n message.tag('info').append('Using default package manager').append(packageManager, 'gray'),\n )\n }\n\n return packageManager\n}\n\nconst installNodeDependencies = async (rootDir: string, context: CliContext) => {\n const packageManager = await preparePackageManager(rootDir, context)\n\n await installRequiredDependencies(packageManager, rootDir, context).catch((error: unknown) => {\n context.log('failed-to-install-dependencies', (message: Message) =>\n message.tag('failed').append('Failed to install dependencies'),\n )\n console.error(error)\n })\n\n return packageManager\n}\n\ntype Args = {\n projectName: string\n template: string\n cursorEnabled: boolean\n context: CliContext\n skipTutorialTemplates?: boolean\n skipRedis?: boolean\n}\n\nexport const create = async ({\n projectName,\n template,\n cursorEnabled,\n context,\n skipRedis = false,\n}: Args): Promise<void> => {\n console.log(\n '\\n\\n' +\n `\n _____ ______ ______ ______\n /'\\\\_/\\`\\\\/\\\\ __\\`\\\\/\\\\__ _\\\\/\\\\__ _\\\\ /\\\\ _ \\\\\n /\\\\ \\\\ \\\\ \\\\/\\\\ \\\\/_/\\\\ \\\\/\\\\/_/\\\\ \\\\/ \\\\ \\\\ \\\\L\\\\ \\\\\n \\\\ \\\\ \\\\__\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ __ \\\\\n \\\\ \\\\ \\\\_/\\\\ \\\\ \\\\ \\\\_\\\\ \\\\ \\\\ \\\\ \\\\ \\\\_\\\\ \\\\__\\\\ \\\\ \\\\/\\\\ \\\\\n \\\\ \\\\_\\\\\\\\ \\\\_\\\\ \\\\_____\\\\ \\\\ \\\\_\\\\ /\\\\_____\\\\\\\\ \\\\_\\\\ \\\\_\\\\\n \\\\/_/ \\\\/_/\\\\/_____/ \\\\/_/ \\\\/_____/ \\\\/_/\\\\/_/\n ` +\n '\\n\\n',\n )\n\n const isCurrentDir = projectName === '.' || projectName === './' || projectName === '.\\\\'\n const rootDir = isCurrentDir ? process.cwd() : path.join(process.cwd(), projectName)\n const isPluginTemplate = template === 'plugin'\n\n process.env.REDISMS_DISABLE_POSTINSTALL = '1'\n if (!isCurrentDir && !checkIfDirectoryExists(rootDir)) {\n fs.mkdirSync(path.join(rootDir))\n context.log('directory-created', (message: Message) =>\n message.tag('success').append('Directory created ').append(projectName, 'gray'),\n )\n } else {\n context.log('directory-using', (message: Message) => message.tag('info').append('Using current directory'))\n }\n\n // Plugin template handles package.json differently (via template)\n if (!isPluginTemplate && !checkIfFileExists(rootDir, 'package.json')) {\n const finalProjectName =\n !projectName || projectName === '.' || projectName === './' || projectName === '.\\\\'\n ? path.basename(process.cwd())\n : projectName.trim()\n\n const packageJsonContent = {\n name: finalProjectName,\n description: '',\n type: 'module',\n scripts: {\n postinstall: 'motia install',\n dev: 'motia dev',\n start: 'motia start',\n 'generate-types': 'motia generate-types',\n build: 'motia build',\n clean: 'rm -rf dist node_modules python_modules .motia .mermaid',\n //'generate:config': 'motia get-config --output ./', TODO: doesnt work at the moment\n },\n keywords: ['motia'],\n }\n\n fs.writeFileSync(path.join(rootDir, 'package.json'), JSON.stringify(packageJsonContent, null, 2))\n\n context.log('package-json-created', (message: Message) =>\n message.tag('success').append('File').append('package.json', 'cyan').append('has been created.'),\n )\n } else if (!isPluginTemplate) {\n const packageJsonPath = path.join(rootDir, 'package.json')\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n\n if (!packageJson.scripts) {\n packageJson.scripts = {}\n }\n\n if (!packageJson.scripts.dev) {\n packageJson.scripts.dev = 'motia dev'\n } else {\n packageJson.scripts.olddev = packageJson.scripts.dev\n packageJson.scripts.dev = 'motia dev'\n context.log('dev-command-already-exists', (message: Message) =>\n message.tag('warning').append('dev command already exists in package.json'),\n )\n }\n\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))\n context.log('dev-command-updated', (message: Message) =>\n message\n .tag('success')\n .append('Updated')\n .append('dev', 'gray')\n .append('command to')\n .append('package.json', 'gray'),\n )\n }\n\n // Plugin template handles tsconfig.json via template\n if (!isPluginTemplate && !checkIfFileExists(rootDir, 'tsconfig.json')) {\n const tsconfigContent = {\n compilerOptions: {\n target: 'ES2020',\n module: 'ESNext',\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n noEmit: true,\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n allowJs: true,\n outDir: 'dist',\n rootDir: '.',\n baseUrl: '.',\n jsx: 'react-jsx',\n },\n include: ['**/*.ts', 'motia.config.ts', '**/*.tsx', 'types.d.ts', '**/*.jsx'],\n exclude: ['node_modules', 'dist', 'tests'],\n }\n\n fs.writeFileSync(path.join(rootDir, 'tsconfig.json'), JSON.stringify(tsconfigContent, null, 2))\n context.log('tsconfig-json-created', (message: Message) =>\n message.tag('success').append('File').append('tsconfig.json', 'cyan').append('has been created.'),\n )\n }\n\n // Plugin template handles .gitignore via template\n if (!isPluginTemplate && !checkIfFileExists(rootDir, '.gitignore')) {\n const gitignoreContent = [\n 'node_modules',\n 'python_modules',\n '.venv',\n 'venv',\n '.motia',\n '.mermaid',\n 'dist',\n '*.pyc',\n ].join('\\n')\n\n fs.writeFileSync(path.join(rootDir, '.gitignore'), gitignoreContent)\n context.log('gitignore-created', (message: Message) =>\n message.tag('success').append('File').append('.gitignore', 'cyan').append('has been created.'),\n )\n }\n\n // Skip cursor rules for plugin template\n if (!isPluginTemplate && cursorEnabled) {\n await pullRules({ force: true, rootDir }, context)\n }\n\n if (template) {\n await setupTemplate(template, rootDir, context)\n }\n\n if (!isPluginTemplate && skipRedis) {\n const motiaConfigPath = path.join(rootDir, 'motia.config.ts')\n\n const templatePath = path.join(__dirname, 'templates/motia.config.external-redis.ts.txt')\n const templateContent = fs.readFileSync(templatePath, 'utf-8')\n fs.writeFileSync(motiaConfigPath, templateContent)\n context.log('motia-config-created', (message: Message) =>\n message.tag('success').append('File').append('motia.config.ts', 'cyan').append('has been created.'),\n )\n }\n\n let packageManager: string\n if (!isPluginTemplate) {\n packageManager = await installNodeDependencies(rootDir, context)\n\n if (template.includes('python') || template.includes('multilang')) {\n await pythonInstall({ baseDir: rootDir })\n }\n\n await generateTypes(rootDir)\n } else {\n // For plugin template, just detect the package manager\n packageManager = await preparePackageManager(rootDir, context)\n }\n\n const projectDirName = path.basename(rootDir)\n const devCommand = `${packageManager} run dev`\n const port = 3000\n const cdCommand = isCurrentDir ? '' : `${pc.cyan(`cd ${projectDirName}`)}\\n `\n\n context.log('success-blank', (message) => message.text(''))\n context.log('success-header', (message) =>\n message.text(`${pc.green('✨')} ${pc.bold('All set! Your project is ready to go.')}`),\n )\n context.log('success-blank-2', (message) => message.text(''))\n context.log('success-get-started', (message) => message.text('Get started:'))\n context.log('success-blank-3', (message) => message.text(''))\n context.log('success-commands', (message) => message.text(` ${cdCommand}${pc.cyan(devCommand)}`))\n context.log('success-blank-4', (message) => message.text(''))\n context.log('success-open', (message) => message.text(`Then open ${pc.cyan(`http://localhost:${port}`)}`))\n context.log('success-blank-5', (message: Message) => message.text(''))\n context.log('success-docs', (message) => message.text(`Docs: ${pc.cyan('https://www.motia.dev/docs')}`))\n context.log('success-blank-6', (message) => message.text(''))\n if (skipRedis) {\n context.log('redis-skip-warning', (message: Message) =>\n message\n .tag('warning')\n .append(\n '⚠️ You skipped Redis binary installation. Make sure to provide a Redis connection before running Motia.',\n ),\n )\n context.log('success-blank-7', (message) => message.text(''))\n }\n context.log('success-signoff', (message) => message.text('Happy coding! 🚀'))\n context.log('success-blank-8', (message) => message.text(''))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["packageManager: string"],"sources":["../../src/create/index.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport pc from 'picocolors'\nimport { fileURLToPath } from 'url'\nimport type { CliContext, Message } from '../cloud/config-utils'\nimport { generateTypes } from '../generate-types'\nimport { pythonInstall } from '../install'\nimport { pluginDependencies } from '../plugins/plugin-dependencies'\nimport { executeCommand } from '../utils/execute-command'\nimport { getPackageManager, getPackageManagerFromEnv } from '../utils/get-package-manager'\nimport { version } from '../version'\nimport { pullRules } from './pull-rules'\nimport { setupTemplate } from './setup-template'\nimport { checkIfDirectoryExists, checkIfFileExists } from './utils'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst installRequiredDependencies = async (packageManager: string, rootDir: string, context: CliContext) => {\n context.log('installing-dependencies', (message: Message) => message.tag('info').append('Installing dependencies...'))\n\n const installCommand = {\n npm: 'npm install --save',\n yarn: 'yarn add',\n pnpm: 'pnpm add',\n bun: 'bun add',\n }[packageManager]\n\n const dependencies = [\n `motia@${version}`,\n 'zod@4.1.12',\n `@motiadev/adapter-bullmq-events@${version}`,\n ...pluginDependencies.map((dep: string) => `${dep}@${version}`),\n ].join(' ')\n\n const devDependencies = ['ts-node@10.9.2', 'typescript@5.7.3', '@types/react@19.1.1'].join(' ')\n\n try {\n await executeCommand(`${installCommand} ${dependencies}`, rootDir)\n await executeCommand(`${installCommand} -D ${devDependencies}`, rootDir)\n\n context.log('dependencies-installed', (message: Message) => message.tag('success').append('Dependencies installed'))\n } catch (error) {\n console.error('❌ Failed to install dependencies:', error)\n }\n}\n\nconst preparePackageManager = async (rootDir: string, context: CliContext, detectFromParent = false) => {\n const detectionDir = detectFromParent ? process.cwd() : rootDir\n const envPackageManager = getPackageManagerFromEnv()\n const packageManager = getPackageManager(detectionDir, detectFromParent)\n\n const isFallback =\n !envPackageManager && packageManager === 'npm' && !checkIfFileExists(detectionDir, 'package-lock.json')\n\n if (isFallback) {\n context.log('package-manager-using-default', (message: Message) =>\n message.tag('info').append('Using default package manager').append(packageManager, 'gray'),\n )\n } else {\n context.log('package-manager-detected', (message: Message) =>\n message.tag('info').append('Detected package manager').append(packageManager, 'gray'),\n )\n }\n\n return packageManager\n}\n\nconst installNodeDependencies = async (rootDir: string, context: CliContext) => {\n const packageManager = await preparePackageManager(rootDir, context)\n\n await installRequiredDependencies(packageManager, rootDir, context).catch((error: unknown) => {\n context.log('failed-to-install-dependencies', (message: Message) =>\n message.tag('failed').append('Failed to install dependencies'),\n )\n console.error(error)\n })\n\n return packageManager\n}\n\ntype Args = {\n projectName: string\n template: string\n cursorEnabled: boolean\n context: CliContext\n skipTutorialTemplates?: boolean\n skipRedis?: boolean\n}\n\nexport const create = async ({\n projectName,\n template,\n cursorEnabled,\n context,\n skipRedis = false,\n}: Args): Promise<void> => {\n console.log(\n '\\n\\n' +\n `\n _____ ______ ______ ______\n /'\\\\_/\\`\\\\/\\\\ __\\`\\\\/\\\\__ _\\\\/\\\\__ _\\\\ /\\\\ _ \\\\\n /\\\\ \\\\ \\\\ \\\\/\\\\ \\\\/_/\\\\ \\\\/\\\\/_/\\\\ \\\\/ \\\\ \\\\ \\\\L\\\\ \\\\\n \\\\ \\\\ \\\\__\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ __ \\\\\n \\\\ \\\\ \\\\_/\\\\ \\\\ \\\\ \\\\_\\\\ \\\\ \\\\ \\\\ \\\\ \\\\_\\\\ \\\\__\\\\ \\\\ \\\\/\\\\ \\\\\n \\\\ \\\\_\\\\\\\\ \\\\_\\\\ \\\\_____\\\\ \\\\ \\\\_\\\\ /\\\\_____\\\\\\\\ \\\\_\\\\ \\\\_\\\\\n \\\\/_/ \\\\/_/\\\\/_____/ \\\\/_/ \\\\/_____/ \\\\/_/\\\\/_/\n ` +\n '\\n\\n',\n )\n\n const isCurrentDir = projectName === '.' || projectName === './' || projectName === '.\\\\'\n const rootDir = isCurrentDir ? process.cwd() : path.join(process.cwd(), projectName)\n const isPluginTemplate = template === 'plugin'\n\n process.env.REDISMS_DISABLE_POSTINSTALL = '1'\n if (!isCurrentDir && !checkIfDirectoryExists(rootDir)) {\n fs.mkdirSync(path.join(rootDir))\n context.log('directory-created', (message: Message) =>\n message.tag('success').append('Directory created ').append(projectName, 'gray'),\n )\n } else {\n context.log('directory-using', (message: Message) => message.tag('info').append('Using current directory'))\n }\n\n // Plugin template handles package.json differently (via template)\n if (!isPluginTemplate && !checkIfFileExists(rootDir, 'package.json')) {\n const finalProjectName =\n !projectName || projectName === '.' || projectName === './' || projectName === '.\\\\'\n ? path.basename(process.cwd())\n : projectName.trim()\n\n const packageJsonContent = {\n name: finalProjectName,\n description: '',\n type: 'module',\n scripts: {\n postinstall: 'motia install',\n dev: 'motia dev',\n start: 'motia start',\n 'generate-types': 'motia generate-types',\n build: 'motia build',\n clean: 'rm -rf dist node_modules python_modules .motia .mermaid',\n //'generate:config': 'motia get-config --output ./', TODO: doesnt work at the moment\n },\n keywords: ['motia'],\n }\n\n fs.writeFileSync(path.join(rootDir, 'package.json'), JSON.stringify(packageJsonContent, null, 2))\n\n context.log('package-json-created', (message: Message) =>\n message.tag('success').append('File').append('package.json', 'cyan').append('has been created.'),\n )\n } else if (!isPluginTemplate) {\n const packageJsonPath = path.join(rootDir, 'package.json')\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n\n if (!packageJson.scripts) {\n packageJson.scripts = {}\n }\n\n if (!packageJson.scripts.dev) {\n packageJson.scripts.dev = 'motia dev'\n } else {\n packageJson.scripts.olddev = packageJson.scripts.dev\n packageJson.scripts.dev = 'motia dev'\n context.log('dev-command-already-exists', (message: Message) =>\n message.tag('warning').append('dev command already exists in package.json'),\n )\n }\n\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))\n context.log('dev-command-updated', (message: Message) =>\n message\n .tag('success')\n .append('Updated')\n .append('dev', 'gray')\n .append('command to')\n .append('package.json', 'gray'),\n )\n }\n\n // Plugin template handles tsconfig.json via template\n if (!isPluginTemplate && !checkIfFileExists(rootDir, 'tsconfig.json')) {\n const tsconfigContent = {\n compilerOptions: {\n target: 'ES2020',\n module: 'ESNext',\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n noEmit: true,\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n allowJs: true,\n outDir: 'dist',\n rootDir: '.',\n baseUrl: '.',\n jsx: 'react-jsx',\n },\n include: ['**/*.ts', 'motia.config.ts', '**/*.tsx', 'types.d.ts', '**/*.jsx'],\n exclude: ['node_modules', 'dist', 'tests'],\n }\n\n fs.writeFileSync(path.join(rootDir, 'tsconfig.json'), JSON.stringify(tsconfigContent, null, 2))\n context.log('tsconfig-json-created', (message: Message) =>\n message.tag('success').append('File').append('tsconfig.json', 'cyan').append('has been created.'),\n )\n }\n\n // Plugin template handles .gitignore via template\n if (!isPluginTemplate && !checkIfFileExists(rootDir, '.gitignore')) {\n const gitignoreContent = [\n 'node_modules',\n 'python_modules',\n '.venv',\n 'venv',\n '.motia',\n '.mermaid',\n 'dist',\n '*.pyc',\n ].join('\\n')\n\n fs.writeFileSync(path.join(rootDir, '.gitignore'), gitignoreContent)\n context.log('gitignore-created', (message: Message) =>\n message.tag('success').append('File').append('.gitignore', 'cyan').append('has been created.'),\n )\n }\n\n // Skip cursor rules for plugin template\n if (!isPluginTemplate && cursorEnabled) {\n await pullRules({ force: true, rootDir }, context)\n }\n\n if (template) {\n await setupTemplate(template, rootDir, context)\n }\n\n if (!isPluginTemplate && skipRedis) {\n const motiaConfigPath = path.join(rootDir, 'motia.config.ts')\n\n const templatePath = path.join(__dirname, 'templates/motia.config.external-redis.ts.txt')\n const templateContent = fs.readFileSync(templatePath, 'utf-8')\n fs.writeFileSync(motiaConfigPath, templateContent)\n context.log('motia-config-created', (message: Message) =>\n message.tag('success').append('File').append('motia.config.ts', 'cyan').append('has been created.'),\n )\n }\n\n let packageManager: string\n if (!isPluginTemplate) {\n packageManager = await installNodeDependencies(rootDir, context)\n\n if (template.includes('python') || template.includes('multilang')) {\n await pythonInstall({ baseDir: rootDir })\n }\n\n await generateTypes(rootDir)\n } else {\n packageManager = await preparePackageManager(rootDir, context, true)\n\n context.log('installing-plugin-dependencies', (message: Message) =>\n message.tag('info').append('Installing plugin dependencies...'),\n )\n\n const installCommand = {\n npm: 'npm install',\n yarn: 'yarn',\n pnpm: 'pnpm install',\n bun: 'bun install',\n }[packageManager]\n\n try {\n await executeCommand(installCommand!, rootDir)\n context.log('plugin-dependencies-installed', (message: Message) =>\n message.tag('success').append('Plugin dependencies installed'),\n )\n } catch (error) {\n context.log('failed-to-install-plugin-dependencies', (message: Message) =>\n message.tag('failed').append('Failed to install plugin dependencies'),\n )\n console.error(error)\n }\n }\n\n const projectDirName = path.basename(rootDir)\n const devCommand = `${packageManager} run dev`\n const port = 3000\n const cdCommand = isCurrentDir ? '' : `${pc.cyan(`cd ${projectDirName}`)}\\n `\n\n context.log('success-blank', (message) => message.text(''))\n context.log('success-header', (message) =>\n message.text(`${pc.green('✨')} ${pc.bold('All set! Your project is ready to go.')}`),\n )\n context.log('success-blank-2', (message) => message.text(''))\n context.log('success-get-started', (message) => message.text('Get started:'))\n context.log('success-blank-3', (message) => message.text(''))\n context.log('success-commands', (message) => message.text(` ${cdCommand}${pc.cyan(devCommand)}`))\n context.log('success-blank-4', (message) => message.text(''))\n context.log('success-open', (message) => message.text(`Then open ${pc.cyan(`http://localhost:${port}`)}`))\n context.log('success-blank-5', (message: Message) => message.text(''))\n context.log('success-docs', (message) => message.text(`Docs: ${pc.cyan('https://www.motia.dev/docs')}`))\n context.log('success-blank-6', (message) => message.text(''))\n if (skipRedis) {\n context.log('redis-skip-warning', (message: Message) =>\n message\n .tag('warning')\n .append(\n '⚠️ You skipped Redis binary installation. Make sure to provide a Redis connection before running Motia.',\n ),\n )\n context.log('success-blank-7', (message) => message.text(''))\n }\n context.log('success-signoff', (message) => message.text('Happy coding! 🚀'))\n context.log('success-blank-8', (message) => message.text(''))\n}\n"],"mappings":"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"}
@@ -1,13 +1,15 @@
1
+ import { version } from "../../version.mjs";
1
2
  import { constants, mkdirSync, promises, statSync } from "fs";
2
3
  import { globSync } from "glob";
3
4
  import * as path$1 from "path";
4
5
  import { fileURLToPath } from "url";
5
6
 
6
7
  //#region src/create/templates/generate.ts
7
- const replaceTemplateVariables = (content, projectName) => {
8
+ const replaceTemplateVariables = (content, projectName, version$1) => {
8
9
  const replacements = {
9
10
  "{{PROJECT_NAME}}": projectName,
10
- "{{PLUGIN_NAME}}": toPascalCase(projectName)
11
+ "{{PLUGIN_NAME}}": toPascalCase(projectName),
12
+ "{{VERSION}}": version$1 || "latest"
11
13
  };
12
14
  return Object.entries(replacements).reduce((result, [key, value]) => {
13
15
  return result.replace(new RegExp(key, "g"), value);
@@ -91,7 +93,7 @@ const generatePluginTemplate = (templateFolder) => {
91
93
  const sanitizedFileName = fileName.replace(".txt", "");
92
94
  const generateFilePath = path$1.join(rootDir, sanitizedFileName);
93
95
  let content = await promises.readFile(filePath, "utf8");
94
- content = replaceTemplateVariables(content, projectName);
96
+ content = replaceTemplateVariables(content, projectName, version);
95
97
  let fd = null;
96
98
  try {
97
99
  fd = await promises.open(generateFilePath, constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC, 420);
@@ -1 +1 @@
1
- {"version":3,"file":"generate.mjs","names":["replacements: Record<string, string>","path","fs","fd: fs.FileHandle | null","fd"],"sources":["../../../src/create/templates/generate.ts"],"sourcesContent":["import { constants, promises as fs, mkdirSync, statSync } from 'fs'\nimport { globSync } from 'glob'\nimport * as path from 'path'\nimport { fileURLToPath } from 'url'\nimport type { CliContext } from '../../cloud/config-utils'\n\nexport type Generator = (rootDir: string, context: CliContext) => Promise<void>\n\nconst replaceTemplateVariables = (content: string, projectName: string): string => {\n const replacements: Record<string, string> = {\n '{{PROJECT_NAME}}': projectName,\n '{{PLUGIN_NAME}}': toPascalCase(projectName),\n }\n\n return Object.entries(replacements).reduce((result, [key, value]) => {\n return result.replace(new RegExp(key, 'g'), value)\n }, content)\n}\n\nconst toPascalCase = (str: string): string => {\n // Remove @ and scope if present\n const name = str.replace(/^@[^/]+\\//, '')\n return name\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport const generateTemplateSteps = (templateFolder: string): Generator => {\n return async (rootDir: string, context: CliContext): Promise<void> => {\n const templatePath = path.join(__dirname, templateFolder)\n const files = globSync('**/*', { absolute: false, cwd: templatePath, dot: true })\n const projectName = path.basename(rootDir)\n\n try {\n for (const fileName of files) {\n const filePath = path.join(templatePath, fileName)\n const targetFilePath = path.join(rootDir, fileName)\n const targetDir = path.dirname(targetFilePath)\n\n mkdirSync(targetDir, { recursive: true })\n\n if (statSync(filePath).isDirectory()) {\n const folderPath = filePath.replace(templatePath, '')\n mkdirSync(path.join(rootDir, folderPath), { recursive: true })\n continue\n }\n\n const sanitizedFileName = fileName === 'requirements.txt' ? fileName : fileName.replace('.txt', '')\n const isWorkbenchConfig = fileName.match('motia-workbench.json')\n const generateFilePath = path.join(rootDir, sanitizedFileName)\n let content = await fs.readFile(filePath, 'utf8')\n\n if (isWorkbenchConfig) {\n try {\n // Use file descriptor to avoid TOCTOU vulnerability\n let fd: fs.FileHandle | null = null\n try {\n // Try to open existing file for reading\n fd = await fs.open(generateFilePath, constants.O_RDONLY)\n const existingWorkbenchConfig = await fd.readFile('utf8')\n const workbenchContent = JSON.parse(content)\n\n content = JSON.stringify([...JSON.parse(existingWorkbenchConfig), ...workbenchContent], null, 2)\n\n context.log('workbench-config-updated', (message) =>\n message.tag('success').append('Workbench config').append('has been updated.'),\n )\n } finally {\n if (fd) await fd.close()\n }\n } catch {\n void 0\n }\n } else {\n content = replaceTemplateVariables(content, projectName)\n }\n\n // Use file descriptor for atomic write operation\n let fd: fs.FileHandle | null = null\n try {\n fd = await fs.open(generateFilePath, constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC, 0o644)\n await fd.writeFile(content, 'utf8')\n } finally {\n if (fd) await fd.close()\n }\n context.log(sanitizedFileName, (message) => {\n message.tag('success').append('File').append(sanitizedFileName, 'cyan').append('has been created.')\n })\n }\n } catch (error) {\n console.error('Error generating template files:', error)\n }\n }\n}\n\nexport const generatePluginTemplate = (templateFolder: string): Generator => {\n return async (rootDir: string, context: CliContext): Promise<void> => {\n const templatePath = path.join(__dirname, templateFolder)\n const files = globSync('**/*', { absolute: false, cwd: templatePath, dot: true })\n const projectName = path.basename(rootDir)\n\n try {\n for (const fileName of files) {\n const filePath = path.join(templatePath, fileName)\n const targetFilePath = path.join(rootDir, fileName)\n const targetDir = path.dirname(targetFilePath)\n\n mkdirSync(targetDir, { recursive: true })\n\n if (statSync(filePath).isDirectory()) {\n const folderPath = filePath.replace(templatePath, '')\n mkdirSync(path.join(rootDir, folderPath), { recursive: true })\n continue\n }\n\n const sanitizedFileName = fileName.replace('.txt', '')\n const generateFilePath = path.join(rootDir, sanitizedFileName)\n let content = await fs.readFile(filePath, 'utf8')\n\n content = replaceTemplateVariables(content, projectName)\n\n // Use file descriptor for atomic write operation\n let fd: fs.FileHandle | null = null\n try {\n fd = await fs.open(generateFilePath, constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC, 0o644)\n await fd.writeFile(content, 'utf8')\n } finally {\n if (fd) await fd.close()\n }\n context.log(sanitizedFileName, (message) => {\n message.tag('success').append('File').append(sanitizedFileName, 'cyan').append('has been created.')\n })\n }\n } catch (error) {\n console.error('Error generating template files:', error)\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.mjs","names":["replacements: Record<string, string>","version","path","fs","fd: fs.FileHandle | null","fd"],"sources":["../../../src/create/templates/generate.ts"],"sourcesContent":["import { constants, promises as fs, mkdirSync, statSync } from 'fs'\nimport { globSync } from 'glob'\nimport * as path from 'path'\nimport { fileURLToPath } from 'url'\nimport type { CliContext } from '../../cloud/config-utils'\nimport { version } from '../../version'\n\nexport type Generator = (rootDir: string, context: CliContext) => Promise<void>\n\nconst replaceTemplateVariables = (content: string, projectName: string, version?: string): string => {\n const replacements: Record<string, string> = {\n '{{PROJECT_NAME}}': projectName,\n '{{PLUGIN_NAME}}': toPascalCase(projectName),\n '{{VERSION}}': version || 'latest',\n }\n\n return Object.entries(replacements).reduce((result, [key, value]) => {\n return result.replace(new RegExp(key, 'g'), value)\n }, content)\n}\n\nconst toPascalCase = (str: string): string => {\n // Remove @ and scope if present\n const name = str.replace(/^@[^/]+\\//, '')\n return name\n .split(/[-_]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport const generateTemplateSteps = (templateFolder: string): Generator => {\n return async (rootDir: string, context: CliContext): Promise<void> => {\n const templatePath = path.join(__dirname, templateFolder)\n const files = globSync('**/*', { absolute: false, cwd: templatePath, dot: true })\n const projectName = path.basename(rootDir)\n\n try {\n for (const fileName of files) {\n const filePath = path.join(templatePath, fileName)\n const targetFilePath = path.join(rootDir, fileName)\n const targetDir = path.dirname(targetFilePath)\n\n mkdirSync(targetDir, { recursive: true })\n\n if (statSync(filePath).isDirectory()) {\n const folderPath = filePath.replace(templatePath, '')\n mkdirSync(path.join(rootDir, folderPath), { recursive: true })\n continue\n }\n\n const sanitizedFileName = fileName === 'requirements.txt' ? fileName : fileName.replace('.txt', '')\n const isWorkbenchConfig = fileName.match('motia-workbench.json')\n const generateFilePath = path.join(rootDir, sanitizedFileName)\n let content = await fs.readFile(filePath, 'utf8')\n\n if (isWorkbenchConfig) {\n try {\n // Use file descriptor to avoid TOCTOU vulnerability\n let fd: fs.FileHandle | null = null\n try {\n // Try to open existing file for reading\n fd = await fs.open(generateFilePath, constants.O_RDONLY)\n const existingWorkbenchConfig = await fd.readFile('utf8')\n const workbenchContent = JSON.parse(content)\n\n content = JSON.stringify([...JSON.parse(existingWorkbenchConfig), ...workbenchContent], null, 2)\n\n context.log('workbench-config-updated', (message) =>\n message.tag('success').append('Workbench config').append('has been updated.'),\n )\n } finally {\n if (fd) await fd.close()\n }\n } catch {\n void 0\n }\n } else {\n content = replaceTemplateVariables(content, projectName)\n }\n\n // Use file descriptor for atomic write operation\n let fd: fs.FileHandle | null = null\n try {\n fd = await fs.open(generateFilePath, constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC, 0o644)\n await fd.writeFile(content, 'utf8')\n } finally {\n if (fd) await fd.close()\n }\n context.log(sanitizedFileName, (message) => {\n message.tag('success').append('File').append(sanitizedFileName, 'cyan').append('has been created.')\n })\n }\n } catch (error) {\n console.error('Error generating template files:', error)\n }\n }\n}\n\nexport const generatePluginTemplate = (templateFolder: string): Generator => {\n return async (rootDir: string, context: CliContext): Promise<void> => {\n const templatePath = path.join(__dirname, templateFolder)\n const files = globSync('**/*', { absolute: false, cwd: templatePath, dot: true })\n const projectName = path.basename(rootDir)\n\n try {\n for (const fileName of files) {\n const filePath = path.join(templatePath, fileName)\n const targetFilePath = path.join(rootDir, fileName)\n const targetDir = path.dirname(targetFilePath)\n\n mkdirSync(targetDir, { recursive: true })\n\n if (statSync(filePath).isDirectory()) {\n const folderPath = filePath.replace(templatePath, '')\n mkdirSync(path.join(rootDir, folderPath), { recursive: true })\n continue\n }\n\n const sanitizedFileName = fileName.replace('.txt', '')\n const generateFilePath = path.join(rootDir, sanitizedFileName)\n let content = await fs.readFile(filePath, 'utf8')\n\n content = replaceTemplateVariables(content, projectName, version)\n\n // Use file descriptor for atomic write operation\n let fd: fs.FileHandle | null = null\n try {\n fd = await fs.open(generateFilePath, constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC, 0o644)\n await fd.writeFile(content, 'utf8')\n } finally {\n if (fd) await fd.close()\n }\n context.log(sanitizedFileName, (message) => {\n message.tag('success').append('File').append(sanitizedFileName, 'cyan').append('has been created.')\n })\n }\n } catch (error) {\n console.error('Error generating template files:', error)\n }\n }\n}\n"],"mappings":"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"}
@@ -3,13 +3,15 @@ import { globSync } from 'glob'
3
3
  import * as path from 'path'
4
4
  import { fileURLToPath } from 'url'
5
5
  import type { CliContext } from '../../cloud/config-utils'
6
+ import { version } from '../../version'
6
7
 
7
8
  export type Generator = (rootDir: string, context: CliContext) => Promise<void>
8
9
 
9
- const replaceTemplateVariables = (content: string, projectName: string): string => {
10
+ const replaceTemplateVariables = (content: string, projectName: string, version?: string): string => {
10
11
  const replacements: Record<string, string> = {
11
12
  '{{PROJECT_NAME}}': projectName,
12
13
  '{{PLUGIN_NAME}}': toPascalCase(projectName),
14
+ '{{VERSION}}': version || 'latest',
13
15
  }
14
16
 
15
17
  return Object.entries(replacements).reduce((result, [key, value]) => {
@@ -119,7 +121,7 @@ export const generatePluginTemplate = (templateFolder: string): Generator => {
119
121
  const generateFilePath = path.join(rootDir, sanitizedFileName)
120
122
  let content = await fs.readFile(filePath, 'utf8')
121
123
 
122
- content = replaceTemplateVariables(content, projectName)
124
+ content = replaceTemplateVariables(content, projectName, version)
123
125
 
124
126
  // Use file descriptor for atomic write operation
125
127
  let fd: fs.FileHandle | null = null
@@ -1,4 +1,4 @@
1
- # @motiadev/plugin-example
1
+ # {{PROJECT_NAME}}
2
2
 
3
3
  A minimal example plugin demonstrating the Motia plugin system.
4
4
 
@@ -37,7 +37,7 @@ pnpm run clean
37
37
  To use this plugin in your Motia project, import it in your `motia.config.ts`:
38
38
 
39
39
  ```typescript
40
- import examplePlugin from '@motiadev/plugin-example/plugin'
40
+ import examplePlugin from '{{PROJECT_NAME}}/plugin'
41
41
 
42
42
  export default {
43
43
  plugins: [examplePlugin],
@@ -55,8 +55,8 @@ export default function plugin(_motia: MotiaPluginContext): MotiaPlugin {
55
55
  return {
56
56
  workbench: [
57
57
  {
58
- packageName: '@motiadev/plugin-example',
59
- cssImports: ['@motiadev/plugin-example/dist/index.css'],
58
+ packageName: '{{PROJECT_NAME}}',
59
+ cssImports: ['{{PROJECT_NAME}}/dist/index.css'],
60
60
  label: 'Example',
61
61
  position: 'bottom',
62
62
  componentName: 'ExamplePage',
@@ -81,7 +81,7 @@ export default function plugin(_motia: MotiaPluginContext): MotiaPlugin {
81
81
  ## Structure
82
82
 
83
83
  ```
84
- plugin-example/
84
+ {{PROJECT_NAME}}/
85
85
  ├── src/
86
86
  │ ├── components/
87
87
  │ │ └── example-page.tsx # Main UI component
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "{{PROJECT_NAME}}",
3
- "version": "0.14.0-beta.164",
3
+ "version": "0.1.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -28,8 +28,8 @@
28
28
  "react": "^19.2.0"
29
29
  },
30
30
  "peerDependencies": {
31
- "@motiadev/core": "latest",
32
- "@motiadev/ui": "latest"
31
+ "@motiadev/core": "{{VERSION}}",
32
+ "@motiadev/ui": "{{VERSION}}"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@rollup/plugin-babel": "^6.1.0",
@@ -38,7 +38,8 @@ const installPluginDependencies = async (baseDir, printer) => {
38
38
  const installCommand = {
39
39
  npm: "npm install",
40
40
  yarn: "yarn install",
41
- pnpm: "pnpm install"
41
+ pnpm: "pnpm install",
42
+ bun: "bun install"
42
43
  }[packageManager] || "npm install";
43
44
  try {
44
45
  await executeCommand(installCommand, baseDir, { silent: false });
@@ -1 +1 @@
1
- {"version":3,"file":"install-plugin-dependencies.mjs","names":["missingDependencies: string[]"],"sources":["../../src/plugins/install-plugin-dependencies.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { Printer } from '@motiadev/core'\nimport { executeCommand } from '../utils/execute-command'\nimport { getPackageManager } from '../utils/get-package-manager'\nimport { version } from '../version'\nimport { pluginDependencies } from './plugin-dependencies'\n\nexport const installPluginDependencies = async (baseDir: string, printer: Printer): Promise<void> => {\n const packageJsonPath = path.join(baseDir, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n printer.printPluginWarn('No package.json found, skipping plugin dependency installation')\n return\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n\n if (!packageJson.dependencies) {\n packageJson.dependencies = {}\n }\n\n const missingDependencies: string[] = []\n\n for (const dep of pluginDependencies) {\n if (packageJson.devDependencies?.[dep]) {\n delete packageJson.devDependencies[dep]\n }\n\n if (!packageJson.dependencies[dep]) {\n packageJson.dependencies[dep] = version\n missingDependencies.push(dep)\n }\n }\n\n if (missingDependencies.length === 0) {\n printer.printPluginLog('All plugin dependencies already installed')\n return\n }\n\n printer.printPluginLog(`Adding missing plugin dependencies: ${missingDependencies.join(', ')}`)\n\n fs.writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`)\n printer.printPluginLog('Updated package.json with plugin dependencies')\n\n let packageManager = getPackageManager(baseDir)\n if (packageManager === 'unknown') {\n printer.printPluginError('No package manager found, using npm as default')\n packageManager = 'npm'\n }\n printer.printPluginLog(`Installing dependencies using ${packageManager}...`)\n\n const installCommands: Record<string, string> = {\n npm: 'npm install',\n yarn: 'yarn install',\n pnpm: 'pnpm install',\n }\n\n const installCommand = installCommands[packageManager] || 'npm install'\n\n try {\n await executeCommand(installCommand, baseDir, { silent: false })\n printer.printPluginLog('Plugin dependencies installed successfully')\n } catch (error) {\n printer.printPluginError('Failed to install plugin dependencies:', error)\n printer.printPluginWarn(`Please run '${installCommand}' manually to install the dependencies`)\n }\n}\n"],"mappings":";;;;;;;;AAQA,MAAa,4BAA4B,OAAO,SAAiB,YAAoC;CACnG,MAAM,kBAAkB,KAAK,KAAK,SAAS,eAAe;AAE1D,KAAI,CAAC,GAAG,WAAW,gBAAgB,EAAE;AACnC,UAAQ,gBAAgB,iEAAiE;AACzF;;CAGF,MAAM,cAAc,KAAK,MAAM,GAAG,aAAa,iBAAiB,QAAQ,CAAC;AAEzE,KAAI,CAAC,YAAY,aACf,aAAY,eAAe,EAAE;CAG/B,MAAMA,sBAAgC,EAAE;AAExC,MAAK,MAAM,OAAO,oBAAoB;AACpC,MAAI,YAAY,kBAAkB,KAChC,QAAO,YAAY,gBAAgB;AAGrC,MAAI,CAAC,YAAY,aAAa,MAAM;AAClC,eAAY,aAAa,OAAO;AAChC,uBAAoB,KAAK,IAAI;;;AAIjC,KAAI,oBAAoB,WAAW,GAAG;AACpC,UAAQ,eAAe,4CAA4C;AACnE;;AAGF,SAAQ,eAAe,uCAAuC,oBAAoB,KAAK,KAAK,GAAG;AAE/F,IAAG,cAAc,iBAAiB,GAAG,KAAK,UAAU,aAAa,MAAM,EAAE,CAAC,IAAI;AAC9E,SAAQ,eAAe,gDAAgD;CAEvE,IAAI,iBAAiB,kBAAkB,QAAQ;AAC/C,KAAI,mBAAmB,WAAW;AAChC,UAAQ,iBAAiB,iDAAiD;AAC1E,mBAAiB;;AAEnB,SAAQ,eAAe,iCAAiC,eAAe,KAAK;CAQ5E,MAAM,iBAN0C;EAC9C,KAAK;EACL,MAAM;EACN,MAAM;EACP,CAEsC,mBAAmB;AAE1D,KAAI;AACF,QAAM,eAAe,gBAAgB,SAAS,EAAE,QAAQ,OAAO,CAAC;AAChE,UAAQ,eAAe,6CAA6C;UAC7D,OAAO;AACd,UAAQ,iBAAiB,0CAA0C,MAAM;AACzE,UAAQ,gBAAgB,eAAe,eAAe,wCAAwC"}
1
+ {"version":3,"file":"install-plugin-dependencies.mjs","names":["missingDependencies: string[]"],"sources":["../../src/plugins/install-plugin-dependencies.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { Printer } from '@motiadev/core'\nimport { executeCommand } from '../utils/execute-command'\nimport { getPackageManager } from '../utils/get-package-manager'\nimport { version } from '../version'\nimport { pluginDependencies } from './plugin-dependencies'\n\nexport const installPluginDependencies = async (baseDir: string, printer: Printer): Promise<void> => {\n const packageJsonPath = path.join(baseDir, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n printer.printPluginWarn('No package.json found, skipping plugin dependency installation')\n return\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n\n if (!packageJson.dependencies) {\n packageJson.dependencies = {}\n }\n\n const missingDependencies: string[] = []\n\n for (const dep of pluginDependencies) {\n if (packageJson.devDependencies?.[dep]) {\n delete packageJson.devDependencies[dep]\n }\n\n if (!packageJson.dependencies[dep]) {\n packageJson.dependencies[dep] = version\n missingDependencies.push(dep)\n }\n }\n\n if (missingDependencies.length === 0) {\n printer.printPluginLog('All plugin dependencies already installed')\n return\n }\n\n printer.printPluginLog(`Adding missing plugin dependencies: ${missingDependencies.join(', ')}`)\n\n fs.writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`)\n printer.printPluginLog('Updated package.json with plugin dependencies')\n\n let packageManager = getPackageManager(baseDir)\n if (packageManager === 'unknown') {\n printer.printPluginError('No package manager found, using npm as default')\n packageManager = 'npm'\n }\n printer.printPluginLog(`Installing dependencies using ${packageManager}...`)\n\n const installCommands: Record<string, string> = {\n npm: 'npm install',\n yarn: 'yarn install',\n pnpm: 'pnpm install',\n bun: 'bun install',\n }\n\n const installCommand = installCommands[packageManager] || 'npm install'\n\n try {\n await executeCommand(installCommand, baseDir, { silent: false })\n printer.printPluginLog('Plugin dependencies installed successfully')\n } catch (error) {\n printer.printPluginError('Failed to install plugin dependencies:', error)\n printer.printPluginWarn(`Please run '${installCommand}' manually to install the dependencies`)\n }\n}\n"],"mappings":";;;;;;;;AAQA,MAAa,4BAA4B,OAAO,SAAiB,YAAoC;CACnG,MAAM,kBAAkB,KAAK,KAAK,SAAS,eAAe;AAE1D,KAAI,CAAC,GAAG,WAAW,gBAAgB,EAAE;AACnC,UAAQ,gBAAgB,iEAAiE;AACzF;;CAGF,MAAM,cAAc,KAAK,MAAM,GAAG,aAAa,iBAAiB,QAAQ,CAAC;AAEzE,KAAI,CAAC,YAAY,aACf,aAAY,eAAe,EAAE;CAG/B,MAAMA,sBAAgC,EAAE;AAExC,MAAK,MAAM,OAAO,oBAAoB;AACpC,MAAI,YAAY,kBAAkB,KAChC,QAAO,YAAY,gBAAgB;AAGrC,MAAI,CAAC,YAAY,aAAa,MAAM;AAClC,eAAY,aAAa,OAAO;AAChC,uBAAoB,KAAK,IAAI;;;AAIjC,KAAI,oBAAoB,WAAW,GAAG;AACpC,UAAQ,eAAe,4CAA4C;AACnE;;AAGF,SAAQ,eAAe,uCAAuC,oBAAoB,KAAK,KAAK,GAAG;AAE/F,IAAG,cAAc,iBAAiB,GAAG,KAAK,UAAU,aAAa,MAAM,EAAE,CAAC,IAAI;AAC9E,SAAQ,eAAe,gDAAgD;CAEvE,IAAI,iBAAiB,kBAAkB,QAAQ;AAC/C,KAAI,mBAAmB,WAAW;AAChC,UAAQ,iBAAiB,iDAAiD;AAC1E,mBAAiB;;AAEnB,SAAQ,eAAe,iCAAiC,eAAe,KAAK;CAS5E,MAAM,iBAP0C;EAC9C,KAAK;EACL,MAAM;EACN,MAAM;EACN,KAAK;EACN,CAEsC,mBAAmB;AAE1D,KAAI;AACF,QAAM,eAAe,gBAAgB,SAAS,EAAE,QAAQ,OAAO,CAAC;AAChE,UAAQ,eAAe,6CAA6C;UAC7D,OAAO;AACd,UAAQ,iBAAiB,0CAA0C,MAAM;AACzE,UAAQ,gBAAgB,eAAe,eAAe,wCAAwC"}
@@ -1,19 +1,51 @@
1
1
  import { checkIfFileExists } from "../create/utils.mjs";
2
+ import fs from "fs";
2
3
  import path from "path";
3
4
 
4
5
  //#region src/utils/get-package-manager.ts
5
- const getPackageManager = (dir) => {
6
+ const getPackageManagerFromEnv = () => {
7
+ const userAgent = process.env.npm_config_user_agent;
8
+ if (!userAgent) return null;
9
+ const match = userAgent.match(/^(npm|pnpm|yarn|bun)\//);
10
+ if (match) return match[1];
11
+ return null;
12
+ };
13
+ const readPackageManagerFromPackageJson = (dir) => {
14
+ const packageJsonPath = path.join(dir, "package.json");
15
+ if (!checkIfFileExists(dir, "package.json")) return null;
16
+ try {
17
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
18
+ if (packageJson.packageManager) {
19
+ const pm = packageJson.packageManager.split("@")[0];
20
+ if ([
21
+ "npm",
22
+ "yarn",
23
+ "pnpm",
24
+ "bun"
25
+ ].includes(pm)) return pm;
26
+ }
27
+ } catch {
28
+ return null;
29
+ }
30
+ return null;
31
+ };
32
+ const getPackageManager = (dir, traverseUp = true) => {
33
+ const envPackageManager = getPackageManagerFromEnv();
34
+ if (envPackageManager) return envPackageManager;
6
35
  let currentDir = dir;
7
36
  while (currentDir !== path.dirname(currentDir)) {
8
37
  if (checkIfFileExists(currentDir, "yarn.lock")) return "yarn";
9
38
  else if (checkIfFileExists(currentDir, "pnpm-lock.yaml")) return "pnpm";
10
39
  else if (checkIfFileExists(currentDir, "package-lock.json")) return "npm";
11
40
  else if (checkIfFileExists(currentDir, "bun.lockb") || checkIfFileExists(currentDir, "bun.lock")) return "bun";
41
+ const packageManagerFromJson = readPackageManagerFromPackageJson(currentDir);
42
+ if (packageManagerFromJson) return packageManagerFromJson;
43
+ if (!traverseUp) break;
12
44
  currentDir = path.dirname(currentDir);
13
45
  }
14
46
  return "npm";
15
47
  };
16
48
 
17
49
  //#endregion
18
- export { getPackageManager };
50
+ export { getPackageManager, getPackageManagerFromEnv };
19
51
  //# sourceMappingURL=get-package-manager.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-package-manager.mjs","names":[],"sources":["../../src/utils/get-package-manager.ts"],"sourcesContent":["import path from 'path'\nimport { checkIfFileExists } from '../create/utils'\n\nexport const getPackageManager = (dir: string): string => {\n let currentDir = dir\n\n while (currentDir !== path.dirname(currentDir)) {\n if (checkIfFileExists(currentDir, 'yarn.lock')) {\n return 'yarn'\n } else if (checkIfFileExists(currentDir, 'pnpm-lock.yaml')) {\n return 'pnpm'\n } else if (checkIfFileExists(currentDir, 'package-lock.json')) {\n return 'npm'\n } else if (checkIfFileExists(currentDir, 'bun.lockb') || checkIfFileExists(currentDir, 'bun.lock')) {\n return 'bun'\n }\n currentDir = path.dirname(currentDir)\n }\n\n return 'npm'\n}\n"],"mappings":";;;;AAGA,MAAa,qBAAqB,QAAwB;CACxD,IAAI,aAAa;AAEjB,QAAO,eAAe,KAAK,QAAQ,WAAW,EAAE;AAC9C,MAAI,kBAAkB,YAAY,YAAY,CAC5C,QAAO;WACE,kBAAkB,YAAY,iBAAiB,CACxD,QAAO;WACE,kBAAkB,YAAY,oBAAoB,CAC3D,QAAO;WACE,kBAAkB,YAAY,YAAY,IAAI,kBAAkB,YAAY,WAAW,CAChG,QAAO;AAET,eAAa,KAAK,QAAQ,WAAW;;AAGvC,QAAO"}
1
+ {"version":3,"file":"get-package-manager.mjs","names":[],"sources":["../../src/utils/get-package-manager.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { checkIfFileExists } from '../create/utils'\n\nexport const getPackageManagerFromEnv = (): string | null => {\n const userAgent = process.env.npm_config_user_agent\n if (!userAgent) {\n return null\n }\n\n const match = userAgent.match(/^(npm|pnpm|yarn|bun)\\//)\n if (match) {\n return match[1]\n }\n\n return null\n}\n\nconst readPackageManagerFromPackageJson = (dir: string): string | null => {\n const packageJsonPath = path.join(dir, 'package.json')\n if (!checkIfFileExists(dir, 'package.json')) {\n return null\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const pm = packageJson.packageManager.split('@')[0]\n if (['npm', 'yarn', 'pnpm', 'bun'].includes(pm)) {\n return pm\n }\n }\n } catch {\n return null\n }\n\n return null\n}\n\nexport const getPackageManager = (dir: string, traverseUp = true): string => {\n const envPackageManager = getPackageManagerFromEnv()\n if (envPackageManager) {\n return envPackageManager\n }\n\n let currentDir = dir\n\n while (currentDir !== path.dirname(currentDir)) {\n if (checkIfFileExists(currentDir, 'yarn.lock')) {\n return 'yarn'\n } else if (checkIfFileExists(currentDir, 'pnpm-lock.yaml')) {\n return 'pnpm'\n } else if (checkIfFileExists(currentDir, 'package-lock.json')) {\n return 'npm'\n } else if (checkIfFileExists(currentDir, 'bun.lockb') || checkIfFileExists(currentDir, 'bun.lock')) {\n return 'bun'\n }\n\n const packageManagerFromJson = readPackageManagerFromPackageJson(currentDir)\n if (packageManagerFromJson) {\n return packageManagerFromJson\n }\n\n if (!traverseUp) {\n break\n }\n\n currentDir = path.dirname(currentDir)\n }\n\n return 'npm'\n}\n"],"mappings":";;;;;AAIA,MAAa,iCAAgD;CAC3D,MAAM,YAAY,QAAQ,IAAI;AAC9B,KAAI,CAAC,UACH,QAAO;CAGT,MAAM,QAAQ,UAAU,MAAM,yBAAyB;AACvD,KAAI,MACF,QAAO,MAAM;AAGf,QAAO;;AAGT,MAAM,qCAAqC,QAA+B;CACxE,MAAM,kBAAkB,KAAK,KAAK,KAAK,eAAe;AACtD,KAAI,CAAC,kBAAkB,KAAK,eAAe,CACzC,QAAO;AAGT,KAAI;EACF,MAAM,cAAc,KAAK,MAAM,GAAG,aAAa,iBAAiB,QAAQ,CAAC;AACzE,MAAI,YAAY,gBAAgB;GAC9B,MAAM,KAAK,YAAY,eAAe,MAAM,IAAI,CAAC;AACjD,OAAI;IAAC;IAAO;IAAQ;IAAQ;IAAM,CAAC,SAAS,GAAG,CAC7C,QAAO;;SAGL;AACN,SAAO;;AAGT,QAAO;;AAGT,MAAa,qBAAqB,KAAa,aAAa,SAAiB;CAC3E,MAAM,oBAAoB,0BAA0B;AACpD,KAAI,kBACF,QAAO;CAGT,IAAI,aAAa;AAEjB,QAAO,eAAe,KAAK,QAAQ,WAAW,EAAE;AAC9C,MAAI,kBAAkB,YAAY,YAAY,CAC5C,QAAO;WACE,kBAAkB,YAAY,iBAAiB,CACxD,QAAO;WACE,kBAAkB,YAAY,oBAAoB,CAC3D,QAAO;WACE,kBAAkB,YAAY,YAAY,IAAI,kBAAkB,YAAY,WAAW,CAChG,QAAO;EAGT,MAAM,yBAAyB,kCAAkC,WAAW;AAC5E,MAAI,uBACF,QAAO;AAGT,MAAI,CAAC,WACH;AAGF,eAAa,KAAK,QAAQ,WAAW;;AAGvC,QAAO"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "motia",
3
3
  "description": "Build production-grade backends with a single primitive. APIs, background jobs, Queues, Workflows, and AI agents - unified in one system with built-in State management, Streaming, and Observability.",
4
- "version": "0.16.0-beta.175",
4
+ "version": "0.16.0-beta.177",
5
5
  "license": "Elastic-2.0",
6
6
  "type": "module",
7
7
  "repository": {
@@ -46,13 +46,13 @@
46
46
  "table": "^6.9.0",
47
47
  "ts-node": "^10.9.2",
48
48
  "zod": "^4.1.12",
49
- "@motiadev/adapter-bullmq-events": "0.16.0-beta.175",
50
- "@motiadev/adapter-redis-streams": "0.16.0-beta.175",
51
- "@motiadev/adapter-redis-cron": "0.16.0-beta.175",
52
- "@motiadev/adapter-redis-state": "0.16.0-beta.175",
53
- "@motiadev/core": "0.16.0-beta.175",
54
- "@motiadev/stream-client-node": "0.16.0-beta.175",
55
- "@motiadev/workbench": "0.16.0-beta.175"
49
+ "@motiadev/adapter-bullmq-events": "0.16.0-beta.177",
50
+ "@motiadev/adapter-redis-cron": "0.16.0-beta.177",
51
+ "@motiadev/adapter-redis-state": "0.16.0-beta.177",
52
+ "@motiadev/adapter-redis-streams": "0.16.0-beta.177",
53
+ "@motiadev/core": "0.16.0-beta.177",
54
+ "@motiadev/stream-client-node": "0.16.0-beta.177",
55
+ "@motiadev/workbench": "0.16.0-beta.177"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@amplitude/analytics-types": "^2.9.2",