@stacksjs/actions 0.72.55 → 0.72.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/action.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export declare interface ActionResponse {
|
|
|
33
33
|
description: string
|
|
34
34
|
schema?: Record<string, unknown>
|
|
35
35
|
}
|
|
36
|
-
declare interface ActionOptions<TModel = string, TValidations extends ActionValidations | undefined = undefined, TPath extends string = '', /** * The payload `handle` receives when the action is invoked by something * other than the router - an event listener, for instance, which calls it * with the event object rather than a request (`app/Events.ts` maps * 'user:registered' straight onto an action name). Defaults to `never`, * which leaves every HTTP action typed exactly as before. */ TPayload = never,> {
|
|
36
|
+
declare interface ActionOptions<TModel = string, TValidations extends ActionValidations | undefined = undefined, TPath extends string = '', /** * The payload `handle` receives when the action is invoked by something * other than the router - an event listener, for instance, which calls it * with the event object rather than a request (`app/Events.ts` maps * 'user:registered' straight onto an action name). Defaults to `never`, * which leaves every HTTP action typed exactly as before. */ TPayload = never, /** * What `handle` answers with, inferred from the handler body. * * `handle` used to be declared as returning the whole {@link ActionResult} * union, which is a complete description of what the router will accept and * a useless one for anybody downstream: the concrete shape an action * actually returns was erased the moment it was written down. A typed client * asking "what comes back from this endpoint" got the union back and could * say nothing more. * * Inferred, so nothing has to be annotated, and constrained to * {@link ActionResult} so the router's contract is unchanged. Defaults to * the full union, which is what an action whose return type cannot be * inferred falls back to - the behaviour every action had before. */ TResult extends ActionResult = ActionResult,> {
|
|
37
37
|
name?: string
|
|
38
38
|
description?: string
|
|
39
39
|
apiResponse?: boolean
|
|
@@ -60,7 +60,7 @@ declare interface ActionOptions<TModel = string, TValidations extends ActionVali
|
|
|
60
60
|
handle: {
|
|
61
61
|
bivarianceHack: (
|
|
62
62
|
request: [TPayload] extends [never] ? InferRequest<TModel, TValidations, TPath> : TPayload,
|
|
63
|
-
) =>
|
|
63
|
+
) => TResult | Promise<TResult>
|
|
64
64
|
}['bivarianceHack']
|
|
65
65
|
dependencies?: () => Record<string, unknown>
|
|
66
66
|
}
|
|
@@ -115,7 +115,7 @@ export type ActionResult = | Response
|
|
|
115
115
|
| boolean
|
|
116
116
|
| object
|
|
117
117
|
| unknown[];
|
|
118
|
-
export declare class Action<TModel = string, TValidations extends ActionValidations | undefined = undefined, TPath extends string = '', TPayload = never,> {
|
|
118
|
+
export declare class Action<TModel = string, TValidations extends ActionValidations | undefined = undefined, TPath extends string = '', TPayload = never, /** @see {@link ActionOptions} - inferred from `handle`'s return type. */ TResult extends ActionResult = ActionResult,> {
|
|
119
119
|
name?: string;
|
|
120
120
|
description?: string;
|
|
121
121
|
apiResponse?: boolean;
|
|
@@ -134,7 +134,7 @@ export declare class Action<TModel = string, TValidations extends ActionValidati
|
|
|
134
134
|
csrf?: boolean;
|
|
135
135
|
authorize?: ActionOptions<TModel, TValidations, TPath>['authorize'];
|
|
136
136
|
before?: ActionOptions<TModel, TValidations, TPath>['before'];
|
|
137
|
-
handle: ActionOptions<TModel, TValidations, TPath, TPayload>['handle'];
|
|
137
|
+
handle: ActionOptions<TModel, TValidations, TPath, TPayload, TResult>['handle'];
|
|
138
138
|
model?: string;
|
|
139
139
|
modelDefinition?: TModel;
|
|
140
140
|
constructor({
|
|
@@ -159,7 +159,7 @@ export declare class Action<TModel = string, TValidations extends ActionValidati
|
|
|
159
159
|
authorize,
|
|
160
160
|
before,
|
|
161
161
|
dependencies,
|
|
162
|
-
}: ActionOptions<TModel, TValidations, TPath, TPayload>);
|
|
162
|
+
}: ActionOptions<TModel, TValidations, TPath, TPayload, TResult>);
|
|
163
163
|
get deps(): Record<string, unknown>;
|
|
164
164
|
overrideDependencies(overrides: Record<string, unknown>): void;
|
|
165
165
|
resetDependencies(): void;
|
|
@@ -1 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Write `storage/framework/types/actions.d.ts`.
|
|
3
|
+
*
|
|
4
|
+
* Controllers stay a pattern rather than a union: they are addressed as
|
|
5
|
+
* `'Controllers/UserController@show'`, and the method half is a member name
|
|
6
|
+
* that would need the file parsed rather than listed. Catching the shape is
|
|
7
|
+
* what was already on offer for them, and it is unchanged.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateActionTypes(): Promise<void>;
|
|
@@ -1,7 +1,46 @@
|
|
|
1
|
-
import{readdir}from"node:fs/promises";import{log}from"@stacksjs/logging";import{path as p}from"@stacksjs/path";import{storage}from"@stacksjs/storage";
|
|
1
|
+
import{existsSync}from"node:fs";import{readdir}from"node:fs/promises";import{log}from"@stacksjs/logging";import{path as p}from"@stacksjs/path";import{storage}from"@stacksjs/storage";function actionDirectories(){const candidates=[p.appPath("Actions"),p.storagePath("framework/defaults/app/Actions")];try{const pkgJson=Bun.resolveSync("@stacksjs/defaults/package.json",process.cwd());candidates.push(`${pkgJson.slice(0,pkgJson.lastIndexOf("/"))}/app/Actions`)}catch{}return candidates.filter((dir)=>existsSync(dir))}async function collectActionPaths(){const found=new Set;for(const dir of actionDirectories()){const files=await readdir(dir,{recursive:!0});for(const file of files){if(!file.endsWith(".ts")||file.endsWith(".d.ts"))continue;found.add(`Actions/${file.slice(0,-3)}`)}}return[...found].sort()}async function collectMiddlewareAliases(){const found=new Set,candidates=[p.appPath("Middleware.ts"),p.storagePath("framework/defaults/app/Middleware.ts")];for(const file of candidates){if(!existsSync(file))continue;try{const module=await import(`${file}?t=${Date.now()}`);for(const alias of Object.keys(module.default??{}))found.add(alias)}catch{}}return[...found].sort()}async function collectNamedRoutes(){const registryFile=p.appPath("Routes.ts");if(!existsSync(registryFile))return{};try{const{listNamedRoutes,loadRoutes}=await import("@stacksjs/router"),{default:routeRegistry}=await import(registryFile);await loadRoutes(routeRegistry);return listNamedRoutes()}catch(error){log.debug("[generate:types] Could not load routes for named-route types",{error});return{}}}export async function generateActionTypes(){log.info("Generating action types...");const actions=await collectActionPaths();if(actions.length===0){log.debug("[generate:types] No action directories found; leaving actions.d.ts alone");return}const aliases=await collectMiddlewareAliases(),namedRoutes=await collectNamedRoutes(),union=actions.map((action)=>`
|
|
2
|
+
| '${action}'`).join(""),middlewareUnion=aliases.flatMap((alias)=>[`
|
|
3
|
+
| '${alias}'`,`
|
|
4
|
+
| '!${alias}'`]).join(""),routeEntries=Object.entries(namedRoutes).sort(([left],[right])=>left.localeCompare(right)).map(([name,routePath])=>`
|
|
5
|
+
'${name}': '${routePath}'`).join(""),contents=`// This file is auto-generated by Stacks. Do not edit this file manually.
|
|
2
6
|
// If you wish to rename an action, please do so by editing the file name.
|
|
3
7
|
//
|
|
4
8
|
// For more information, please visit: https://stacksjs.com/docs
|
|
5
9
|
|
|
6
|
-
|
|
7
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Every action this application can route to: its own, plus the framework
|
|
12
|
+
* defaults it has not overridden.
|
|
13
|
+
*/
|
|
14
|
+
export type ActionPath =${union}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Every middleware alias this application registers, and its negated form.
|
|
18
|
+
*/
|
|
19
|
+
export type MiddlewareAlias =${middlewareUnion||`
|
|
20
|
+
| string`}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Every named route, and the path it resolves to.
|
|
24
|
+
*
|
|
25
|
+
* A type alias, NOT an interface: only aliases of object literals get an
|
|
26
|
+
* implicit index signature, so an interface here fails the router's
|
|
27
|
+
* \`extends Record<string, string>\` shape check and the whole map is quietly
|
|
28
|
+
* ignored.
|
|
29
|
+
*/
|
|
30
|
+
export type NamedRoutes = {${routeEntries?`${routeEntries}
|
|
31
|
+
`:""}}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Handed to the router, so \`route.get(path, 'Actions/\u2026')\` and
|
|
35
|
+
* \`.middleware('auth')\` are checked against the lists above rather than
|
|
36
|
+
* against a string. A controller reference stays a pattern - the method half is
|
|
37
|
+
* a member name, not a filename.
|
|
38
|
+
*/
|
|
39
|
+
declare module '@stacksjs/bun-router' {
|
|
40
|
+
interface RouterTypeRegistry {
|
|
41
|
+
actions: ActionPath | \`\${string}Controller@\${string}\`
|
|
42
|
+
middleware: MiddlewareAlias
|
|
43
|
+
routes: NamedRoutes
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
`;await storage.writeFile(p.frameworkPath("types/actions.d.ts"),contents);log.debug(`[generate:types] Wrote ${actions.length} action paths, ${aliases.length} middleware aliases and ${Object.keys(namedRoutes).length} named routes`)}
|
package/dist/generate/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as fs from"node:fs";import process from"node:process";import{runCommand}from"@stacksjs/cli";import{Action,NpmScript}from"@stacksjs/enums";import{log}from"@stacksjs/logging";import{frameworkPath,projectPath,storagePath}from"@stacksjs/path";import{ExitCode}from"@stacksjs/types";import{runNpmScript}from"@stacksjs/utils";import{runAction}from"../helpers";import{generateVsCodeCustomData as genVsCodeCustomData}from"../helpers/vscode-custom-data";import{generateProjectImages}from"./images";import{generateEnvFiles}from"./env-files";export{generateProjectImages}from"./images";export{generateVSchema}from"./vschema";export async function invoke(options){if(options?.types)await generateTypes(options);else if(options?.entries)await generateLibEntries(options);else if(options?.webTypes)await generateWebTypes(options);else if(options?.customData)await generateVsCodeCustomData();else if(options?.ideHelpers)await generateIdeHelpers(options);else if(options?.componentMeta)await generateComponentMeta();else if(options?.coreSymlink)await generateCoreSymlink();else if(options?.openApiSpec)await generateOpenApiSpec();else if(options?.images)await generateProjectImages({verbose:options?.verbose})}export function generate(options){return invoke(options)}export async function generateLibEntries(options){const result=await runAction(Action.GenerateLibraryEntries,{...options,cwd:projectPath()});if(result.isErr){log.error("There was an error generating your library entry points",result.error);process.exit(ExitCode.FatalError)}log.success("Library entry points generated successfully")}export async function generateWebTypes(options){const result=await runNpmScript(NpmScript.GenerateWebTypes,options);if(result.isErr){log.error("There was an error generating the web-types.json file.",result.error);process.exit(ExitCode.FatalError)}log.success("Successfully generated the web-types.json file")}export async function generateVsCodeCustomData(){const result=await genVsCodeCustomData();if(result.isErr){log.error("There was an error generating the custom-elements.json file.",result.error);process.exit(ExitCode.FatalError)}await runAction(Action.LintFix,{verbose:!0,cwd:projectPath()});log.success("Successfully generated the custom-elements.json file")}export async function generateIdeHelpers(options){const result=await runNpmScript(NpmScript.GenerateIdeHelpers,options);if(result.isErr){log.error("There was an error generating IDE helpers.",result.error);process.exit(ExitCode.FatalError)}await runAction(Action.LintFix,{verbose:!0,cwd:projectPath()});log.success("Successfully generated IDE helpers")}export async function generateComponentMeta(){const result=await genVsCodeCustomData();if(result.isErr){log.error("There was an error generating your component meta information.",result.error);process.exit(ExitCode.FatalError)}await runAction(Action.LintFix,{verbose:!0,cwd:projectPath()});log.success("Successfully generated component meta information")}export async function generateTypes(options){await generateEnvFiles();const entry=frameworkPath("core/actions/src/generate/types.ts");if(!fs.existsSync(entry)){await import(`./types?t=${Date.now()}`);return}const result=await runNpmScript(NpmScript.GenerateTypes,{cwd:frameworkPath(),...options});if(result.isErr){log.error("There was an error generating your types.",result.error);throw result.error instanceof Error?result.error:Error(String(result.error))}log.success("Types were generated successfully")}export async function watchTypes(options){try{const manifestPath=`${frameworkPath()}/package.json`,text=fs.existsSync(manifestPath)?fs.readFileSync(manifestPath,"utf-8"):"";if(!(text?JSON.parse(text):{})?.scripts?.["generate:types"]){log.warn("[generate:types --watch] no `generate:types` script in framework package.json - type regeneration disabled. dev:api will keep running, but type definitions won't auto-refresh on model/config changes.");return}}catch{}const watched=[projectPath("app/Models"),storagePath("framework/defaults/app/Models"),projectPath("config"),projectPath("database/migrations")];log.info(`[generate:types --watch] watching ${watched.length} directories`);let pending=null,inflight=!1;const trigger=()=>{if(pending)clearTimeout(pending);pending=setTimeout(async()=>{if(inflight)return;inflight=!0;try{log.info("[generate:types --watch] change detected, regenerating\u2026");await generateTypes(options);log.success("[generate:types --watch] types up to date")}catch(err){log.error("[generate:types --watch] regeneration failed:",err)}finally{inflight=!1}},200)},watchers=[];for(const dir of watched)try{if(!fs.existsSync(dir))continue;const w=fs.watch(dir,{recursive:!0},()=>trigger());watchers.push(w)}catch(err){log.warn(`[generate:types --watch] cannot watch ${dir}: ${err}`)}if(watchers.length===0){log.warn("[generate:types --watch] no directories to watch - exiting");return}await new Promise((resolve)=>{process.once("SIGINT",()=>{log.info("[generate:types --watch] stopping");for(const w of watchers)try{w.close()}catch{}resolve()})})}export function generatePantryConfig(){log.success("Successfully generated `./pantry.yaml` based on your config")}export async function generateSeeder(){}export async function generateCoreSymlink(){const link=projectPath(".framework");if(fs.existsSync(link))await runCommand(`rm -f ${link}`);await runCommand(`ln -s ${frameworkPath()} ${link}`)}export async function generateOpenApiSpec(){const{generateOpenApi}=await import("@stacksjs/api");await generateOpenApi();log.success("Successfully generated Open API Spec")}
|
|
1
|
+
import*as fs from"node:fs";import process from"node:process";import{runCommand}from"@stacksjs/cli";import{Action,NpmScript}from"@stacksjs/enums";import{log}from"@stacksjs/logging";import{frameworkPath,projectPath,storagePath}from"@stacksjs/path";import{ExitCode}from"@stacksjs/types";import{runNpmScript}from"@stacksjs/utils";import{runAction}from"../helpers";import{generateVsCodeCustomData as genVsCodeCustomData}from"../helpers/vscode-custom-data";import{generateProjectImages}from"./images";import{generateActionTypes}from"./action-types";import{generateEnvFiles}from"./env-files";export{generateProjectImages}from"./images";export{generateVSchema}from"./vschema";export async function invoke(options){if(options?.types)await generateTypes(options);else if(options?.entries)await generateLibEntries(options);else if(options?.webTypes)await generateWebTypes(options);else if(options?.customData)await generateVsCodeCustomData();else if(options?.ideHelpers)await generateIdeHelpers(options);else if(options?.componentMeta)await generateComponentMeta();else if(options?.coreSymlink)await generateCoreSymlink();else if(options?.openApiSpec)await generateOpenApiSpec();else if(options?.images)await generateProjectImages({verbose:options?.verbose})}export function generate(options){return invoke(options)}export async function generateLibEntries(options){const result=await runAction(Action.GenerateLibraryEntries,{...options,cwd:projectPath()});if(result.isErr){log.error("There was an error generating your library entry points",result.error);process.exit(ExitCode.FatalError)}log.success("Library entry points generated successfully")}export async function generateWebTypes(options){const result=await runNpmScript(NpmScript.GenerateWebTypes,options);if(result.isErr){log.error("There was an error generating the web-types.json file.",result.error);process.exit(ExitCode.FatalError)}log.success("Successfully generated the web-types.json file")}export async function generateVsCodeCustomData(){const result=await genVsCodeCustomData();if(result.isErr){log.error("There was an error generating the custom-elements.json file.",result.error);process.exit(ExitCode.FatalError)}await runAction(Action.LintFix,{verbose:!0,cwd:projectPath()});log.success("Successfully generated the custom-elements.json file")}export async function generateIdeHelpers(options){const result=await runNpmScript(NpmScript.GenerateIdeHelpers,options);if(result.isErr){log.error("There was an error generating IDE helpers.",result.error);process.exit(ExitCode.FatalError)}await runAction(Action.LintFix,{verbose:!0,cwd:projectPath()});log.success("Successfully generated IDE helpers")}export async function generateComponentMeta(){const result=await genVsCodeCustomData();if(result.isErr){log.error("There was an error generating your component meta information.",result.error);process.exit(ExitCode.FatalError)}await runAction(Action.LintFix,{verbose:!0,cwd:projectPath()});log.success("Successfully generated component meta information")}export async function generateTypes(options){await generateEnvFiles();await generateActionTypes();const entry=frameworkPath("core/actions/src/generate/types.ts");if(!fs.existsSync(entry)){await import(`./types?t=${Date.now()}`);return}const result=await runNpmScript(NpmScript.GenerateTypes,{cwd:frameworkPath(),...options});if(result.isErr){log.error("There was an error generating your types.",result.error);throw result.error instanceof Error?result.error:Error(String(result.error))}log.success("Types were generated successfully")}export async function watchTypes(options){try{const manifestPath=`${frameworkPath()}/package.json`,text=fs.existsSync(manifestPath)?fs.readFileSync(manifestPath,"utf-8"):"";if(!(text?JSON.parse(text):{})?.scripts?.["generate:types"]){log.warn("[generate:types --watch] no `generate:types` script in framework package.json - type regeneration disabled. dev:api will keep running, but type definitions won't auto-refresh on model/config changes.");return}}catch{}const watched=[projectPath("app/Models"),storagePath("framework/defaults/app/Models"),projectPath("config"),projectPath("database/migrations")];log.info(`[generate:types --watch] watching ${watched.length} directories`);let pending=null,inflight=!1;const trigger=()=>{if(pending)clearTimeout(pending);pending=setTimeout(async()=>{if(inflight)return;inflight=!0;try{log.info("[generate:types --watch] change detected, regenerating\u2026");await generateTypes(options);log.success("[generate:types --watch] types up to date")}catch(err){log.error("[generate:types --watch] regeneration failed:",err)}finally{inflight=!1}},200)},watchers=[];for(const dir of watched)try{if(!fs.existsSync(dir))continue;const w=fs.watch(dir,{recursive:!0},()=>trigger());watchers.push(w)}catch(err){log.warn(`[generate:types --watch] cannot watch ${dir}: ${err}`)}if(watchers.length===0){log.warn("[generate:types --watch] no directories to watch - exiting");return}await new Promise((resolve)=>{process.once("SIGINT",()=>{log.info("[generate:types --watch] stopping");for(const w of watchers)try{w.close()}catch{}resolve()})})}export function generatePantryConfig(){log.success("Successfully generated `./pantry.yaml` based on your config")}export async function generateSeeder(){}export async function generateCoreSymlink(){const link=projectPath(".framework");if(fs.existsSync(link))await runCommand(`rm -f ${link}`);await runCommand(`ln -s ${frameworkPath()} ${link}`)}export async function generateOpenApiSpec(){const{generateOpenApi}=await import("@stacksjs/api");await generateOpenApi();log.success("Successfully generated Open API Spec")}
|
package/dist/scaffold-crud.js
CHANGED
|
@@ -83,4 +83,4 @@ ${migrationColumns(fields)}
|
|
|
83
83
|
`);log.info(`[dry-run] would write ${path} (${lines.length} lines)`);process.stdout.write(`${lines.slice(0,60).map((l)=>` ${l}`).join(`
|
|
84
84
|
`)}
|
|
85
85
|
|
|
86
|
-
`);return}await writeTextFile({path,data:contents})}export async function scaffoldCrud(name,options){const Model=pascalCase(name);if(!Model)throw Error("scaffold:crud requires a non-empty resource name");const fields=parseFields(options.fields);log.info(`Scaffolding CRUD for ${italic(Model)} (${fields.length||"no"} fields)`);await writeFile(p.userModelsPath(`${Model}.ts`),modelStub(Model,fields));const migrationName=`${Date.now().toString()}-create-${pluralize(snakeCase(name))}-table.ts`;await writeFile(p.userMigrationsPath(migrationName),migrationStub(name,fields));for(const kind of["Index","Show","Store","Update","Destroy"])await writeFile(p.userActionsPath(`${Model}${kind}Action.ts`),actionStub(name,kind,fields));log.success(`CRUD scaffold complete: model + migration + 5 actions for ${Model}`);log.info(`Next: register \`route.resource('${pluralize(snakeCase(name))}', '${Model}')\` in routes/api.ts`)}
|
|
86
|
+
`);return}await writeTextFile({path,data:contents})}export async function scaffoldCrud(name,options){const Model=pascalCase(name);if(!Model)throw Error("scaffold:crud requires a non-empty resource name");const fields=parseFields(options.fields);log.info(`Scaffolding CRUD for ${italic(Model)} (${fields.length||"no"} fields)`);await writeFile(p.userModelsPath(`${Model}.ts`),modelStub(Model,fields));const migrationName=`${Date.now().toString()}-create-${pluralize(snakeCase(name))}-table.ts`;await writeFile(p.userMigrationsPath(migrationName),migrationStub(name,fields));for(const kind of["Index","Show","Store","Update","Destroy"])await writeFile(p.userActionsPath(`${Model}${kind}Action.ts`),actionStub(name,kind,fields));log.success(`CRUD scaffold complete: model + migration + 5 actions for ${Model}`);log.info(`Next: run \`buddy generate:types\`, then register \`route.resource('${pluralize(snakeCase(name))}', '${Model}')\` in routes/api.ts`)}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/actions",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.72.
|
|
5
|
+
"version": "0.72.57",
|
|
6
6
|
"description": "The Stacks actions.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -59,35 +59,35 @@
|
|
|
59
59
|
"prepublishOnly": "bun run build"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@stacksjs/config": "0.72.
|
|
62
|
+
"@stacksjs/config": "0.72.57",
|
|
63
63
|
"@stacksjs/bumpx": "^0.2.6",
|
|
64
64
|
"@stacksjs/bunpress": "^0.2.8",
|
|
65
65
|
"@stacksjs/logsmith": "^0.2.3",
|
|
66
|
-
"@stacksjs/registry": "0.72.
|
|
66
|
+
"@stacksjs/registry": "0.72.57",
|
|
67
67
|
"@stacksjs/stx": "^0.2.219",
|
|
68
68
|
"@stacksjs/ts-cloud": "^0.11.4",
|
|
69
69
|
"@stacksjs/ts-md": "^0.1.1"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@stacksjs/api": "0.72.
|
|
73
|
-
"@stacksjs/cli": "0.72.
|
|
74
|
-
"@stacksjs/database": "0.72.
|
|
72
|
+
"@stacksjs/api": "0.72.57",
|
|
73
|
+
"@stacksjs/cli": "0.72.57",
|
|
74
|
+
"@stacksjs/database": "0.72.57",
|
|
75
75
|
"@stacksjs/tlsx": "^0.13.2",
|
|
76
76
|
"better-dx": "^0.2.24",
|
|
77
|
-
"@stacksjs/dns": "0.72.
|
|
78
|
-
"@stacksjs/enums": "0.72.
|
|
79
|
-
"@stacksjs/env": "0.72.
|
|
80
|
-
"@stacksjs/error-handling": "0.72.
|
|
81
|
-
"@stacksjs/image": "0.72.
|
|
82
|
-
"@stacksjs/logging": "0.72.
|
|
83
|
-
"@stacksjs/path": "0.72.
|
|
84
|
-
"@stacksjs/security": "0.72.
|
|
85
|
-
"@stacksjs/cms": "0.72.
|
|
86
|
-
"@stacksjs/sites": "0.72.
|
|
87
|
-
"@stacksjs/storage": "0.72.
|
|
88
|
-
"@stacksjs/strings": "0.72.
|
|
89
|
-
"@stacksjs/utils": "0.72.
|
|
90
|
-
"@stacksjs/validation": "0.72.
|
|
77
|
+
"@stacksjs/dns": "0.72.57",
|
|
78
|
+
"@stacksjs/enums": "0.72.57",
|
|
79
|
+
"@stacksjs/env": "0.72.57",
|
|
80
|
+
"@stacksjs/error-handling": "0.72.57",
|
|
81
|
+
"@stacksjs/image": "0.72.57",
|
|
82
|
+
"@stacksjs/logging": "0.72.57",
|
|
83
|
+
"@stacksjs/path": "0.72.57",
|
|
84
|
+
"@stacksjs/security": "0.72.57",
|
|
85
|
+
"@stacksjs/cms": "0.72.57",
|
|
86
|
+
"@stacksjs/sites": "0.72.57",
|
|
87
|
+
"@stacksjs/storage": "0.72.57",
|
|
88
|
+
"@stacksjs/strings": "0.72.57",
|
|
89
|
+
"@stacksjs/utils": "0.72.57",
|
|
90
|
+
"@stacksjs/validation": "0.72.57"
|
|
91
91
|
},
|
|
92
92
|
"peerDependencies": {
|
|
93
93
|
"pickier": "^0.1.58",
|