@stacksjs/actions 0.74.55 → 0.74.57
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/dist/make.js +1 -1
- package/package.json +38 -38
package/dist/make.js
CHANGED
|
@@ -21,4 +21,4 @@ export function ${factoryName}(): Partial<${modelName}Model> {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export default ${factoryName}
|
|
24
|
-
`;await writeOrPreview(factoryPath,content);log.success(`Created factory: ${factoryPath}`)}catch(error){log.error(`Failed to create factory ${factoryName}`,error);throw error}}export async function makeNotification(options){try{const name=requireName(options,"notification");log.info(`Creating your ${italic(name)} notification...`);await createNotification(options);log.success(`Created ${italic(name)} notification`)}catch(error){await log.error("There was an error creating your notification",error);process.exit(ExitCode.FatalError)}}export async function createMail(options){const rawName=String(options.name||"").trim();if(!rawName){log.error("A mail name is required (e.g. `buddy make:mail OrderShipped`).");return!1}const className=pascalCase(rawName),kebabName=kebabCase(rawName),mailPath=p.userMailPath(`${className}.ts`),templatePath=p.userEmailsPath(`${kebabName}.stx`);await log.flush();if(!options.force){if(existsSync(mailPath)){console.error(`${italic(mailPath)} already exists - re-run with --force to overwrite.`);return!1}if(existsSync(templatePath)){console.error(`${italic(templatePath)} already exists - re-run with --force to overwrite.`);return!1}}if(!doesFolderExist(p.userMailPath()))await createFolder(p.userMailPath());if(!doesFolderExist(p.userEmailsPath()))await createFolder(p.userEmailsPath());try{await createFileWithTemplate(mailPath,"mail",className,kebabName);await createFileWithTemplate(templatePath,"mailTemplate",className,kebabName);return!0}catch(error){handleError("Error creating mailable",error);return!1}}export async function makeMail(options){try{const name=requireName(options,"mail");log.info(`Creating your ${italic(name)} mailable...`);if(!await createMail(options))process.exit(ExitCode.FatalError);log.success(`Created ${italic(pascalCase(name))} mailable + ${italic(kebabCase(name))}.stx template`)}catch(error){await log.error("There was an error creating your mailable",error);process.exit(ExitCode.FatalError)}}export async function makePage(options){try{const name=requireName(options,"page");log.info("Creating your page...");await createPage(options);log.success(`Created ${name} page`)}catch(error){await log.error("There was an error creating your page",error);process.exit(ExitCode.FatalError)}}export async function createPage(options){const name=requireName(options,"page");await createFileWithTemplate(p.userViewsPath(pageFileName(name)),"page",name)}export function pageFileName(name){return`${name}.stx`}export async function makeFunction(options){try{const name=requireName(options,"function");log.info("Creating your function...");await createFunction(options);log.success(`Created ${name} function`)}catch(error){await log.error("There was an error creating your function",error);process.exit(ExitCode.FatalError)}}export async function createFunction(options){const name=requireName(options,"function");await createFileWithTemplate(p.userFunctionsPath(`${name}.ts`),"function",camelCase(name))}export async function makeLanguage(options){try{const name=requireName(options,"language");log.info("Creating your translation file...");await createLanguage(options);log.success(`Created ${name} translation file`)}catch(error){await log.error("There was an error creating your language.",error);process.exit(ExitCode.FatalError)}}export async function createLanguage(options){const name=requireName(options,"language");await createFileWithTemplate(p.resourcesPath(`lang/${name}.yml`),"language",name)}export async function makeStack(options){try{const name=requireName(options,"stack");log.info(`Creating your ${name} stack...`);const stackDir=resolve(process.cwd(),name);if(doesFolderExist(stackDir)){await log.error(`Directory "${name}" already exists`);process.exit(ExitCode.FatalError)}await createFolder(stackDir);const dirs=["app/Actions","app/Models","config","database/migrations","resources/views","resources/components","resources/functions","resources/partials","routes","public"];for(const dir of dirs)await createFolder(resolve(stackDir,dir));const shortName=name.replace(/^@[^/]+\//,"").replace(/-stack$/,"");await createFileWithTemplate(resolve(stackDir,"package.json"),"stackPackageJson",name,shortName);log.success(`Successfully scaffolded your "${name}" stack`);log.info("");log.info(` cd ${name}`);log.info(" # Add your models, actions, views, etc.");log.info(" # Push the repository, then submit its GitHub source to the Stacks registry.");log.info("");log.info(" Users install it with:");log.info(` buddy add ${shortName}`)}catch(error){await log.error("There was an error creating your stack",error);process.exit(ExitCode.FatalError)}}export async function createNotification(options){const name=requireName(options,"stack");try{let importOption="EmailOptions";if(!doesFolderExist("notifications"))await createFolder("./notifications");if(options.chat)importOption="ChatOptions";if(options.sms)importOption="SMSOptions";await createFileWithTemplate(p.userNotificationsPath(`${name}.ts`),"notification",importOption);return!0}catch(error){handleError("Error creating notification",error);return!1}}export async function createMigration(options){const optionName=options.name;if(!optionName)throw Error("options.name is required and cannot be empty");const fileName=`${Date.now()}-${kebabCase(optionName)}.sql`,path=p.userMigrationsPath(fileName),snake=kebabCase(optionName).replace(/-/g,"_"),table=/^create_(.+)_table$/.exec(snake)?.[1]??"table_name",driver=(process.env.DB_CONNECTION||"sqlite").toLowerCase(),mysqlLike=driver==="mysql"||driver==="singlestore",tableIdentifier=mysqlLike?`\`${table}\``:`"${table}"`,primaryKey=driver==="postgres"?'"id" BIGSERIAL PRIMARY KEY':mysqlLike?"`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY":'"id" INTEGER PRIMARY KEY AUTOINCREMENT';try{await createFileWithTemplate(path,"migration",tableIdentifier,primaryKey);log.success(`Migration created: ${italic(`database/migrations/${fileName}`)}`)}catch(error){log.error(error)}}export async function makeQueueTable(){await runAction(Action.QueueTable)}export async function makeCertificate(){const domain=await localUrl();log.info("Creating SSL certificate...");await runCommand(`tlsx ${domain}`,{cwd:p.storagePath("keys")});log.success("Certificate created");log.info("Installing SSL certificate...");await runCommand("tlsx -install",{cwd:p.storagePath("keys")});log.success("Certificate installed")}export async function createModel(options){const optionName=options.name;if(!optionName)throw Error("options.name is required and cannot be empty");const name=optionName.charAt(0).toUpperCase()+optionName.slice(1),tableName=name.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"").replace(/([^s])$/,"$1s"),path=p.userModelsPath(`${name}.ts`);try{await createFileWithTemplate(path,"model",name,tableName);log.success(`Model created: ${italic(`app/Models/${name}.ts`)}`)}catch(error){log.error(error)}}export async function createMiddleware(options){const name=requireName(options,"certificate");await createFileWithTemplate(p.userMiddlewarePath(`${name}.ts`),"middleware",name)}
|
|
24
|
+
`;await writeOrPreview(factoryPath,content);log.success(`Created factory: ${factoryPath}`)}catch(error){log.error(`Failed to create factory ${factoryName}`,error);throw error}}export async function makeNotification(options){try{const name=requireName(options,"notification");log.info(`Creating your ${italic(name)} notification...`);await createNotification(options);log.success(`Created ${italic(name)} notification`)}catch(error){await log.error("There was an error creating your notification",error);process.exit(ExitCode.FatalError)}}export async function createMail(options){const rawName=String(options.name||"").trim();if(!rawName){log.error("A mail name is required (e.g. `buddy make:mail OrderShipped`).");return!1}const className=pascalCase(rawName),kebabName=kebabCase(rawName),mailPath=p.userMailPath(`${className}.ts`),templatePath=p.userEmailsPath(`${kebabName}.stx`);await log.flush();if(!options.force){if(existsSync(mailPath)){console.error(`${italic(mailPath)} already exists - re-run with --force to overwrite.`);return!1}if(existsSync(templatePath)){console.error(`${italic(templatePath)} already exists - re-run with --force to overwrite.`);return!1}}if(!doesFolderExist(p.userMailPath()))await createFolder(p.userMailPath());if(!doesFolderExist(p.userEmailsPath()))await createFolder(p.userEmailsPath());try{await createFileWithTemplate(mailPath,"mail",className,kebabName);await createFileWithTemplate(templatePath,"mailTemplate",className,kebabName);return!0}catch(error){handleError("Error creating mailable",error);return!1}}export async function makeMail(options){try{const name=requireName(options,"mail");log.info(`Creating your ${italic(name)} mailable...`);if(!await createMail(options))process.exit(ExitCode.FatalError);log.success(`Created ${italic(pascalCase(name))} mailable + ${italic(kebabCase(name))}.stx template`)}catch(error){await log.error("There was an error creating your mailable",error);process.exit(ExitCode.FatalError)}}export async function makePage(options){try{const name=requireName(options,"page");log.info("Creating your page...");await createPage(options);log.success(`Created ${name} page`)}catch(error){await log.error("There was an error creating your page",error);process.exit(ExitCode.FatalError)}}export async function createPage(options){const name=requireName(options,"page");await createFileWithTemplate(p.userViewsPath(pageFileName(name)),"page",name)}export function pageFileName(name){return`${name}.stx`}export async function makeFunction(options){try{const name=requireName(options,"function");log.info("Creating your function...");await createFunction(options);log.success(`Created ${name} function`)}catch(error){await log.error("There was an error creating your function",error);process.exit(ExitCode.FatalError)}}export async function createFunction(options){const name=requireName(options,"function");await createFileWithTemplate(p.userFunctionsPath(`${name}.ts`),"function",camelCase(name))}export async function makeLanguage(options){try{const name=requireName(options,"language");log.info("Creating your translation file...");await createLanguage(options);log.success(`Created ${name} translation file`)}catch(error){await log.error("There was an error creating your language.",error);process.exit(ExitCode.FatalError)}}export async function createLanguage(options){const name=requireName(options,"language");await createFileWithTemplate(p.resourcesPath(`lang/${name}.yml`),"language",name)}export async function makeStack(options){try{const name=requireName(options,"stack");log.info(`Creating your ${name} stack...`);const stackDir=resolve(process.cwd(),name);if(doesFolderExist(stackDir)){await log.error(`Directory "${name}" already exists`);process.exit(ExitCode.FatalError)}await createFolder(stackDir);const dirs=["app/Actions","app/Models","config","database/migrations","resources/views","resources/components","resources/functions","resources/partials","routes","public"];for(const dir of dirs)await createFolder(resolve(stackDir,dir));const shortName=name.replace(/^@[^/]+\//,"").replace(/-stack$/,"");await createFileWithTemplate(resolve(stackDir,"package.json"),"stackPackageJson",name,shortName);log.success(`Successfully scaffolded your "${name}" stack`);log.info("");log.info(` cd ${name}`);log.info(" # Add your models, actions, views, etc.");log.info(" # Push the repository, then submit its GitHub source to the Stacks registry.");log.info("");log.info(" Users install it with:");log.info(` buddy add ${shortName}`)}catch(error){await log.error("There was an error creating your stack",error);process.exit(ExitCode.FatalError)}}export async function createNotification(options){const name=requireName(options,"stack");try{let importOption="EmailOptions";if(!doesFolderExist("notifications"))await createFolder("./notifications");if(options.chat)importOption="ChatOptions";if(options.sms)importOption="SMSOptions";await createFileWithTemplate(p.userNotificationsPath(`${name}.ts`),"notification",importOption);return!0}catch(error){handleError("Error creating notification",error);return!1}}export async function createMigration(options){const optionName=options.name;if(!optionName)throw Error("options.name is required and cannot be empty");const fileName=`${Date.now()}-${kebabCase(optionName)}.sql`,path=p.userMigrationsPath(fileName),snake=kebabCase(optionName).replace(/-/g,"_"),table=/^create_(.+)_table$/.exec(snake)?.[1]??"table_name",driver=(process.env.DB_CONNECTION||"sqlite").toLowerCase(),mysqlLike=driver==="mysql"||driver==="singlestore",tableIdentifier=mysqlLike?`\`${table}\``:`"${table}"`,primaryKey=driver==="postgres"?'"id" BIGSERIAL PRIMARY KEY':mysqlLike?"`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY":'"id" INTEGER PRIMARY KEY AUTOINCREMENT';try{await createFileWithTemplate(path,"migration",tableIdentifier,primaryKey);log.success(`Migration created: ${italic(`database/migrations/${fileName}`)}`);const{findIgnoredMigrations,formatIgnoredMigrations}=await import("@stacksjs/database");if(findIgnoredMigrations().includes(fileName))log.warn(formatIgnoredMigrations([fileName]))}catch(error){log.error(error)}}export async function makeQueueTable(){await runAction(Action.QueueTable)}export async function makeCertificate(){const domain=await localUrl();log.info("Creating SSL certificate...");await runCommand(`tlsx ${domain}`,{cwd:p.storagePath("keys")});log.success("Certificate created");log.info("Installing SSL certificate...");await runCommand("tlsx -install",{cwd:p.storagePath("keys")});log.success("Certificate installed")}export async function createModel(options){const optionName=options.name;if(!optionName)throw Error("options.name is required and cannot be empty");const name=optionName.charAt(0).toUpperCase()+optionName.slice(1),tableName=name.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"").replace(/([^s])$/,"$1s"),path=p.userModelsPath(`${name}.ts`);try{await createFileWithTemplate(path,"model",name,tableName);log.success(`Model created: ${italic(`app/Models/${name}.ts`)}`)}catch(error){log.error(error)}}export async function createMiddleware(options){const name=requireName(options,"certificate");await createFileWithTemplate(p.userMiddlewarePath(`${name}.ts`),"middleware",name)}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/actions",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.74.
|
|
5
|
+
"version": "0.74.57",
|
|
6
6
|
"description": "The Stacks actions.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -60,52 +60,52 @@
|
|
|
60
60
|
"prepublishOnly": "bun run build"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@stacksjs/action-runner": "0.74.
|
|
64
|
-
"@stacksjs/ai": "0.74.
|
|
65
|
-
"@stacksjs/analytics": "0.74.
|
|
66
|
-
"@stacksjs/api": "0.74.
|
|
67
|
-
"@stacksjs/auth": "0.74.
|
|
68
|
-
"@stacksjs/build": "0.74.
|
|
63
|
+
"@stacksjs/action-runner": "0.74.57",
|
|
64
|
+
"@stacksjs/ai": "0.74.57",
|
|
65
|
+
"@stacksjs/analytics": "0.74.57",
|
|
66
|
+
"@stacksjs/api": "0.74.57",
|
|
67
|
+
"@stacksjs/auth": "0.74.57",
|
|
68
|
+
"@stacksjs/build": "0.74.57",
|
|
69
69
|
"@stacksjs/bumpx": "^0.2.6",
|
|
70
70
|
"@stacksjs/bunpress": "^0.2.8",
|
|
71
|
-
"@stacksjs/cli": "0.74.
|
|
72
|
-
"@stacksjs/cloud": "0.74.
|
|
73
|
-
"@stacksjs/cms": "0.74.
|
|
71
|
+
"@stacksjs/cli": "0.74.57",
|
|
72
|
+
"@stacksjs/cloud": "0.74.57",
|
|
73
|
+
"@stacksjs/cms": "0.74.57",
|
|
74
74
|
"@stacksjs/components": "^0.2.246",
|
|
75
|
-
"@stacksjs/config": "0.74.
|
|
76
|
-
"@stacksjs/database": "0.74.
|
|
77
|
-
"@stacksjs/desktop-build": "0.74.
|
|
78
|
-
"@stacksjs/dns": "0.74.
|
|
79
|
-
"@stacksjs/enums": "0.74.
|
|
80
|
-
"@stacksjs/env": "0.74.
|
|
81
|
-
"@stacksjs/error-handling": "0.74.
|
|
75
|
+
"@stacksjs/config": "0.74.57",
|
|
76
|
+
"@stacksjs/database": "0.74.57",
|
|
77
|
+
"@stacksjs/desktop-build": "0.74.57",
|
|
78
|
+
"@stacksjs/dns": "0.74.57",
|
|
79
|
+
"@stacksjs/enums": "0.74.57",
|
|
80
|
+
"@stacksjs/env": "0.74.57",
|
|
81
|
+
"@stacksjs/error-handling": "0.74.57",
|
|
82
82
|
"@stacksjs/gitit": "^0.2.5",
|
|
83
|
-
"@stacksjs/i18n": "0.74.
|
|
84
|
-
"@stacksjs/image": "0.74.
|
|
85
|
-
"@stacksjs/logging": "0.74.
|
|
83
|
+
"@stacksjs/i18n": "0.74.57",
|
|
84
|
+
"@stacksjs/image": "0.74.57",
|
|
85
|
+
"@stacksjs/logging": "0.74.57",
|
|
86
86
|
"@stacksjs/logsmith": "^0.2.3",
|
|
87
|
-
"@stacksjs/orm": "0.74.
|
|
88
|
-
"@stacksjs/path": "0.74.
|
|
89
|
-
"@stacksjs/payments": "0.74.
|
|
90
|
-
"@stacksjs/queue": "0.74.
|
|
91
|
-
"@stacksjs/registry": "0.74.
|
|
92
|
-
"@stacksjs/router": "0.74.
|
|
87
|
+
"@stacksjs/orm": "0.74.57",
|
|
88
|
+
"@stacksjs/path": "0.74.57",
|
|
89
|
+
"@stacksjs/payments": "0.74.57",
|
|
90
|
+
"@stacksjs/queue": "0.74.57",
|
|
91
|
+
"@stacksjs/registry": "0.74.57",
|
|
92
|
+
"@stacksjs/router": "0.74.57",
|
|
93
93
|
"@stacksjs/rpx": "^0.11.54",
|
|
94
|
-
"@stacksjs/scheduler": "0.74.
|
|
95
|
-
"@stacksjs/search-engine": "0.74.
|
|
96
|
-
"@stacksjs/security": "0.74.
|
|
97
|
-
"@stacksjs/server": "0.74.
|
|
98
|
-
"@stacksjs/sites": "0.74.
|
|
99
|
-
"@stacksjs/storage": "0.74.
|
|
100
|
-
"@stacksjs/strings": "0.74.
|
|
94
|
+
"@stacksjs/scheduler": "0.74.57",
|
|
95
|
+
"@stacksjs/search-engine": "0.74.57",
|
|
96
|
+
"@stacksjs/security": "0.74.57",
|
|
97
|
+
"@stacksjs/server": "0.74.57",
|
|
98
|
+
"@stacksjs/sites": "0.74.57",
|
|
99
|
+
"@stacksjs/storage": "0.74.57",
|
|
100
|
+
"@stacksjs/strings": "0.74.57",
|
|
101
101
|
"@stacksjs/stx": "^0.2.286",
|
|
102
102
|
"@stacksjs/tlsx": "^0.13.19",
|
|
103
103
|
"@stacksjs/ts-cloud": "^0.16.0",
|
|
104
104
|
"@stacksjs/ts-md": "^0.1.1",
|
|
105
|
-
"@stacksjs/tunnel": "0.74.
|
|
106
|
-
"@stacksjs/types": "0.74.
|
|
107
|
-
"@stacksjs/utils": "0.74.
|
|
108
|
-
"@stacksjs/whois": "0.74.
|
|
105
|
+
"@stacksjs/tunnel": "0.74.57",
|
|
106
|
+
"@stacksjs/types": "0.74.57",
|
|
107
|
+
"@stacksjs/utils": "0.74.57",
|
|
108
|
+
"@stacksjs/whois": "0.74.57",
|
|
109
109
|
"bun-plugin-stx": "^0.2.286"
|
|
110
110
|
},
|
|
111
111
|
"peerDependencies": {
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
}
|
|
122
122
|
},
|
|
123
123
|
"devDependencies": {
|
|
124
|
-
"@stacksjs/validation": "0.74.
|
|
124
|
+
"@stacksjs/validation": "0.74.57",
|
|
125
125
|
"better-dx": "^0.2.24"
|
|
126
126
|
}
|
|
127
127
|
}
|