Skip to content

Commit 4dfbbd5

Browse files
committed
New SchemaBuilder types and updated U.getExtension (removed "." dot).
1 parent 79f6c1e commit 4dfbbd5

8 files changed

Lines changed: 205 additions & 58 deletions

File tree

builders.js

Lines changed: 109 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
const REQUIRED = 'The field "@" is required.';
3030
const DEFAULT_SCHEMA = 'default';
3131
const SKIP = { $$schema: true, $$result: true, $callback: true, $$async: true };
32+
const REGEXP_CLEAN_EMAIL = /\s/g;
33+
const REGEXP_CLEAN_PHONE = /\s|\.|\-|\(|\)/g;
3234

3335
var schemas = {};
3436
var transforms = { pagination: {}, error: {}, objectbuilder: {}, transformbuilder: {} };
@@ -321,16 +323,81 @@ SchemaBuilderEntity.prototype.$parse = function(name, value, required, custom) {
321323
}
322324

323325
if (lower.contains(['string', 'text', 'varchar', 'nvarchar'])) {
326+
result.type = 3;
327+
var beg = lower.indexOf('(');
328+
if (beg === -1)
329+
return result;
330+
var size = lower.substring(beg + 1, lower.length - 1).parseInt();
331+
result.length = size;
332+
result.raw = lower.substring(0, beg);
333+
return result;
334+
}
324335

336+
if (lower.contains(['camelize', 'camelcase', 'camel'])) {
325337
result.type = 3;
338+
var beg = lower.indexOf('(');
339+
if (beg === -1)
340+
return result;
341+
var size = lower.substring(beg + 1, lower.length - 1).parseInt();
342+
result.length = size;
343+
result.raw = lower.substring(0, beg);
344+
result.subtype = 'camelcase';
345+
return result;
346+
}
326347

348+
if (lower.contains(['lowerize', 'lowercase', 'lower'])) {
349+
result.type = 3;
327350
var beg = lower.indexOf('(');
328351
if (beg === -1)
329352
return result;
353+
var size = lower.substring(beg + 1, lower.length - 1).parseInt();
354+
result.length = size;
355+
result.raw = lower.substring(0, beg);
356+
result.subtype = 'lowercase';
357+
return result;
358+
}
330359

360+
if (lower.contains(['upperize', 'uppercase', 'upper'])) {
361+
result.type = 3;
362+
var beg = lower.indexOf('(');
363+
if (beg === -1)
364+
return result;
331365
var size = lower.substring(beg + 1, lower.length - 1).parseInt();
332366
result.length = size;
333367
result.raw = lower.substring(0, beg);
368+
result.subtype = 'uppercase';
369+
return result;
370+
}
371+
372+
if (lower.contains(['uid'])) {
373+
result.type = 3;
374+
result.length = 20;
375+
result.raw = 'string';
376+
result.subtype = 'uid';
377+
return result;
378+
}
379+
380+
if (lower.contains(['email'])) {
381+
result.type = 3;
382+
result.length = 120;
383+
result.raw = 'string';
384+
result.subtype = 'email';
385+
return result;
386+
}
387+
388+
if (lower.contains(['zip'])) {
389+
result.type = 3;
390+
result.length = 10;
391+
result.raw = 'string';
392+
result.subtype = 'zip';
393+
return result;
394+
}
395+
396+
if (lower.contains(['phone'])) {
397+
result.type = 3;
398+
result.length = 20;
399+
result.raw = 'string';
400+
result.subtype = 'phone';
334401
return result;
335402
}
336403

@@ -972,18 +1039,11 @@ SchemaBuilderEntity.prototype.$make = function(obj) {
9721039
};
9731040

9741041
SchemaBuilderEntity.prototype.$prepare = function(obj, callback) {
975-
9761042
var self = this;
977-
978-
if (obj && typeof(obj.$save) === 'function') {
1043+
if (obj && typeof(obj.$save) === 'function')
9791044
callback(null, obj);
980-
return self;
981-
}
982-
983-
self.make(obj, function(err, model) {
984-
callback(err, model);
985-
});
986-
1045+
else
1046+
self.make(obj, (err, model) => callback(err, model));
9871047
return self;
9881048
};
9891049

@@ -1069,8 +1129,10 @@ SchemaBuilderEntity.prototype.make = function(model, filter, callback) {
10691129

10701130
var self = this;
10711131

1072-
if (typeof(model) === 'function')
1073-
return model.call(self, self);
1132+
if (typeof(model) === 'function') {
1133+
model.call(self, self);
1134+
return self;
1135+
}
10741136

10751137
if (typeof(filter) === 'function') {
10761138
var tmp = callback;
@@ -1165,13 +1227,28 @@ SchemaBuilderEntity.prototype.prepare = function(model, dependencies) {
11651227
case 2:
11661228
item[property] = self.$onprepare(property, framework_utils.parseFloat(val), undefined, model);
11671229
break;
1230+
11681231
// string
11691232
case 3:
11701233
tmp = val === undefined || val === null ? '' : autotrim(self, val.toString());
1171-
if (type.length&& type.length < tmp.length)
1234+
if (type.length && type.length < tmp.length)
11721235
tmp = tmp.substring(0, type.length);
1236+
1237+
switch (type.subtype) {
1238+
case 'email':
1239+
tmp = tmp.toLowerCase().replace(REGEXP_CLEAN_EMAIL, '');
1240+
break;
1241+
case 'phone':
1242+
tmp = tmp.replace(REGEXP_CLEAN_PHONE, '');
1243+
break;
1244+
case 'camelcase':
1245+
tmp = tmp.toCamelCase();
1246+
break;
1247+
}
1248+
11731249
item[property] = self.$onprepare(property, tmp, undefined, model);
11741250
break;
1251+
11751252
// boolean
11761253
case 4:
11771254
tmp = val ? val.toString().toLowerCase() : null;
@@ -1273,6 +1350,25 @@ SchemaBuilderEntity.prototype.prepare = function(model, dependencies) {
12731350
tmp = tmp === undefined || tmp === null ? '' : autotrim(self, tmp.toString());
12741351
if (type.length && tmp.length < tmp.length)
12751352
tmp = tmp.substring(0, type.length);
1353+
1354+
switch (type.subtype) {
1355+
case 'email':
1356+
tmp = tmp.toLowerCase().replace(REGEXP_CLEAN_EMAIL, '');
1357+
break;
1358+
case 'phone':
1359+
tmp = tmp.replace(REGEXP_CLEAN_PHONE, '');
1360+
break;
1361+
case 'camelcase':
1362+
tmp = tmp.toCamelCase();
1363+
break;
1364+
case 'lowercase':
1365+
tmp = tmp.toLowerCase();
1366+
break;
1367+
case 'uppercase':
1368+
tmp = tmp.toUpperCase();
1369+
break;
1370+
}
1371+
12761372
tmp = self.$onprepare(property, tmp, j, model);
12771373
break;
12781374

changes.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@
1212
- added: `F.route()` supports a new flag: `cors` (creates a cors route) and `credentials` (enables cookies for cors)
1313
- added: `ErrorBuilder.plain()` returns all errors as a simple string
1414
- added: `Array.findItem()` alias to `Array.find()`
15-
- added: `UID()` for generating unique identificators (contains minimum 16 chars)
15+
- added: `UID()` for generating unique identificators (contains minimum 18 chars)
1616
- added: `F.restart()` for restarting app
1717
- added: `F.on('restart')`
1818
- added: quicksort algorithm for sorting arrays
1919
- added: `Array.quicksort(property_name, [asc])` for sorting arrays
2020
- added: `String.removeTags()` by @harry-stot
2121
- added: F.nosql(name) + NOSQL(name) --> alias for NoSQL embedded database (it can be used with e.g. SQL Agent)
2222
- added: modificators can handle `INSTALL('view', ...)`
23+
- added: `String.isPhone()` for phone number validation
24+
- added: `String.isUID()` for UID() validation
25+
- added: `String.toCamelCase()`
26+
- added: new schemabuilder types `Email` (string, maxlength 120), `Phone` (string, maxlength 20), `Zip` (string, maxlength 10), `Camelize` (string), `Lowerize` (string), `Upperize` (string), `UID` (string, minlength 18, maxlength 20)
2327

2428
- updated: `F.route(url, ...)` - `url`can be String Array with multiple relative paths by @Harry-Stot
2529
- updated: `F.file()` supports flags instead of middleware and the flags supports extensions `['.jpg', '.png']`. The `name` argument has been removed.
@@ -32,6 +36,7 @@
3236
- updated: `Array.orderBy()` added quicksort algorithm
3337
- updated: `Date.format()` supports day names `ddd` (short) and `dddd` (full)
3438
- updated: `String.removeDiacritics()` supports multiple languages (by @Harry-Slot)
39+
- updated: (IMPORTANT) `U.getExtension(filename)` --> returns extension without `.` dot
3540

3641
- fixed: `FrameworkImage.save()` problem with streams
3742
- fixed: `CLEANUP(stream)` method

image.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ function Image(filename, useImageMagick, width, height) {
142142
this.filename = type === 'string' ? filename : null;
143143
this.currentStream = type === 'object' ? filename : null;
144144
this.isIM = useImageMagick === undefined || useImageMagick === null ? F.config['default-image-converter'] === 'im' : useImageMagick;
145-
this.outputType = type === 'string' ? framework_utils.getExtension(filename).substring(1) : 'jpg';
145+
this.outputType = type === 'string' ? framework_utils.getExtension(filename) : 'jpg';
146146
}
147147

148148
/*

index.js

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ var child = require('child_process');
3939
var util = require('util');
4040

4141
const ENCODING = 'utf8';
42-
const EXTENSION_JS = '.js';
4342
const RESPONSE_HEADER_CACHECONTROL = 'Cache-Control';
4443
const RESPONSE_HEADER_CONTENTTYPE = 'Content-Type';
4544
const RESPONSE_HEADER_CONTENTLENGTH = 'Content-Length';
@@ -266,7 +265,8 @@ global.GETSCHEMA = function(group, name) {
266265
};
267266

268267
global.UID = function() {
269-
return UIDGENERATOR.date + (UIDGENERATOR.index++).padLeft(4, '0') + UIDGENERATOR.instance;
268+
var plus = UIDGENERATOR.index % 2 ? 1 : 0;
269+
return UIDGENERATOR.date + (UIDGENERATOR.index++).padLeft(4, '0') + UIDGENERATOR.instance + plus;
270270
};
271271

272272
global.MAKE = global.TRANSFORM = function(transform, fn) {
@@ -424,7 +424,7 @@ function Framework() {
424424

425425
this.id = null;
426426
this.version = 2000;
427-
this.version_header = '2.0.0-21';
427+
this.version_header = '2.0.0-22';
428428
this.version_node = process.version.toString().replace('v', '').replace(/\./g, '').parseFloat();
429429

430430
this.config = {
@@ -1770,8 +1770,11 @@ Framework.prototype.map = function(url, filename, filter) {
17701770
}
17711771

17721772
if (filter instanceof Array) {
1773-
for (var i = 0, length = filter.length; i < length; i++)
1774-
filter[i] = (filter[i][0] !== '.' ? '.' : '') + filter[i].toLowerCase();
1773+
for (var i = 0, length = filter.length; i < length; i++) {
1774+
if (filter[i][0] === '.')
1775+
filter[i] = filter[i].substring(1);
1776+
filter[i] = filter[i].toLowerCase();
1777+
}
17751778
}
17761779

17771780
setTimeout(function() {
@@ -2396,7 +2399,7 @@ Framework.prototype.$load = function(types, targetdirectory) {
23962399
return;
23972400

23982401
if (!extension)
2399-
extension = EXTENSION_JS;
2402+
extension = '.js';
24002403

24012404
fs.readdirSync(directory).forEach(function(o) {
24022405
var isDirectory = fs.statSync(path.join(directory, o)).isDirectory();
@@ -2420,6 +2423,8 @@ Framework.prototype.$load = function(types, targetdirectory) {
24202423
}
24212424

24222425
var ext = framework_utils.getExtension(o).toLowerCase();
2426+
if (ext)
2427+
ext = '.' + ext;
24232428
if (ext !== extension)
24242429
return;
24252430
var name = (level ? framework_utils.$normalize(directory).replace(dir, '') + '/' : '') + o.substring(0, o.length - ext.length);
@@ -2533,7 +2538,7 @@ Framework.prototype.$startup = function(callback) {
25332538

25342539
fs.readdirSync(dir).forEach(function(o) {
25352540
var extension = framework_utils.getExtension(o).toLowerCase();
2536-
if (extension !== '.js')
2541+
if (extension !== 'js')
25372542
return;
25382543
run.push(o);
25392544
});
@@ -3520,7 +3525,7 @@ Framework.prototype.uninstall = function(type, name, options, skipEmit) {
35203525
*/
35213526
Framework.prototype.register = function(path) {
35223527

3523-
var extension = framework_utils.getExtension(path);
3528+
var extension = '.' + framework_utils.getExtension(path);
35243529
var self = this;
35253530
var name = framework_utils.getName(path);
35263531
var key;
@@ -5107,8 +5112,8 @@ Framework.prototype.responseImage = function(req, res, filename, fnProcess, head
51075112
fnProcess(image);
51085113

51095114
var extension = framework_utils.getExtension(name);
5110-
if (extension.substring(1) !== image.outputType)
5111-
name = name.substring(0, name.lastIndexOf(extension)) + '.' + image.outputType;
5115+
if (extension !== image.outputType)
5116+
name = name.substring(0, name.lastIndexOf('.' + extension)) + '.' + image.outputType;
51125117

51135118
image.save(name, function(err) {
51145119

@@ -5161,8 +5166,8 @@ Framework.prototype.responseImage = function(req, res, filename, fnProcess, head
51615166
fnProcess(image);
51625167

51635168
var extension = framework_utils.getExtension(name);
5164-
if (extension.substring(1) !== image.outputType)
5165-
name = name.substring(0, name.lastIndexOf(extension)) + '.' + image.outputType;
5169+
if (extension !== image.outputType)
5170+
name = name.substring(0, name.lastIndexOf('.' + extension)) + '.' + image.outputType;
51665171

51675172
image.save(name, function(err) {
51685173

@@ -6413,7 +6418,7 @@ Framework.prototype.listener = function(req, res) {
64136418

64146419
var can = true;
64156420
if (req.isStaticFile) {
6416-
req.extension = framework_utils.getExtension(req.uri.pathname).substring(1);
6421+
req.extension = framework_utils.getExtension(req.uri.pathname);
64176422
switch (req.extension) {
64186423
case 'html':
64196424
case 'htm':
@@ -7023,7 +7028,7 @@ Framework.prototype.model = function(name) {
70237028
if (self.models[name] !== undefined)
70247029
return self.models[name];
70257030

7026-
var filename = path.join(directory, self.config['directory-models'], name + EXTENSION_JS);
7031+
var filename = path.join(directory, self.config['directory-models'], name + '.js');
70277032

70287033
if (existsSync(filename))
70297034
self.install('model', name, filename, undefined, undefined, undefined, true);
@@ -7048,7 +7053,7 @@ Framework.prototype.source = function(name, options, callback) {
70487053
if (self.sources[name] !== undefined)
70497054
return self.sources[name];
70507055

7051-
var filename = path.join(directory, self.config['directory-source'], name + EXTENSION_JS);
7056+
var filename = path.join(directory, self.config['directory-source'], name + '.js');
70527057
if (existsSync(filename))
70537058
self.install('source', name, filename, options, callback, undefined, true);
70547059
return self.sources[name] || null;
@@ -7524,7 +7529,7 @@ Framework.prototype.test = function(stop, names, cb) {
75247529
var name = path.relative(framework_utils.combine(dir), filePath);
75257530
var filename = filePath;
75267531
var ext = framework_utils.getExtension(filename).toLowerCase();
7527-
if (ext !== EXTENSION_JS)
7532+
if (ext !== 'js')
75287533
return;
75297534

75307535
if (names.length && names.indexOf(name.substring(0, name.length - 3)) === -1)
@@ -7661,7 +7666,7 @@ Framework.prototype.clear = function(callback, isInit) {
76617666
if (dir)
76627667
return false;
76637668
var ext = framework_utils.getExtension(filename);
7664-
return ext === '.js' || ext === '.css' || ext === '.tmp';
7669+
return ext === 'js' || ext === 'css' || ext === 'tmp';
76657670
});
76667671
return self;
76677672
}
@@ -8388,8 +8393,8 @@ Framework.prototype._configure = function(arr, rewrite) {
83888393
*/
83898394
Framework.prototype.routeScript = function(name, theme) {
83908395
var self = this;
8391-
if (name.lastIndexOf(EXTENSION_JS) === -1)
8392-
name += EXTENSION_JS;
8396+
if (name.lastIndexOf('.js') === -1)
8397+
name += '.js';
83938398
return self._routeStatic(name, self.config['static-url-script'], theme);
83948399
};
83958400

@@ -8759,7 +8764,7 @@ Framework.prototype.worker = function(name, id, timeout, args) {
87598764
if (fork)
87608765
return fork;
87618766

8762-
var filename = framework_utils.combine(self.config['directory-workers'], name) + EXTENSION_JS;
8767+
var filename = framework_utils.combine(self.config['directory-workers'], name) + '.js';
87638768

87648769
if (!args)
87658770
args = [];
@@ -11470,8 +11475,8 @@ Controller.prototype.head = function() {
1147011475

1147111476
if (val.endsWith('.css', true))
1147211477
output += '<link type="text/css" rel="stylesheet" href="' + (isRoute ? self.routeStyle(val) : val) + '" />';
11473-
else if (val.endsWith(EXTENSION_JS, true) !== -1)
11474-
output += '<script type="text/javascript" src="' + (isRoute ? self.routeScript(val) : val) + '"></script>';
11478+
else if (val.endsWith('.js', true) !== -1)
11479+
output += '<script src="' + (isRoute ? self.routeScript(val) : val) + '"></script>';
1147511480
}
1147611481

1147711482
header += output;

0 commit comments

Comments
 (0)