@agung_dhewe/webapps 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +2 -0
  3. package/jsconfig.json +10 -0
  4. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.css +2 -0
  5. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js +11 -0
  6. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js.map +1 -0
  7. package/libs/fgta5js-dist/fonts/karla-italic-latin-ext.woff2 +0 -0
  8. package/libs/fgta5js-dist/fonts/karla-italic-latin.woff2 +0 -0
  9. package/libs/fgta5js-dist/fonts/karla-normal-latin-ext.woff2 +0 -0
  10. package/libs/fgta5js-dist/fonts/karla-normal-latin.woff2 +0 -0
  11. package/libs/fgta5js-dist/fonts/karla.css +142 -0
  12. package/libs/webmodule/module-edit.css +163 -0
  13. package/libs/webmodule/module-footer.css +22 -0
  14. package/libs/webmodule/module-list.css +25 -0
  15. package/libs/webmodule/module.css +52 -0
  16. package/libs/webmodule/module.js +195 -0
  17. package/libs/webmodule/pagehelper.mjs +45 -0
  18. package/modules/generator/appgen-components.mjs +142 -0
  19. package/modules/generator/appgen-icons.mjs +6 -0
  20. package/modules/generator/appgen-io.mjs +784 -0
  21. package/modules/generator/appgen-ui-search.mjs +173 -0
  22. package/modules/generator/appgen-ui-unique.mjs +153 -0
  23. package/modules/generator/appgen-ui.mjs +1181 -0
  24. package/modules/generator/generator-context.mjs +18 -0
  25. package/modules/generator/generator-designtemplate.html +1508 -0
  26. package/modules/generator/generator-ext.html +0 -0
  27. package/modules/generator/generator-ext.mjs +3 -0
  28. package/modules/generator/generator.css +642 -0
  29. package/modules/generator/generator.mjs +195 -0
  30. package/modules/generator/generator.png +0 -0
  31. package/modules/generator/generatorEdit.html +185 -0
  32. package/modules/generator/generatorEdit.mjs +238 -0
  33. package/modules/generator/generatorList.html +32 -0
  34. package/modules/generator/generatorList.mjs +243 -0
  35. package/modules/login/login.css +11 -0
  36. package/modules/login/login.html +12 -0
  37. package/modules/login/login.mjs +111 -0
  38. package/package.json +46 -0
  39. package/percobaan/simmpan-ke-minio.js +24 -0
  40. package/src/api.js +80 -0
  41. package/src/apis/generator.api.js +226 -0
  42. package/src/apis/login.api.js +109 -0
  43. package/src/bucket.js +24 -0
  44. package/src/context.js +26 -0
  45. package/src/datalog.sql +22 -0
  46. package/src/datarecords.js +0 -0
  47. package/src/db.js +61 -0
  48. package/src/generator/createApiExtenderModule.js +54 -0
  49. package/src/generator/createApiModule.js +218 -0
  50. package/src/generator/createIcon.js +62 -0
  51. package/src/generator/createInfoAboutExtender.js +42 -0
  52. package/src/generator/createInfoLogs.js +41 -0
  53. package/src/generator/createInfoRecordExtender.js +41 -0
  54. package/src/generator/createModuleContext.js +48 -0
  55. package/src/generator/createModuleDetilEditHtml.js +110 -0
  56. package/src/generator/createModuleDetilEditMjs.js +172 -0
  57. package/src/generator/createModuleDetilListHtml.js +146 -0
  58. package/src/generator/createModuleDetilListMjs.js +73 -0
  59. package/src/generator/createModuleEjs.js +51 -0
  60. package/src/generator/createModuleExtenderHtml.js +43 -0
  61. package/src/generator/createModuleExtenderMjs.js +43 -0
  62. package/src/generator/createModuleHeaderEditHtml.js +148 -0
  63. package/src/generator/createModuleHeaderEditMjs.js +197 -0
  64. package/src/generator/createModuleHeaderListHtml.js +144 -0
  65. package/src/generator/createModuleHeaderListMjs.js +67 -0
  66. package/src/generator/createModuleMjs.js +67 -0
  67. package/src/generator/createModuleRollup.js +42 -0
  68. package/src/generator/createProgramData.js +96 -0
  69. package/src/generator/createTable.js +156 -0
  70. package/src/generator/ddl.js +475 -0
  71. package/src/generator/helper.js +149 -0
  72. package/src/generator/templates/__rollup-module.ejs +90 -0
  73. package/src/generator/templates/api-extender-module.js.ejs +0 -0
  74. package/src/generator/templates/api-module.js.ejs +818 -0
  75. package/src/generator/templates/module-context.ejs +16 -0
  76. package/src/generator/templates/module-ext-about.ejs +1 -0
  77. package/src/generator/templates/module-ext-record.ejs +1 -0
  78. package/src/generator/templates/module-ext.html.ejs +3 -0
  79. package/src/generator/templates/module-ext.mjs.ejs +21 -0
  80. package/src/generator/templates/module-logs.ejs +14 -0
  81. package/src/generator/templates/module.ejs.ejs +48 -0
  82. package/src/generator/templates/module.mjs.ejs +256 -0
  83. package/src/generator/templates/moduleDetilEdit.html.ejs +34 -0
  84. package/src/generator/templates/moduleDetilEdit.mjs.ejs +792 -0
  85. package/src/generator/templates/moduleDetilList.html.ejs +26 -0
  86. package/src/generator/templates/moduleDetilList.mjs.ejs +319 -0
  87. package/src/generator/templates/moduleHeaderEdit.html.ejs +53 -0
  88. package/src/generator/templates/moduleHeaderEdit.mjs.ejs +807 -0
  89. package/src/generator/templates/moduleHeaderList.html.ejs +24 -0
  90. package/src/generator/templates/moduleHeaderList.mjs.ejs +308 -0
  91. package/src/generator/templates/sqlAddField.ejs +3 -0
  92. package/src/generator/templates/sqlAddForeignKey.ejs +12 -0
  93. package/src/generator/templates/sqlAddUniqueIndex.ejs +4 -0
  94. package/src/generator/templates/sqlCreateTable.ejs +9 -0
  95. package/src/generator/templates/sqlDropForeignKey.ejs +3 -0
  96. package/src/generator/templates/sqlDropUniqueIndex.ejs +4 -0
  97. package/src/generator/templates/sqlModifyField.ejs +6 -0
  98. package/src/generator/trygenerate.js +83 -0
  99. package/src/generator/worker.js +389 -0
  100. package/src/helper.js +82 -0
  101. package/src/logger.js +39 -0
  102. package/src/router.js +84 -0
  103. package/src/routers/defaultLoginApi.js +29 -0
  104. package/src/routers/defaultLoginAsset.js +18 -0
  105. package/src/routers/defaultLoginPage.js +36 -0
  106. package/src/routers/defaultRootIndex.js +16 -0
  107. package/src/routers/downloadHandler.js +51 -0
  108. package/src/routers/fileUploadApi.js +15 -0
  109. package/src/routers/generatorApi.js +30 -0
  110. package/src/routers/generatorAsset.js +18 -0
  111. package/src/routers/generatorPage.js +37 -0
  112. package/src/routers/handleError.js +43 -0
  113. package/src/routers/handleModuleNotfound.js +12 -0
  114. package/src/routers/moduleApi.js +34 -0
  115. package/src/routers/modulePage.js +102 -0
  116. package/src/sequencerdoc.js +311 -0
  117. package/src/sequencerline.js +214 -0
  118. package/src/session.js +57 -0
  119. package/src/startup.js +59 -0
  120. package/src/webapps.js +239 -0
  121. package/src/workermanager.js +83 -0
  122. package/templates/_lib_debug.ejs +11 -0
  123. package/templates/_lib_production.ejs +5 -0
  124. package/templates/application.page.ejs +143 -0
  125. package/templates/generator.page.ejs +131 -0
  126. package/templates/index.page.ejs +24 -0
  127. package/templates/login.page.ejs +102 -0
  128. package/templates/moduleError.ejs +16 -0
  129. package/templates/moduleNotfound.ejs +14 -0
  130. package/webapps.code-workspace +11 -0
@@ -0,0 +1,197 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleHeaderEditMjs(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const sectionPart = 'edit'
15
+ const timeGenerated = context.timeGenerated
16
+
17
+ try {
18
+
19
+ // Data Detil
20
+ const entitiesDetil = []
21
+ for (let entityName in context.entities) {
22
+ const entity = context.entities[entityName]
23
+
24
+ // hanya proses yang detil
25
+ if (entityName=='header') {
26
+ continue
27
+ }
28
+
29
+ const e = {
30
+ name: entityName,
31
+ table: entity.table,
32
+ pk: entity.pk,
33
+ moduleSection: kebabToCamel(`${moduleName}-${entityName}`),
34
+ }
35
+ entitiesDetil.push(e)
36
+ }
37
+
38
+
39
+
40
+ // Data Header
41
+ for (let entityName in context.entities) {
42
+ const entityData = context.entities[entityName]
43
+
44
+ // hanya proses yang Header
45
+ if (entityName!='header') {
46
+ continue
47
+ }
48
+
49
+ const sectionName = entityName
50
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
51
+ const targetFile = path.join(context.moduleDir, `${modulePart}.mjs`)
52
+
53
+ // cek dulu apakah file ada
54
+ var fileExists = await isFileExist(targetFile)
55
+ if (fileExists && !overwrite) {
56
+ context.postMessage({message: `skip file: '${targetFile}`})
57
+ return
58
+ }
59
+
60
+ // reporting progress to parent process
61
+ context.postMessage({message: `generating file: '${targetFile}`})
62
+
63
+
64
+ // start geneate program code
65
+
66
+ const tablename = entityData.table
67
+ const headerPrimaryKey = entityData.pk
68
+
69
+ const fields = []
70
+ const fieldHandles = []
71
+ const defaultInits = []
72
+ const uploadFields = []
73
+ const comboboxList = []
74
+ let headerHasUpload = false
75
+ for (var fieldName in entityData.Items) {
76
+ const item = entityData.Items[fieldName]
77
+
78
+ if (!item.showInForm) {
79
+ continue
80
+ }
81
+
82
+
83
+ const component = item.component
84
+ const fieldname = item.data_fieldname
85
+ const inputname = item.input_name
86
+ const elementId = `${modulePart}-${item.input_name}`
87
+
88
+
89
+ if (component=='Filebox') {
90
+ headerHasUpload = true
91
+ uploadFields.push({
92
+ elementId,
93
+ fieldname,
94
+ inputname
95
+ })
96
+
97
+ } else if (component=='Combobox') {
98
+ comboboxList.push({
99
+ inputname
100
+ })
101
+ }
102
+
103
+ // setup handles
104
+ const handles = []
105
+ for (let eventname in item.Handle) {
106
+ let createhandle = item.Handle[eventname]
107
+ if (createhandle) {
108
+ if (eventname=='selecting' && component=='Combobox') {
109
+ handles.push({
110
+ eventname,
111
+ appId: item.Reference.loaderApiModule,
112
+ path: item.Reference.loaderApiPath,
113
+ field_value: item.Reference.bindingValue,
114
+ field_text: item.Reference.bindingText,
115
+ })
116
+ } else {
117
+ handles.push({eventname})
118
+ }
119
+ }
120
+ }
121
+
122
+ if (handles.length>0) {
123
+ fieldHandles.push({component, inputname, handles})
124
+ }
125
+
126
+
127
+ // setup default values
128
+ let setdefault
129
+ if (item.data_defaultvalue != '') {
130
+ if (item.component=='Datepicker' || item.component=='Timepicker') {
131
+ setdefault = `${item.name }: new Date()`
132
+ } else if (item.component=='Numberbox') {
133
+ setdefault = `${item.name }: ${item.data_defaultvalue}`
134
+ } else if (item.component=='Checkbox') {
135
+ if (item.data_defaultvalue==='true' || item.data_defaultvalue==='checked' || item.data_defaultvalue==='1') {
136
+ setdefault = `${item.name }: true`
137
+ }
138
+ } else {
139
+ setdefault = `${item.name }: '${item.data_defaultvalue}'`
140
+ }
141
+ }
142
+
143
+ if (setdefault!=null) {
144
+ defaultInits.push(setdefault)
145
+ }
146
+
147
+
148
+
149
+
150
+
151
+ // add to field config data
152
+ fields.push({
153
+ component,
154
+ fieldname,
155
+ inputname,
156
+ elementId
157
+ })
158
+ }
159
+
160
+
161
+
162
+
163
+
164
+ const variables = {
165
+ timeGenerated,
166
+ moduleDescription: context.descr,
167
+ title,
168
+ tablename,
169
+ modulePart,
170
+ moduleName,
171
+ moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
172
+ moduleList: kebabToCamel(`${moduleName}-${sectionName}-list`),
173
+ fields,
174
+ fieldHandles,
175
+ defaultInits,
176
+ headerPrimaryKey,
177
+ headerHasUpload,
178
+ entitiesDetil,
179
+ uploadFields,
180
+ comboboxList
181
+ }
182
+
183
+
184
+
185
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderEdit.mjs.ejs')
186
+ const template = await fs.readFile(tplFilePath, 'utf-8');
187
+ const content = ejs.render(template, variables)
188
+
189
+ await fs.writeFile(targetFile, content, 'utf8');
190
+
191
+ }
192
+
193
+ } catch (err) {
194
+ throw err
195
+ }
196
+
197
+ }
@@ -0,0 +1,144 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import ejs from 'ejs'
4
+ import path from 'path'
5
+ import fs from 'fs/promises'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleHeaderListHtml(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const sectionPart = 'list'
15
+
16
+ try {
17
+
18
+ for (let entityName in context.entities) {
19
+ // hanya proses yang Header
20
+ if (entityName!='header') {
21
+ continue
22
+ }
23
+
24
+ const sectionName = entityName
25
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
26
+ const targetFile = path.join(context.moduleDir, `${modulePart}.html`)
27
+
28
+
29
+ // cek dulu apakah file ada
30
+ var fileExists = await isFileExist(targetFile)
31
+ if (fileExists && !overwrite) {
32
+ context.postMessage({message: `skip file: '${targetFile}`})
33
+ return
34
+ }
35
+
36
+ // reporting progress to parent process
37
+ context.postMessage({message: `generating file: '${targetFile}`})
38
+
39
+
40
+
41
+ // start geneate program code
42
+ const entityData = context.entities[entityName]
43
+ const sectionData = getSectionData(moduleName, entityName, entityData, 'list')
44
+
45
+ const itemsList = []
46
+ for (var fieldName in entityData.Items) {
47
+ const item = entityData.Items[fieldName]
48
+ if (!item.showInGrid) {
49
+ continue
50
+ }
51
+ item._fieldName = fieldName
52
+ item._columnIndex = Number(item.input_index)
53
+ itemsList.push(item)
54
+ }
55
+
56
+ // urutkan data
57
+ itemsList.sort((a, b) => a._columnIndex - b._columnIndex);
58
+
59
+ const sortedItems = {}
60
+ for (let item of itemsList) {
61
+ sortedItems[item._fieldName] = item
62
+ }
63
+
64
+
65
+ const fields = []
66
+ for (var fieldName in sortedItems) {
67
+ const item = entityData.Items[fieldName]
68
+
69
+ const component = item.component
70
+ const dataName = item.name
71
+ const binding = item.data_fieldname
72
+ const label = item.input_label
73
+ const {bindingValue, bindingText, bindingDisplay, table} = item.Reference
74
+
75
+ // additional attributes
76
+ const attrs = []
77
+ if (item.grid_formatter.trim()!='') {
78
+ attrs.push(`formatter="${item.grid_formatter}"`)
79
+ }
80
+
81
+ if (item.grid_css.trim()!='') {
82
+ attrs.push(`class="${item.grid_css}"`)
83
+ }
84
+
85
+ if (item.grid_inlinestyle.trim()!='') {
86
+ attrs.push(`style="${item.grid_inlinestyle}"`)
87
+ }
88
+
89
+ if (item.grid_sorting) {
90
+ attrs.push(`sorting="true"`)
91
+ }
92
+
93
+ let additionalAttributes = attrs.join(' ')
94
+
95
+
96
+
97
+ let columnDataName = dataName
98
+ let columnDataBinding = binding
99
+
100
+ if (component=='Combobox') {
101
+ if (bindingDisplay!='' && bindingDisplay!=null) {
102
+ columnDataName = bindingDisplay
103
+ columnDataBinding = bindingDisplay
104
+ } else {
105
+ columnDataName = bindingText
106
+ columnDataBinding = bindingText
107
+ }
108
+ }
109
+
110
+
111
+
112
+ // masukkan ke fields
113
+ fields.push({
114
+ component,
115
+ dataName: columnDataName, //bindingDisplay!=null ? bindingDisplay : dataName,
116
+ binding: columnDataBinding, //bindingDisplay!=null ? bindingDisplay : binding,
117
+ label,
118
+ additionalAttributes
119
+ })
120
+ }
121
+
122
+ const variables = {
123
+ timeGenerated: context.timeGenerated,
124
+ title: title,
125
+ moduleName: moduleName,
126
+ modulePart: modulePart,
127
+ moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
128
+ section: sectionData,
129
+ fields: fields
130
+ }
131
+
132
+
133
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderList.html.ejs')
134
+ const template = await fs.readFile(tplFilePath, 'utf-8');
135
+ const content = ejs.render(template, variables)
136
+
137
+ await fs.writeFile(targetFile, content, 'utf8');
138
+
139
+ }
140
+ } catch (err) {
141
+ throw err
142
+ }
143
+
144
+ }
@@ -0,0 +1,67 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleHeaderListMjs(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const sectionPart = 'list'
15
+
16
+
17
+ try {
18
+
19
+ for (let entityName in context.entities) {
20
+ // hanya proses yang Header
21
+ if (entityName!='header') {
22
+ continue
23
+ }
24
+
25
+
26
+ const sectionName = entityName
27
+ const modulePart = kebabToCamel(`${moduleName}-${sectionName}-${sectionPart}`)
28
+ const targetFile = path.join(context.moduleDir, `${modulePart}.mjs`)
29
+
30
+
31
+ // cek dulu apakah file ada
32
+ var fileExists = await isFileExist(targetFile)
33
+ if (fileExists && !overwrite) {
34
+ context.postMessage({message: `skip file: '${targetFile}`})
35
+ return
36
+ }
37
+
38
+ // reporting progress to parent process
39
+ context.postMessage({message: `generating file: '${targetFile}`})
40
+
41
+
42
+ // start geneate program code
43
+ const entityData = context.entities[entityName]
44
+ const sectionData = getSectionData(moduleName, entityName, entityData, 'list')
45
+
46
+ const variables = {
47
+ timeGenerated: context.timeGenerated,
48
+ title: title,
49
+ modulePart: modulePart,
50
+ moduleName: moduleName,
51
+ moduleEdit: kebabToCamel(`${moduleName}-${sectionName}-edit`),
52
+ moduleSection: kebabToCamel(`${moduleName}-${sectionName}`),
53
+ sectionName
54
+ }
55
+
56
+
57
+ const tplFilePath = path.join(__dirname, 'templates', 'moduleHeaderList.mjs.ejs')
58
+ const template = await fs.readFile(tplFilePath, 'utf-8');
59
+ const content = ejs.render(template, variables)
60
+
61
+ await fs.writeFile(targetFile, content, 'utf8');
62
+ }
63
+ } catch (err) {
64
+ throw err
65
+ }
66
+
67
+ }
@@ -0,0 +1,67 @@
1
+ import { kebabToCamel, isFileExist, getSectionData } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleMjs(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const title = context.title
14
+ const targetFile = path.join(context.moduleDir, `${moduleName}.mjs`)
15
+ const iconUrl = context.icon=='' ? '' : `public/modules/${moduleName}/${options.iconFileName}`
16
+
17
+ try {
18
+ // cek dulu apakah file ada
19
+ var fileExists = await isFileExist(targetFile)
20
+ if (fileExists && !overwrite) {
21
+ context.postMessage({message: `skip file: '${targetFile}`})
22
+ return
23
+ }
24
+
25
+ // reporting progress to parent process
26
+ context.postMessage({message: `generating file: '${targetFile}`})
27
+
28
+
29
+ // start geneate program code
30
+ let sections = []
31
+ for (var entityName in context.entities) {
32
+ // console.log(context.entities[entityName])
33
+ sections.push(getSectionData(moduleName, entityName, context.entities[entityName], 'list'))
34
+ sections.push(getSectionData(moduleName, entityName, context.entities[entityName], 'edit'))
35
+ }
36
+
37
+
38
+ const entityNameArray = []
39
+ for (let s of sections) {
40
+ if (s.partName=='edit') {
41
+ const sectionName = s.sectionName
42
+ entityNameArray.push(sectionName)
43
+ }
44
+ }
45
+
46
+ const entityNameList = `'${entityNameArray.join("\', \'")}'`
47
+
48
+ const variables = {
49
+ timeGenerated: context.timeGenerated,
50
+ title: title,
51
+ moduleName: moduleName,
52
+ iconUrl,
53
+ entityNameList,
54
+ sections: sections
55
+ }
56
+
57
+
58
+ const tplFilePath = path.join(__dirname, 'templates', 'module.mjs.ejs')
59
+ const template = await fs.readFile(tplFilePath, 'utf-8');
60
+ const content = ejs.render(template, variables)
61
+
62
+ await fs.writeFile(targetFile, content, 'utf8');
63
+ } catch (err) {
64
+ throw err
65
+ }
66
+
67
+ }
@@ -0,0 +1,42 @@
1
+ import { isFileExist } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import ejs from 'ejs'
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ export async function createModuleRollup(context, options) {
11
+ const overwrite = options.overwrite===true
12
+ const moduleName = context.moduleName
13
+ const targetFile = path.join(context.moduleDir, `__rollup.${moduleName}.js`)
14
+
15
+
16
+ try {
17
+ // cek dulu apakah file ada
18
+ var fileExists = await isFileExist(targetFile)
19
+ if (fileExists && !overwrite) {
20
+ context.postMessage({message: `skip file: '${targetFile}`})
21
+ return
22
+ }
23
+
24
+ // reporting progress to parent process
25
+ context.postMessage({message: `generating file: '${targetFile}`})
26
+
27
+
28
+ // start geneate program code
29
+ const variables = {
30
+ timeGenerated: context.timeGenerated,
31
+ moduleName: moduleName
32
+ }
33
+
34
+ const tplFilePath = path.join(__dirname, 'templates', '__rollup-module.ejs')
35
+ const template = await fs.readFile(tplFilePath, 'utf-8');
36
+ const content = ejs.render(template, variables)
37
+
38
+ await fs.writeFile(targetFile, content, 'utf8');
39
+ } catch (err) {
40
+ throw err
41
+ }
42
+ }
@@ -0,0 +1,96 @@
1
+ import { isFileExist } from './helper.js'
2
+ import { fileURLToPath } from 'url';
3
+ import path from 'path'
4
+ import fs from 'fs/promises'
5
+ import db from '../db.js'
6
+ import sqlUtil from '@agung_dhewe/pgsqlc'
7
+ import { createSequencerLine } from '../sequencerline.js'
8
+ import logger from '../logger.js';
9
+
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+
13
+ export async function createProgramData(context, options) {
14
+ const apps_id = context.appname
15
+ if (apps_id=='dev') {
16
+ // untuk dev, tidak perlu diinput ke program
17
+ return
18
+ }
19
+
20
+
21
+ const generator_id = context.id
22
+ const rawData = context.icon
23
+ const moduleName = context.moduleName
24
+ const user_id = context.user_id
25
+ const user_name = context.user_name
26
+ const ipaddress = context.ipaddress
27
+ const title = context.title
28
+ const descr = context.descr
29
+ const icon = context.icon=='' ? '' : `public/modules/${moduleName}/${options.iconFileName}`
30
+ const tablename = 'core.program'
31
+
32
+
33
+ const log = async (id, action, data={}, remark='') => {
34
+ const source = 'generator'
35
+ const metadata = JSON.stringify({})
36
+ const executionTimeMs = 0
37
+
38
+ const logdata = {id, user_id, user_name, moduleName, action, tablename, executionTimeMs, remark, metadata, ipaddress}
39
+ logdata.moduleName = 'program'
40
+ logdata.tablename = 'core.program'
41
+
42
+ const ret = await logger.log(logdata)
43
+ return ret
44
+ }
45
+
46
+
47
+ try {
48
+
49
+ const sql = `select * from ${tablename} where generator_id = \${generator_id}`
50
+ const row = await db.oneOrNone(sql, {generator_id})
51
+
52
+ const obj = {
53
+ program_title: title,
54
+ apps_id : apps_id,
55
+ program_name : moduleName,
56
+ program_descr: descr,
57
+ program_icon: icon,
58
+ generator_id: generator_id,
59
+ }
60
+
61
+ const result = await db.tx(async tx=>{
62
+ sqlUtil.connect(tx)
63
+
64
+ if (row==null) {
65
+ // insert
66
+ const sequencer = createSequencerLine(tx, {})
67
+ const program_id = await sequencer.yearlyshort('CNT')
68
+
69
+ obj.program_id = program_id
70
+ obj._createby = user_id
71
+ obj._createdate = (new Date()).toISOString()
72
+
73
+ const cmd = sqlUtil.createInsertCommand(tablename, obj)
74
+ const ret = await cmd.execute(obj)
75
+
76
+ // log
77
+ log(obj.program_id, 'GENERATED')
78
+
79
+ } else {
80
+ // update
81
+ obj.program_id = row.program_id
82
+ obj._modifyby = user_id
83
+ obj._modifydate = (new Date()).toISOString()
84
+
85
+ const cmd = sqlUtil.createUpdateCommand(tablename, obj, ['program_id'])
86
+ const ret = await cmd.execute(obj)
87
+
88
+ // log
89
+ log(obj.program_id, 'REGENERATED')
90
+ }
91
+ })
92
+
93
+ } catch (err) {
94
+ throw err
95
+ }
96
+ }