Skip to content

Commit 5b5a50e

Browse files
authored
Merge pull request #13 from silverl/master
Many many changes...
2 parents da44c99 + 01f91a7 commit 5b5a50e

12 files changed

+3590
-410
lines changed

.jshintrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"esversion": 6
3+
}

.vscode/settings.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
// Place your settings in this file to overwrite default and user settings.
22
{
3-
"typescript.tsdk": "./node_modules/typescript/lib" // we want to use the TS server from our node_modules folder to control its version
3+
// we want to use the TS server from our node_modules folder to control its version
4+
"typescript.tsdk": "./node_modules/typescript/lib",
5+
6+
// OAuth NetSuite Token ID
7+
"netSuiteUpload.netSuiteKey": "<INTEGRATION KEY>",
8+
9+
// OAuth NetSuite Token Secret
10+
"netSuiteUpload.netSuiteSecret": "<INTEGRATION SECRET>",
11+
12+
// OAuth NetSuite Consumer Key
13+
"netSuiteUpload.consumerToken": "<CONSUMER KEY>",
14+
15+
// OAuth NetSuite Consumer Secret
16+
"netSuiteUpload.consumerSecret": "<CONSUMER SECRET>",
17+
18+
// Account number
19+
"netSuiteUpload.realm": "<ACCOUNT NUMBER>"
420
}

README.md

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
**netsuite-upload** is a Visual Studio Code extension that allows you to manage your SuiteScript files directly from the IDE & helps you with defining of new momdules & module dependecies
66

77
## Features
8+
89
### 1. NetSuite File Cabinet Management
10+
911
Right-click the file/folder in the navigation panel to see the options:
1012

1113
- `Pull file from NetSuite` - downloads file from NetSuite
@@ -14,40 +16,67 @@ Right-click the file/folder in the navigation panel to see the options:
1416
- `Compare file with NetSuite` - compares your local version with the NetSuite one
1517
- `Pull folder from NetSuite` - Download the folder content from NetSuite
1618

17-
![Snippet & commands](img/netsuite_upload.gif)
19+
![Snippet & commands](img/netsuite_upload.gif)
1820

1921
### 2. Snippets & commands
2022

21-
- `Snippets for module initialization` - type *defineRestlet...*, choose your module type and hit enter
23+
- `Snippets for module initialization` - type _defineRestlet..._, choose your module type and hit enter
2224
- `Commands for adding new NetSuite/custom dependencies` - open command line (`Ctrl`-`Shift`-`P`) and type
23-
- *add netsuite dependency* for choosing of the NetSuite built-in module from the list
24-
- *add custom dependency* for defining od custom dependecies
25+
- _add netsuite dependency_ for choosing of the NetSuite built-in module from the list
26+
- _add custom dependency_ for defining od custom dependecies
2527

26-
![Snippet & commands](img/snippet_addModule.gif)
28+
![Snippet & commands](img/snippet_addModule.gif)
2729

2830
## Setup
29-
##### NetSuite setup
31+
32+
### NetSuite setup
33+
3034
- Upload `netSuiteRestlet/vscodeExtensionRestlet.js` file somewhere in the `SuiteScripts` folder in NetSuite
3135
- Create and deploy RESTlet using the file. (RESTlet URL will be set in the `settings.json`)
3236

33-
##### VSCode project setup
37+
### VSCode project setup
38+
3439
- Open your local root **SuiteScripts** folder in VSCode
3540
- If not yet created, create one or update the project `settings.json` inside the `.vscode` folder
3641
- Copy the following code to `settings.json` and update with your settings
3742

38-
**settings.json**
43+
### OAuth Authentication
44+
45+
I attempted to implement OAuth, but have failed. If anyone would like to help me figure out what the deal is, I'm open.
46+
47+
To experiment with OAuth, leave the setting for `netSuiteUpload.authentication` unset or commented out.
48+
49+
- If you wish to use OAuth authentication instead of basic authentication you can leave the authentication header blank and use the OAuth settings properties.
50+
- First generate an Integration record in NetSuite, make sure the 'token based authentication' scheme is checked, and save the token and secret
51+
- Second log into a role you wish to use for authentication and from the manage tokens center generate a new token and secret using the Integration from the previous step
52+
- Input the 4 values from above in the corresponding settings options along with the account number in the realm property
53+
54+
### settings.json
55+
3956
```javascript
4057
{
41-
// Authentication header
42-
"netSuiteUpload.authentication": "NLAuth nlauth_account=<ACCOUNTID>, nlauth_email=<LOGIN>, nlauth_signature=<PASSWORD>, nlauth_role=<ROLE>",
58+
// Authentication header
59+
"netSuiteUpload.authentication": "NLAuth nlauth_account=<ACCOUNTID>, nlauth_email=<LOGIN>, nlauth_signature=<PASSWORD>, nlauth_role=<ROLE>",
60+
61+
// Restlet URL
62+
"netSuiteUpload.restlet": "<RESTlet URL>",
4363

44-
// Restlet URL
45-
"netSuiteUpload.restlet": "<RESTlet URL>",
64+
// Temporary folder (e.g. C:\\temp or /tmp) - used for storing compared file
65+
"netSuiteUpload.tempFolder": "<TEMP FOLDER PATH>"
4666

47-
// Temporary folder (e.g. C:\\temp) - used for storing compared file
48-
"netSuiteUpload.tempFolder": "<TEMP FOLDER PATH>"
67+
// Oauth NetSuite Key or Token ID
68+
"netSuiteUpload.netSuiteKey": "<NETSUITE TOKEN KEY>",
69+
// Oauth NetSuite Secret
70+
"netSuiteUpload.netSuiteSecret": "<NETSUITE SECRET>",
71+
// Oauth NetSuite Consumer Key
72+
"netSuiteUpload.consumerToken": "<CONSUMER TOKEN>",
73+
// Oauth NetSuite Consumer Secret
74+
"netSuiteUpload.consumerSecret": "<CONSUMER SECRET>",
75+
// Account number
76+
"netSuiteUpload.realm": "<NETSUITE ACCOUNT NUMBER>"
4977
}
5078
```
5179

5280
## Limitation
53-
The plugin is using RESTlet for the communication with the NetSuite which is having some governance limitation. Current implementation does not deal with this problem, so there could be a problem to pull folders containing a lot of items from NetSuite.
81+
82+
The plugin is using RESTlet for the communication with the NetSuite which is having some governance limitation. Current implementation does not deal with this problem, so there could be a problem to pull folders containing a lot of items from NetSuite.

bl/netSuiteBl.js

Lines changed: 85 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,86 +7,116 @@ let uiHelper = require('../helpers/uiHelper');
77
let netsuiteList = require('../helpers/netsuiteList');
88
let _ = require('underscore');
99

10-
function hasError(data, message) {
11-
if (data.error) {
12-
var errorMessage = message ? message : JSON.parse(data.error.message).message;
13-
vscode.window.showErrorMessage(errorMessage);
14-
return true;
15-
}
16-
return false;
17-
}
18-
1910
function downloadFileFromNetSuite(file) {
20-
nsRestClient.getFile(file, function(data) {
21-
if (hasError(data)) return;
22-
11+
nsRestClient.getFile(file, function (err, res) {
12+
if (hasNetSuiteError("ERROR downloading file", err, res)) {
13+
return;
14+
}
15+
2316
var relativeFileName = nsRestClient.getRelativePath(file.fsPath);
24-
25-
fs.writeFile(file.fsPath, data[0].content.toString());
26-
vscode.window.showInformationMessage('File "' + relativeFileName + '" downloaded.');
17+
fs.writeFile(file.fsPath, res.body[0].content);
18+
vscode.window.showInformationMessage('SUCCESS! File "' + relativeFileName + '" downloaded.');
2719
});
2820
}
2921

3022
function uploadFileToNetSuite(file) {
3123
var fileContent = fs.readFileSync(file.fsPath, 'utf8');
32-
33-
nsRestClient.postFile(file, fileContent, function(data) {
34-
if (hasError(data)) return;
35-
36-
var relativeFileName = nsRestClient.getRelativePath(file.fsPath);
3724

38-
vscode.window.showInformationMessage('File "' + relativeFileName + '" uploaded.');
25+
nsRestClient.postFile(file, fileContent, function (err, res) {
26+
if (hasNetSuiteError("ERROR uploading file", err, res)) {
27+
return;
28+
}
29+
30+
var relativeFileName = nsRestClient.getRelativePath(file.fsPath);
31+
vscode.window.showInformationMessage('SUCCESS! File "' + relativeFileName + '" uploaded.');
3932
});
4033
}
4134

35+
function hasNetSuiteError(custommessage, err, response) {
36+
if (err) {
37+
var msg = custommessage;
38+
var items = [];
39+
if (response && response.body && response.body.error) {
40+
// The body of the response may contain a JSON object containing a NetSuite-specific
41+
// message. We'll parse and display that in addition to the HTTP message.
42+
var code = response.body.error.code;
43+
var nsMessage = JSON.parse(response.body.error.message);
44+
items = [
45+
"NetSuite Error:",
46+
"Code: " + code,
47+
"Type: " + nsMessage.type,
48+
"Name: " + nsMessage.name,
49+
"Message: " + nsMessage.message,
50+
"Stack: " + nsMessage.stack.toString()
51+
];
52+
} else if (err.status && err.stack) {
53+
items = [
54+
"Other Error:",
55+
"Status: " + err.status,
56+
"Stack:" + err.stack
57+
];
58+
}
59+
var errormessage = msg + " " + items.join(" ");
60+
console.log(err);
61+
console.log(errormessage);
62+
vscode.window.showErrorMessage(errormessage);
63+
return true;
64+
}
65+
return false;
66+
}
67+
4268
function deleteFileInNetSuite(file) {
43-
nsRestClient.deleteFile(file, function(data) {
44-
if (hasError(data)) return;
45-
46-
var relativeFileName = nsRestClient.getRelativePath(file.fsPath);
69+
nsRestClient.deleteFile(file, function (err, res) {
70+
if (hasNetSuiteError("ERROR deleting file", err, res)) {
71+
return;
72+
}
4773

48-
vscode.window.showInformationMessage('File "' + relativeFileName + '" deleted.');
74+
var relativeFileName = nsRestClient.getRelativePath(file.fsPath);
75+
vscode.window.showInformationMessage('SUCCESS! Deleted file "' + relativeFileName + '".');
4976
});
5077
}
5178

5279
function previewFileFromNetSuite(file) {
53-
nsRestClient.getFile(file, function(data) {
54-
if (hasError(data, 'File does not exist in NetSuite')) return;
55-
80+
nsRestClient.getFile(file, function (err, res) {
81+
if (hasNetSuiteError("ERROR downloading file!", err, res)) {
82+
return;
83+
}
84+
5685
var relativeFileName = nsRestClient.getRelativePath(file.fsPath);
57-
var tempFolder = vscode.workspace.getConfiguration('netSuiteUpload')['tempFolder'];
58-
var filePathArray = (relativeFileName.split('.')[0] + '.preview.' + relativeFileName.split('.')[1]).split('\\');
59-
var newPreviewFile = tempFolder + '\\' + filePathArray[filePathArray.length-1];
86+
var tempFolder = vscode.workspace.getConfiguration('netSuiteUpload').tempFolder;
87+
var filePathArray = (relativeFileName.split('.')[0] + '.preview.' + relativeFileName.split('.')[1]).split(path.sep);
88+
var newPreviewFile = path.join(tempFolder, filePathArray[filePathArray.length - 1]);
6089

61-
fs.writeFile(newPreviewFile, data[0].content.toString());
90+
fs.writeFile(newPreviewFile, res.body[0].content);
6291

6392
var nsFile = vscode.Uri.file(newPreviewFile);
6493
vscode.commands.executeCommand('vscode.diff', file, nsFile, 'Local <--> NetSuite');
6594
});
6695
}
6796

6897
function downloadDirectoryFromNetSuite(directory) {
69-
nsRestClient.getDirectory(directory, function(data) {
70-
// TODO: fix another error messages + check other functions and fix there as well
71-
if (hasError(data, 'Folder does not exist in NetSuite')) return;
98+
nsRestClient.getDirectory(directory, function (err, res) {
99+
if (hasNetSuiteError("ERROR downloading directory!", err, res)) {
100+
return;
101+
}
72102

73-
data.forEach(function(file) {
74-
var fullFilePath = vscode.workspace.rootPath + file.fullPath.split('/').join('\\');
103+
res.body.forEach(function (file) {
104+
var fullFilePath = path.join(vscode.workspace.rootPath, file.fullPath.split('/').join(path.sep));
105+
106+
createDirectoryIfNotExist(fullFilePath + (file.type == 'folder' ? path.sep + '_' : ''));
75107

76-
createDirectoryIfNotExist(fullFilePath + (file.type == 'folder' ? '\\_' : ''));
77-
78108
if (file.type == 'file') {
79-
fs.writeFile(fullFilePath, file.content.toString());
109+
fs.writeFile(fullFilePath, file.content);
80110
}
81111
});
82112

83-
vscode.window.showInformationMessage('Folder successfully downloaded.');
113+
vscode.window.showInformationMessage('SUCCESS: Downloaded ' + res.body.length + ' file(s).');
84114
});
85115
}
86116

87117
function createDirectoryIfNotExist(filePath) {
88118
var dirname = path.dirname(filePath);
89-
119+
90120
if (fs.existsSync(dirname)) {
91121
return true;
92122
}
@@ -98,37 +128,39 @@ function createDirectoryIfNotExist(filePath) {
98128
function addCustomDependencyToActiveFile(editor) {
99129
uiHelper.askForCustomDependency()
100130
.then(values => {
101-
addDependency(editor, values.depPath, values.depParam);
102-
})
131+
addDependency(editor, values.depPath, values.depParam);
132+
});
103133
}
104134

105135
function addNetSuiteDependencyToActiveFile(editor) {
106136
let netsuiteLibs = netsuiteList.getSuiteScriptDependecies();
107137

108138
uiHelper.showListOfNetSuiteDependecies(_.pluck(netsuiteLibs, 'path'))
109139
.then(value => {
110-
var depRecord = _.findWhere(netsuiteLibs, { path: value });
140+
var depRecord = _.findWhere(netsuiteLibs, {
141+
path: value
142+
});
111143
addDependency(editor, depRecord.path, depRecord.param);
112-
})
144+
});
113145
}
114146

115147
function addDependency(editor, pathText, paramText) {
116148
let docContent = editor.document.getText();
117149
let coords = codeChangeHelper.getCoords(docContent);
118150
let oldParamsString = docContent.substring(coords.depParam.range[0], coords.depParam.range[1]);
119-
151+
120152
let newParamsString = codeChangeHelper.getUpdatedFunctionParams(paramText, oldParamsString);
121-
let newPathArrayString = codeChangeHelper.getUpdatedDepPath(pathText,
153+
let newPathArrayString = codeChangeHelper.getUpdatedDepPath(pathText,
122154
coords.depPath ? docContent.substring(coords.depPath.range[0], coords.depPath.range[1]) : null);
123155

124156
if (coords.depPath) {
125-
codeChangeHelper.updateDocument(editor, coords.depParam.start.row - 1, coords.depParam.start.col,
157+
codeChangeHelper.updateDocument(editor, coords.depParam.start.row - 1, coords.depParam.start.col,
126158
coords.depParam.end.row - 1, coords.depParam.end.col, newParamsString);
127159

128-
codeChangeHelper.updateDocument(editor, coords.depPath.start.row - 1, coords.depPath.start.col,
160+
codeChangeHelper.updateDocument(editor, coords.depPath.start.row - 1, coords.depPath.start.col,
129161
coords.depPath.end.row - 1, coords.depPath.end.col, newPathArrayString);
130162
} else { // Path array not defined
131-
codeChangeHelper.updateDocument(editor, coords.depParam.start.row - 1, coords.depParam.start.col,
163+
codeChangeHelper.updateDocument(editor, coords.depParam.start.row - 1, coords.depParam.start.col,
132164
coords.depParam.end.row - 1, coords.depParam.end.col, newPathArrayString + ', ' + newParamsString);
133165
}
134166
}
@@ -139,4 +171,4 @@ exports.downloadDirectoryFromNetSuite = downloadDirectoryFromNetSuite;
139171
exports.uploadFileToNetSuite = uploadFileToNetSuite;
140172
exports.deleteFileInNetSuite = deleteFileInNetSuite;
141173
exports.addCustomDependencyToActiveFile = addCustomDependencyToActiveFile;
142-
exports.addNetSuiteDependencyToActiveFile = addNetSuiteDependencyToActiveFile;
174+
exports.addNetSuiteDependencyToActiveFile = addNetSuiteDependencyToActiveFile;

0 commit comments

Comments
 (0)