UNPKG

6.13 kBJavaScriptView Raw
1// Generated by CoffeeScript 1.4.0
2(function() {
3 "use strict";
4
5 var desugarModel, getAllIndirectOwners, getAllOwners, _,
6 __slice = [].slice;
7
8 _ = require('underscore');
9
10 desugarModel = function(modelName, tgt, src, keys) {
11 return keys.forEach(function(key) {
12 var obj;
13 if (typeof src[key] === 'string') {
14 obj = {};
15 obj[key] = {
16 type: src[key]
17 };
18 return desugarModel(modelName, tgt, obj, [key]);
19 } else if (!(src[key].type != null)) {
20 throw new Error("must assign a type: " + key);
21 } else if (src[key].type === 'mixed') {
22 return tgt[key] = {
23 type: 'mixed'
24 };
25 } else if (src[key].type === 'nested') {
26 tgt[key] = {
27 type: 'nested'
28 };
29 return desugarModel(modelName, tgt[key], src[key], _.without(Object.keys(src[key]), 'type'));
30 } else if (_(['string', 'number', 'date', 'boolean']).contains(src[key].type)) {
31 tgt[key] = {
32 type: src[key].type,
33 required: !!src[key].required,
34 index: !!src[key].index,
35 unique: !!src[key].unique
36 };
37 if (src[key]["default"] != null) {
38 tgt[key]["default"] = src[key]["default"];
39 }
40 if (src[key].validate != null) {
41 return tgt[key].validate = src[key].validate;
42 }
43 } else if (src[key].type === 'hasOne') {
44 return tgt[key] = src[key];
45 } else if (src[key].type === 'hasMany') {
46 tgt[key] = src[key];
47 return tgt[key].inverseName = src[key].inverseName || key;
48 } else {
49 throw new Error("Invalid type: " + src[key].type);
50 }
51 });
52 };
53
54 getAllOwners = function(specmodels, modelName) {
55 var indirect, owners;
56 owners = specmodels[modelName].owners;
57 indirect = _.values(owners).map(function(model) {
58 return getAllOwners(specmodels, model);
59 });
60 return _.extend.apply(_, [{}, owners].concat(__slice.call(indirect)));
61 };
62
63 getAllIndirectOwners = function(specmodels, modelName) {
64 var indirect, owners;
65 owners = specmodels[modelName].owners;
66 indirect = _.flatten(_.values(owners).map(function(model) {
67 return getAllOwners(specmodels, model);
68 }));
69 return _.extend.apply(_, [{}].concat(__slice.call(indirect)));
70 };
71
72 exports.desugar = function(models) {
73 var rest;
74 rest = {};
75 Object.keys(models).forEach(function(modelName) {
76 var inspec, spec;
77 spec = {};
78 inspec = models[modelName].fields || {};
79 desugarModel(modelName, spec, inspec, Object.keys(inspec));
80 rest[modelName] = _.extend({}, models[modelName], {
81 fields: spec
82 });
83 if (!rest[modelName].owners) {
84 return rest[modelName].owners = {};
85 }
86 });
87 Object.keys(rest).forEach(function(modelName) {
88 return rest[modelName].indirectOwners = getAllIndirectOwners(rest, modelName);
89 });
90 return rest;
91 };
92
93 exports.getMeta = function(specmodels) {
94 var meta;
95 meta = {};
96 Object.keys(specmodels).forEach(function(modelName) {
97 var apa, otherMany, ownMany;
98 meta[modelName] = meta[modelName] || {};
99 meta[modelName].owners = _.pairs(specmodels[modelName].owners).map(function(_arg) {
100 var plur, sing;
101 sing = _arg[0], plur = _arg[1];
102 return {
103 sing: sing,
104 plur: plur
105 };
106 });
107 meta[modelName].fields = [
108 {
109 name: 'id',
110 readonly: true,
111 required: false,
112 type: 'string'
113 }
114 ];
115 meta[modelName].fields = meta[modelName].fields.concat(_.pairs(specmodels[modelName].fields).filter(function(_arg) {
116 var k, v;
117 k = _arg[0], v = _arg[1];
118 return v.type !== 'hasMany';
119 }).map(function(_arg) {
120 var k, v;
121 k = _arg[0], v = _arg[1];
122 return {
123 name: k,
124 readonly: k === '_id',
125 required: !!v.require,
126 type: v.type
127 };
128 }));
129 meta[modelName].fields = meta[modelName].fields.concat(_.pairs(specmodels[modelName].owners).map(function(_arg) {
130 var k, v;
131 k = _arg[0], v = _arg[1];
132 return {
133 name: k,
134 readonly: true,
135 required: true,
136 type: 'string'
137 };
138 }));
139 meta[modelName].fields = meta[modelName].fields.concat(_.pairs(specmodels[modelName].indirectOwners).map(function(_arg) {
140 var k, v;
141 k = _arg[0], v = _arg[1];
142 return {
143 name: k,
144 readonly: true,
145 required: true,
146 type: 'string'
147 };
148 }));
149 meta[modelName].fields = _.sortBy(meta[modelName].fields, function(x) {
150 return x.name;
151 });
152 apa = function(modelName) {
153 return _.pairs(specmodels[modelName].fields).filter(function(_arg) {
154 var key, value;
155 key = _arg[0], value = _arg[1];
156 return value.type === 'hasMany';
157 });
158 };
159 ownMany = apa(modelName).map(function(_arg) {
160 var k, v;
161 k = _arg[0], v = _arg[1];
162 return {
163 ref: v.model,
164 name: k,
165 inverseName: v.inverseName
166 };
167 });
168 otherMany = Object.keys(specmodels).map(function(mn) {
169 var fd;
170 fd = apa(mn).filter(function(_arg) {
171 var k, v;
172 k = _arg[0], v = _arg[1];
173 return v.model === modelName;
174 });
175 return fd.map(function(_arg) {
176 var k, v;
177 k = _arg[0], v = _arg[1];
178 return {
179 ref: mn,
180 name: v.inverseName,
181 inverseName: k
182 };
183 });
184 });
185 return meta[modelName].manyToMany = _.flatten(ownMany.concat(otherMany));
186 });
187 Object.keys(meta).forEach(function(metaName) {
188 return meta[metaName].owns = _.flatten(Object.keys(meta).map(function(mn) {
189 return meta[mn].owners.filter(function(x) {
190 return x.plur === metaName;
191 }).map(function(x) {
192 return {
193 name: mn,
194 field: x.sing
195 };
196 });
197 }));
198 });
199 return meta;
200 };
201
202}).call(this);