j1-template 2024.0.0 → 2024.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/apps/public/cc/cc.yml +35 -33
  3. data/assets/data/cookieconsent.html +15 -106
  4. data/assets/data/docsearch.html +155 -0
  5. data/assets/data/iframes.html +96 -0
  6. data/assets/data/quicklinks.html +10 -0
  7. data/assets/data/speak2me.html +4 -3
  8. data/assets/data/translator.html +27 -147
  9. data/assets/themes/j1/adapter/js/{chat.js → chatbot.js} +20 -18
  10. data/assets/themes/j1/adapter/js/clipboard.js +1 -1
  11. data/assets/themes/j1/adapter/js/docsearch.js +270 -0
  12. data/assets/themes/j1/adapter/js/gallery.js +1 -1
  13. data/assets/themes/j1/adapter/js/iframer.js +350 -0
  14. data/assets/themes/j1/adapter/js/mmenu.js +1 -1
  15. data/assets/themes/j1/adapter/js/navigator.js +4 -0
  16. data/assets/themes/j1/adapter/js/rouge.js +1 -1
  17. data/assets/themes/j1/adapter/js/speak2me.js +2 -2
  18. data/assets/themes/j1/adapter/js/translator.js +5 -0
  19. data/assets/themes/j1/core/css/animate.css +4 -4
  20. data/assets/themes/j1/core/css/animate.min.css +1 -1
  21. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +1 -1
  22. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  23. data/assets/themes/j1/core/js/template.js +19 -7
  24. data/assets/themes/j1/core/js/template.min.js +1 -1
  25. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  26. data/assets/themes/j1/modules/iframeResizer/LICENSE +1 -1
  27. data/assets/themes/j1/modules/iframeResizer/README.md +105 -0
  28. data/assets/themes/j1/modules/iframeResizer/{examples → example}/frame.absolute.html +12 -11
  29. data/assets/themes/j1/modules/iframeResizer/{examples → example}/frame.content.html +22 -28
  30. data/assets/themes/j1/modules/iframeResizer/{examples → example}/frame.hover.html +9 -8
  31. data/assets/themes/j1/modules/iframeResizer/{examples → example}/frame.nested.html +12 -12
  32. data/assets/themes/j1/modules/iframeResizer/{examples → example}/frame.textarea.html +6 -8
  33. data/assets/themes/j1/modules/iframeResizer/{examples → example}/frame.tolerance.html +11 -11
  34. data/assets/themes/j1/modules/iframeResizer/{examples → example}/index.html +43 -19
  35. data/assets/themes/j1/modules/iframeResizer/{examples → example}/two.html +8 -11
  36. data/assets/themes/j1/modules/iframeResizer/js/client/iframeResizer.contentWindow.js +84 -68
  37. data/assets/themes/j1/modules/iframeResizer/js/client/iframeResizer.contentWindow.min.js +10 -8
  38. data/assets/themes/j1/modules/iframeResizer/js/resizer.js +149 -72
  39. data/assets/themes/j1/modules/iframeResizer/js/resizer.min.js +11 -7
  40. data/lib/j1/version.rb +1 -1
  41. data/lib/starter_web/README.md +5 -5
  42. data/lib/starter_web/_config.yml +1 -1
  43. data/lib/starter_web/_data/modules/{framer.yml → _docsearch.yml} +20 -9
  44. data/lib/starter_web/_data/modules/{chat.yml → chatbots.yml} +2 -2
  45. data/lib/starter_web/_data/modules/defaults/{chat.yml → chatbots.yml} +2 -2
  46. data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +3 -75
  47. data/lib/starter_web/_data/modules/defaults/docsearch.yml +87 -0
  48. data/lib/starter_web/_data/modules/defaults/{framer.yml → iframer.yml} +56 -21
  49. data/lib/starter_web/_data/modules/defaults/navigator.yml +4 -0
  50. data/lib/starter_web/_data/modules/defaults/translator.yml +11 -52
  51. data/lib/starter_web/_data/modules/docsearch.yml +45 -0
  52. data/lib/starter_web/_data/modules/iframer.yml +103 -0
  53. data/lib/starter_web/_data/modules/navigator_menu.yml +39 -1
  54. data/lib/starter_web/_data/resources.yml +41 -19
  55. data/lib/starter_web/_data/templates/feed.xml +1 -1
  56. data/lib/starter_web/_plugins/asciidoctor/iframe-block.rb +46 -0
  57. data/lib/starter_web/_plugins/index/lunr.rb +2 -1
  58. data/lib/starter_web/package.json +74 -75
  59. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +1 -1
  60. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +1 -1
  61. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +1 -1
  62. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/111_about_the_converter.asciidoc +1 -2
  63. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/100_converter/112_getting_started.asciidoc +1 -0
  64. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/200_themes/211_language_overview.asciidoc +0 -1
  65. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/200_themes/212_values.asciidoc +1 -2
  66. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/_includes/documents/200_themes/213_fonts.asciidoc +4 -1
  67. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/a2p.bat +2 -2
  68. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/a2p.sh +2 -3
  69. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.a2p +5 -9
  70. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +1 -1
  71. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.pdf +27727 -0
  72. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +1 -1
  73. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +1 -1
  74. data/lib/starter_web/pages/public/features/general.adoc +1 -1
  75. data/lib/starter_web/pages/public/features/template.adoc +1 -1
  76. data/lib/starter_web/pages/public/learn/roundtrip/asciidoc_extensions.adoc +1 -1
  77. data/lib/starter_web/pages/public/learn/roundtrip/bootstrap_themes.adoc +1 -1
  78. data/lib/starter_web/pages/public/learn/roundtrip/highlghter_rouge.adoc +1 -1
  79. data/lib/starter_web/pages/public/learn/roundtrip/lunr_search.adoc +1 -1
  80. data/lib/starter_web/pages/public/learn/roundtrip/modal_extentions.adoc +1 -1
  81. data/lib/starter_web/pages/public/learn/roundtrip/present_images.adoc +1 -1
  82. data/lib/starter_web/pages/public/learn/roundtrip/present_videos.adoc +1 -1
  83. data/lib/starter_web/pages/public/learn/roundtrip/responsive_tables.adoc +1 -1
  84. data/lib/starter_web/pages/public/learn/roundtrip/typography.adoc +1 -1
  85. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +1 -1
  86. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +1 -1
  87. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +1 -1
  88. data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +1 -1
  89. data/lib/starter_web/pages/public/plans/plans.adoc +1 -1
  90. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.hover.html +69 -0
  91. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.nested.html +75 -0
  92. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.textarea.html +57 -0
  93. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/my.content.html +112 -0
  94. data/lib/starter_web/pages/public/tools/previewer/iframer_documents/iframe.content.html +51 -0
  95. data/lib/starter_web/pages/public/tools/previewer/iframer_documents/iframe.docsearch.info.html +84 -0
  96. data/lib/starter_web/pages/public/tools/previewer/preview_bootstrap_theme.adoc +1 -1
  97. data/lib/starter_web/pages/public/tools/previewer/preview_docsearch.adoc +92 -0
  98. data/lib/starter_web/pages/public/tools/previewer/preview_iframer.adoc +106 -0
  99. metadata +35 -25
  100. data/assets/themes/j1/adapter/js/framer.js +0 -237
  101. data/assets/themes/j1/modules/chatgpt/css/theme/uno.css +0 -92
  102. data/assets/themes/j1/modules/chatgpt/css/theme/uno.min.css +0 -16
  103. data/lib/starter_web/_data/_defaults/private.yml +0 -129
  104. data/lib/starter_web/_data/modules/nbinteract.yml +0 -476
  105. data/lib/starter_web/utilsrv/_defaults/package.json +0 -57
  106. data/lib/starter_web/utilsrv/package.json +0 -57
  107. data/lib/starter_web/utilsrv/server.js +0 -775
  108. /data/assets/themes/j1/modules/{chat → chatbot}/css/theme/uno.css +0 -0
  109. /data/assets/themes/j1/modules/{chat → chatbot}/css/theme/uno.min.css +0 -0
@@ -1,775 +0,0 @@
1
- /*
2
- # -----------------------------------------------------------------------------
3
- # ~/packages/910_theme_utils/100_util_server/server.js
4
- #
5
- # Provides services for e.g. an external OAuth Client used by
6
- # NetlifyCMS for GH authentication
7
- #
8
- # Product/Info:
9
- # https://jekyll.one
10
- # http://www.vxk.cz/tips/2017/05/18/netlify-cms/
11
- #
12
- # Copyright (C) 2023, 2024 Juergen Adams
13
- # Copyright (C) 2020 Václav Klecanda
14
- #
15
- # J1 Template is licensed under the MIT License.
16
- # See: https://github.com/jekyll-one-org/j1-template/blob/main/LICENSE.md
17
- # Netlify-cms-github-oauth-provider is licensed under UNKNOWN License.
18
- # See: https://github.com/vencax/netlify-cms-github-oauth-provider/blob/master/README.md
19
- # -----------------------------------------------------------------------------
20
- # NOTE:
21
- # To fix Webstorm NodeJS API issue see:
22
- # https://stackoverflow.com/questions/19532660/webstorm-7-cannot-recognize-node-api-methods
23
- # -----------------------------------------------------------------------------
24
- */
25
- 'use strict';
26
-
27
- // -----------------------------------------------------------------------------
28
- // ESLint shimming
29
- // -----------------------------------------------------------------------------
30
- // noinspection DuplicatedCode
31
- // noinspection ES6ConvertRequireIntoImport
32
- // noinspection ES6ConvertVarToLetConst
33
- // noinspection ES6ModulesDependencies
34
- // noinspection JSCheckFunctionSignatures
35
- // noinspection JSIgnoredPromiseFromCall
36
- // noinspection JSJoinVariableDeclarationAndAssignment
37
- // noinspection JSUnfilteredForInLoop
38
- // noinspection JSUnresolvedFunction
39
- // noinspection JSUnresolvedVariable
40
- // noinspection JSUnusedLocalSymbols
41
- // noinspection JSValidateTypes
42
- // noinspection NodeJsCodingAssistanceForCoreModules
43
- // noinspection SpellCheckingInspection
44
-
45
- // =============================================================================
46
- // libraries
47
- // -----------------------------------------------------------------------------
48
- const express = require('express');
49
- const bodyParser = require("body-parser");
50
- const cors = require('cors');
51
- const parseURL = require('lite-url');
52
- const fs = require('fs');
53
- const touch = require("touch");
54
- const yaml = require('js-yaml');
55
- const path = require('path');
56
- const randomstring = require('randomstring');
57
- // const gitP = require('simple-git/promise');
58
- const gitP = require('simple-git'); // simple-git/promise' has been deprecated and will be removed by July 2022 - change all 'simple-git/promise' imports to just 'simple-git'
59
- const simpleOauthModule = require('simple-oauth2');
60
- const util = require('util');
61
- const exec = util.promisify(require('child_process').exec);
62
- const moment = require('moment');
63
- const sprintf = require('sprintf-js').sprintf;
64
- const vsprintf = require('sprintf-js').vsprintf;
65
- const cron = require('node-cron');
66
- const log4js = require('log4js');
67
-
68
-
69
- // =============================================================================
70
- // base settings
71
- // -----------------------------------------------------------------------------
72
- const daemon_home = path.resolve(__dirname);
73
- const environment = daemon_home.indexOf('packages') !== -1 ? 'dev' : 'prod';
74
- const current_date = moment().format('YYYY-MM-DD');
75
-
76
- let config_home;
77
- let project_home;
78
- let log_home;
79
- let utilsrv_options;
80
- let log4javascript_options;
81
- let private_data;
82
- let logStream;
83
- let fsStats;
84
-
85
- // timestamp settings
86
- //
87
- moment().format('YYYY-MM-DD hh:mm:ss.SSS');
88
-
89
- // =============================================================================
90
- // environment settings
91
- // -----------------------------------------------------------------------------
92
- if (environment === 'dev') {
93
- project_home = daemon_home + '/../400_theme_site';
94
- config_home = daemon_home + '/../400_theme_site/_data';
95
- log_home = daemon_home + '/../..';
96
- } else {
97
- project_home = daemon_home + '/..';
98
- config_home = daemon_home + '/../_data';
99
- log_home = daemon_home + '/..';
100
- }
101
-
102
- // =============================================================================
103
- // load configuration data
104
- // -----------------------------------------------------------------------------
105
-
106
- const util_settings = config_home + '/utilities';
107
- const util_defaults = util_settings + '/defaults';
108
-
109
- const modules_settings = config_home + '/modules';
110
- const modules_defaults = modules_settings + '/defaults';
111
-
112
- const private_data_file = config_home + '/' + 'private.yml';
113
-
114
- const log4javascript_defaults_file = modules_defaults + '/' + 'log4javascript.yml';
115
- const log4javascript_settings_file = modules_settings + '/' + 'log4javascript.yml';
116
-
117
- const utilsrv_defaults_file = util_defaults + '/' + 'util_srv.yml';
118
- const utilsrv_settings_file = util_settings + '/' + 'util_srv.yml';
119
-
120
- try {
121
- const log4javascript_defaults = yaml.load(fs.readFileSync(log4javascript_defaults_file, 'utf8'));
122
- const log4javascript_settings = yaml.load(fs.readFileSync(log4javascript_settings_file, 'utf8'));
123
- const utilsrv_defaults = yaml.load(fs.readFileSync(utilsrv_defaults_file, 'utf8'));
124
- const utilsrv_settings = yaml.load(fs.readFileSync(utilsrv_settings_file, 'utf8'));
125
- const private_data_settings = yaml.load(fs.readFileSync(private_data_file, 'utf8'));
126
-
127
- // noinspection JSUnresolvedVariable
128
- private_data = private_data_settings.util_srv;
129
- utilsrv_options = mergeData(utilsrv_defaults.defaults, utilsrv_settings.settings);
130
- log4javascript_options = mergeData(log4javascript_defaults.defaults, utilsrv_settings.settings);
131
- } catch (e) {
132
- console.log(e);
133
- }
134
- const ajaxAppenderOptions = log4javascript_options.appenders[1].appender;
135
-
136
- // -----------------------------------------------------------------------------
137
- // utility server settings
138
- //
139
- const enabled = utilsrv_options.enabled || false;
140
- const ssl = utilsrv_options.ssl || false;
141
- const port = utilsrv_options.port || 40020;
142
- const origin = utilsrv_options.origin || 'localhost';
143
- const hostName = utilsrv_options.host_name || '0.0.0.0';
144
- const verbose = utilsrv_options.verbose || false;
145
- const logFileName = ajaxAppenderOptions.log_file_name + '_' + current_date || 'messages' + '_' + current_date;
146
- const logFileExt = ajaxAppenderOptions.log_file_ext || 'log';
147
- const logFolder = ajaxAppenderOptions.log_folder || 'log';
148
- const logFileNamePath = log_home + '/' + logFolder + '/' + logFileName + '.' + logFileExt;
149
- const current_logFile = log_home + '/' + logFolder + '/' + 'messages.current';
150
- const util_srv_url = ssl ? 'https://' + origin + ':' + port : 'http://' + origin + ':' + port;
151
- const thread_id = generateId (11);
152
- const page = '/util_srv';
153
- const isWin = process.platform === "win32";
154
-
155
- // -----------------------------------------------------------------------------
156
- // logger settings
157
- // See: https://github.com/log4js-node/log4js-node/blob/master/docs/layouts.md
158
- //
159
- log4js.configure({
160
- appenders: {
161
- stdout: {
162
- type: 'stdout',
163
- layout: {
164
- type: 'pattern',
165
- pattern: '[%d{yyyy-MM-dd hh:mm:ss.SSS}] [%p] [%-40c] %m%n'
166
- }
167
- },
168
- file: {
169
- type: 'file',
170
- filename: logFileNamePath,
171
- layout: {
172
- type: 'pattern',
173
- pattern: '[%d{yyyy-MM-dd hh:mm:ss.SSS}] [%-11x{thread}] [%-5p] [%-60x{page}] [%-40c] %m',
174
- tokens: {
175
- thread: thread_id,
176
- page: page
177
- }
178
- }
179
- }
180
- },
181
- categories: {
182
- default: {
183
- appenders: ['stdout'],
184
- level: 'info'
185
- },
186
- 'j1.util_srv': {
187
- appenders: ['file'],
188
- level: 'info'
189
- },
190
- 'j1.util_srv.preflight': {
191
- appenders: ['file'],
192
- level: 'info'
193
- },
194
- 'j1.util_srv.task': {
195
- appenders: ['file'],
196
- level: 'info'
197
- }
198
- }
199
- });
200
-
201
- // -----------------------------------------------------------------------------
202
- // create loggers
203
- //
204
- let stdout = log4js.getLogger('stdout');
205
- let preflight = log4js.getLogger('j1.util_srv.preflight');
206
- let logger = log4js.getLogger('j1.util_srv.core');
207
-
208
- // -----------------------------------------------------------------------------
209
- // scheduler task settings
210
- // See: https://github.com/node-cron/node-cron
211
- //
212
- let test_per_minute = cron.schedule('* * * * *', () => {
213
- let timestamp = moment().format('YYYY-MM-DD HH:mm');
214
- console.log(timestamp + ': scheduled test task running every minute');
215
- }, {
216
- scheduled: false
217
- });
218
-
219
- let rolling_logs = cron.schedule('* * * * *', () => {
220
- let logger = log4js.getLogger( 'j1.util_srv.task');
221
- // logger_stdout.info('rolling log task running every minute');
222
- logger.info('rolling log task running every minute');
223
- let timestamp = moment().format('YYYY-MM-DD HH:mm');
224
- console.log(timestamp + ': rolling log task running every minute');
225
- }, {
226
- scheduled: false
227
- });
228
-
229
- // -----------------------------------------------------------------------------
230
- // initialize the logfile
231
-
232
- // check if the logfile exists
233
- try {
234
- fsStats = fs.statSync(logFileNamePath);
235
- console.log('Log file exists : ' + logFileName);
236
- preflight.info('log file exists: ' + logFileName)
237
-
238
- if ( ajaxAppenderOptions.reset_on_start === true) {
239
- fs.truncate(logFileNamePath, 0, function(){console.log('Reset file: ' + logFileName)});
240
- }
241
- }
242
- catch (e) {
243
- console.log('Create Log file :' + logFileName);
244
- preflight.info('create log file :' + logFileName);
245
- // create empty logfile
246
- touch(logFileNamePath);
247
- }
248
-
249
- // symlinks on Windows are only supported by elevated user rights
250
- //
251
- if (isWin === false) {
252
- // (Re-)Create symlink to current logfile
253
- //
254
- fs.unlink(current_logFile, (err => {
255
- if (err) {
256
- fs.symlink (
257
- logFileNamePath,
258
- current_logFile,
259
- function (err) { console.log(err || 'Symlink to current log created.'); }
260
- );
261
- } else {
262
- // See: https://stackoverflow.com/questions/29777506/create-relative-symlinks-using-absolute-paths-in-node-js
263
- //
264
- fs.symlink (
265
- logFileNamePath,
266
- current_logFile,
267
- function (err) { console.log(err || 'Symlink to current log re-created.'); }
268
- );
269
- }
270
- }));
271
- }
272
-
273
-
274
- // check if logs should be appended
275
- //
276
- preflight.info('appender options, mode: ' + ajaxAppenderOptions.mode);
277
- if (ajaxAppenderOptions.mode === 'append') {
278
- logStream = fs.createWriteStream(logFileNamePath, {'flags': 'a'});
279
- } else {
280
- fs.truncate(logFileNamePath, 0, function(){console.log('Reset file: ' + logFileName)});
281
- logStream = fs.createWriteStream(logFileNamePath, {'flags': 'a'});
282
- }
283
-
284
- // check if logs should be rolled (e.g. daily)
285
- //
286
- preflight.info('appender options, rolling files: ' + ajaxAppenderOptions.rolling_files);
287
- if (ajaxAppenderOptions.rolling_files === true) {
288
- // start the scheduled task for rolling (log) files
289
- //
290
- rolling_logs.start();
291
- }
292
-
293
- // -----------------------------------------------------------------------------
294
- // print utility server issue
295
- //
296
- if (environment === 'dev') {
297
- console.log('Server enabled: ' + enabled);
298
- console.log('Environment detected as: ' + environment);
299
- console.log('Daemon path set to: ' + daemon_home);
300
- console.log('Daemon verbosity set to: ' + verbose);
301
- console.log('Project path set to: ' + project_home);
302
- console.log('Data path set to: ' + config_home);
303
- console.log('Log file set to: ' + logFileNamePath);
304
- }
305
-
306
- // -----------------------------------------------------------------------------
307
- // Github OAuth client settings (used for CC)
308
- //
309
- const loginAuthTarget = '_self';
310
- const oauthProvider = 'github';
311
- const oauthProviderUrl = 'https://github.com';
312
- const oauthProviderTokenPath = '/login/oauth/access_token';
313
- const oauthProviderAuthorizePath = '/login/oauth/authorize';
314
- const oauthProviderRedirectUrl = private_data.oauth.site_redirect_url;
315
- const oauthProviderClientScope = private_data.oauth.client_scope;
316
- const oauthProviderClientId = private_data.oauth.client_id;
317
- const oauthProviderClientSecret = private_data.oauth.client_secret;
318
-
319
- // -----------------------------------------------------------------------------
320
- // cors settings
321
- //
322
- let corsSettings = {
323
- origin: '*',
324
- optionsSuccessStatus: 200 // Some legacy browsers (IE11, various SmartTVs) choke on 204
325
- }
326
-
327
- // -----------------------------------------------------------------------------
328
- // git client settings
329
- //
330
-
331
- // -----------------------------------------------------------------------------
332
- // npm client settings
333
- //
334
-
335
- // =============================================================================
336
- // initialize runtime libraries
337
- // -----------------------------------------------------------------------------
338
- const app = express();
339
- const oauth2 = simpleOauthModule.create({
340
- client: {
341
- id: oauthProviderClientId,
342
- secret: oauthProviderClientSecret
343
- },
344
- auth: {
345
- // Supply oauthProviderUrl for enterprise github installs
346
- tokenHost: oauthProviderUrl,
347
- tokenPath: oauthProviderTokenPath,
348
- authorizePath: oauthProviderAuthorizePath
349
- }
350
- });
351
-
352
- // check origin settings
353
- //
354
- const originPattern = origin || '';
355
- if (('').match(originPattern)) {
356
- console.warn('Insecure ORIGIN pattern used. This can give unauthorized users access to your repository.');
357
- if (environment === 'prod') {
358
- console.error('Utility Server: Will not run without a safe ORIGIN pattern in production.');
359
- process.exit;
360
- }
361
- }
362
-
363
- // authorization uri definition
364
- //
365
- const authorizationUri = oauth2.authorizationCode.authorizeURL({
366
- redirect_uri: oauthProviderRedirectUrl,
367
- scope: oauthProviderClientScope || 'repo, user',
368
- state: randomstring.generate(32)
369
- });
370
-
371
- // =============================================================================
372
- // cors settings (all routes)
373
- // see: https://expressjs.com/en/resources/middleware/cors.html
374
- // -----------------------------------------------------------------------------
375
- app.use(cors(corsSettings));
376
-
377
- // =============================================================================
378
- // initialize body parser to extract data from POST requests
379
- // -----------------------------------------------------------------------------
380
- app.use(bodyParser.urlencoded({ extended: false }));
381
- app.use(bodyParser.json());
382
-
383
- // =============================================================================
384
- // api endpoints
385
- // -----------------------------------------------------------------------------
386
-
387
- // endpoint 'root'
388
- // present simple sign-in page for e.g. testing
389
- // -----------------------------------------------------------------------------
390
- app.get('/', (req, res) => {
391
-
392
- res.send(`Utility Server<br>
393
- <a href="/auth" target="${loginAuthTarget}">
394
- SignIn with provider: ${oauthProvider.toUpperCase()}
395
- </a>`);
396
-
397
- }); // end endpoint root
398
-
399
- // endpoint 'auth' (auth redirect)
400
- // initial page redirect to Github
401
- // ----------------------------------------------------------------------------
402
- app.get('/auth', (req, res) => {
403
-
404
- if (environment === 'dev') console.log('Utility Server: endpoint /auth entered');
405
- if (environment === 'dev') console.log('Utility Server: authorization URL: ' + authorizationUri);
406
- res.redirect(authorizationUri);
407
-
408
- }); // end endpoint auth
409
-
410
-
411
- // endpoint '/auth/github/callback' (auth callback)
412
- // parsing the authorization token, asking for the access token
413
- // ----------------------------------------------------------------------------
414
- app.get('/auth/github/callback', (req, res) => {
415
-
416
- const code = req.query.code;
417
- let options = {
418
- code: code
419
- };
420
-
421
- if (environment === 'dev') console.log('Utility Server: auth redirect entered: /auth/github/callback');
422
-
423
- if (oauthProvider === 'gitlab') {
424
- options.client_id = process.env.UTIL_SRV_GITHUB_CLIENT_ID;
425
- options.client_secret = process.env.UTIL_SRV_GITHUB_CLIENT_SECRET;
426
- options.grant_type = 'authorization_code';
427
- options.redirect_uri = process.env.REDIRECT_URL || '/auth/github/callback';
428
- }
429
-
430
- oauth2.authorizationCode.getToken(options, (error, result) => {
431
- let mess, content;
432
-
433
- if (error) {
434
- console.error('Utility Server: Access Token Error - ', error.message);
435
- mess = 'error';
436
- content = JSON.stringify(error)
437
- } else {
438
- const token = oauth2.accessToken.create(result);
439
- mess = 'success';
440
- content = {
441
- token: token.token.access_token,
442
- provider: oauthProvider
443
- }
444
- }
445
-
446
- // see: http://usefulangle.com/post/4/javascript-communication-parent-child-window
447
- //
448
- const script = `
449
- <script>
450
- (function() {
451
-
452
- // Register an event handler to listen for messages of the child window
453
- window.addEventListener("message", receiveMessage, false);
454
-
455
- // Post a authorizing message to the parent window (Netlify CMS App)
456
- // as a handshake with the parent window
457
- console.log("Sending message: %o", "${oauthProvider}");
458
- window.opener.postMessage("authorizing:${oauthProvider}", "*");
459
-
460
- function receiveMessage(e) {
461
- console.log("receiveMessage %o", e);
462
- if (!e.origin.match(${JSON.stringify(originPattern)})) {
463
- console.log('Invalid origin: %s', e.origin);
464
- return;
465
- } // end invalid origin
466
-
467
- // send message to main (parent) window (Netlify CMS App)
468
- // 'authorization:github:success:{"token":"12345678908f0719d7ae1bf94f379876543210","provider":"github"}'
469
- window.opener.postMessage(
470
- 'authorization:${oauthProvider}:${mess}:${JSON.stringify(content)}',
471
- e.origin
472
- )
473
- } // end receiveMessage
474
-
475
- })()
476
- </script>`;
477
-
478
- if (environment === 'dev') console.log('Utility Server: Send script (IIF) to main (parent) window (Netlify CMS App): ' + script);
479
- return res.send(script);
480
- });
481
-
482
- }); // end endpoint callback
483
-
484
-
485
- // endpoint 'success' (/success)
486
- // currently NOT used (placeholder)
487
- // -----------------------------------------------------------------------------
488
- app.get('/success', (req, res) => {
489
-
490
- if (verbose) console.log('Utility Server: endpoint /success entered');
491
- res.send('');
492
-
493
- }); // end endpoint success
494
-
495
-
496
- // endpoint 'git' (git client)
497
- // run git cli commands locally on the host
498
- // -----------------------------------------------------------------------------
499
- // noinspection JSUnusedLocalSymbols
500
- //let git = app.get('/git', (req, res) => {
501
- app.get('/git', (req, res) => {
502
-
503
- // ---------------------------------------------------------------------------
504
- // API response message
505
- //
506
-
507
- let time = moment();
508
- let response;
509
-
510
- let response_message = {
511
- timestamp: time,
512
- request: '',
513
- response: '',
514
- status: '',
515
- error: ''
516
- };
517
- response_message.request = req.query.request;
518
-
519
- if (verbose) console.log('Utility Server: endpoint /git entered');
520
- if (verbose) console.log('Utility Server: Processing request: ' + req.query.request);
521
-
522
- // see: https://dzone.com/articles/cors-in-node
523
- res.header("Access-Control-Allow-Origin", "*");
524
-
525
- async function pull (workingDir) {
526
- // noinspection UnnecessaryLocalVariableJS
527
- const git = gitP;
528
-
529
- try {
530
- await git(workingDir).pull();
531
- response_message.status = 'success';
532
- }
533
- catch (e) {
534
- // handle error
535
- console.log('Utility Server: Error on repository at ' + workingDir + ' - ' + e.message );
536
- response_message.status = 'failed';
537
- response_message.error = e.message;
538
- console.log('Utility Server: Send response: ' + response);
539
- }
540
- }
541
-
542
- // pull the repo (async)
543
- if ( req.query.request === 'pull' ) {
544
- pull(project_home)
545
- .then(pull => console.log('Utility Server: pull request done. Status: ' + response_message.status))
546
- .then(function() {
547
- if ( response_message.status === 'failed') {
548
- response_message.response = response_message.status;
549
- } else {
550
- response_message.status = 'success';
551
- response_message.response = response_message.status;
552
- }
553
- response = JSON.stringify(response_message);
554
- if (verbose) console.log('Utility Server: Send response: ' + response);
555
- res.send(response);
556
- });
557
- } // end pull
558
-
559
-
560
- }); // end endpoint git
561
-
562
-
563
- // endpoint 'npm' (npm client)
564
- // run npm commands locally on the host
565
- // -----------------------------------------------------------------------------
566
- app.get('/npm', (req, res) => {
567
-
568
- // ---------------------------------------------------------------------------
569
- // api response message
570
- let projectFolder;
571
- let shellCmd;
572
- let response;
573
- let devPrefix = 'packages\\400_theme_site';
574
- let pkgManager = 'npm';
575
- let time = moment();
576
-
577
- let response_message = {
578
- timestamp: time,
579
- request: '',
580
- response: '',
581
- status: '',
582
- error: ''
583
- };
584
- response_message.request = req.query.request;
585
-
586
- // let versionRe = /.*(site.\w+\.\w+\.\w+).*(jekyll \w+\.\w+\.\w+)/;
587
- // let re = /.*(jekyll \w+\.\w+\.\w+)/;
588
-
589
- if (environment === 'dev') {
590
- projectFolder = project_home + '\\' + devPrefix;
591
- } else {
592
- projectFolder = project_home;
593
- }
594
-
595
- shellCmd = pkgManager + ' --prefix ' + projectFolder + ' run ' + req.query.request;
596
-
597
- if (verbose) console.log('Utility Server: endpoint /npm entered. Request: ' + req.query.request);
598
- if (verbose) console.log('Utility Server: Processing NPM call: ' + shellCmd);
599
-
600
- // if (req.query.request === 'version') {
601
- // let re = /.*(jekyll \w+\.\w+\.\w+)/;
602
- // }
603
- //
604
- // if (req.query.request === 'built') {
605
- // let re = /.*/;
606
- // }
607
-
608
- async function npm (workingDir) {
609
- try {
610
- const { stdout, stderr } = await exec(shellCmd);
611
- response_message.response = stdout;
612
- response_message.status = 'success';
613
- return response_message;
614
- }
615
- catch (e) {
616
- // handle error
617
- console.log('Utility Server: Error detected at ' + workingDir + ' - ' + e.message );
618
- response_message.status = 'failed';
619
- response_message.error = e.message;
620
- return response_message;
621
- }
622
- }
623
-
624
- // built the requested site (async)
625
- npm(project_home)
626
- .then(npm => console.log('Utility Server: NPM script done. Status: ' + response_message.status))
627
- .then(function() {
628
- if ( response_message.status === 'failed') {
629
- response_message.response = utilsrv_options.npm_client.built.response_failed;
630
- } else {
631
- response_message.status = 'success';
632
- response_message.response = utilsrv_options.npm_client.built.response_success;
633
- }
634
- response = JSON.stringify(response_message);
635
- if (verbose) console.log('Utility Server: Send response: ' + response);
636
- res.send(response);
637
- });
638
-
639
- });
640
-
641
- // endpoint 'log2disk' (log message writer)
642
- // process log data received from POST request, write to disk|file
643
- // -----------------------------------------------------------------------------
644
- // noinspection JSUnusedLocalSymbols
645
- // let logger = app.post('/log2disk', (req, res) => {
646
- app.post('/log2disk', (req, res) => {
647
- // ---------------------------------------------------------------------------
648
- // globals
649
- let pageID = req.headers['x-page-id'];
650
- let tzOffset = req.headers['x-tz-offset'];
651
- const tz_offset = tzOffset.replace(/GMT/g, '');
652
- let tz_factor;
653
- let tz_offset_milli;
654
- let logLine;
655
- let msgDate2Int;
656
- let timestamp;
657
- let url;
658
- let path;
659
-
660
- // ---------------------------------------------------------------------------
661
- // process the POST response body
662
- //
663
- if (req.body.layout === 'XmlLayout') {
664
- logLine = req.body.data;
665
- } else if (req.body.layout === 'JsonLayout' || req.body.layout === 'PatternLayout' || req.body.layout === 'SimpleLayout' || req.body.layout === 'NullLayout') {
666
- logLine = req.body.data + '\n';
667
- } else if (req.body.layout === 'HttpPostDataLayout') {
668
- url = new parseURL(req.body.url);
669
- path = url.pathname;
670
-
671
- msgDate2Int = parseInt(req.body.timestamp, 10);
672
-
673
- // calculate TZ offset
674
- //
675
- let tz_split = tz_offset.split(':');
676
- let tz_offset_hours = eval(tz_split[0]*1);
677
- let tz_offset_minutes = eval(tz_split[1]*1);
678
-
679
- tz_factor = tz_offset_hours < 0 ? -1 : 1;
680
-
681
- tz_offset_hours = tz_factor*tz_offset_hours;
682
- tz_offset_milli = tz_factor*((3600*1000*tz_offset_hours) + (tz_offset_minutes*60*1000));
683
- msgDate2Int += tz_offset_milli;
684
-
685
- // ISOString: yyyy-MM-ddThh:mm:ss.sssZ
686
- timestamp = new Date(msgDate2Int).toISOString().slice(0, 23).replace('T', ' ');
687
-
688
- // [10:05:12.666] [INFO ] [j1.logger.writer ] [logger.js:154] [state: finished]
689
- // [http://localhost:41000/assets/themes/j1/adapter/js/logger.js:154]
690
- logLine = sprintf('[%s] [%s] [%-5s] [%-60s] [%-40s] %s\n', timestamp, pageID, req.body.level, path, req.body.logger, req.body.message);
691
- } else {
692
- logLine = req.body + '\n';
693
- }
694
-
695
- // if (verbose) console.log('Utility Server: endpoint /log2disk entered');
696
- // if (verbose) console.log('Utility Server: processing request: ' + req.query.request);
697
- // if (verbose) console.log('Utility Server: write message: ' + logLine);
698
-
699
- logStream.write(logLine);
700
- res.send('');
701
-
702
- }); // end endpoint 'log2disk'
703
-
704
-
705
- // =============================================================================
706
- // helper functions
707
- // -----------------------------------------------------------------------------
708
-
709
- // -----------------------------------------------------------------------------
710
- // mergeData:
711
- // merge 2 hashes
712
- //
713
- function mergeData () {
714
- let a = [].slice.call(arguments), o = a.shift();
715
-
716
- for(let i=0,l=a.length; i<l; i++){
717
- for(let p in a[i]){
718
- o[p] = a[i][p];
719
- }
720
- }
721
-
722
- return o;
723
- }
724
-
725
- // -------------------------------------------------------------------------
726
- // generateId()
727
- // Generate a unique (thread) id used by the logger
728
- // -------------------------------------------------------------------------
729
- function generateId (length) {
730
- let result = '';
731
- let characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
732
- let charactersLength = characters.length;
733
- for ( let i = 0; i < length; i++ ) {
734
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
735
- }
736
- return result;
737
- } // END generateId
738
-
739
-
740
- // =============================================================================
741
- // main
742
- // -----------------------------------------------------------------------------
743
-
744
- // catch startup errors
745
- process.on('uncaughtException', function(err) {
746
- if(err.errno === 'EADDRINUSE') {
747
- console.log('Port already in use :' + port );
748
- console.log('Utility server seems already running. Exiting ...');
749
- } else {
750
- console.log('Initializing the utility server failed. Exiting ...');
751
- console.log(err);
752
- }
753
- process.exit;
754
- });
755
-
756
- if (utilsrv_options.enabled) {
757
-
758
- // test_per_minute.start();
759
-
760
- logger.info('utility server is starting');
761
-
762
- // run the daemon (use IPV4, all interfaces)
763
- // see https://github.com/expressjs/express/issues/3528
764
- app.listen(port, hostName, () => {
765
- console.log("Utility Server is listening on port: " + port);
766
- logger.info('utility server is listening on port: ' + port);
767
- });
768
- } else {
769
- logger.info('found utility server: disabled');
770
- logger.info('stop the server');
771
- console.log('Stop the server. Exiting ...');
772
- }
773
-
774
- // END main
775
- // -----------------------------------------------------------------------------