npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

rest-resource-file-generator

v2.0.4

Published

## Table of contents * [General info](#general-info) * [About RESTful](#about-RESTful) * [Setup](#setup) * [Usage](#usage)

Downloads

13

Readme

REST resource file generator

Table of contents

General info

:new: You can use it also in front end side for creating file as in back end. Just follow the instructions.
As a backend developer all we know that every time when we want to add new API, new logic, new CRUD, we create some files and write into them some codes.
For example when we want to create a logic (let's call it resource) about user, we create a router.

    userRt.get('/v1/users', UserCtrl.getMany);
    userRt.post('/v1/users', UserCtrl.post);

a controller.

    async getMany(req, res) {
     // here should be your code, where it's called service or db model or smth else
    }
    async post(req, res) {
     // here should be your code, where it's called service or db model or smth else
    }

then we usually create a service, a model, tests, swagger schema and so on. Almost 6-7 files every time. So this package allows you to generate all this files at once just run a CLI command and make your life easy :)

About RESTful

Why did I decide to use rest resource name? Because I connect this log with RESTful resource. REST is architectural style for distributed hypermedia systems, one of the most famous styles. The key abstraction of information in REST is a resource. Any information that can be named can be a resource: a document or image, a temporal service, a collection of other resources, a non-virtual object (e.g. a person), and so on. REST uses a resource identifier to identify the particular resource involved in an interaction between components.
For more info, please see here here. That's why I chose REST resource.

Setup

Now I created a generator for Mongodb/Mongoose scheme/model. In the next version you'll be able to choose SQL/Sequelize else. Before setup please ensure that you use Node.js v12 version or above.

  • install package
  npm i -g rest-resource-file-generator
  • create a rest.js local config file in your project's root directory like default config file below\
'use strict';
module.exports = function (resourceName, bodies) {
    return {
        routers: {
            resourceName,
            body: bodies.routers,
            fileName: `routers/${resourceName}-rt.js`,
            params: {
                dir: '../controllers',
                basePath: 'v1',
                routerName: 'camelCaseNameRt',
                controllerName: 'pascalCaseNameCtrl',
                pathName: 'pluralizedName',
            },
        },
        controllers: {
            resourceName,
            body: bodies.controllers,
            fileName: `controllers/${resourceName}-ctrl.js`,
            params: {
                dir: '../services',
                controllerName: 'pascalCaseNameCtrl',
                serviceName: 'pascalCaseNameSrv',
            },
        },
        services: {
            resourceName,
            body: bodies.services,
            fileName: `services/${resourceName}-srv.js`,
            params: {
                modelName: 'pascalCaseName',
                dir: '../dal/models',
                serviceName: 'pascalCaseNameSrv',
            },
        },
        models: {
            resourceName,
            body: bodies.models,
            fileName: `dal/models/${resourceName}.js`,
            params: { // find in string by key name
                modelName: 'pascalCaseName',
                schemaName: 'camelCaseNameSchema',
            },
        },
        unitTests: {
            resourceName,
            body: bodies.unitTests,
            fileName: `tests/unit/${resourceName}-test.js`,
            params: {
                dir: '../controllers', // key and values must contain different words
                controllerName: 'pascalCaseNameCtrl',
                testName: 'pascalCaseName',
            },
        },
        swaggerPaths: {
            resourceName,
            body: bodies.swaggerPaths,
            fileName: `docs/swagger/paths/${resourceName}-path.json`,
            params: {
                basePath: 'v1',
                schemaName: 'camelCaseNameSchema',
                tagName: 'pascalCaseName',
                pathName: 'pluralizedName',
            },
        },
        swaggerSchemas: {
            fileName: `docs/swagger/schemas/${resourceName}-schema.json`,
        },
    };
};

If you don't create local config file, it'll be created from global configuration. It's allowed to make your variable resourceName to camelCase, PascalCase or pluralized.
E.g. resourceName is my-child, camelCase will be myChild, PascalCase MyChild, pluralized-myChildren.
Also, you can dynamically change creating filename and its body in your code as you need. For that you should create local resources bodies, as in example, or your files' body will be taken from global resource-bodies directory.
For using local bodies, please create a resource-bodies directory and export all you local resource bodies. Files in that must have these special names as in below image. The file names and restrc.js returning object's key name must be the same.

This is a bodyFiles example for routers. You can dynamically change your file's content as you want.

'use strict';
module.exports = `'use strict';
const routerName = require('express').Router();

const { controllerName } = require('dir');

routerName.get('/basePath/pathName/:_id', controllerName.getOne);
routerName.get('/basePath/pathName', controllerName.getMany);
routerName.post('/basePath/pathName', controllerName.post);
routerName.put('/basePath/pathName/:_id', controllerName.putOne);
routerName.delete('/basePath/pathName/:_id', controllerName.deleteOne);

module.exports = routerName;
`;

In this example we set dynamically dir, basePath, routerName, controllerName, pathName which will be replace in file's body with values you set here (restrc.js routers params)

{
     dir: '../controllers',
     basePath: 'v1',
     routerName: 'camelCaseNameRt',
     controllerName: 'pascalCaseNameCtrl',
     pathName: 'pluralizedName',
}

Usage

There is an only one command rest resource, but there are some flags what you need to know.

-N name. Its value is the resource name.
-LR local restrc.js file existence. If its value is yes, it says that the local restrc.js file exists. Otherwise, it uses global configs.
-F fields. It must be the last flag. Its values (and the rest values) are mongoose and swagger schemas configs.
Let's see on example.

or you can write just in one line using this syntax.

rest-resource -N user -F name--type:String-required:true-minLength:3 age--type:Number-min:13 email--type:String-unique:true

It will create all your files like this hierarchy.

If you wanted to generate a controller file, it will look like

List of mongoose supported options

    'type',
    'required',
    'default',
    'index',
    'unique',
    'sparse',
    'lowercase',
    'uppercase',
    'trim',
    'minLength',
    'maxLength',
    'min',
    'max',
    'ref',

List of mongoose supported options (please be careful about the register).

    'String',
    'Number',
    'Date',
    'Buffer',
    'Boolean',
    'Map',
    'Schema.ObjectId', // since here to below you must take quotes, othervise it throws an error.
    'Schema.Types.Mixed',
    'Schema.Types.ObjectId',
    'Schema.Types.Decimal128',

These lists will be expanded in the future.

P.S. This module works perfectly with my node-server-template, here its link Node-server