Skip to content

Commit b7fac3b

Browse files
committed
more SOLID
1 parent 1354610 commit b7fac3b

11 files changed

+223
-281
lines changed

commands/compile.js

Lines changed: 0 additions & 251 deletions
This file was deleted.

commands/compile/cls-check-names.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// is name correlate with code ?
2+
// if ( atelier ) {
3+
// testClass({ code: 'test.class.cls', file: 'class.cls' })
4+
// } else {
5+
// testClass({ code: 'test.class.cls', file: 'test.class.cls' })
6+
//}
7+
module.exports = ( { code, file, log = data => console.log( data ) } ) => {
8+
9+
const arr = code.split( '.' )
10+
.filter( s => !!s ) // drop empty parts
11+
12+
if ( arr.length < 3 ) { // without package
13+
log( `Unable to detect class.name in ${ file }. Is it a valid ObjectScript class?` )
14+
return false
15+
}
16+
17+
// NOTE: by default, we can use package 'User'
18+
// else if ( parts.length === 2 ){
19+
// arr.unshift( 'User' ) //package by default
20+
// or parse 'import' directive ;)
21+
//}
22+
23+
// is codename contain filename
24+
if ( ~code.toLowerCase().indexOf( file.toLowerCase() ) ) return true
25+
// else
26+
log( `'${ code }' defined in '${ file }'. Rename the file or class` )
27+
return false
28+
29+
}

commands/compile/cls-regex-name.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Caché class files can be placed hierarchically (e.g. /src/Package/Class.cls),
2+
// so we pick the class name from the class definition itself
3+
const regex = /Class ([^\s]+)/i //'Class test.class'
4+
5+
module.exports = ( code ) => {
6+
7+
const arr = code.match( regex ) || []; // ['Class test.class', 'test.class']
8+
const name = arr[ 1 ] || '', ext = 'cls'
9+
return { name, ext } // test.class.cls
10+
11+
}

commands/compile/index.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* Import and compile current file.
3+
*/
4+
const clsRegexName = require( './cls-regex-name' )
5+
const clsCheckNames = require( './cls-check-names' )
6+
const rtnRegexName = require( './rtn-regex-name' )
7+
const rtnCheckNames = require( './rtn-check-names' )
8+
const IsError = require( './is-error' )
9+
10+
// will be overriden in module.exports
11+
let window = {}
12+
let languages = [ 'cacheobjectscript', 'cacheobjectscriptinclude' ];
13+
let api = { putDoc: () => {}, compile: ( ) => {} }
14+
let log = data => console.log( 'cos.compile:', JSON.stringify( data ) )
15+
16+
module.exports = env => {
17+
18+
({ window, languages, api, log } = env );
19+
20+
return () => {
21+
22+
const editor = window.activeTextEditor
23+
if ( !editor ) return log( 'No active editor, open one at first' )
24+
const doc = editor.document
25+
if ( !doc ) return log( 'Open ObjectScript file first.' )
26+
const fullname = doc.fileName
27+
if ( !fullname ) return log( 'You must save the document first' )
28+
if ( !~languages.indexOf( doc.languageId ) ) {
29+
return log( `${ fullname } has unsupported type ${ language }` )
30+
}
31+
32+
let file = ( fullname.match( /[^\\\/]+$/ ) || [] )[ 0 ] || '' //only filename without folders
33+
let code = doc.getText().replace( /\/\/[^\r\n]*\r?\n/g, '' ) // normalize EOL?
34+
let name, ext, codename //server side name
35+
36+
const cdnm = ({name,ext})=>[name, ext].join('.')
37+
38+
if ( /\.cls$/i.test( fullname ) ) { // is class?
39+
40+
( { name, ext } = clsRegexName( code ) )
41+
codename = cdnm({ name, ext })
42+
if ( !clsCheckNames( { code: codename, file, log } ) ) return
43+
44+
} else { // routines
45+
46+
( { name, ext } = rtnRegexName( code ) )
47+
codename = cdnm({ name, ext })
48+
if ( !rtnCheckNames( { code: codename, file, log } ) ) return
49+
50+
}
51+
52+
const content = code.split( /\r?\n/g ), // code lines array
53+
isCompileErrors = IsError({ codename, action: 'compile', log }),
54+
compile = () => api.compile( codename, ( err, res ) => {
55+
if ( isCompileErrors( err, res ) ) return
56+
res.console.forEach( l => l ? log( l ) : 0 )
57+
}),
58+
isSaveErrors = IsError({ codename, action: 'save', log })
59+
60+
log( `
61+
Save and compile ${ fullname } ...`
62+
)
63+
api.putDoc( codename, { enc: false, content }, { ignoreConflict: true }, ( err, res ) => {
64+
if ( isSaveErrors( err, res ) ) return
65+
compile()
66+
})
67+
68+
}
69+
70+
}

commands/compile/is-error.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module.exports = ({ name, action, log }) => ( err, data ) => {
2+
3+
const { result, status, console } = data
4+
5+
if ( err ){
6+
const errtext = err.code ? err.code + ' ' + err.message : err
7+
log( `${ name } ${ action }: ${ errtext }` )
8+
return true
9+
}
10+
11+
if ( !data || !status || !( status.errors instanceof Array ) ){
12+
log( `Unknown response from ${ name } ${ action }: ${ JSON.stringify( res ) }` )
13+
return true
14+
}
15+
16+
if ( result && result.status ){
17+
log( result.status )
18+
return true
19+
}
20+
21+
if ( status.errors.length !== 0 ){
22+
log( `${ name } ${ action }:` )
23+
console.forEach( line => log( line ) )
24+
return true
25+
}
26+
27+
return false
28+
29+
}

0 commit comments

Comments
 (0)