UNPKG

13.8 kBJavaScriptView Raw
1/**
2 * We.js core plugin main file
3 */
4module.exports = function loadPlugin (projectPath, Plugin) {
5 const plugin = new Plugin(__dirname);
6
7 // folder for fallback templates
8 plugin.tplFolder = projectPath + '/node_modules/we-plugin-view/server/templates/';
9
10 // set plugin configs
11 plugin.setConfigs({
12 // select how bootstrap functions will run
13 // values: full || install
14 bootstrapMode: null,
15
16 // enable suport to parse req.query.where to sequelize query
17 enableQueryWhere: false,
18 // update route methods
19 updateMethods: ['POST', 'PUT', 'PATCH'],
20 // default find limit
21 queryDefaultLimit: 25,
22 queryMaxLimit: 300,
23 // map reponseType response types, used by Accept headers in response selection
24 // this is set automaticaly after add new response types
25 responseTypes: [
26 'application/json',
27 'application/vnd.api+json'
28 ],
29 defaultResponseType: 'application/json',
30 // send nested models in response
31 sendNestedModels: true,
32 port: process.env.PORT || '4000',
33 hostname: process.env.APP_HOSTNAME || 'http://localhost:' + ( process.env.PORT || '4000' ),
34 // default favicon, change in your project config/local.js
35 favicon: __dirname + '/files/public/core-favicon.ico',
36
37 appName: process.env.APP_NAME || 'We.js app',
38 appLogo: '/public/plugin/we-core/files/images/logo-small.png',
39
40 robotsTXT: __dirname + '/files/robots.txt',
41 log: { level: 'debug' },
42 // set false to disable request log in dev env
43 enableRequestLog: process.env.APP_ENABLE_REQUEST_LOG || true,
44
45 session: {
46 secret: 'setASecreteKeyInYourAppConfig',
47 resave: false,
48 saveUninitialized: true,
49 name: 'wejs.sid',
50 rolling: false,
51 cookie: {
52 path: '/',
53 httpOnly: true,
54 secure: false,
55 maxAge: 86400000*15 // 15 days
56 }
57 },
58 // body parser settings to use in bodyParser.json()
59 bodyParser: {
60 limit: 20000000
61 },
62 // external services API keys
63 apiKeys: {},
64 // node-i18n configs
65 i18n: {
66 // setup some locales - other locales default to en silently
67 locales:[],
68 // you may alter a site wide default locale
69 defaultLocale: process.env.APP_DEFAULT_LOCALE || 'en-us',
70 // sets a custom cookie name to parse locale settings from - defaults to NULL
71 cookie: 'weLocale',
72 // where to store json files - defaults to './locales' relative to modules directory
73 directory: projectPath + '/config/locales',
74 // whether to write new locale information to disk - defaults to true
75 updateFiles: false,
76 // what to use as the indentation unit - defaults to "\t"
77 indent: '\t',
78 // setting extension of json files - defaults to '.json'
79 // (you might want to set this to '.js' according to webtranslateit)
80 extension: '.json',
81 // setting prefix of json files name - default to none ''
82 // (in case you use different locale files naming scheme
83 // (webapp-en.json), rather then just en.json)
84 prefix: '',
85 // enable object notation
86 objectNotation: false
87 },
88 clientside: {
89 // client side logs
90 log: {},
91 // publivars
92 publicVars: {
93 // set to true to enable the page.js partial loader
94 dynamicLayout: false
95 }
96 },
97 metadata: {},
98 // default db config
99 database: {
100 resetAllData: false,
101 prod: {
102 uri: process.env.DATABASE_URL,
103 dialect: process.env.DB_DIALECT,
104 protocol: process.env.DB_PROTOCOL,
105 database: process.env.DB_NAME,
106 username: process.env.DB_USER,
107 password: process.env.DB_PASSWORD,
108 host: process.env.DB_HOST,
109 port: process.env.DB_PORT,
110 // by default log to info
111 logging: plugin.we.log.debug
112 },
113 dev: {
114 uri: process.env.DATABASE_URL,
115 dialect: process.env.DB_DIALECT,
116 protocol: process.env.DB_PROTOCOL,
117 database: process.env.DB_NAME,
118 username: process.env.DB_USER,
119 password: process.env.DB_PASSWORD,
120 host: process.env.DB_HOST,
121 port: process.env.DB_PORT,
122 // by default log to info
123 logging: plugin.we.log.debug
124 },
125 test: {
126 uri: process.env.TEST_DATABASE_URL,
127 dialect: process.env.TEST_DB_DIALECT,
128 protocol: process.env.TEST_DB_PROTOCOL,
129 database: process.env.TEST_DB_NAME,
130 username: process.env.TEST_DB_USER,
131 password: process.env.TEST_DB_PASSWORD,
132 port: process.env.TEST_DB_PORT,
133 // by default log to info
134 logging: plugin.we.log.debug
135 }
136 },
137 // services register
138 // { url: '', oauthCallback: '', name: ''}
139 services: {},
140
141 date: { defaultFormat: process.env.APP_DATE_FORMAT || 'L HH:mm' },
142 // cache configs
143 cache: {
144 // resource cache, Last-Modified cache
145 resourceCacheActions: 'findOne',
146 skipResourceCache: false,
147 //Cache-Control: public, max-age=[maxage]
148 maxage: 86400000*15 // 15 days
149 },
150 security: {
151 // see https://github.com/expressjs/cors#configuration-options for configuration options
152 // This may be override by every route configs
153 CORS: {
154 // block all CORS requests by default
155 origin: function(origin, cb){ cb(null, false); },
156 // default methods
157 methods: ['GET', 'OPTIONS'],
158 allowedHeaders: ['Content-Type', 'Authorization', 'Accept']
159 },
160 sanitizer: {
161 allowedTags: [
162 // text blocks
163 'p',
164 'pre',
165 'code',
166 'blockquote',
167 'br',
168 'a', 'img',
169 'hr',
170 'mention',
171 'iframe',
172 'div',
173 // table:
174 'table', 'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre',
175 // text format
176 'b', 'i', 'em', 'strong', 'u',
177 'h1', 'h2', 'h3',
178 'h4', 'h5','h6',
179 // list
180 'ul', 'ol', 'nl', 'li',
181 // form:
182 'form',
183 'button', 'datalist', 'legend', 'label',
184 'select', 'optgroup', 'option',
185 'textarea', 'keygen', 'fieldset', 'output', 'progress', 'meter',
186 'input',
187 // figure tags:
188 'figure', 'figcaption',
189 // video tags:
190 'object', 'param', 'embed', 'video', 'source',
191 // audio
192 'audio', 'track'
193 ],
194 selfClosing: [
195 'br',
196 'img',
197 'hr',
198 'input'
199 ],
200 allowedAttributes: {
201 '*': [
202 'id',
203 'style',
204 'align',
205 'alt',
206 'center',
207 'bgcolor',
208 'data-*',
209 'we-*',
210 'width',
211 'height',
212 'class',
213 'type',
214 'name',
215 'autocomplete',
216 'autofocus',
217 'required',
218 'value',
219 'disabled',
220 'src',
221 'tabindex',
222 'placeholder',
223 'type',
224 'multiple',
225 'rows',
226 'cols'
227 ],
228 'a': ['href', 'target', 'type'],
229 'img': ['src'],
230 'iframe': ['src', 'frameborder'],
231 'form': ['action', 'method', 'accept', 'accept-charset', 'autocomplete', 'enctype', 'target' ],
232 'input': [
233 'accept', 'checked', 'maxlength', 'size', 'minlength'
234 ],
235 'video': ['controls'],
236 'audio': ['controls'],
237 'embed': ['allowscriptaccess', 'allowfullscreen'],
238 'track': ['kind', 'srclang', 'label']
239 },
240 allowedSchemes: [ 'http', 'https', 'ftp', 'mailto' ],
241 allowProtocolRelative: true
242 }
243 },
244 router: {
245 pluralize: false
246 },
247 JSONApi: {
248 sendSubRecordAttributes: process.env.APP_SUB_RECORD_ATTRIBUTES || false
249 },
250 /**
251 * Resource routes, add or remove routes generated to your resource
252 *
253 * @type {Object}
254 */
255 resourceRoutes: {
256 // apis
257 createAPI(we, cfg, opts) {
258 // set post create on list for APIS
259 we.routes['post '+opts.rootRoute] = we.utils._.merge(
260 {
261 resourceName: opts.namePrefix+opts.name,
262 action: 'create',
263 controller: cfg.controller,
264 model: cfg.model,
265 paramIdName: opts.paramIdName,
266 permission: 'create_' + opts.name,
267 breadcrumbHandler: 'create'
268 },
269 opts.create,
270 we.routes['post '+opts.rootRoute] || {}
271 );
272 },
273 findAll(we, cfg, opts) {
274 we.routes['get ' + opts.rootRoute] = we.utils._.merge(
275 {
276 resourceName: opts.namePrefix+opts.name,
277 layoutName: opts.layoutName, // null = default layout
278 name: opts.namePrefix + opts.name + '.find',
279 action: 'find',
280 controller: cfg.controller,
281 model: cfg.model,
282 paramIdName: opts.paramIdName,
283 template: opts.templateFolderPrefix + opts.name + '/find',
284 fallbackTemplate: plugin.tplFolder + 'default/find.hbs',
285 permission: 'find_' + opts.name,
286 titleHandler: 'i18n',
287 titleI18n: opts.name + '.find',
288 routeQuery: opts.routeQuery,
289 // default search
290 search: {
291 // since search is avaible in findAll by default
292 since: {
293 parser: 'since',
294 target: {
295 type: 'field',
296 field: 'createdAt'
297 }
298 }
299 },
300 breadcrumbHandler: 'find'
301 },
302 opts.findAll,
303 we.routes['get ' + opts.rootRoute] || {}
304 );
305 },
306 findOne(we, cfg, opts, Model) {
307 we.routes['get '+opts.itemRoute] = we.utils._.merge(
308 {
309 layoutName: opts.layoutName, // null = default layout
310 resourceName: opts.namePrefix+opts.name,
311 name: opts.namePrefix + opts.name + '.findOne',
312 action: 'findOne',
313 controller: cfg.controller,
314 model: cfg.model,
315 paramIdName: opts.paramIdName,
316 template: opts.templateFolderPrefix + opts.name + '/findOne',
317 fallbackTemplate: plugin.tplFolder + 'default/findOne.hbs',
318 permission: 'find_' + opts.name,
319 titleHandler: opts.itemTitleHandler,
320 titleField: Model.options.titleField,
321 titleI18n: opts.name + '.findOne',
322 breadcrumbHandler: 'findOne'
323 },
324 opts.findOne,
325 we.routes['get '+opts.itemRoute] || {}
326 );
327 },
328 updateAPI(we, cfg, opts) {
329 // pipe put and patch will be handled in same controller, action as update
330 we.routes['put '+opts.itemRoute] = we.utils._.merge(
331 {
332 resourceName: opts.namePrefix+opts.name,
333 action: 'edit',
334 controller: cfg.controller,
335 model: cfg.model,
336 paramIdName: opts.paramIdName,
337 permission: 'update_' + opts.name
338 },
339 opts.edit,
340 we.routes['put '+opts.itemRoute] || {}
341 );
342
343 we.routes['patch '+opts.itemRoute] = we.utils._.merge(
344 {
345 resourceName: opts.namePrefix+opts.name,
346 action: 'edit',
347 controller: cfg.controller,
348 model: cfg.model,
349 paramIdName: opts.paramIdName,
350 permission: 'update_' + opts.name
351 },
352 opts.edit,
353 we.routes['patch '+opts.itemRoute] || {}
354 );
355 },
356 deleteAPI(we, cfg, opts) {
357 we.routes['delete '+opts.itemRoute] = we.utils._.merge(
358 {
359 resourceName: opts.namePrefix+opts.name,
360 action: 'delete',
361 controller: cfg.controller,
362 model: cfg.model,
363 paramIdName: opts.paramIdName,
364 permission: 'delete_' + opts.name
365 },
366 opts.delete,
367 we.routes['delete '+opts.itemRoute] || {}
368 );
369 },
370 countAPI(we, cfg, opts) {
371 we.routes[`get ${opts.rootRoute}/count`] = we.utils._.merge(
372 {
373 resourceName: opts.namePrefix+opts.name,
374 name: opts.namePrefix + opts.name + '.count',
375 action: 'count',
376 controller: cfg.controller,
377 model: cfg.model,
378 paramIdName: opts.paramIdName,
379 permission: 'find_' + opts.name,
380 routeQuery: opts.routeQuery,
381 search: {
382 since: {
383 parser: 'since',
384 target: {
385 type: 'field',
386 field: 'createdAt'
387 }
388 }
389 }
390 },
391 opts.count,
392 we.routes[`get ${opts.rootRoute}/count`] || {}
393 );
394 }
395 }
396 });
397
398 plugin.fastLoader = function fastLoader(we, done) {
399 /**
400 * MainController
401 *
402 * @module Controller
403 */
404 we.controllers.main = new we.class.Controller({
405 /**
406 * Index page route /
407 */
408 index(req, res) {
409 res.locals.title = null; // dont show duplicated titles
410 res.ok();
411 }
412 });
413
414 /**
415 * t controller
416 * Controller for core translations API
417 * @type {Controller}
418 */
419 we.controllers.t = new we.class.Controller({});
420
421 done();
422 };
423
424 plugin.setResource({ name: 't' });
425
426 plugin.setRoutes({
427 'get /': {
428 'controller': 'main',
429 'action': 'index',
430 'template' : 'home/index',
431 'layoutName' : 'home',
432 titleHandler(req, res, next) {
433 res.locals.title = ''; /// remove default duplicated title:
434 return next();
435 }
436 }
437 });
438
439 return plugin;
440};
\No newline at end of file