@cyklang/cli 0.5.4 → 0.5.6

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.
@@ -1,113 +1,194 @@
1
- import { Cmd } from "./Cmd";
1
+ import { Cmd, readPackageJson, runShellCommand } from "./Cmd";
2
2
  import * as fs from "fs"
3
3
  import * as path from "path"
4
- import {green, red, bold} from 'kolorist'
4
+ import { green, red, bold } from 'kolorist'
5
5
 
6
6
  import loglevel from 'loglevel'
7
7
  import { uploadModule } from "./ModuleCommand";
8
+ import { uninstallPackage } from "./UninstallCommand";
9
+ import { DBManager, DBRemote } from "@cyklang/core";
10
+ import { FileDescriptor, uploadAsset, uploadDirectory } from "./AssetCommand";
8
11
  const logger = loglevel.getLogger('InstallCommand.ts')
9
12
  logger.setLevel('debug')
10
13
 
11
14
  export class InstallCommand extends Cmd {
15
+ /**
16
+ * constructor
17
+ * @param name
18
+ */
12
19
  constructor(name: string) {
13
20
  super(name)
14
- this.description('npm install and upload xml modules to Cyk server')
21
+ this.description('npm install and run install script')
15
22
  .argument('<node_package>', 'Node Package installed as dev dependency')
16
23
  .action(async (node_package: any, options: any) => {
17
24
  await this.install(node_package, options)
18
25
  })
19
26
  }
20
27
 
28
+ /**
29
+ * method install
30
+ * @param node_package
31
+ * @param options
32
+ */
21
33
  async install(node_package: string, options: any) {
22
34
  try {
23
35
  await this.prologue(options)
24
- if (this.dbManager === undefined) throw 'dbManager undefined'
25
-
26
- /**
27
- * install the Node Package
28
- */
29
- await this.installNodePackage(node_package)
30
-
31
- const installScript = await this.lookupInstallScript(node_package)
32
-
33
- if (installScript) {
34
- /**
35
- * execute installScript
36
- */
37
- const installPath = path.join('node_modules',node_package,'scripts',installScript)
38
- await this.runShellCommand(installPath, [])
39
- }
40
- else {
41
- /**
42
- * default install : upload modules and execute _init.xml
43
- */
44
- console.log()
45
- console.log('upload modules to server ...')
46
- const xmlFolder = path.join('node_modules', node_package, 'xml')
47
- if (!fs.existsSync(xmlFolder) || !fs.statSync(xmlFolder).isDirectory()) {
48
- throw 'xml folder not found ( ' + xmlFolder + ' )'
49
- }
50
- /**
51
- * upload modules to the server
52
- */
53
- let initModule: string | undefined
54
- const files = fs.readdirSync(xmlFolder)
55
- for (let ind = 0; ind < files.length; ind++) {
56
- const file = files[ind]
57
- await uploadModule(path.join(xmlFolder, file), this.dbManager)
58
- if (file.endsWith('_init.xml')) {
59
- initModule = file
60
- }
61
- }
62
- console.log(green('*') + ' upload modules to server' )
63
- if (initModule) {
64
- const initPath = path.join(xmlFolder, initModule)
65
- await this.runShellCommand('npx', ['cyk', 'run', initPath])
66
- }
67
- }
36
+ if (this.dbManager === undefined || !this.dbRemote) throw 'dbManager or dbRemote undefined'
68
37
 
38
+ await installPackage(node_package, this.dbManager, this.dbRemote)
69
39
  }
70
40
  catch (err) {
71
41
  logger.error(err)
72
42
  }
73
43
  }
44
+ }
45
+
46
+ export async function installPackage(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
74
47
 
75
48
  /**
76
- * method installNodePackage
77
- * @param node_package
49
+ * install the Node Package
78
50
  */
79
- async installNodePackage(node_package: string) {
51
+ await installNodePackage(node_package, dbManager, dbRemote)
80
52
 
81
- try {
82
- await this.runShellCommand('npm', ['install', '--save-dev', node_package])
83
- } catch (error) {
84
- console.error('Error installing ' + node_package + ' :', error);
85
- throw error
86
- }
53
+ const installScript = await lookupInstallScript(node_package)
54
+
55
+ if (installScript) {
56
+ /**
57
+ * execute installScript
58
+ */
59
+ const installPath = path.join('node_modules', node_package, 'scripts', installScript)
60
+ await runShellCommand(installPath, [])
87
61
  }
62
+ else {
63
+ /**
64
+ * default install : upload modules and execute _init.xml
65
+ */
66
+ await defaultInstallScript(node_package, dbManager, dbRemote)
67
+ }
68
+
69
+ }
70
+
71
+ /**
72
+ * method defaultInstallScript
73
+ * @param node_package
74
+ */
75
+ async function defaultInstallScript(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
88
76
 
77
+ console.log()
78
+ console.log('Default install script')
89
79
  /**
90
- * method lookupInstallScript
91
- * @param node_package
80
+ * upload package assets
92
81
  */
93
- async lookupInstallScript(node_package: string): Promise<string | undefined> {
94
- let result: string | undefined
95
- try {
96
- const scriptsFolder = path.join('node_modules', node_package, 'scripts')
97
- if (fs.existsSync(scriptsFolder) && fs.statSync(scriptsFolder).isDirectory()) {
98
- const files = fs.readdirSync(scriptsFolder)
99
- for (let ind = 0; ind < files.length; ind++) {
100
- const file = files[ind]
101
- if (file.startsWith('install.')) {
102
- result = file
103
- }
104
- }
105
- }
106
- return result
82
+ await uploadPackageAssets(node_package, dbManager, dbRemote)
83
+
84
+ /**
85
+ * upload package modules to the server
86
+ */
87
+ await uploadPackageModules(node_package, dbManager)
88
+ }
89
+
90
+ /**
91
+ * function uploadPackageAssets
92
+ * @param node_package
93
+ * @param dbManager
94
+ */
95
+ async function uploadPackageAssets(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
96
+ const assetFolder = path.join('node_modules', node_package, 'asset')
97
+ if (!fs.existsSync(assetFolder) || !fs.statSync(assetFolder).isDirectory()) {
98
+ return
99
+ }
100
+ console.log()
101
+ console.log('upload assets to server ...')
102
+
103
+ const items = fs.readdirSync(assetFolder)
104
+ for (let ind = 0; ind < items.length; ind++) {
105
+ const item = items[ind]
106
+ const itemPath = path.join(assetFolder, item)
107
+ if (fs.statSync(itemPath).isDirectory()) {
108
+ const dest = "/" + item + "/"
109
+ await uploadDirectory(itemPath, dest, {yes: true}, dbManager, dbRemote)
107
110
  }
108
- catch (err) {
109
- throw err
111
+ else {
112
+ const dest = "/" + item
113
+ const fd: FileDescriptor = {path: path.join(assetFolder, item), mtime: new Date()}
114
+ await uploadAsset(fd, dest, dbManager, dbRemote)
110
115
  }
116
+
111
117
  }
118
+ console.log(green('*') + ' upload assets to server')
119
+ }
120
+
121
+ /**
122
+ * function uploadModules
123
+ * @param node_package
124
+ * @param dbManager
125
+ */
126
+ async function uploadPackageModules(node_package: string, dbManager: DBManager) {
112
127
 
128
+ const moduleFolder = path.join('node_modules', node_package, 'module')
129
+ if (!fs.existsSync(moduleFolder) || !fs.statSync(moduleFolder).isDirectory()) {
130
+ return
131
+ }
132
+ console.log()
133
+ console.log('upload modules to server ...')
134
+ let initModule: string | undefined
135
+ const files = fs.readdirSync(moduleFolder)
136
+ for (let ind = 0; ind < files.length; ind++) {
137
+ const file = files[ind]
138
+ if (!dbManager) throw 'dbManager undefined'
139
+ await uploadModule(path.join(moduleFolder, file), dbManager)
140
+ if (file.endsWith('_init.xml')) {
141
+ initModule = file
142
+ }
143
+ }
144
+ console.log(green('*') + ' upload modules to server')
145
+ if (initModule) {
146
+ const initPath = path.join(moduleFolder, initModule)
147
+ await runShellCommand('npx', ['cyk', 'run', initPath])
148
+ }
149
+ }
150
+
151
+ /**
152
+ * method installNodePackage
153
+ * @param node_package
154
+ */
155
+ async function installNodePackage(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
156
+
157
+ try {
158
+ const packageJson = await readPackageJson()
159
+ if (packageJson.devDependencies && packageJson.devDependencies[node_package]
160
+ || packageJson.dependencies && packageJson.dependencies[node_package]) {
161
+ console.log(node_package + ' already installed. We uninstall it first')
162
+ if (!dbManager) throw 'dbManager undefined'
163
+ await uninstallPackage(node_package, dbManager, dbRemote)
164
+ }
165
+
166
+ await runShellCommand('npm', ['install', '--save-dev', node_package])
167
+ } catch (error) {
168
+ console.error('Error installing ' + node_package + ' :', error);
169
+ throw error
170
+ }
171
+ }
172
+ /**
173
+ * function lookupInstallScript
174
+ * @param node_package
175
+ */
176
+ async function lookupInstallScript(node_package: string): Promise<string | undefined> {
177
+ let result: string | undefined
178
+ try {
179
+ const scriptsFolder = path.join('node_modules', node_package, 'scripts')
180
+ if (fs.existsSync(scriptsFolder) && fs.statSync(scriptsFolder).isDirectory()) {
181
+ const files = fs.readdirSync(scriptsFolder)
182
+ for (let ind = 0; ind < files.length; ind++) {
183
+ const file = files[ind]
184
+ if (file.startsWith('install.')) {
185
+ result = file
186
+ }
187
+ }
188
+ }
189
+ return result
190
+ }
191
+ catch (err) {
192
+ throw err
193
+ }
113
194
  }
@@ -147,6 +147,7 @@ export async function uploadModule(file: string, dbManager: DBManager) {
147
147
  logger.info('module ' + dbname + ' added with ID ' + id)
148
148
  }
149
149
  else {
150
+ logger.debug('module exists : ' + dbModuleExist.dbname + ', id ' + dbModuleExist.id)
150
151
  // update
151
152
  dbModuleExist.source = source
152
153
  dbModuleExist.access = tag.attributes.ACCESS
@@ -273,3 +274,14 @@ class ModuleDelete extends Cmd {
273
274
  }
274
275
  }
275
276
 
277
+ /**
278
+ * function deleteModule
279
+ * @param dbname
280
+ * @param dbManager
281
+ */
282
+ export async function deleteModule(dbname: string, dbManager: DBManager) {
283
+
284
+ const dbClient = new DBClient(dbManager)
285
+ await dbClient.deleteModule(dbname)
286
+ }
287
+
@@ -0,0 +1,196 @@
1
+ import { Cmd, runShellCommand } from "./Cmd";
2
+ import * as fs from "fs"
3
+ import * as path from "path"
4
+ import { green, red, bold } from 'kolorist'
5
+
6
+ import loglevel from 'loglevel'
7
+ import { deleteModule } from "./ModuleCommand";
8
+ import { DBManager, DBRemote } from "@cyklang/core";
9
+ const logger = loglevel.getLogger('UninstallCommand.ts')
10
+ logger.setLevel('debug')
11
+
12
+ export class UninstallCommand extends Cmd {
13
+ /**
14
+ * constructor
15
+ * @param name
16
+ */
17
+ constructor(name: string) {
18
+ super(name)
19
+ this.description('run uninstall script and npm uninstall command')
20
+ .argument('<node_package>', 'Node Package installed as dev dependency')
21
+ .action(async (node_package: any, options: any) => {
22
+ await this.uninstall(node_package, options)
23
+ })
24
+ }
25
+
26
+ /**
27
+ * method uninstall
28
+ * @param node_package
29
+ * @param options
30
+ */
31
+ async uninstall(node_package: string, options: any) {
32
+ try {
33
+ await this.prologue(options)
34
+ if (! this.dbManager || ! this.dbRemote) throw 'dbManager or dbRemote undefined'
35
+
36
+ await uninstallPackage(node_package, this.dbManager, this.dbRemote)
37
+ }
38
+ catch (err) {
39
+ logger.error(err)
40
+ }
41
+ }
42
+ }
43
+
44
+ /**
45
+ * function uninstallPackage
46
+ * @param node_package
47
+ */
48
+ export async function uninstallPackage(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
49
+
50
+ const uninstallScript = await lookupUninstallScript(node_package)
51
+ if (uninstallScript) {
52
+ /**
53
+ * run scripts/uninstall
54
+ */
55
+ const uninstallPath = path.join('node_modules', node_package, 'scripts', uninstallScript)
56
+ await runShellCommand(uninstallPath, [])
57
+ }
58
+ else {
59
+ /**
60
+ * default uninstall :
61
+ */
62
+ await defaultUninstallScript(node_package, dbManager, dbRemote)
63
+ }
64
+
65
+ /**
66
+ * uninstall the node package
67
+ */
68
+ await uninstallNodePackage(node_package)
69
+
70
+ }
71
+ /**
72
+ * method defaultUninstallScript
73
+ * @param node_package
74
+ */
75
+ async function defaultUninstallScript(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
76
+ console.log()
77
+ console.log('Default uninstall script')
78
+ /**
79
+ * delete package modules from server
80
+ */
81
+ await deletePackageModules(node_package, dbManager)
82
+ /**
83
+ * delete package assets from server
84
+ */
85
+ await deletePackageAssets(node_package, dbManager, dbRemote)
86
+
87
+ }
88
+
89
+ /**
90
+ * function deletePackageAssets
91
+ * @param node_package
92
+ * @param dbManager
93
+ * @param dbRemote
94
+ */
95
+ async function deletePackageAssets(node_package: string, dbManager: DBManager, dbRemote: DBRemote) {
96
+ const assetFolder = path.join('node_modules', node_package, 'asset')
97
+ if (!fs.existsSync(assetFolder) || !fs.statSync(assetFolder).isDirectory()) {
98
+ return
99
+ }
100
+ console.log()
101
+ console.log('delete assets from server ...')
102
+
103
+ await browseFolder(assetFolder, async (filePath: string) => {
104
+ const route = '/' + path.relative(assetFolder, filePath)
105
+ const dbAsset = await dbManager.dbAssetExist(route)
106
+ if (!dbAsset) {
107
+ logger.info('asset ' + route + ' not found')
108
+ return
109
+ }
110
+ await dbManager.dbAssetDelete(dbAsset)
111
+ logger.info('asset ' + route + ' deleted')
112
+ })
113
+
114
+ console.log(green('*') + ' delete assets from server')
115
+ }
116
+
117
+ /**
118
+ * browseFolder
119
+ * @param folder
120
+ * @param treatment
121
+ */
122
+ async function browseFolder(folder: string, treatment: (filePath: string) => Promise<void>) {
123
+ const files = fs.readdirSync(folder)
124
+ for(let ind = 0; ind < files.length; ind++) {
125
+ const file = files[ind]
126
+ const pathName = folder + '/' + file
127
+ if (fs.statSync(pathName).isDirectory()) {
128
+ await browseFolder(pathName, treatment)
129
+ }
130
+ else {
131
+ await treatment(pathName)
132
+ }
133
+ }
134
+ }
135
+
136
+ /**
137
+ * function deletePackageModules
138
+ * @param node_package
139
+ * @param dbManager
140
+ * @returns
141
+ */
142
+ async function deletePackageModules(node_package: string, dbManager: DBManager) {
143
+ const moduleFolder = path.join('node_modules', node_package, 'module')
144
+ if (!fs.existsSync(moduleFolder) || !fs.statSync(moduleFolder).isDirectory()) {
145
+ return
146
+ }
147
+ console.log()
148
+ console.log('delete modules from server ...')
149
+ const files = fs.readdirSync(moduleFolder)
150
+ for (let ind = 0; ind < files.length; ind++) {
151
+ const file = files[ind]
152
+ if (!dbManager) throw 'dbManager undefined'
153
+
154
+ const fileInfo = path.parse(file)
155
+ await deleteModule(fileInfo.name, dbManager)
156
+ }
157
+ console.log(green('*') + ' delete modules from server')
158
+ }
159
+
160
+ /**
161
+ * function uninstallNodePackage
162
+ * @param node_package
163
+ */
164
+ async function uninstallNodePackage(node_package: string) {
165
+
166
+ try {
167
+ await runShellCommand('npm', ['uninstall', '--save-dev', node_package])
168
+ } catch (error) {
169
+ console.error('Error uninstalling ' + node_package + ' :', error);
170
+ throw error
171
+ }
172
+ }
173
+
174
+ /**
175
+ * function lookupUninstallScript
176
+ * @param node_package
177
+ */
178
+ async function lookupUninstallScript(node_package: string): Promise<string | undefined> {
179
+ let result: string | undefined
180
+ try {
181
+ const scriptsFolder = path.join('node_modules', node_package, 'scripts')
182
+ if (fs.existsSync(scriptsFolder) && fs.statSync(scriptsFolder).isDirectory()) {
183
+ const files = fs.readdirSync(scriptsFolder)
184
+ for (let ind = 0; ind < files.length; ind++) {
185
+ const file = files[ind]
186
+ if (file.startsWith('uninstall.')) {
187
+ result = file
188
+ }
189
+ }
190
+ }
191
+ return result
192
+ }
193
+ catch (err) {
194
+ throw err
195
+ }
196
+ }
package/src/index.ts CHANGED
@@ -10,15 +10,17 @@ import { RunCommand } from './RunCommand'
10
10
  import { InstallCommand } from './InstallCommand'
11
11
  import { AssetCommand } from './AssetCommand'
12
12
  import { OpenCommand } from './OpenCommand'
13
+ import { UninstallCommand } from './UninstallCommand'
13
14
  const logger = loglevel.getLogger("index.ts")
14
15
  logger.setLevel("debug")
15
16
 
16
17
  const program = new Command()
17
18
  program.name('cyk').description('cyklang CLI')
18
- .version('0.5.4')
19
+ .version('0.5.6')
19
20
 
20
21
  program.addCommand(new InstallCommand('install'))
21
22
  program.addCommand(new InstallCommand('i'))
23
+ program.addCommand(new UninstallCommand('uninstall'))
22
24
  program.addCommand(new AssetCommand('asset', 'manage assets'))
23
25
  program.addCommand(new AssetCommand('a', 'manage assets'))
24
26
  program.addCommand(new ModuleCommand('module'))