
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
Node.js web application development framework built on top of Express
npm install from command linenpm install qwert from command line in your project directoryexample configuration:
const qwert = require("qwert");
const path = require("path");
qwert.config({
root_dir: path.resolve("./src"), // Required
controllers_dir: "./controllers", // optional, default is "controllers"
models_dir: "./models", // optional, default is "models"
middleware_dir: "./middleware", // optional, default is "middleware"
views: {
dir: "./views" // optional, default is "views"
},
port: 3000
});
qwert.boot();
According to this configuration, our directory structure will be
|-- index.js
|-- src
|-- controllers
|-- middleware
|-- models
|-- views
Qwert will scan these directories and read model, view, controller and middleware js files from there, You can read more about how to create these files below
require("qwert") - read docsrequire("qwert/Controller") - read docsrequire("qwert/ControllerGroup") - read docsrequire("qwert/Middleware") - read docsrequire("qwert/Model") - read docsControllers must be located in controllers_dir directory
###How to create / Example
create file in controllers directory, for example TestController.js
Contents:
// file: controllers/TestController.js
const Controller = require("qwert/Controller");
module.exports = Controller(function($request, $response) {
// some controller logic
}, {
route: "/test"
});
this will create controller, that handles request on /test page
Qwert injects services as controller function arguments by argument names, read about services
Controller(fn, options)
Controller groups must be located in controllers_dir directory
###How to create / Example
create file in controllers directory, for example TestControllerGroup.js
Contents:
// file: controllers/TestControllerGroup.js
const ControllerGroup = require("qwert/ControllerGroup");
var group = ControllerGroup({
route: "/home"
});
group.add(Controller(function($request, $response) {
// Some controller logic
}, {
route: "/main"
}));
module.exports = group;
This code will create ControllerGroup that handles requests on /home path
Then added one controller which handles /home/main request, you can add as much controllers in group as needed
ControllerGroup(options)
Models must be located in models_dir
create file in models directory, for example TestModel.js
Contents:
// file: models/TestModel.js
const Model = require("qwert/Model");
module.exports = Model("test", function(args) {
this.getName = function() {
return "George";
}
});
this code creates model with name test
model can be instantiated from middleware or controller by service $model
Example code:
Controller(function($model, $param) {
var userModel = $model("user"); // user is the name of model
var user = userModel.getUser($param.get("id"));
// some logic
}, {
route: "/user/:id"
})
Model(name, fn)
##Middleware Middleware must be located in middleware_dir directory
##How to create / Example Create file in middleware directory, for example TestMiddleware.js
Contents:
// file: middleware/TestMiddleware.js
const Middleware = require("qwert/Middleware");
module.exports = Middleware("testMiddleware", function($response, $post, $next) {
if(!$post.has("id")) {
$response.json({
error: "You must provide id"
});
} else {
$next();
}
});
this code creates middleware with name testMiddleware
testMiddleware can be used as middleware of Controller or ControllerGroup
Note: In case if you don't call $next function, you have to handle response
Middleware(name, fn)
##Service injection
Services are used in controller, model and middleware functions
Service is passed to the function by name
Example
function Test($post, $response) { // Parameter sequence and length has no matter
$response.send($post.get("name"));
}
$request - express request object see docs$response - express response object see docs
$response.send("Hello world");$post - POST data of the request
$post.get("user_id"); // returns empty string if no user_id in post data$post.all(); // returns object that contains all post data$get - GET data of the request$param - Parameters of the router
/user/:id, $param.get("id") will return the id$get.get('user_id'); same as $post$model - Model provider$session - Session handler service
var user = $model('User');$next - used in Middleware, function that has to be called to continue request flow$upload - Service for accepting uploaded files, files won't stored unless you accept them by this service, generally used in middleware
$upload('file1').then(next); where file1 is form field and next is callback function$files - files uploaded by Content-Type: multipart/form-data and received by $upload service
var filename = $files.handler().get('file1').moveAutoName(__dirname+'../images/', true);FAQs
Node.js web application development framework built on top of Express
We found that qwert demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.