Skip to content

Commit

Permalink
Release 2.0.0-rc.2 :squirrel:
Browse files Browse the repository at this point in the history
- Refactor SDK Structure (Internal Breaking Change - External istransparent)
- First refactor draft for generator logic
- Fixed bug #41
- Fixed bug #42
- Upgrade Angular 2 test app to RC4
  • Loading branch information
Jonathan Casarrubias committed Jul 16, 2016
1 parent 875eb40 commit ef007dd
Show file tree
Hide file tree
Showing 43 changed files with 604 additions and 404 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

This file is created to keep history of the LoopBack SDK Builder, it does not consider or keeps any history of its parent module `loopback-sdk-angular`.

## Release 2.0.0-rc.2

- Refactor SDK Structure (Internal Breaking Change - External istransparent)
- First refactor draft for generator logic
- Fixed bug https://github.com/jonathan-casarrubias/loopback-sdk-builder/issues/41
- Fixed bug https://github.com/jonathan-casarrubias/loopback-sdk-builder/issues/42
- Upgrade Angular 2 test app to RC4

## Release 2.0.0-rc.1

- Created Unit Tests
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,21 @@ You don't have to manually write any static code.
- Built in Interfaces and Models.
- Built in API Calls.
- Built in PubSub support for the [loopback-component-pubsub](https://www.npmjs.com/package/loopback-component-pubsub).
- Built in Platform Specific Drivers (Angular2 for web, NativeScript2, Angular Universal).
- Built in Platform Specific Drivers (Angular2 for web, NativeScript2, ~~Angular Universal~~).
- Built in CLI Tool for builder.
- Built in Logger Service.
- Ability to select which models or methods to generate.
- Ability to point models to different url domains (not global baseUrl)
- IO Heartbeating to avoid disconnections.
- Fully Typed (TypeScript).
- Extendable Models for custom logic.
- Small foot print 100k per generated SDK (Will increase depending on number of models).

# Installation

````sh
$ cd to/api/project
$ npm install --save-dev [email protected].1
$ npm install --save-dev [email protected].2
````

# LoopBack SDK CLI Options
Expand Down
196 changes: 103 additions & 93 deletions lib/angular2/index.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,38 @@
var fs = require('fs');
var path = require('path');
var fs = require('fs');
var path = require('path');
var mkdirp = require('mkdirp');
var ejs = require('ejs');
var utils = require('../utils');
ejs.filters.q = function(obj) {
return JSON.stringify(obj, null, 2 );
var rmdir = require('rimraf');
var ejs = require('ejs');
var utils = require('../utils');
ejs.filters.q = function (obj) {
return JSON.stringify(obj, null, 2);
};
/**
* Generate Client SDK for the given loopback application.
*/
module.exports = function generate(ctx) {
var results = [];
// Describe models
ctx.models = utils.describeModels(ctx.app);
ctx.models = utils.describeModels(ctx.app);
for (modelName in ctx.models) {
if (!ctx.models[modelName].sharedClass.ctor.settings.sdk.enabled) {
console.warn('LoopBack SDK Builder: %s model was ignored', modelName);
delete ctx.models[modelName];
}
}
// resolve path once
ctx.outputFolder = path.resolve(ctx.outputFolder);
// clean folder
console.log('Removing base directory %s', ctx.outputFolder);
rmdir.sync(ctx.outputFolder);
// Create required directories
mkdirp.sync(ctx.outputFolder+'/models');
mkdirp.sync(ctx.outputFolder);
mkdirp.sync(ctx.outputFolder + '/models');
if (ctx.isIo === 'enabled')
mkdirp.sync(ctx.outputFolder+'/sockets');
mkdirp.sync(ctx.outputFolder+'/storage');
mkdirp.sync(ctx.outputFolder+'/services/api');
mkdirp.sync(ctx.outputFolder + '/sockets');
mkdirp.sync(ctx.outputFolder + '/storage');
mkdirp.sync(ctx.outputFolder + '/services/custom');
mkdirp.sync(ctx.outputFolder + '/services/core');
// Generate SDK
results.push(generateModels(ctx));
results.push(generateApis(ctx));
Expand Down Expand Up @@ -64,7 +72,7 @@ function generateModels(ctx) {
}
// Create Models index
var indexTemplate = fs.readFileSync(
require.resolve('./shared/models.ejs'),
require.resolve('./shared/model.index.ejs'),
{ encoding: 'utf-8' }
);
result = ejs.render(indexTemplate, {
Expand All @@ -78,6 +86,45 @@ function generateModels(ctx) {
fs.writeFileSync(ctx.outputFolder + '/models/index.ts', result);
}
results.push(result);

/**
* Generate Base Models
*/
var template = fs.readFileSync(
require.resolve('./shared/base.models.ejs'),
{ encoding: 'utf-8' }
);

result = ejs.render(template);

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/models/BaseModels.ts', result);
}

results.push(result);

/**
* Generate loopback config
*/
var template = fs.readFileSync(
require.resolve('./shared/config.ejs'),
{ encoding: 'utf-8' }
);

result = ejs.render(template, {
moduleName: ctx.moduleName,
urlBase: ctx.apiUrl.replace(/\/+$/, '')
});

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/lb.config.ts', result);
}

results.push(result);


return results;
}
/**
Expand All @@ -89,11 +136,12 @@ function generateApis(ctx) {
{ encoding: 'utf-8' }
);

var indexTemplate = fs.readFileSync(
require.resolve('./shared/apis.ejs'),
var customIndexTemplate = fs.readFileSync(
require.resolve('./shared/custom-api.index.ejs'),
{ encoding: 'utf-8' }
);


var results = [];
var result;
for (var modelName in ctx.models) {
Expand All @@ -112,50 +160,51 @@ function generateApis(ctx) {
if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(
ctx.outputFolder + '/services/api/' + modelName + '.ts',
ctx.outputFolder + '/services/custom/' + modelName + '.ts',
result
);
}

results.push(result);
}

result = ejs.render(indexTemplate, {
moduleName: ctx.moduleName,
models: ctx.models,
urlBase: ctx.apiUrl.replace(/\/+$/, '')
});

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/api.service.ts', result);
}
/**
* Create multiple files at once (First draft for complete refactor)
* TODO REFACTOR THE COMPLETE MESSY FILE
*/
[
{
template : './shared/services.index.ejs',
output : '/services/index.ts',
params : {}
},
{
template : './shared/custom-api.index.ejs',
output : '/services/custom/index.ts',
params : {
models : ctx.models
}
},
{
template : './shared/core-api.index.ejs',
output : '/services/core/index.ts',
params : {}
}
].forEach(
config => {
results.push(fs.writeFileSync(`${ctx.outputFolder}${config.output}`, ejs.render(fs.readFileSync(
require.resolve(config.template), { encoding: 'utf-8' }), config.params))
)
}
);

results.push(result);
return results;
}

function generateHelperFiles(ctx) {
var results = [];
var result;

/**
* Generate services/api.d.ts
*/
var template = fs.readFileSync(
require.resolve('./shared/typings.ejs'),
{ encoding: 'utf-8' }
);

result = ejs.render(template);

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/api.d.ts', result);
}

results.push(result);

/**
* Generate services/errorHandler.service.ts
*/
Expand All @@ -169,41 +218,21 @@ function generateHelperFiles(ctx) {
if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(
ctx.outputFolder + '/services/errorHandler.service.ts',
ctx.outputFolder + '/services/core/errorHandler.service.ts',
result
);
}

results.push(result);

/**
* Generate services/config.service.ts
* Generate services/base.api.service.ts
*/
template = fs.readFileSync(
require.resolve('./shared/config.ejs'),
require.resolve('./shared/base-api.ejs'),
{ encoding: 'utf-8' }
);

result = ejs.render(template, {
moduleName: ctx.moduleName,
urlBase: ctx.apiUrl.replace(/\/+$/, '')
});

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/config.service.ts', result);
}

results.push(result);

/**
* Generate services/baseApi.service.ts
*/
template = fs.readFileSync(
require.resolve('./shared/baseApi.ejs'),
{ encoding: 'utf-8' }
);

result = ejs.render(template, {
moduleName: ctx.moduleName,
isIo: ctx.isIo,
Expand All @@ -212,7 +241,7 @@ function generateHelperFiles(ctx) {

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/baseApi.service.ts', result);
fs.writeFileSync(ctx.outputFolder + '/services/core/base.api.service.ts', result);
}

results.push(result);
Expand All @@ -232,7 +261,7 @@ function generateHelperFiles(ctx) {

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/auth.service.ts', result);
fs.writeFileSync(ctx.outputFolder + '/services/core/auth.service.ts', result);
}

results.push(result);
Expand All @@ -241,7 +270,7 @@ function generateHelperFiles(ctx) {
* Generate storage/storage.driver.ts
*/
template = fs.readFileSync(
require.resolve('./'+ ctx.driver +'/storage.driver.ejs'),
require.resolve('./' + ctx.driver + '/storage.driver.ejs'),
{ encoding: 'utf-8' }
);

Expand Down Expand Up @@ -272,27 +301,7 @@ function generateHelperFiles(ctx) {

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/logger.service.ts', result);
}

results.push(result);

/**
* Generate services/logger.config.ts
*/
template = fs.readFileSync(
require.resolve('./shared/logger.config.ejs'),
{ encoding: 'utf-8' }
);

result = ejs.render(template, {
moduleName: ctx.moduleName,
urlBase: ctx.apiUrl.replace(/\/+$/, '')
});

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/logger.config.ts', result);
fs.writeFileSync(ctx.outputFolder + '/services/core/logger.service.ts', result);
}

results.push(result);
Expand All @@ -311,12 +320,12 @@ function generateHelperFiles(ctx) {

if (ctx.outputFolder) {
ctx.outputFolder = path.resolve(ctx.outputFolder);
fs.writeFileSync(ctx.outputFolder + '/services/search.params.ts', result);
fs.writeFileSync(ctx.outputFolder + '/services/core/search.params.ts', result);
}

results.push(result);
if (ctx.isIo === 'enabled') {

if (ctx.isIo === 'enabled')  {
/**
* Generate sockets/index.ts
*/
Expand Down Expand Up @@ -380,6 +389,7 @@ function generateHelperFiles(ctx) {
result = ejs.render(template, {
moduleName: ctx.moduleName,
models: ctx.models,
isIo: ctx.isIo,
urlBase: ctx.apiUrl.replace(/\/+$/, '')
});

Expand Down
Loading

0 comments on commit ef007dd

Please sign in to comment.