mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-23 18:47:06 -05:00
Compare commits
385 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d08d07fe39 | ||
|
|
7725d1f6a8 | ||
|
|
63803ea6f2 | ||
|
|
cacd481bff | ||
|
|
650ab3b800 | ||
|
|
517b375395 | ||
|
|
29ccbb5497 | ||
|
|
ba3e92e5be | ||
|
|
5013a76565 | ||
|
|
fe896e8b1a | ||
|
|
ea71c0e39c | ||
|
|
32acda343d | ||
|
|
e97e098a14 | ||
|
|
b317ccde28 | ||
|
|
3d1d20a472 | ||
|
|
7b2ae58aa6 | ||
|
|
ecedd3108d | ||
|
|
6d598b1362 | ||
|
|
1cae74c6d3 | ||
|
|
fbcd3c620c | ||
|
|
78ec3c016b | ||
|
|
71a6ced5bf | ||
|
|
eee799aeef | ||
|
|
3ffef2fb02 | ||
|
|
c7d7faa167 | ||
|
|
64e95edc96 | ||
|
|
761e3d1692 | ||
|
|
c1fb00b3f2 | ||
|
|
8c925a31b6 | ||
|
|
b196291052 | ||
|
|
068b64973f | ||
|
|
d83444ffeb | ||
|
|
872973c4d2 | ||
|
|
ca36aa5b2d | ||
|
|
0a7cdf79ba | ||
|
|
ccb7a03a0f | ||
|
|
beab3cb48c | ||
|
|
fd7b5a8628 | ||
|
|
fd0d3855df | ||
|
|
0498253b56 | ||
|
|
e5609ffd5c | ||
|
|
29e6145920 | ||
|
|
b03ff643e5 | ||
|
|
053be4756d | ||
|
|
2bdd55dea4 | ||
|
|
738c8231ee | ||
|
|
1e29949273 | ||
|
|
cdd3899648 | ||
|
|
933dfc0f3f | ||
|
|
10a7b47604 | ||
|
|
910dc32623 | ||
|
|
86f38f5074 | ||
|
|
ba9d3169c5 | ||
|
|
a19885e719 | ||
|
|
84457bf981 | ||
|
|
d73fa5e168 | ||
|
|
e9c3ffe424 | ||
|
|
a1aa303922 | ||
|
|
c9dd2fb4a8 | ||
|
|
3d95b0032e | ||
|
|
5ff747d6ef | ||
|
|
d26f4167fb | ||
|
|
93a28b30c7 | ||
|
|
10d7db8b37 | ||
|
|
c4a8b786c3 | ||
|
|
c99c09a6ab | ||
|
|
b6a36ebc59 | ||
|
|
b783a69e36 | ||
|
|
bbad8f194c | ||
|
|
6f6ba99251 | ||
|
|
f991293ee8 | ||
|
|
a60cd0132e | ||
|
|
05a53af085 | ||
|
|
143b70c6a8 | ||
|
|
c1e95a2246 | ||
|
|
53a081262d | ||
|
|
8b46143d48 | ||
|
|
a05edc619c | ||
|
|
6c5aa6b367 | ||
|
|
0246c3f895 | ||
|
|
e3ae5263c6 | ||
|
|
0bfb1aab7e | ||
|
|
d120102805 | ||
|
|
7e5b864299 | ||
|
|
4dd6db57ee | ||
|
|
a2f105a913 | ||
|
|
ab31a7b964 | ||
|
|
203ff3872f | ||
|
|
2ee3840650 | ||
|
|
fa80dbfb27 | ||
|
|
2237d286b6 | ||
|
|
4124f6b1ad | ||
|
|
23361d3d56 | ||
|
|
4c8f3ddfd3 | ||
|
|
f631a8aa9a | ||
|
|
bbc6460d3f | ||
|
|
09d78544cf | ||
|
|
a791aff0a2 | ||
|
|
ce318f123f | ||
|
|
9374056e61 | ||
|
|
5ef19affd0 | ||
|
|
d40abf4add | ||
|
|
86f8b3f9ec | ||
|
|
385d7f2803 | ||
|
|
2ee04e0cf0 | ||
|
|
9bdaba3b65 | ||
|
|
80d46fb8a4 | ||
|
|
268f9ef725 | ||
|
|
3813d9385b | ||
|
|
48bf72bfc4 | ||
|
|
fa1d5cc49d | ||
|
|
de5fd11155 | ||
|
|
cd30a8cbc0 | ||
|
|
ec1e54db9a | ||
|
|
82963ad075 | ||
|
|
b24671bbf6 | ||
|
|
2ab7a47353 | ||
|
|
5d4da455bd | ||
|
|
0b039830ea | ||
|
|
77e1ca59ed | ||
|
|
e8e8ee5941 | ||
|
|
23861bd369 | ||
|
|
4c946b21a9 | ||
|
|
e74538b40d | ||
|
|
b6ef5469de | ||
|
|
ee2850f2e2 | ||
|
|
3387a762c4 | ||
|
|
75388cc3af | ||
|
|
087f7fc43d | ||
|
|
5da0e16e44 | ||
|
|
eb465fde1a | ||
|
|
26ece1ee86 | ||
|
|
f18b65a690 | ||
|
|
6851b2091f | ||
|
|
74396c1558 | ||
|
|
d02c680dab | ||
|
|
888327f5bc | ||
|
|
2623e7da88 | ||
|
|
0d2a3bc2d7 | ||
|
|
5eeaa5710c | ||
|
|
92e1f83046 | ||
|
|
9a3f72591e | ||
|
|
12d824d791 | ||
|
|
613fef5e73 | ||
|
|
1d4babefba | ||
|
|
6e9e81e3a1 | ||
|
|
c292561eb1 | ||
|
|
248464191d | ||
|
|
f1cdfb768d | ||
|
|
777c188a3f | ||
|
|
bf00a6b695 | ||
|
|
b58927fea1 | ||
|
|
2aa7a145d4 | ||
|
|
4d618c5ef1 | ||
|
|
543e3e2c09 | ||
|
|
93c9426f25 | ||
|
|
d4feb903b0 | ||
|
|
5a1183a457 | ||
|
|
22774f28c0 | ||
|
|
1936e0dbbd | ||
|
|
df6e86554c | ||
|
|
33218bb0e5 | ||
|
|
f475c04ce3 | ||
|
|
0788796f1a | ||
|
|
3a01f960a7 | ||
|
|
d37105ada2 | ||
|
|
66fda57513 | ||
|
|
2fe82e4b2f | ||
|
|
eee7e52bd4 | ||
|
|
ecd76eb870 | ||
|
|
bcaa09e910 | ||
|
|
32df727ff9 | ||
|
|
e1bfe6cdda | ||
|
|
e4e71af597 | ||
|
|
749ddc30c7 | ||
|
|
c4965c7fe9 | ||
|
|
de72ab176c | ||
|
|
b453c3a48e | ||
|
|
857c658888 | ||
|
|
d91488da62 | ||
|
|
16fbd4abfd | ||
|
|
285f8bc28c | ||
|
|
3fb4877859 | ||
|
|
e25cbdf4b9 | ||
|
|
b1db9a8cf1 | ||
|
|
f418104b7a | ||
|
|
5454917569 | ||
|
|
effa50a9bd | ||
|
|
ac87346507 | ||
|
|
cacbcb5415 | ||
|
|
0b2a2ad0ed | ||
|
|
44bc7a89df | ||
|
|
bcb5384639 | ||
|
|
b23e577ccc | ||
|
|
96a28f2c4d | ||
|
|
826c4115a7 | ||
|
|
c95ea16a44 | ||
|
|
8e1a2248e4 | ||
|
|
6b29fd05bd | ||
|
|
080d9bbaa6 | ||
|
|
263d342a79 | ||
|
|
0d2dcb3d25 | ||
|
|
9dd35c8c0d | ||
|
|
e85f93abec | ||
|
|
18c12dac9a | ||
|
|
a0f1d68cfb | ||
|
|
37f651fe08 | ||
|
|
d2e4e94aec | ||
|
|
cf1a09aeaf | ||
|
|
32897d3e07 | ||
|
|
3f2a728ed0 | ||
|
|
af24a9d002 | ||
|
|
6582debd73 | ||
|
|
575d1c8543 | ||
|
|
08b78c3ca5 | ||
|
|
e0a867a184 | ||
|
|
2b8508574d | ||
|
|
b8976785fd | ||
|
|
79e2c56ec8 | ||
|
|
1ea09c7add | ||
|
|
7489a65bbe | ||
|
|
faabdb8d88 | ||
|
|
57c5d98bdc | ||
|
|
b5c249c25d | ||
|
|
60a244888d | ||
|
|
c4dfc5cf70 | ||
|
|
4c2ffdfc68 | ||
|
|
704c5174f9 | ||
|
|
b708b4a42b | ||
|
|
ee98ce5c18 | ||
|
|
7162272f1e | ||
|
|
faee6b45e0 | ||
|
|
aef69ab12a | ||
|
|
a712426185 | ||
|
|
19be0d0ff3 | ||
|
|
3202e46930 | ||
|
|
5b95d6777f | ||
|
|
084524cd2d | ||
|
|
6ab03053a0 | ||
|
|
9f065b2b5a | ||
|
|
5327ed84c1 | ||
|
|
4018a29a16 | ||
|
|
7cbc268c52 | ||
|
|
bca7c8e6bd | ||
|
|
d0fb6de390 | ||
|
|
63f3d9862f | ||
|
|
00f8dcb23e | ||
|
|
bc4165037c | ||
|
|
07109617b5 | ||
|
|
6385443a4c | ||
|
|
6ef415d0e6 | ||
|
|
ba8ba9f68d | ||
|
|
b30252021b | ||
|
|
db57171ece | ||
|
|
3688e9981d | ||
|
|
b4de26a801 | ||
|
|
2a15768a25 | ||
|
|
f971417746 | ||
|
|
33854d42e4 | ||
|
|
2d9f6dcd86 | ||
|
|
e3c347e148 | ||
|
|
f7c468d6f0 | ||
|
|
e6cac8cc14 | ||
|
|
79d0239362 | ||
|
|
a0e31fc723 | ||
|
|
6a6048d40f | ||
|
|
a29ae4d3b9 | ||
|
|
82b19614e1 | ||
|
|
49851daf0d | ||
|
|
d815ae0e83 | ||
|
|
cb50fae12d | ||
|
|
26072af82f | ||
|
|
89c1c4897a | ||
|
|
5e5563f974 | ||
|
|
5df68e5942 | ||
|
|
d895de0bc1 | ||
|
|
2ec4a0c8a8 | ||
|
|
5e3ec6ea39 | ||
|
|
6f06ab440a | ||
|
|
c3bb7a66e0 | ||
|
|
aadc871124 | ||
|
|
cb2cea4ebd | ||
|
|
6125e68c1f | ||
|
|
71b80e0817 | ||
|
|
ac6a4e590d | ||
|
|
1f61a2581c | ||
|
|
bf23a52ba4 | ||
|
|
db498db0a8 | ||
|
|
9d3d64eef3 | ||
|
|
e694e0273b | ||
|
|
ced882a2e5 | ||
|
|
754c643b1b | ||
|
|
6a136854b0 | ||
|
|
a584aca969 | ||
|
|
b3fbb29bf2 | ||
|
|
b7299e5eec | ||
|
|
510c45b9b7 | ||
|
|
aad9c0f965 | ||
|
|
373828d76f | ||
|
|
86a9a2c069 | ||
|
|
6e7e6ee434 | ||
|
|
6af544afde | ||
|
|
dca21bd3be | ||
|
|
9b82b101cd | ||
|
|
47a14bbbff | ||
|
|
094d6f2339 | ||
|
|
290dd9531f | ||
|
|
141226332c | ||
|
|
7e0a5205b2 | ||
|
|
c6c863cd84 | ||
|
|
28d453fced | ||
|
|
4d62983680 | ||
|
|
d3ea9c3168 | ||
|
|
603a79d094 | ||
|
|
16481927e8 | ||
|
|
6f06c18014 | ||
|
|
7868afb4fd | ||
|
|
66d4d5c73f | ||
|
|
075479274d | ||
|
|
bae797f975 | ||
|
|
ea0f9e6ce9 | ||
|
|
fa6c52699e | ||
|
|
209d7e48d8 | ||
|
|
0bd3e1b0e1 | ||
|
|
9229b26b9e | ||
|
|
29dbce079b | ||
|
|
86df538db9 | ||
|
|
d9c5b7ea9e | ||
|
|
c9128d56c0 | ||
|
|
888755e842 | ||
|
|
3ac096b3b1 | ||
|
|
7ebd1eb053 | ||
|
|
2128851bdf | ||
|
|
823d136a00 | ||
|
|
a67e62b2d0 | ||
|
|
d262ea21e3 | ||
|
|
aaf115a5c8 | ||
|
|
206c5146e1 | ||
|
|
abe917f3c1 | ||
|
|
0793e11b04 | ||
|
|
9df66deb81 | ||
|
|
9765b0ed8e | ||
|
|
83c9c3f618 | ||
|
|
dd5dd12ee6 | ||
|
|
b68fd91a02 | ||
|
|
4270547147 | ||
|
|
c4b90360a5 | ||
|
|
7d49e75e46 | ||
|
|
8db5bd438e | ||
|
|
f6f18b68b5 | ||
|
|
ab8a9509b8 | ||
|
|
4dda5ee549 | ||
|
|
5ae8017233 | ||
|
|
66cdbbb335 | ||
|
|
3e9b694e6f | ||
|
|
b1eef13bb0 | ||
|
|
82f93f7da5 | ||
|
|
119008d05d | ||
|
|
aeaac4bc17 | ||
|
|
789e26ae60 | ||
|
|
b813ace79c | ||
|
|
02f497712d | ||
|
|
fda4ba81c3 | ||
|
|
e7a9d34ecd | ||
|
|
485cb43a34 | ||
|
|
3281d28de7 | ||
|
|
856833dbc4 | ||
|
|
15f1945f31 | ||
|
|
b1f29a8c92 | ||
|
|
cbbd4ffbb6 | ||
|
|
e2ea397fb9 | ||
|
|
6a4c9b4108 | ||
|
|
a61c86bff5 | ||
|
|
35b09542e2 | ||
|
|
a57536be4b | ||
|
|
fbb2accacb | ||
|
|
0a393400b2 | ||
|
|
8b5ce753e4 | ||
|
|
f05b9396e8 | ||
|
|
6670fe8c1c | ||
|
|
b8518f5795 | ||
|
|
c94291af52 | ||
|
|
1d6f48806e | ||
|
|
4626f37671 | ||
|
|
33a7fe38e1 |
71
.github/classifier.yml
vendored
71
.github/classifier.yml
vendored
@@ -1,49 +1,34 @@
|
|||||||
{
|
{
|
||||||
perform: false,
|
perform: true,
|
||||||
alwaysRequireAssignee: false,
|
alwaysRequireAssignee: false,
|
||||||
labelsRequiringAssignee: [],
|
labelsRequiringAssignee: [],
|
||||||
autoAssignees: {
|
autoAssignees: {
|
||||||
accessibility: [],
|
Area - Acquisition: [],
|
||||||
acquisition: [],
|
Area - Azure: [],
|
||||||
agent: [],
|
Area - Backup\Restore: [],
|
||||||
azure: [],
|
Area - Charting\Insights: [],
|
||||||
backup: [],
|
Area - Connection: [],
|
||||||
bcdr: [],
|
Area - DacFX: [],
|
||||||
'chart viewer': [],
|
Area - Dashboard: [],
|
||||||
connection: [],
|
Area - Data Explorer: [],
|
||||||
dacfx: [],
|
Area - Edit Data: [],
|
||||||
dashboard: [],
|
Area - Extensibility: [],
|
||||||
'data explorer': [],
|
Area - External Table: [],
|
||||||
documentation: [],
|
Area - Fundamentals: [],
|
||||||
'edit data': [],
|
Area - Language Service: [],
|
||||||
export: [],
|
Area - Localization: [],
|
||||||
extensibility: [],
|
Area - Notebooks: [],
|
||||||
extensionManager: [],
|
Area - Performance: [],
|
||||||
globalization: [],
|
Area - Query Editor: [ anthonydresser ],
|
||||||
grid: [],
|
Area - Query Plan: [],
|
||||||
import: [],
|
Area - Reliability: [],
|
||||||
insights: [],
|
Area - Resource Deployment: [],
|
||||||
intellisense: [],
|
Area - Schema Compare: [],
|
||||||
localization: [],
|
Area - Shell: [],
|
||||||
'managed instance': [],
|
Area - SQL Agent: [],
|
||||||
notebooks: [],
|
Area - SQL Import: [],
|
||||||
'object explorer': [],
|
Area - SQL Profiler: [],
|
||||||
performance: [],
|
Area - SQL 2019: [],
|
||||||
profiler: [],
|
Area - SSMS Integration: []
|
||||||
'query editor': [],
|
|
||||||
'query execution': [],
|
|
||||||
reliability: [],
|
|
||||||
restore: [],
|
|
||||||
scripting: [],
|
|
||||||
'server group': [],
|
|
||||||
settings: [],
|
|
||||||
setup: [],
|
|
||||||
shell: [],
|
|
||||||
showplan: [],
|
|
||||||
snippet: [],
|
|
||||||
sql2019Preview: [],
|
|
||||||
sqldw: [],
|
|
||||||
supportability: [],
|
|
||||||
ux: []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -30,3 +30,4 @@ coverage/
|
|||||||
test_data/
|
test_data/
|
||||||
test-results/
|
test-results/
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
|
*.vsix
|
||||||
|
|||||||
33
.lgtm/javascript-queries/promises.ql
Normal file
33
.lgtm/javascript-queries/promises.ql
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/**
|
||||||
|
* @name No floating promises
|
||||||
|
* @kind problem
|
||||||
|
* @problem.severity error
|
||||||
|
* @id js/experimental/floating-promise
|
||||||
|
*/
|
||||||
|
import javascript
|
||||||
|
|
||||||
|
private predicate isEscapingPromise(PromiseDefinition promise) {
|
||||||
|
exists (DataFlow::Node escape | promise.flowsTo(escape) |
|
||||||
|
escape = any(DataFlow::InvokeNode invk).getAnArgument()
|
||||||
|
or
|
||||||
|
escape = any(DataFlow::FunctionNode fun).getAReturn()
|
||||||
|
or
|
||||||
|
escape = any(ThrowStmt t).getExpr().flow()
|
||||||
|
or
|
||||||
|
escape = any(GlobalVariable v).getAnAssignedExpr().flow()
|
||||||
|
or
|
||||||
|
escape = any(DataFlow::PropWrite write).getRhs()
|
||||||
|
or
|
||||||
|
exists(WithStmt with, Assignment assign |
|
||||||
|
with.mayAffect(assign.getLhs()) and
|
||||||
|
assign.getRhs().flow() = escape
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
from PromiseDefinition promise
|
||||||
|
where
|
||||||
|
not exists(promise.getAMethodCall(any(string m | m = "then" or m = "catch" or m = "finally"))) and
|
||||||
|
not exists (AwaitExpr e | promise.flowsTo(e.getOperand().flow())) and
|
||||||
|
not isEscapingPromise(promise)
|
||||||
|
select promise, "This promise appears to be a floating promise"
|
||||||
6
.prettierrc.json
Normal file
6
.prettierrc.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"useTabs": true,
|
||||||
|
"printWidth": 120,
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true
|
||||||
|
}
|
||||||
48
.vscode/launch.json
vendored
48
.vscode/launch.json
vendored
@@ -16,6 +16,7 @@
|
|||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to Extension Host",
|
"name": "Attach to Extension Host",
|
||||||
"port": 5870,
|
"port": 5870,
|
||||||
|
"timeout": 30000,
|
||||||
"restart": true,
|
"restart": true,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
@@ -67,15 +68,15 @@
|
|||||||
"name": "Launch azuredatastudio",
|
"name": "Launch azuredatastudio",
|
||||||
"windows": {
|
"windows": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat",
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat",
|
||||||
"timeout": 20000
|
"timeout": 45000
|
||||||
},
|
},
|
||||||
"osx": {
|
"osx": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
||||||
"timeout": 20000
|
"timeout": 45000
|
||||||
},
|
},
|
||||||
"linux": {
|
"linux": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
||||||
"timeout": 20000
|
"timeout": 45000
|
||||||
},
|
},
|
||||||
"env": {
|
"env": {
|
||||||
"VSCODE_EXTHOST_WILL_SEND_SOCKET": null
|
"VSCODE_EXTHOST_WILL_SEND_SOCKET": null
|
||||||
@@ -165,7 +166,10 @@
|
|||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
]
|
],
|
||||||
|
"env": {
|
||||||
|
"MOCHA_COLORS": "true"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
@@ -183,6 +187,22 @@
|
|||||||
"webRoot": "${workspaceFolder}",
|
"webRoot": "${workspaceFolder}",
|
||||||
"timeout": 45000
|
"timeout": 45000
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Run Extension Integration Tests",
|
||||||
|
"windows": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql-test-integration.bat"
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql-test-integration.sh"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql-test-integration.sh"
|
||||||
|
},
|
||||||
|
"webRoot": "${workspaceFolder}",
|
||||||
|
"timeout": 45000
|
||||||
|
},
|
||||||
],
|
],
|
||||||
"compounds": [
|
"compounds": [
|
||||||
{
|
{
|
||||||
@@ -199,6 +219,13 @@
|
|||||||
"Run Extension Unit Tests"
|
"Run Extension Unit Tests"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Debug Extension Integration Tests",
|
||||||
|
"configurations": [
|
||||||
|
"Attach to Extension Host",
|
||||||
|
"Run Extension Integration Tests"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Debug azuredatastudio Main and Renderer",
|
"name": "Debug azuredatastudio Main and Renderer",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
@@ -207,18 +234,25 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Search and Renderer processes",
|
"name": "Debug Renderer and search processes",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Search Process"
|
"Attach to Search Process"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Renderer and Extension Host processes",
|
"name": "Debug Renderer and Extension Host processes",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Extension Host"
|
"Attach to Extension Host"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Attach Renderer and Extension Host",
|
||||||
|
"configurations": [
|
||||||
|
"Attach to azuredatastudio",
|
||||||
|
"Attach to Extension Host"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -61,4 +61,4 @@
|
|||||||
"msjsdiag.debugger-for-chrome": "workspace"
|
"msjsdiag.debugger-for-chrome": "workspace"
|
||||||
},
|
},
|
||||||
"files.insertFinalNewline": true
|
"files.insertFinalNewline": true
|
||||||
}
|
}
|
||||||
|
|||||||
8
.vscode/tasks.json
vendored
8
.vscode/tasks.json
vendored
@@ -5,7 +5,10 @@
|
|||||||
"type": "npm",
|
"type": "npm",
|
||||||
"script": "watch",
|
"script": "watch",
|
||||||
"label": "Build VS Code",
|
"label": "Build VS Code",
|
||||||
"group": "build",
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "never"
|
"reveal": "never"
|
||||||
@@ -45,7 +48,7 @@
|
|||||||
{
|
{
|
||||||
"type": "npm",
|
"type": "npm",
|
||||||
"script": "strict-null-check-watch",
|
"script": "strict-null-check-watch",
|
||||||
"label": "TS - Strict Null Cheks",
|
"label": "TS - Strict Null Checks",
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "never"
|
"reveal": "never"
|
||||||
@@ -96,6 +99,5 @@
|
|||||||
"task": "hygiene",
|
"task": "hygiene",
|
||||||
"problemMatcher": []
|
"problemMatcher": []
|
||||||
},
|
},
|
||||||
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2
.yarnrc
2
.yarnrc
@@ -1,3 +1,3 @@
|
|||||||
disturl "https://atom.io/download/electron"
|
disturl "https://atom.io/download/electron"
|
||||||
target "4.2.9"
|
target "4.2.10"
|
||||||
runtime "electron"
|
runtime "electron"
|
||||||
|
|||||||
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,5 +1,33 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## Version 1.12.2
|
||||||
|
* Release date: October 11, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
* Hotfix release (1.12.2): `Disable automatically starting the EH in inspect mode` https://github.com/microsoft/azuredatastudio/commit/c9bef82ace6c67190d0e83820011a2bbd1f793c1
|
||||||
|
|
||||||
|
## Version 1.12.1
|
||||||
|
* Release date: October 7, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
* Hotfix release: `Notebooks: Ensure quotes and backslashes are escaped properly in text editor model` https://github.com/microsoft/azuredatastudio/pull/7540
|
||||||
|
|
||||||
|
## Version 1.12.0
|
||||||
|
* Release date: October 2, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Announcing the Query History panel
|
||||||
|
* Improved Query Results Grid copy selection support
|
||||||
|
* TempDB page added to Server Reports extension
|
||||||
|
* PowerShell extension update
|
||||||
|
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/42?closed=1).
|
||||||
|
|
||||||
|
## Version 1.11.0
|
||||||
|
* Release date: September 10, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/41?closed=1).
|
||||||
|
|
||||||
## Version 1.10.0
|
## Version 1.10.0
|
||||||
* Release date: August 14, 2019
|
* Release date: August 14, 2019
|
||||||
* Release status: General Availability
|
* Release status: General Availability
|
||||||
@@ -197,7 +225,7 @@ We would like to thank all our users who raised issues, and in particular the fo
|
|||||||
|
|
||||||
## What's new in this version
|
## What's new in this version
|
||||||
* Announcing the SQL Server 2019 Preview extension.
|
* Announcing the SQL Server 2019 Preview extension.
|
||||||
* Support for SQL Server 2019 preview features including big data cluster support.
|
* Support for SQL Server 2019 preview features including Big Data Cluster support.
|
||||||
* Azure Data Studio Notebooks
|
* Azure Data Studio Notebooks
|
||||||
* The Azure Resource Explorer viewlets you browse data-related endpoints for your Azure accounts and create connections to them in Object Explorer. In this release Azure SQL Databases and servers are supported.
|
* The Azure Resource Explorer viewlets you browse data-related endpoints for your Azure accounts and create connections to them in Object Explorer. In this release Azure SQL Databases and servers are supported.
|
||||||
* SQL Server Polybase Create External Table Wizard
|
* SQL Server Polybase Create External Table Wizard
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -9,13 +9,13 @@ Azure Data Studio is a data management tool that enables you to work with SQL Se
|
|||||||
|
|
||||||
Platform | Link
|
Platform | Link
|
||||||
-- | --
|
-- | --
|
||||||
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2100710
|
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2105135
|
||||||
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2100711
|
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2105134
|
||||||
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2100712
|
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2104938
|
||||||
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2100809
|
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2105133
|
||||||
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2100714
|
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2105132
|
||||||
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2100810
|
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2104937
|
||||||
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2100672
|
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2105131
|
||||||
|
|
||||||
Go to our [download page](https://aka.ms/azuredatastudio) for more specific instructions.
|
Go to our [download page](https://aka.ms/azuredatastudio) for more specific instructions.
|
||||||
|
|
||||||
@@ -68,6 +68,9 @@ The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.micro
|
|||||||
## Contributions and "Thank You"
|
## Contributions and "Thank You"
|
||||||
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* dzsquared for `fix(snippets): ads parenthesis to sqlcreateindex snippet #7020`
|
||||||
|
* devmattrick for `Update row count as updates are received #6642`
|
||||||
|
* mottykohn for `In Message panel onclick scroll to line #6417`
|
||||||
* Stevoni for `Corrected Keyboard Shortcut Execution Issue #5480`
|
* Stevoni for `Corrected Keyboard Shortcut Execution Issue #5480`
|
||||||
* yamatoya for `fix the format #4899`
|
* yamatoya for `fix the format #4899`
|
||||||
* GeoffYoung for `Fix sqlDropColumn description #4422`
|
* GeoffYoung for `Fix sqlDropColumn description #4422`
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ expressly granted herein, whether by implication, estoppel or otherwise.
|
|||||||
jquery-ui: https://github.com/jquery/jquery-ui
|
jquery-ui: https://github.com/jquery/jquery-ui
|
||||||
jquery.event.drag: https://github.com/devongovett/jquery.event.drag
|
jquery.event.drag: https://github.com/devongovett/jquery.event.drag
|
||||||
jschardet: https://github.com/aadsm/jschardet
|
jschardet: https://github.com/aadsm/jschardet
|
||||||
|
jupyter-powershell: https://github.com/vors/jupyter-powershell
|
||||||
JupyterLab: https://github.com/jupyterlab/jupyterlab
|
JupyterLab: https://github.com/jupyterlab/jupyterlab
|
||||||
make-error: https://github.com/JsCommunity/make-error
|
make-error: https://github.com/JsCommunity/make-error
|
||||||
minimist: https://github.com/substack/minimist
|
minimist: https://github.com/substack/minimist
|
||||||
@@ -1175,7 +1176,35 @@ That's all there is to it!
|
|||||||
=========================================
|
=========================================
|
||||||
END OF jschardet NOTICES AND INFORMATION
|
END OF jschardet NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% jupyter-powershell NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Sergei Vorobev
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
=========================================
|
||||||
|
END OF jupyter-powershell NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% JupyterLab NOTICES AND INFORMATION BEGIN HERE
|
%% JupyterLab NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
Copyright (c) 2015 Project Jupyter Contributors
|
Copyright (c) 2015 Project Jupyter Contributors
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
@@ -46,39 +46,40 @@ steps:
|
|||||||
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene
|
yarn gulp hygiene --skip-tslint
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn tslint
|
yarn tslint
|
||||||
displayName: "Run TSLint"
|
displayName: Run TSLint
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn strict-null-check
|
yarn strict-null-check
|
||||||
displayName: "Run Strict Null Check"
|
displayName: Run Strict Null Check
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: "Compile"
|
displayName: Compile
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
DISPLAY=:10 ./scripts/test.sh --reporter mocha-junit-reporter
|
DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
||||||
displayName: "Tests"
|
displayName: Run Unit Tests (Linux)
|
||||||
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
|
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
DISPLAY=:10 ./scripts/test.sh --reporter mocha-junit-reporter --coverage
|
DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests" --coverage
|
||||||
displayName: "Tests"
|
displayName: Run Unit Tests (Mac)
|
||||||
condition: and(succeeded(), ne(variables['Agent.OS'], 'Linux'))
|
condition: and(succeeded(), ne(variables['Agent.OS'], 'Linux'))
|
||||||
|
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
inputs:
|
inputs:
|
||||||
testResultsFiles: "**/test-results.xml"
|
testResultsFiles: '*-results.xml'
|
||||||
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
condition: succeededOrFailed()
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
- task: PublishCodeCoverageResults@1
|
- task: PublishCodeCoverageResults@1
|
||||||
inputs:
|
inputs:
|
||||||
codeCoverageTool: "cobertura"
|
codeCoverageTool: 'cobertura'
|
||||||
summaryFileLocation: $(System.DefaultWorkingDirectory)/.build/coverage/cobertura-coverage.xml
|
summaryFileLocation: $(System.DefaultWorkingDirectory)/.build/coverage/cobertura-coverage.xml
|
||||||
reportDirectory: $(System.DefaultWorkingDirectory)/.build/coverage/lcov-reports
|
reportDirectory: $(System.DefaultWorkingDirectory)/.build/coverage/lcov-report
|
||||||
condition: ne(variables['Agent.OS'], 'Linux')
|
condition: ne(variables['Agent.OS'], 'Linux')
|
||||||
|
|||||||
@@ -34,32 +34,27 @@ steps:
|
|||||||
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene
|
yarn gulp hygiene --skip-tslint
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn tslint
|
yarn tslint
|
||||||
displayName: "Run TSLint"
|
displayName: Run TSLint
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn strict-null-check
|
yarn strict-null-check
|
||||||
displayName: "Run Strict Null Check"
|
displayName: Run Strict Null Check
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: "Compile"
|
displayName: Compile
|
||||||
|
|
||||||
- script: |
|
- powershell: |
|
||||||
.\scripts\test.bat --reporter mocha-junit-reporter --coverage
|
.\scripts\test.bat --tfs "Unit Tests"
|
||||||
displayName: "Test"
|
displayName: Run Unit Tests
|
||||||
|
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
inputs:
|
inputs:
|
||||||
testResultsFiles: "test-results.xml"
|
testResultsFiles: "*-results.xml"
|
||||||
|
searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
|
||||||
condition: succeededOrFailed()
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
- task: PublishCodeCoverageResults@1
|
|
||||||
inputs:
|
|
||||||
codeCoverageTool: "cobertura"
|
|
||||||
summaryFileLocation: $(System.DefaultWorkingDirectory)\.build\coverage\cobertura-coverage.xml
|
|
||||||
reportDirectory: $(System.DefaultWorkingDirectory)\.build\coverage\lcov-report
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2019-07-11T05:47:05.444Z
|
2019-08-30T20:24:23.714Z
|
||||||
|
|||||||
9
build/azure-pipelines/common/publish-webview.sh
Executable file
9
build/azure-pipelines/common/publish-webview.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
REPO="$(pwd)"
|
||||||
|
|
||||||
|
# Publish webview contents
|
||||||
|
PACKAGEJSON="$REPO/package.json"
|
||||||
|
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
||||||
|
|
||||||
|
node build/azure-pipelines/common/publish-webview.js "$REPO/src/vs/workbench/contrib/webview/browser/pre/"
|
||||||
87
build/azure-pipelines/common/publish-webview.ts
Normal file
87
build/azure-pipelines/common/publish-webview.ts
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as azure from 'azure-storage';
|
||||||
|
import * as mime from 'mime';
|
||||||
|
import * as minimist from 'minimist';
|
||||||
|
import { basename, join } from 'path';
|
||||||
|
|
||||||
|
const fileNames = [
|
||||||
|
'fake.html',
|
||||||
|
'host.js',
|
||||||
|
'index.html',
|
||||||
|
'main.js',
|
||||||
|
'service-worker.js'
|
||||||
|
];
|
||||||
|
|
||||||
|
async function assertContainer(blobService: azure.BlobService, container: string): Promise<void> {
|
||||||
|
await new Promise((c, e) => blobService.createContainerIfNotExists(container, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doesBlobExist(blobService: azure.BlobService, container: string, blobName: string): Promise<boolean | undefined> {
|
||||||
|
const existsResult = await new Promise<azure.BlobService.BlobResult>((c, e) => blobService.doesBlobExist(container, blobName, (err, r) => err ? e(err) : c(r)));
|
||||||
|
return existsResult.exists;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function uploadBlob(blobService: azure.BlobService, container: string, blobName: string, file: string): Promise<void> {
|
||||||
|
const blobOptions: azure.BlobService.CreateBlockBlobRequestOptions = {
|
||||||
|
contentSettings: {
|
||||||
|
contentType: mime.lookup(file),
|
||||||
|
cacheControl: 'max-age=31536000, public'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(container, blobName, file, blobOptions, err => err ? e(err) : c()));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function publish(commit: string, files: readonly string[]): Promise<void> {
|
||||||
|
|
||||||
|
console.log('Publishing...');
|
||||||
|
console.log('Commit:', commit);
|
||||||
|
const storageAccount = process.env['AZURE_WEBVIEW_STORAGE_ACCOUNT']!;
|
||||||
|
|
||||||
|
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_WEBVIEW_STORAGE_ACCESS_KEY']!)
|
||||||
|
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
||||||
|
|
||||||
|
await assertContainer(blobService, commit);
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
const blobName = basename(file);
|
||||||
|
const blobExists = await doesBlobExist(blobService, commit, blobName);
|
||||||
|
if (blobExists) {
|
||||||
|
console.log(`Blob ${commit}, ${blobName} already exists, not publishing again.`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
console.log('Uploading blob to Azure storage...');
|
||||||
|
await uploadBlob(blobService, commit, blobName, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Blobs successfully uploaded.');
|
||||||
|
}
|
||||||
|
|
||||||
|
function main(): void {
|
||||||
|
const commit = process.env['BUILD_SOURCEVERSION'];
|
||||||
|
|
||||||
|
if (!commit) {
|
||||||
|
console.warn('Skipping publish due to missing BUILD_SOURCEVERSION');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const opts = minimist(process.argv.slice(2));
|
||||||
|
const [directory] = opts._;
|
||||||
|
|
||||||
|
const files = fileNames.map(fileName => join(directory, fileName));
|
||||||
|
|
||||||
|
publish(commit, files).catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.argv.length < 3) {
|
||||||
|
console.error('Usage: node publish.js <directory>');
|
||||||
|
process.exit(-1);
|
||||||
|
}
|
||||||
|
main();
|
||||||
@@ -9,7 +9,7 @@ steps:
|
|||||||
vstsFeed: '$(ArtifactFeed)'
|
vstsFeed: '$(ArtifactFeed)'
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
- script: |
|
- script: |
|
||||||
yarn --frozen-lockfile
|
yarn --frozen-lockfile
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
@@ -24,8 +24,11 @@ steps:
|
|||||||
yarn gulp electron-x64
|
yarn gulp electron-x64
|
||||||
displayName: Download Electron
|
displayName: Download Electron
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene
|
yarn gulp hygiene --skip-tslint
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
|
- script: |
|
||||||
|
yarn gulp tslint
|
||||||
|
displayName: Run TSLint Checks
|
||||||
- script: |
|
- script: |
|
||||||
yarn monaco-compile-check
|
yarn monaco-compile-check
|
||||||
displayName: Run Monaco Editor Checks
|
displayName: Run Monaco Editor Checks
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
@@ -102,20 +102,28 @@ steps:
|
|||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
|
# Figure out the full absolute path of the product we just built
|
||||||
|
# including the remote server and configure the integration tests
|
||||||
|
# to run with these builds instead of running out of sources.
|
||||||
set -e
|
set -e
|
||||||
|
APP_ROOT=$(agent.builddirectory)/VSCode-darwin
|
||||||
|
APP_NAME="`ls $APP_ROOT | head -n 1`"
|
||||||
|
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
|
||||||
|
VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \
|
||||||
./scripts/test-integration.sh --build --tfs "Integration Tests"
|
./scripts/test-integration.sh --build --tfs "Integration Tests"
|
||||||
displayName: Run integration tests
|
displayName: Run integration tests
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- script: |
|
# Web Smoke Tests disabled due to https://github.com/microsoft/vscode/issues/80308
|
||||||
set -e
|
# - script: |
|
||||||
cd test/smoke
|
# set -e
|
||||||
yarn compile
|
# cd test/smoke
|
||||||
cd -
|
# yarn compile
|
||||||
yarn smoketest --web --headless
|
# cd -
|
||||||
continueOnError: true
|
# yarn smoketest --web --headless
|
||||||
displayName: Run web smoke tests
|
# continueOnError: true
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
# displayName: Run web smoke tests
|
||||||
|
# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
|
||||||
|
trigger: none
|
||||||
|
pr: none
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
@@ -31,13 +34,3 @@ steps:
|
|||||||
git push origin HEAD:electron-6.0.x
|
git push origin HEAD:electron-6.0.x
|
||||||
|
|
||||||
displayName: Sync & Merge Exploration
|
displayName: Sync & Merge Exploration
|
||||||
|
|
||||||
trigger: none
|
|
||||||
pr: none
|
|
||||||
|
|
||||||
schedules:
|
|
||||||
- cron: "0 5 * * Mon-Fri"
|
|
||||||
displayName: Mon-Fri at 7:00
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- master
|
|
||||||
|
|||||||
39
build/azure-pipelines/exploration-merge.yml
Normal file
39
build/azure-pipelines/exploration-merge.yml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
trigger:
|
||||||
|
branches:
|
||||||
|
include: ['master']
|
||||||
|
pr: none
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: ExplorationMerge
|
||||||
|
pool:
|
||||||
|
vmImage: Ubuntu-16.04
|
||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "10.15.1"
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cat << EOF > ~/.netrc
|
||||||
|
machine mssqltools.visualstudio.com
|
||||||
|
login azuredatastudio
|
||||||
|
password $(DEVOPS_PASSWORD)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git config user.email "andresse@microsoft.com"
|
||||||
|
git config user.name "AzureDataStudio"
|
||||||
|
|
||||||
|
git remote add explore "$ADS_EXPLORE_REPO"
|
||||||
|
git fetch explore
|
||||||
|
|
||||||
|
git checkout -b merge-branch explore/master
|
||||||
|
|
||||||
|
git merge origin/master
|
||||||
|
|
||||||
|
git push explore HEAD:master
|
||||||
|
|
||||||
|
displayName: Sync & Merge Explore
|
||||||
|
env:
|
||||||
|
ADS_EXPLORE_REPO: $(ADS_EXPLORE_REPO)
|
||||||
|
DEVOPS_PASSWORD: $(DEVOPS_PASSWORD)
|
||||||
@@ -17,7 +17,7 @@ steps:
|
|||||||
vstsFeed: '$(ArtifactFeed)'
|
vstsFeed: '$(ArtifactFeed)'
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
- script: |
|
- script: |
|
||||||
yarn --frozen-lockfile
|
yarn --frozen-lockfile
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
@@ -32,8 +32,11 @@ steps:
|
|||||||
yarn gulp electron-x64
|
yarn gulp electron-x64
|
||||||
displayName: Download Electron
|
displayName: Download Electron
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene
|
yarn gulp hygiene --skip-tslint
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
|
- script: |
|
||||||
|
yarn gulp tslint
|
||||||
|
displayName: Run TSLint Checks
|
||||||
- script: |
|
- script: |
|
||||||
yarn monaco-compile-check
|
yarn monaco-compile-check
|
||||||
displayName: Run Monaco Editor Checks
|
displayName: Run Monaco Editor Checks
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
@@ -105,7 +105,14 @@ steps:
|
|||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
|
# Figure out the full absolute path of the product we just built
|
||||||
|
# including the remote server and configure the integration tests
|
||||||
|
# to run with these builds instead of running out of sources.
|
||||||
set -e
|
set -e
|
||||||
|
APP_ROOT=$(agent.builddirectory)/VSCode-linux-x64
|
||||||
|
APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
|
||||||
|
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
|
||||||
|
VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-x64" \
|
||||||
DISPLAY=:10 ./scripts/test-integration.sh --build --tfs "Integration Tests"
|
DISPLAY=:10 ./scripts/test-integration.sh --build --tfs "Integration Tests"
|
||||||
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-x64"
|
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-x64"
|
||||||
displayName: Run integration tests
|
displayName: Run integration tests
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
@@ -51,4 +51,4 @@ steps:
|
|||||||
# Publish snap package
|
# Publish snap package
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-x64" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH"
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-x64" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH"
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ jobs:
|
|||||||
- template: linux/snap-build-linux.yml
|
- template: linux/snap-build-linux.yml
|
||||||
|
|
||||||
- job: LinuxArmhf
|
- job: LinuxArmhf
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable'))
|
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'))
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
variables:
|
variables:
|
||||||
@@ -78,7 +78,7 @@ jobs:
|
|||||||
- template: linux/product-build-linux-multiarch.yml
|
- template: linux/product-build-linux-multiarch.yml
|
||||||
|
|
||||||
- job: LinuxAlpine
|
- job: LinuxAlpine
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable'))
|
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'))
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
variables:
|
variables:
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
@@ -87,9 +87,10 @@ steps:
|
|||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
yarn gulp hygiene
|
yarn gulp hygiene --skip-tslint
|
||||||
|
yarn gulp tslint
|
||||||
yarn monaco-compile-check
|
yarn monaco-compile-check
|
||||||
displayName: Run hygiene checks
|
displayName: Run hygiene, tslint and monaco compile checks
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
@@ -98,6 +99,13 @@ steps:
|
|||||||
displayName: Extract Telemetry
|
displayName: Extract Telemetry
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
|
||||||
|
./build/azure-pipelines/common/publish-webview.sh
|
||||||
|
displayName: Publish Webview
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
yarn gulp compile-build
|
yarn gulp compile-build
|
||||||
|
|||||||
@@ -13,7 +13,23 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
|
- bash: |
|
||||||
|
TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
|
||||||
|
CHANNEL="G1C14HJ2F"
|
||||||
|
|
||||||
|
if [ "$TAG_VERSION" == "1.999.0" ]; then
|
||||||
|
MESSAGE="<!here>. Someone pushed 1.999.0 tag. Please delete it ASAP from remote and local."
|
||||||
|
|
||||||
|
curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
|
||||||
|
-H 'Content-type: application/json; charset=utf-8' \
|
||||||
|
--data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE"'"}' \
|
||||||
|
https://slack.com/api/chat.postMessage
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
displayName: Check 1.999.0 tag
|
||||||
|
|
||||||
- bash: |
|
- bash: |
|
||||||
# Install build dependencies
|
# Install build dependencies
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ steps:
|
|||||||
versionSpec: "10.15.1"
|
versionSpec: "10.15.1"
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: '2.x'
|
versionSpec: '2.x'
|
||||||
@@ -26,10 +26,12 @@ steps:
|
|||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn gulp electron
|
yarn gulp electron
|
||||||
displayName: Download Electron
|
- script: |
|
||||||
- powershell: |
|
yarn gulp hygiene --skip-tslint
|
||||||
yarn gulp hygiene
|
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
|
- script: |
|
||||||
|
yarn gulp tslint
|
||||||
|
displayName: Run TSLint Checks
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn monaco-compile-check
|
yarn monaco-compile-check
|
||||||
displayName: Run Monaco Editor Checks
|
displayName: Run Monaco Editor Checks
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ steps:
|
|||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.10.1"
|
versionSpec: "1.x"
|
||||||
|
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
@@ -113,10 +113,15 @@ steps:
|
|||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
|
# Figure out the full absolute path of the product we just built
|
||||||
|
# including the remote server and configure the integration tests
|
||||||
|
# to run with these builds instead of running out of sources.
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
exec { yarn gulp "electron-$(VSCODE_ARCH)" }
|
$AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
|
||||||
exec { .\scripts\test-integration.bat --build --tfs "Integration Tests" }
|
$AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
|
||||||
|
$AppNameShort = $AppProductJson.nameShort
|
||||||
|
exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\scripts\test-integration.bat --build --tfs "Integration Tests" }
|
||||||
displayName: Run integration tests
|
displayName: Run integration tests
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "Microsoft.sqlservernotebook",
|
"name": "Microsoft.sqlservernotebook",
|
||||||
"version": "0.2.1",
|
"version": "0.3.2",
|
||||||
"repo": "https://github.com/Microsoft/azuredatastudio"
|
"repo": "https://github.com/Microsoft/azuredatastudio"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,2 +1,7 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"name": "Microsoft.sqlservernotebook",
|
||||||
|
"version": "0.3.2",
|
||||||
|
"repo": "https://github.com/Microsoft/azuredatastudio"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -41,12 +41,7 @@ var editorEntryPoints = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
var editorResources = [
|
var editorResources = [
|
||||||
'out-build/vs/{base,editor}/**/*.{svg,png}',
|
'out-editor-build/vs/base/browser/ui/codiconLabel/**/*.ttf'
|
||||||
'!out-build/vs/base/browser/ui/splitview/**/*',
|
|
||||||
'!out-build/vs/base/browser/ui/toolbar/**/*',
|
|
||||||
'!out-build/vs/base/browser/ui/octiconLabel/**/*',
|
|
||||||
'!out-build/vs/workbench/**',
|
|
||||||
'!**/test/**'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
var BUNDLED_FILE_HEADER = [
|
var BUNDLED_FILE_HEADER = [
|
||||||
|
|||||||
@@ -21,10 +21,15 @@ const nlsDev = require('vscode-nls-dev');
|
|||||||
const root = path.dirname(__dirname);
|
const root = path.dirname(__dirname);
|
||||||
const commit = util.getVersion(root);
|
const commit = util.getVersion(root);
|
||||||
const plumber = require('gulp-plumber');
|
const plumber = require('gulp-plumber');
|
||||||
const _ = require('underscore');
|
|
||||||
const ext = require('./lib/extensions');
|
const ext = require('./lib/extensions');
|
||||||
|
|
||||||
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
const sqlLocalizedExtensions = [
|
||||||
|
'dacpac',
|
||||||
|
'schema-compare'
|
||||||
|
];
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
|
||||||
const compilations = glob.sync('**/tsconfig.json', {
|
const compilations = glob.sync('**/tsconfig.json', {
|
||||||
cwd: extensionsPath,
|
cwd: extensionsPath,
|
||||||
@@ -37,38 +42,38 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
const absolutePath = path.join(extensionsPath, tsconfigFile);
|
const absolutePath = path.join(extensionsPath, tsconfigFile);
|
||||||
const relativeDirname = path.dirname(tsconfigFile);
|
const relativeDirname = path.dirname(tsconfigFile);
|
||||||
|
|
||||||
const tsconfig = require(absolutePath);
|
const overrideOptions = {};
|
||||||
const tsOptions = _.assign({}, tsconfig.extends ? require(path.join(extensionsPath, relativeDirname, tsconfig.extends)).compilerOptions : {}, tsconfig.compilerOptions);
|
overrideOptions.sourceMap = true;
|
||||||
tsOptions.verbose = false;
|
|
||||||
tsOptions.sourceMap = true;
|
|
||||||
|
|
||||||
const name = relativeDirname.replace(/\//g, '-');
|
const name = relativeDirname.replace(/\//g, '-');
|
||||||
|
|
||||||
const root = path.join('extensions', relativeDirname);
|
const root = path.join('extensions', relativeDirname);
|
||||||
const srcBase = path.join(root, 'src');
|
const srcBase = path.join(root, 'src');
|
||||||
const src = path.join(srcBase, '**');
|
const src = path.join(srcBase, '**');
|
||||||
|
const srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
|
||||||
|
|
||||||
const out = path.join(root, 'out');
|
const out = path.join(root, 'out');
|
||||||
const baseUrl = getBaseUrl(out);
|
const baseUrl = getBaseUrl(out);
|
||||||
|
|
||||||
let headerId, headerOut;
|
let headerId, headerOut;
|
||||||
let index = relativeDirname.indexOf('/');
|
let index = relativeDirname.indexOf('/');
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
headerId = 'vscode.' + relativeDirname;
|
headerId = 'microsoft.' + relativeDirname; // {{SQL CARBON EDIT}}
|
||||||
headerOut = 'out';
|
headerOut = 'out';
|
||||||
} else {
|
} else {
|
||||||
headerId = 'vscode.' + relativeDirname.substr(0, index);
|
headerId = 'microsoft.' + relativeDirname.substr(0, index); // {{SQL CARBON EDIT}}
|
||||||
headerOut = relativeDirname.substr(index + 1) + '/out';
|
headerOut = relativeDirname.substr(index + 1) + '/out';
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPipeline(build, emitError) {
|
function createPipeline(build, emitError) {
|
||||||
const reporter = createReporter();
|
const reporter = createReporter();
|
||||||
|
|
||||||
tsOptions.inlineSources = !!build;
|
overrideOptions.inlineSources = Boolean(build);
|
||||||
tsOptions.base = path.dirname(absolutePath);
|
overrideOptions.base = path.dirname(absolutePath);
|
||||||
|
|
||||||
const compilation = tsb.create(tsOptions, null, null, err => reporter(err.toString()));
|
const compilation = tsb.create(absolutePath, overrideOptions, false, err => reporter(err.toString()));
|
||||||
|
|
||||||
return function () {
|
const pipeline = function () {
|
||||||
const input = es.through();
|
const input = es.through();
|
||||||
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
||||||
const output = input
|
const output = input
|
||||||
@@ -98,15 +103,19 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
const srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
|
// add src-stream for project files
|
||||||
|
pipeline.tsProjectSrc = () => {
|
||||||
|
return compilation.src(srcOpts);
|
||||||
|
};
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
|
||||||
const cleanTask = task.define(`clean-extension-${name}`, util.rimraf(out));
|
const cleanTask = task.define(`clean-extension-${name}`, util.rimraf(out));
|
||||||
|
|
||||||
const compileTask = task.define(`compile-extension:${name}`, task.series(cleanTask, () => {
|
const compileTask = task.define(`compile-extension:${name}`, task.series(cleanTask, () => {
|
||||||
const pipeline = createPipeline(false, true);
|
const pipeline = createPipeline(sqlLocalizedExtensions.includes(name), true); // {{SQL CARBON EDIT}}
|
||||||
const input = gulp.src(src, srcOpts);
|
const input = pipeline.tsProjectSrc();
|
||||||
|
|
||||||
return input
|
return input
|
||||||
.pipe(pipeline())
|
.pipe(pipeline())
|
||||||
@@ -115,8 +124,8 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
const watchTask = task.define(`watch-extension:${name}`, task.series(cleanTask, () => {
|
const watchTask = task.define(`watch-extension:${name}`, task.series(cleanTask, () => {
|
||||||
const pipeline = createPipeline(false);
|
const pipeline = createPipeline(false);
|
||||||
const input = gulp.src(src, srcOpts);
|
const input = pipeline.tsProjectSrc();
|
||||||
const watchInput = watcher(src, srcOpts);
|
const watchInput = watcher(src, { ...srcOpts, ...{ readDelay: 200 } });
|
||||||
|
|
||||||
return watchInput
|
return watchInput
|
||||||
.pipe(util.incremental(pipeline, input))
|
.pipe(util.incremental(pipeline, input))
|
||||||
@@ -125,7 +134,7 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => {
|
const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => {
|
||||||
const pipeline = createPipeline(true, true);
|
const pipeline = createPipeline(true, true);
|
||||||
const input = gulp.src(src, srcOpts);
|
const input = pipeline.tsProjectSrc();
|
||||||
|
|
||||||
return input
|
return input
|
||||||
.pipe(pipeline())
|
.pipe(pipeline())
|
||||||
@@ -156,8 +165,8 @@ const cleanExtensionsBuildTask = task.define('clean-extensions-build', util.rimr
|
|||||||
const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series(
|
const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series(
|
||||||
cleanExtensionsBuildTask,
|
cleanExtensionsBuildTask,
|
||||||
task.define('bundle-extensions-build', () => ext.packageLocalExtensionsStream().pipe(gulp.dest('.build'))),
|
task.define('bundle-extensions-build', () => ext.packageLocalExtensionsStream().pipe(gulp.dest('.build'))),
|
||||||
task.define('bundle-marketplace-extensions-build', () => ext.packageMarketplaceExtensionsStream().pipe(gulp.dest('.build'))),
|
task.define('bundle-marketplace-extensions-build', () => ext.packageMarketplaceExtensionsStream().pipe(gulp.dest('.build')))
|
||||||
));
|
));
|
||||||
|
|
||||||
gulp.task(compileExtensionsBuildTask);
|
gulp.task(compileExtensionsBuildTask);
|
||||||
exports.compileExtensionsBuildTask = compileExtensionsBuildTask;
|
exports.compileExtensionsBuildTask = compileExtensionsBuildTask;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ const vfs = require('vinyl-fs');
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const pall = require('p-all');
|
const pall = require('p-all');
|
||||||
|
const task = require('./lib/task');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hygiene works by creating cascading subsets of all our files and
|
* Hygiene works by creating cascading subsets of all our files and
|
||||||
@@ -55,8 +56,10 @@ const indentationFilter = [
|
|||||||
'!src/vs/base/node/terminateProcess.sh',
|
'!src/vs/base/node/terminateProcess.sh',
|
||||||
'!src/vs/base/node/cpuUsage.sh',
|
'!src/vs/base/node/cpuUsage.sh',
|
||||||
'!test/assert.js',
|
'!test/assert.js',
|
||||||
|
'!build/testSetup.js',
|
||||||
|
|
||||||
// except specific folders
|
// except specific folders
|
||||||
|
'!test/automation/out/**',
|
||||||
'!test/smoke/out/**',
|
'!test/smoke/out/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace/**',
|
'!extensions/vscode-api-tests/testWorkspace/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace2/**',
|
'!extensions/vscode-api-tests/testWorkspace2/**',
|
||||||
@@ -65,11 +68,13 @@ const indentationFilter = [
|
|||||||
|
|
||||||
// except multiple specific files
|
// except multiple specific files
|
||||||
'!**/package.json',
|
'!**/package.json',
|
||||||
|
'!**/package-lock.json', // {{SQL CARBON EDIT}}
|
||||||
'!**/yarn.lock',
|
'!**/yarn.lock',
|
||||||
'!**/yarn-error.log',
|
'!**/yarn-error.log',
|
||||||
|
|
||||||
// except multiple specific folders
|
// except multiple specific folders
|
||||||
'!**/octicons/**',
|
'!**/octicons/**',
|
||||||
|
'!**/codicon/**',
|
||||||
'!**/fixtures/**',
|
'!**/fixtures/**',
|
||||||
'!**/lib/**',
|
'!**/lib/**',
|
||||||
'!extensions/**/out/**',
|
'!extensions/**/out/**',
|
||||||
@@ -99,7 +104,8 @@ const indentationFilter = [
|
|||||||
'!extensions/admin-tool-ext-win/ssmsmin/**',
|
'!extensions/admin-tool-ext-win/ssmsmin/**',
|
||||||
'!extensions/resource-deployment/notebooks/**',
|
'!extensions/resource-deployment/notebooks/**',
|
||||||
'!extensions/mssql/notebooks/**',
|
'!extensions/mssql/notebooks/**',
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts'
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts',
|
||||||
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/clusterApiGenerated2.ts'
|
||||||
];
|
];
|
||||||
|
|
||||||
const copyrightFilter = [
|
const copyrightFilter = [
|
||||||
@@ -132,7 +138,7 @@ const copyrightFilter = [
|
|||||||
'!src/vs/editor/test/node/classification/typescript-test.ts',
|
'!src/vs/editor/test/node/classification/typescript-test.ts',
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
'!extensions/notebook/src/intellisense/text.ts',
|
'!extensions/notebook/src/intellisense/text.ts',
|
||||||
'!extensions/mssql/src/objectExplorerNodeProvider/webhdfs.ts',
|
'!extensions/mssql/src/hdfs/webhdfs.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/tableRenderers.ts',
|
'!src/sql/workbench/parts/notebook/browser/outputs/tableRenderers.ts',
|
||||||
'!src/sql/workbench/parts/notebook/common/models/url.ts',
|
'!src/sql/workbench/parts/notebook/common/models/url.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/renderMimeInterfaces.ts',
|
'!src/sql/workbench/parts/notebook/browser/models/renderMimeInterfaces.ts',
|
||||||
@@ -158,6 +164,7 @@ const copyrightFilter = [
|
|||||||
'!extensions/notebook/src/prompts/**',
|
'!extensions/notebook/src/prompts/**',
|
||||||
'!extensions/mssql/src/prompts/**',
|
'!extensions/mssql/src/prompts/**',
|
||||||
'!extensions/notebook/resources/jupyter_config/**',
|
'!extensions/notebook/resources/jupyter_config/**',
|
||||||
|
'!extensions/query-history/images/**',
|
||||||
'!**/*.gif',
|
'!**/*.gif',
|
||||||
'!**/*.xlf',
|
'!**/*.xlf',
|
||||||
'!**/*.dacpac',
|
'!**/*.dacpac',
|
||||||
@@ -186,25 +193,17 @@ const tslintBaseFilter = [
|
|||||||
'!extensions/vscode-api-tests/testWorkspace2/**',
|
'!extensions/vscode-api-tests/testWorkspace2/**',
|
||||||
'!extensions/**/*.test.ts',
|
'!extensions/**/*.test.ts',
|
||||||
'!extensions/html-language-features/server/lib/jquery.d.ts',
|
'!extensions/html-language-features/server/lib/jquery.d.ts',
|
||||||
// {{SQL CARBON EDIT}}
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts', // {{SQL CARBON EDIT}},
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts'
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/tokenApiGenerated.ts' // {{SQL CARBON EDIT}},
|
||||||
];
|
];
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
const sqlFilter = ['src/sql/**']; // {{SQL CARBON EDIT}}
|
||||||
const useStrictFilter = [
|
|
||||||
'src/**'
|
|
||||||
];
|
|
||||||
|
|
||||||
const sqlFilter = [
|
|
||||||
'src/sql/**'
|
|
||||||
];
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
|
|
||||||
const tslintCoreFilter = [
|
const tslintCoreFilter = [
|
||||||
'src/**/*.ts',
|
'src/**/*.ts',
|
||||||
'test/**/*.ts',
|
'test/**/*.ts',
|
||||||
'!extensions/**/*.ts',
|
'!extensions/**/*.ts',
|
||||||
|
'!test/automation/**',
|
||||||
'!test/smoke/**',
|
'!test/smoke/**',
|
||||||
...tslintBaseFilter
|
...tslintBaseFilter
|
||||||
];
|
];
|
||||||
@@ -213,6 +212,7 @@ const tslintExtensionsFilter = [
|
|||||||
'extensions/**/*.ts',
|
'extensions/**/*.ts',
|
||||||
'!src/**/*.ts',
|
'!src/**/*.ts',
|
||||||
'!test/**/*.ts',
|
'!test/**/*.ts',
|
||||||
|
'test/automation/**/*.ts',
|
||||||
...tslintBaseFilter
|
...tslintBaseFilter
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -255,6 +255,33 @@ gulp.task('tslint', () => {
|
|||||||
]).pipe(es.through());
|
]).pipe(es.through());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function checkPackageJSON(actualPath) {
|
||||||
|
const actual = require(path.join(__dirname, '..', actualPath));
|
||||||
|
const rootPackageJSON = require('../package.json');
|
||||||
|
|
||||||
|
for (let depName in actual.dependencies) {
|
||||||
|
const depVersion = actual.dependencies[depName];
|
||||||
|
const rootDepVersion = rootPackageJSON.dependencies[depName];
|
||||||
|
if (!rootDepVersion) {
|
||||||
|
// missing in root is allowed
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (depVersion !== rootDepVersion) {
|
||||||
|
this.emit('error', `The dependency ${depName} in '${actualPath}' (${depVersion}) is different than in the root package.json (${rootDepVersion})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const checkPackageJSONTask = task.define('check-package-json', () => {
|
||||||
|
return gulp.src('package.json')
|
||||||
|
.pipe(es.through(function() {
|
||||||
|
checkPackageJSON.call(this, 'remote/package.json');
|
||||||
|
checkPackageJSON.call(this, 'remote/web/package.json');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
gulp.task(checkPackageJSONTask);
|
||||||
|
|
||||||
|
|
||||||
function hygiene(some) {
|
function hygiene(some) {
|
||||||
let errorCount = 0;
|
let errorCount = 0;
|
||||||
|
|
||||||
@@ -304,23 +331,6 @@ function hygiene(some) {
|
|||||||
this.emit('data', file);
|
this.emit('data', file);
|
||||||
});
|
});
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
// Check for unnecessary 'use strict' lines. These are automatically added by the alwaysStrict compiler option so don't need to be added manually
|
|
||||||
const useStrict = es.through(function (file) {
|
|
||||||
const lines = file.__lines;
|
|
||||||
// Only take the first 10 lines to reduce false positives- the compiler will throw an error if it's not the first non-comment line in a file
|
|
||||||
// (10 is used to account for copyright and extraneous newlines)
|
|
||||||
lines.slice(0, 10).forEach((line, i) => {
|
|
||||||
if (/\s*'use\s*strict\s*'/.test(line)) {
|
|
||||||
console.error(file.relative + '(' + (i + 1) + ',1): Unnecessary \'use strict\' - this is already added by the compiler');
|
|
||||||
errorCount++;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.emit('data', file);
|
|
||||||
});
|
|
||||||
// {{SQL CARBON EDIT}} END
|
|
||||||
|
|
||||||
const formatting = es.map(function (file, cb) {
|
const formatting = es.map(function (file, cb) {
|
||||||
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
||||||
verify: false,
|
verify: false,
|
||||||
@@ -373,11 +383,9 @@ function hygiene(some) {
|
|||||||
const tslintSqlOptions = { fix: false, formatter: 'json' };
|
const tslintSqlOptions = { fix: false, formatter: 'json' };
|
||||||
const sqlTsLinter = new tslint.Linter(tslintSqlOptions);
|
const sqlTsLinter = new tslint.Linter(tslintSqlOptions);
|
||||||
|
|
||||||
const sqlTsl = es.through(function (file) {
|
const sqlTsl = es.through(function (file) { //TODO restore
|
||||||
const contents = file.contents.toString('utf8');
|
const contents = file.contents.toString('utf8');
|
||||||
sqlTsLinter.lint(file.relative, contents, tslintSqlConfiguration.results);
|
sqlTsLinter.lint(file.relative, contents, tslintSqlConfiguration.results);
|
||||||
|
|
||||||
this.emit('data', file);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const productJsonFilter = filter('product.json', { restore: true });
|
const productJsonFilter = filter('product.json', { restore: true });
|
||||||
@@ -392,15 +400,16 @@ function hygiene(some) {
|
|||||||
.pipe(filter(copyrightFilter))
|
.pipe(filter(copyrightFilter))
|
||||||
.pipe(copyrights);
|
.pipe(copyrights);
|
||||||
|
|
||||||
const typescript = result
|
let typescript = result
|
||||||
.pipe(filter(tslintHygieneFilter))
|
.pipe(filter(tslintHygieneFilter))
|
||||||
.pipe(formatting)
|
.pipe(formatting);
|
||||||
.pipe(tsl)
|
|
||||||
// {{SQL CARBON EDIT}}
|
if (!process.argv.some(arg => arg === '--skip-tslint')) {
|
||||||
.pipe(filter(useStrictFilter))
|
typescript = typescript.pipe(tsl);
|
||||||
.pipe(useStrict)
|
typescript = typescript
|
||||||
.pipe(filter(sqlFilter))
|
.pipe(filter(sqlFilter))
|
||||||
.pipe(sqlTsl);
|
.pipe(sqlTsl); // {{SQL CARBON EDIT}}
|
||||||
|
}
|
||||||
|
|
||||||
const javascript = result
|
const javascript = result
|
||||||
.pipe(filter(eslintFilter))
|
.pipe(filter(eslintFilter))
|
||||||
@@ -486,7 +495,7 @@ function createGitIndexVinyls(paths) {
|
|||||||
.then(r => r.filter(p => !!p));
|
.then(r => r.filter(p => !!p));
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('hygiene', () => hygiene());
|
gulp.task('hygiene', task.series(checkPackageJSONTask, () => hygiene()));
|
||||||
|
|
||||||
// this allows us to run hygiene as a git pre-commit hook
|
// this allows us to run hygiene as a git pre-commit hook
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const tsfmt = require('typescript-formatter');
|
const tsfmt = require('typescript-formatter');
|
||||||
@@ -14,6 +13,10 @@ const del = require('del');
|
|||||||
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
||||||
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
|
const rollup = require('rollup');
|
||||||
|
const rollupNodeResolve = require('rollup-plugin-node-resolve');
|
||||||
|
const rollupCommonJS = require('rollup-plugin-commonjs');
|
||||||
|
|
||||||
gulp.task('clean-mssql-extension', util.rimraf('extensions/mssql/node_modules'));
|
gulp.task('clean-mssql-extension', util.rimraf('extensions/mssql/node_modules'));
|
||||||
gulp.task('clean-credentials-extension', util.rimraf('extensions/credentials/node_modules'));
|
gulp.task('clean-credentials-extension', util.rimraf('extensions/credentials/node_modules'));
|
||||||
@@ -22,72 +25,78 @@ gulp.task('fmt', () => formatStagedFiles());
|
|||||||
const formatFiles = (some) => {
|
const formatFiles = (some) => {
|
||||||
const formatting = es.map(function (file, cb) {
|
const formatting = es.map(function (file, cb) {
|
||||||
|
|
||||||
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
||||||
replace: true,
|
replace: true,
|
||||||
tsfmt: true,
|
tsfmt: true,
|
||||||
tslint: true,
|
tslint: true,
|
||||||
tsconfig: true
|
tsconfig: true
|
||||||
// verbose: true
|
// verbose: true
|
||||||
}).then(result => {
|
}).then(result => {
|
||||||
console.info('ran formatting on file ' + file.path + ' result: ' + result.message);
|
console.info('ran formatting on file ' + file.path + ' result: ' + result.message);
|
||||||
if (result.error) {
|
if (result.error) {
|
||||||
console.error(result.message);
|
console.error(result.message);
|
||||||
}
|
}
|
||||||
cb(null, file);
|
cb(null, file);
|
||||||
|
|
||||||
}, err => {
|
}, err => {
|
||||||
cb(err);
|
cb(err);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
return gulp.src(some, { base: '.' })
|
});
|
||||||
.pipe(filter(f => !f.stat.isDirectory()))
|
return gulp.src(some, {
|
||||||
.pipe(formatting);
|
base: '.'
|
||||||
|
})
|
||||||
|
.pipe(filter(f => !f.stat.isDirectory()))
|
||||||
|
.pipe(formatting);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatStagedFiles = () => {
|
const formatStagedFiles = () => {
|
||||||
const cp = require('child_process');
|
const cp = require('child_process');
|
||||||
cp.exec('git diff --name-only', { maxBuffer: 2000 * 1024 }, (err, out) => {
|
cp.exec('git diff --name-only', {
|
||||||
if (err) {
|
maxBuffer: 2000 * 1024
|
||||||
console.error();
|
}, (err, out) => {
|
||||||
console.error(err);
|
if (err) {
|
||||||
process.exit(1);
|
console.error();
|
||||||
}
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
const some = out
|
const some = out
|
||||||
.split(/\r?\n/)
|
.split(/\r?\n/)
|
||||||
.filter(l => !!l)
|
.filter(l => !!l)
|
||||||
.filter(l => l.match(/.*.ts$/i));
|
.filter(l => l.match(/.*.ts$/i));
|
||||||
|
|
||||||
formatFiles(some).on('error', err => {
|
formatFiles(some).on('error', err => {
|
||||||
console.error();
|
console.error();
|
||||||
console.error(err);
|
console.error(err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
cp.exec('git diff --cached --name-only', { maxBuffer: 2000 * 1024 }, (err, out) => {
|
cp.exec('git diff --cached --name-only', {
|
||||||
if (err) {
|
maxBuffer: 2000 * 1024
|
||||||
console.error();
|
}, (err, out) => {
|
||||||
console.error(err);
|
if (err) {
|
||||||
process.exit(1);
|
console.error();
|
||||||
}
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
const some = out
|
const some = out
|
||||||
.split(/\r?\n/)
|
.split(/\r?\n/)
|
||||||
.filter(l => !!l)
|
.filter(l => !!l)
|
||||||
.filter(l => l.match(/.*.ts$/i));
|
.filter(l => l.match(/.*.ts$/i));
|
||||||
|
|
||||||
formatFiles(some).on('error', err => {
|
formatFiles(some).on('error', err => {
|
||||||
console.error();
|
console.error();
|
||||||
console.error(err);
|
console.error(err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function installService() {
|
function installService() {
|
||||||
let config = require('../extensions/mssql/src/config.json');
|
let config = require('../extensions/mssql/config.json');
|
||||||
return platformInfo.getCurrent().then(p => {
|
return platformInfo.getCurrent().then(p => {
|
||||||
let runtime = p.runtimeId;
|
let runtime = p.runtimeId;
|
||||||
// fix path since it won't be correct
|
// fix path since it won't be correct
|
||||||
@@ -109,7 +118,7 @@ gulp.task('install-sqltoolsservice', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function installSsmsMin() {
|
function installSsmsMin() {
|
||||||
const config = require('../extensions/admin-tool-ext-win/src/config.json');
|
const config = require('../extensions/admin-tool-ext-win/config.json');
|
||||||
return platformInfo.getCurrent().then(p => {
|
return platformInfo.getCurrent().then(p => {
|
||||||
const runtime = p.runtimeId;
|
const runtime = p.runtimeId;
|
||||||
// fix path since it won't be correct
|
// fix path since it won't be correct
|
||||||
@@ -130,3 +139,60 @@ function installSsmsMin() {
|
|||||||
gulp.task('install-ssmsmin', () => {
|
gulp.task('install-ssmsmin', () => {
|
||||||
return installSsmsMin();
|
return installSsmsMin();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
async function rollupModule(options) {
|
||||||
|
const moduleName = options.moduleName;
|
||||||
|
try {
|
||||||
|
const inputFile = options.inputFile;
|
||||||
|
const outputDirectory = options.outputDirectory;
|
||||||
|
|
||||||
|
await fs.promises.mkdir(outputDirectory, {
|
||||||
|
recursive: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const outputFileName = options.outputFileName;
|
||||||
|
const outputMapName = `${outputFileName}.map`;
|
||||||
|
const external = options.external || [];
|
||||||
|
|
||||||
|
const outputFilePath = path.resolve(outputDirectory, outputFileName);
|
||||||
|
const outputMapPath = path.resolve(outputDirectory, outputMapName);
|
||||||
|
|
||||||
|
const bundle = await rollup.rollup({
|
||||||
|
input: inputFile,
|
||||||
|
plugins: [
|
||||||
|
rollupNodeResolve(),
|
||||||
|
rollupCommonJS(),
|
||||||
|
],
|
||||||
|
external,
|
||||||
|
});
|
||||||
|
|
||||||
|
const generatedBundle = await bundle.generate({
|
||||||
|
output: {
|
||||||
|
name: moduleName
|
||||||
|
},
|
||||||
|
format: 'umd',
|
||||||
|
sourcemap: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = generatedBundle.output[0];
|
||||||
|
result.code = result.code + '\n//# sourceMappingURL=' + path.basename(outputMapName);
|
||||||
|
|
||||||
|
await fs.promises.writeFile(outputFilePath, result.code);
|
||||||
|
await fs.promises.writeFile(outputMapPath, result.map);
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: moduleName,
|
||||||
|
result: true
|
||||||
|
};
|
||||||
|
} catch (ex) {
|
||||||
|
return {
|
||||||
|
name: moduleName,
|
||||||
|
result: false,
|
||||||
|
exception: ex
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
rollupModule
|
||||||
|
};
|
||||||
|
|||||||
@@ -60,8 +60,7 @@ const nodeModules = [
|
|||||||
const vscodeEntryPoints = _.flatten([
|
const vscodeEntryPoints = _.flatten([
|
||||||
buildfile.entrypoint('vs/workbench/workbench.desktop.main'),
|
buildfile.entrypoint('vs/workbench/workbench.desktop.main'),
|
||||||
buildfile.base,
|
buildfile.base,
|
||||||
buildfile.serviceWorker,
|
buildfile.workbenchDesktop,
|
||||||
buildfile.workbench,
|
|
||||||
buildfile.code
|
buildfile.code
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -80,6 +79,7 @@ const vscodeResources = [
|
|||||||
'out-build/vs/base/node/languagePacks.js',
|
'out-build/vs/base/node/languagePacks.js',
|
||||||
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}',
|
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}',
|
||||||
'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
|
'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
|
||||||
|
'out-build/vs/base/browser/ui/codiconLabel/codicon/**',
|
||||||
'out-build/vs/workbench/browser/media/*-theme.css',
|
'out-build/vs/workbench/browser/media/*-theme.css',
|
||||||
'out-build/vs/workbench/contrib/debug/**/*.json',
|
'out-build/vs/workbench/contrib/debug/**/*.json',
|
||||||
'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt',
|
'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt',
|
||||||
@@ -87,7 +87,6 @@ const vscodeResources = [
|
|||||||
'out-build/vs/workbench/contrib/webview/electron-browser/pre/*.js',
|
'out-build/vs/workbench/contrib/webview/electron-browser/pre/*.js',
|
||||||
'out-build/vs/**/markdown.css',
|
'out-build/vs/**/markdown.css',
|
||||||
'out-build/vs/workbench/contrib/tasks/**/*.json',
|
'out-build/vs/workbench/contrib/tasks/**/*.json',
|
||||||
'out-build/vs/workbench/contrib/welcome/walkThrough/**/*.md',
|
|
||||||
'out-build/vs/platform/files/**/*.exe',
|
'out-build/vs/platform/files/**/*.exe',
|
||||||
'out-build/vs/platform/files/**/*.md',
|
'out-build/vs/platform/files/**/*.md',
|
||||||
'out-build/vs/code/electron-browser/workbench/**',
|
'out-build/vs/code/electron-browser/workbench/**',
|
||||||
@@ -125,6 +124,7 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series(
|
|||||||
resources: vscodeResources,
|
resources: vscodeResources,
|
||||||
loaderConfig: common.loaderConfig(nodeModules),
|
loaderConfig: common.loaderConfig(nodeModules),
|
||||||
out: 'out-vscode',
|
out: 'out-vscode',
|
||||||
|
inlineAmdImages: true,
|
||||||
bundleInfo: undefined
|
bundleInfo: undefined
|
||||||
})
|
})
|
||||||
));
|
));
|
||||||
@@ -468,7 +468,7 @@ gulp.task(task.define(
|
|||||||
optimizeVSCodeTask,
|
optimizeVSCodeTask,
|
||||||
function () {
|
function () {
|
||||||
const pathToMetadata = './out-vscode/nls.metadata.json';
|
const pathToMetadata = './out-vscode/nls.metadata.json';
|
||||||
const pathToExtensions = './extensions/*';
|
const pathToExtensions = '.build/extensions/*';
|
||||||
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
||||||
|
|
||||||
return es.merge(
|
return es.merge(
|
||||||
@@ -489,7 +489,7 @@ gulp.task(task.define(
|
|||||||
optimizeVSCodeTask,
|
optimizeVSCodeTask,
|
||||||
function () {
|
function () {
|
||||||
const pathToMetadata = './out-vscode/nls.metadata.json';
|
const pathToMetadata = './out-vscode/nls.metadata.json';
|
||||||
const pathToExtensions = './extensions/*';
|
const pathToExtensions = '.build/extensions/*';
|
||||||
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
||||||
|
|
||||||
return es.merge(
|
return es.merge(
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ function prepareDebPackage(arch) {
|
|||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
|
.pipe(replace('@@EXEC@@', `/usr/share/${product.applicationName}/${product.applicationName}`))
|
||||||
.pipe(replace('@@ICON@@', product.linuxIconName))
|
.pipe(replace('@@ICON@@', product.linuxIconName))
|
||||||
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
@@ -136,6 +137,7 @@ function prepareRpmPackage(arch) {
|
|||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
|
.pipe(replace('@@EXEC@@', `/usr/share/${product.applicationName}/${product.applicationName}`))
|
||||||
.pipe(replace('@@ICON@@', product.linuxIconName))
|
.pipe(replace('@@ICON@@', product.linuxIconName))
|
||||||
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
@@ -206,21 +208,25 @@ function prepareSnapPackage(arch) {
|
|||||||
const destination = getSnapBuildPath(arch);
|
const destination = getSnapBuildPath(arch);
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
|
// A desktop file that is placed in snap/gui will be placed into meta/gui verbatim.
|
||||||
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
||||||
.pipe(rename(`usr/share/applications/${product.applicationName}.desktop`));
|
.pipe(rename(`snap/gui/${product.applicationName}.desktop`));
|
||||||
|
|
||||||
|
// A desktop file that is placed in snap/gui will be placed into meta/gui verbatim.
|
||||||
const desktopUrlHandler = gulp.src('resources/linux/code-url-handler.desktop', { base: '.' })
|
const desktopUrlHandler = gulp.src('resources/linux/code-url-handler.desktop', { base: '.' })
|
||||||
.pipe(rename(`usr/share/applications/${product.applicationName}-url-handler.desktop`));
|
.pipe(rename(`snap/gui/${product.applicationName}-url-handler.desktop`));
|
||||||
|
|
||||||
const desktops = es.merge(desktop, desktopUrlHandler)
|
const desktops = es.merge(desktop, desktopUrlHandler)
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@ICON@@', `/usr/share/pixmaps/${product.linuxIconName}.png`))
|
.pipe(replace('@@EXEC@@', `${product.applicationName} --force-user-env`))
|
||||||
|
.pipe(replace('@@ICON@@', `\${SNAP}/meta/gui/${product.linuxIconName}.png`))
|
||||||
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
|
// An icon that is placed in snap/gui will be placed into meta/gui verbatim.
|
||||||
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
||||||
.pipe(rename(`usr/share/pixmaps/${product.linuxIconName}.png`));
|
.pipe(rename(`snap/gui/${product.linuxIconName}.png`));
|
||||||
|
|
||||||
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
||||||
.pipe(rename(function (p) { p.dirname = `usr/share/${product.applicationName}/${p.dirname}`; }));
|
.pipe(rename(function (p) { p.dirname = `usr/share/${product.applicationName}/${p.dirname}`; }));
|
||||||
@@ -241,7 +247,8 @@ function prepareSnapPackage(arch) {
|
|||||||
|
|
||||||
function buildSnapPackage(arch) {
|
function buildSnapPackage(arch) {
|
||||||
const snapBuildPath = getSnapBuildPath(arch);
|
const snapBuildPath = getSnapBuildPath(arch);
|
||||||
return shell.task(`cd ${snapBuildPath} && snapcraft build`);
|
// Default target for snapcraft runs: pull, build, stage and prime, and finally assembles the snap.
|
||||||
|
return shell.task(`cd ${snapBuildPath} && snapcraft`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const BUILD_TARGETS = [
|
const BUILD_TARGETS = [
|
||||||
|
|||||||
@@ -6,150 +6,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const path = require('path');
|
|
||||||
const es = require('event-stream');
|
|
||||||
const util = require('./lib/util');
|
|
||||||
const task = require('./lib/task');
|
|
||||||
const common = require('./lib/optimize');
|
|
||||||
const product = require('../product.json');
|
|
||||||
const rename = require('gulp-rename');
|
|
||||||
const filter = require('gulp-filter');
|
|
||||||
const json = require('gulp-json-editor');
|
|
||||||
const _ = require('underscore');
|
|
||||||
const deps = require('./dependencies');
|
|
||||||
const vfs = require('vinyl-fs');
|
|
||||||
const packageJson = require('../package.json');
|
|
||||||
const { compileBuildTask } = require('./gulpfile.compile');
|
|
||||||
|
|
||||||
const REPO_ROOT = path.dirname(__dirname);
|
const noop = () => { return Promise.resolve(); };
|
||||||
const commit = util.getVersion(REPO_ROOT);
|
|
||||||
const BUILD_ROOT = path.dirname(REPO_ROOT);
|
|
||||||
const WEB_FOLDER = path.join(REPO_ROOT, 'remote', 'web');
|
|
||||||
|
|
||||||
const productionDependencies = deps.getProductionDependencies(WEB_FOLDER);
|
gulp.task('minify-vscode-web', noop);
|
||||||
|
gulp.task('vscode-web', noop);
|
||||||
const nodeModules = Object.keys(product.dependencies || {})
|
gulp.task('vscode-web-min', noop);
|
||||||
.concat(_.uniq(productionDependencies.map(d => d.name)));
|
gulp.task('vscode-web-ci', noop);
|
||||||
|
gulp.task('vscode-web-min-ci', noop);
|
||||||
const vscodeWebResources = [
|
|
||||||
|
|
||||||
// Workbench
|
|
||||||
'out-build/vs/{base,platform,editor,workbench}/**/*.{svg,png,html}',
|
|
||||||
'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
|
|
||||||
'out-build/vs/**/markdown.css',
|
|
||||||
|
|
||||||
// Webview
|
|
||||||
'out-build/vs/workbench/contrib/webview/browser/pre/*.js',
|
|
||||||
|
|
||||||
// Extension Worker
|
|
||||||
'out-build/vs/workbench/services/extensions/worker/extensionHostWorkerMain.js',
|
|
||||||
|
|
||||||
// Excludes
|
|
||||||
'!out-build/vs/**/{node,electron-browser,electron-main}/**',
|
|
||||||
'!out-build/vs/editor/standalone/**',
|
|
||||||
'!out-build/vs/workbench/**/*-tb.png',
|
|
||||||
'!**/test/**'
|
|
||||||
];
|
|
||||||
|
|
||||||
const buildfile = require('../src/buildfile');
|
|
||||||
|
|
||||||
const vscodeWebEntryPoints = [
|
|
||||||
buildfile.workbenchWeb,
|
|
||||||
buildfile.serviceWorker,
|
|
||||||
buildfile.workerExtensionHost,
|
|
||||||
buildfile.keyboardMaps,
|
|
||||||
buildfile.base
|
|
||||||
];
|
|
||||||
|
|
||||||
const optimizeVSCodeWebTask = task.define('optimize-vscode-web', task.series(
|
|
||||||
util.rimraf('out-vscode-web'),
|
|
||||||
common.optimizeTask({
|
|
||||||
src: 'out-build',
|
|
||||||
entryPoints: _.flatten(vscodeWebEntryPoints),
|
|
||||||
otherSources: [],
|
|
||||||
resources: vscodeWebResources,
|
|
||||||
loaderConfig: common.loaderConfig(nodeModules),
|
|
||||||
out: 'out-vscode-web',
|
|
||||||
bundleInfo: undefined
|
|
||||||
})
|
|
||||||
));
|
|
||||||
|
|
||||||
const minifyVSCodeWebTask = task.define('minify-vscode-web', task.series(
|
|
||||||
optimizeVSCodeWebTask,
|
|
||||||
util.rimraf('out-vscode-web-min'),
|
|
||||||
common.minifyTask('out-vscode-web', `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`)
|
|
||||||
));
|
|
||||||
gulp.task(minifyVSCodeWebTask);
|
|
||||||
|
|
||||||
function packageTask(sourceFolderName, destinationFolderName) {
|
|
||||||
const destination = path.join(BUILD_ROOT, destinationFolderName);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
const src = gulp.src(sourceFolderName + '/**', { base: '.' })
|
|
||||||
.pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + sourceFolderName), 'out'); }))
|
|
||||||
.pipe(filter(['**', '!**/*.js.map']));
|
|
||||||
|
|
||||||
const sources = es.merge(src);
|
|
||||||
|
|
||||||
let version = packageJson.version;
|
|
||||||
const quality = product.quality;
|
|
||||||
|
|
||||||
if (quality && quality !== 'stable') {
|
|
||||||
version += '-' + quality;
|
|
||||||
}
|
|
||||||
|
|
||||||
const name = product.nameShort;
|
|
||||||
const packageJsonStream = gulp.src(['remote/web/package.json'], { base: 'remote/web' })
|
|
||||||
.pipe(json({ name, version }));
|
|
||||||
|
|
||||||
const date = new Date().toISOString();
|
|
||||||
|
|
||||||
const productJsonStream = gulp.src(['product.json'], { base: '.' })
|
|
||||||
.pipe(json({ commit, date }));
|
|
||||||
|
|
||||||
const license = gulp.src(['remote/LICENSE'], { base: 'remote' });
|
|
||||||
|
|
||||||
const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(REPO_ROOT, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!${d}/.bin/**`]));
|
|
||||||
|
|
||||||
const deps = gulp.src(dependenciesSrc, { base: 'remote/web', dot: true })
|
|
||||||
.pipe(filter(['**', '!**/package-lock.json']))
|
|
||||||
.pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore')));
|
|
||||||
|
|
||||||
const favicon = gulp.src('resources/server/favicon.ico', { base: 'resources/server' });
|
|
||||||
|
|
||||||
let all = es.merge(
|
|
||||||
packageJsonStream,
|
|
||||||
productJsonStream,
|
|
||||||
license,
|
|
||||||
sources,
|
|
||||||
deps,
|
|
||||||
favicon
|
|
||||||
);
|
|
||||||
|
|
||||||
let result = all
|
|
||||||
.pipe(util.skipDirectories())
|
|
||||||
.pipe(util.fixWin32DirectoryPermissions());
|
|
||||||
|
|
||||||
return result.pipe(vfs.dest(destination));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const dashed = (str) => (str ? `-${str}` : ``);
|
|
||||||
|
|
||||||
['', 'min'].forEach(minified => {
|
|
||||||
const sourceFolderName = `out-vscode-web${dashed(minified)}`;
|
|
||||||
const destinationFolderName = `vscode-web`;
|
|
||||||
|
|
||||||
const vscodeWebTaskCI = task.define(`vscode-web${dashed(minified)}-ci`, task.series(
|
|
||||||
minified ? minifyVSCodeWebTask : optimizeVSCodeWebTask,
|
|
||||||
util.rimraf(path.join(BUILD_ROOT, destinationFolderName)),
|
|
||||||
packageTask(sourceFolderName, destinationFolderName)
|
|
||||||
));
|
|
||||||
gulp.task(vscodeWebTaskCI);
|
|
||||||
|
|
||||||
const vscodeWebTask = task.define(`vscode-web${dashed(minified)}`, task.series(
|
|
||||||
compileBuildTask,
|
|
||||||
vscodeWebTaskCI
|
|
||||||
));
|
|
||||||
gulp.task(vscodeWebTask);
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ const ansiColors = require('ansi-colors');
|
|||||||
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
const root = path.dirname(path.dirname(__dirname));
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const builtInExtensions = require('../builtInExtensions-insiders.json');
|
const quality = process.env['VSCODE_QUALITY'];
|
||||||
|
const builtInExtensions = quality && quality === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
||||||
// {{SQL CARBON EDIT}} - END
|
// {{SQL CARBON EDIT}} - END
|
||||||
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ const bom = require("gulp-bom");
|
|||||||
const sourcemaps = require("gulp-sourcemaps");
|
const sourcemaps = require("gulp-sourcemaps");
|
||||||
const tsb = require("gulp-tsb");
|
const tsb = require("gulp-tsb");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const _ = require("underscore");
|
|
||||||
const monacodts = require("../monaco/api");
|
const monacodts = require("../monaco/api");
|
||||||
const nls = require("./nls");
|
const nls = require("./nls");
|
||||||
const reporter_1 = require("./reporter");
|
const reporter_1 = require("./reporter");
|
||||||
@@ -22,14 +21,7 @@ const watch = require('./watch');
|
|||||||
const reporter = reporter_1.createReporter();
|
const reporter = reporter_1.createReporter();
|
||||||
function getTypeScriptCompilerOptions(src) {
|
function getTypeScriptCompilerOptions(src) {
|
||||||
const rootDir = path.join(__dirname, `../../${src}`);
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
const tsconfig = require(`../../${src}/tsconfig.json`);
|
let options = {};
|
||||||
let options;
|
|
||||||
if (tsconfig.extends) {
|
|
||||||
options = Object.assign({}, require(path.join(rootDir, tsconfig.extends)).compilerOptions, tsconfig.compilerOptions);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
options = tsconfig.compilerOptions;
|
|
||||||
}
|
|
||||||
options.verbose = false;
|
options.verbose = false;
|
||||||
options.sourceMap = true;
|
options.sourceMap = true;
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
@@ -38,15 +30,14 @@ function getTypeScriptCompilerOptions(src) {
|
|||||||
options.rootDir = rootDir;
|
options.rootDir = rootDir;
|
||||||
options.baseUrl = rootDir;
|
options.baseUrl = rootDir;
|
||||||
options.sourceRoot = util.toFileUri(rootDir);
|
options.sourceRoot = util.toFileUri(rootDir);
|
||||||
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF';
|
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 0 : 1;
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
function createCompile(src, build, emitError) {
|
function createCompile(src, build, emitError) {
|
||||||
const opts = _.clone(getTypeScriptCompilerOptions(src));
|
const projectPath = path.join(__dirname, '../../', src, 'tsconfig.json');
|
||||||
opts.inlineSources = !!build;
|
const overrideOptions = Object.assign(Object.assign({}, getTypeScriptCompilerOptions(src)), { inlineSources: Boolean(build) });
|
||||||
opts.noFilesystemLookup = true;
|
const compilation = tsb.create(projectPath, overrideOptions, false, err => reporter(err));
|
||||||
const ts = tsb.create(opts, true, undefined, err => reporter(err.toString()));
|
function pipeline(token) {
|
||||||
return function (token) {
|
|
||||||
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
||||||
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
||||||
const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path)));
|
const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path)));
|
||||||
@@ -57,30 +48,28 @@ function createCompile(src, build, emitError) {
|
|||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
.pipe(ts(token))
|
.pipe(compilation(token))
|
||||||
.pipe(noDeclarationsFilter)
|
.pipe(noDeclarationsFilter)
|
||||||
.pipe(build ? nls() : es.through())
|
.pipe(build ? nls() : es.through())
|
||||||
.pipe(noDeclarationsFilter.restore)
|
.pipe(noDeclarationsFilter.restore)
|
||||||
.pipe(sourcemaps.write('.', {
|
.pipe(sourcemaps.write('.', {
|
||||||
addComment: false,
|
addComment: false,
|
||||||
includeContent: !!build,
|
includeContent: !!build,
|
||||||
sourceRoot: opts.sourceRoot
|
sourceRoot: overrideOptions.sourceRoot
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(reporter.end(!!emitError));
|
.pipe(reporter.end(!!emitError));
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
|
}
|
||||||
|
pipeline.tsProjectSrc = () => {
|
||||||
|
return compilation.src({ base: src });
|
||||||
};
|
};
|
||||||
|
return pipeline;
|
||||||
}
|
}
|
||||||
const typesDts = [
|
|
||||||
'node_modules/typescript/lib/*.d.ts',
|
|
||||||
'node_modules/@types/**/*.d.ts',
|
|
||||||
'!node_modules/@types/webpack/**/*',
|
|
||||||
'!node_modules/@types/uglify-js/**/*',
|
|
||||||
];
|
|
||||||
function compileTask(src, out, build) {
|
function compileTask(src, out, build) {
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile(src, build, true);
|
const compile = createCompile(src, build, true);
|
||||||
const srcPipe = es.merge(gulp.src(`${src}/**`, { base: `${src}` }), gulp.src(typesDts));
|
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
|
||||||
let generator = new MonacoGenerator(false);
|
let generator = new MonacoGenerator(false);
|
||||||
if (src === 'src') {
|
if (src === 'src') {
|
||||||
generator.execute();
|
generator.execute();
|
||||||
@@ -95,8 +84,8 @@ exports.compileTask = compileTask;
|
|||||||
function watchTask(out, build) {
|
function watchTask(out, build) {
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile('src', build);
|
const compile = createCompile('src', build);
|
||||||
const src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src(typesDts));
|
const src = gulp.src('src/**', { base: 'src' });
|
||||||
const watchSrc = watch('src/**', { base: 'src' });
|
const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
|
||||||
let generator = new MonacoGenerator(true);
|
let generator = new MonacoGenerator(true);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
return watchSrc
|
return watchSrc
|
||||||
|
|||||||
@@ -12,27 +12,21 @@ import * as bom from 'gulp-bom';
|
|||||||
import * as sourcemaps from 'gulp-sourcemaps';
|
import * as sourcemaps from 'gulp-sourcemaps';
|
||||||
import * as tsb from 'gulp-tsb';
|
import * as tsb from 'gulp-tsb';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as _ from 'underscore';
|
|
||||||
import * as monacodts from '../monaco/api';
|
import * as monacodts from '../monaco/api';
|
||||||
import * as nls from './nls';
|
import * as nls from './nls';
|
||||||
import { createReporter } from './reporter';
|
import { createReporter } from './reporter';
|
||||||
import * as util from './util';
|
import * as util from './util';
|
||||||
import * as fancyLog from 'fancy-log';
|
import * as fancyLog from 'fancy-log';
|
||||||
import * as ansiColors from 'ansi-colors';
|
import * as ansiColors from 'ansi-colors';
|
||||||
|
import ts = require('typescript');
|
||||||
|
|
||||||
const watch = require('./watch');
|
const watch = require('./watch');
|
||||||
|
|
||||||
const reporter = createReporter();
|
const reporter = createReporter();
|
||||||
|
|
||||||
function getTypeScriptCompilerOptions(src: string) {
|
function getTypeScriptCompilerOptions(src: string): ts.CompilerOptions {
|
||||||
const rootDir = path.join(__dirname, `../../${src}`);
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
const tsconfig = require(`../../${src}/tsconfig.json`);
|
let options: ts.CompilerOptions = {};
|
||||||
let options: { [key: string]: any };
|
|
||||||
if (tsconfig.extends) {
|
|
||||||
options = Object.assign({}, require(path.join(rootDir, tsconfig.extends)).compilerOptions, tsconfig.compilerOptions);
|
|
||||||
} else {
|
|
||||||
options = tsconfig.compilerOptions;
|
|
||||||
}
|
|
||||||
options.verbose = false;
|
options.verbose = false;
|
||||||
options.sourceMap = true;
|
options.sourceMap = true;
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
@@ -41,18 +35,17 @@ function getTypeScriptCompilerOptions(src: string) {
|
|||||||
options.rootDir = rootDir;
|
options.rootDir = rootDir;
|
||||||
options.baseUrl = rootDir;
|
options.baseUrl = rootDir;
|
||||||
options.sourceRoot = util.toFileUri(rootDir);
|
options.sourceRoot = util.toFileUri(rootDir);
|
||||||
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF';
|
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 0 : 1;
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createCompile(src: string, build: boolean, emitError?: boolean): (token?: util.ICancellationToken) => NodeJS.ReadWriteStream {
|
function createCompile(src: string, build: boolean, emitError?: boolean) {
|
||||||
const opts = _.clone(getTypeScriptCompilerOptions(src));
|
const projectPath = path.join(__dirname, '../../', src, 'tsconfig.json');
|
||||||
opts.inlineSources = !!build;
|
const overrideOptions = { ...getTypeScriptCompilerOptions(src), inlineSources: Boolean(build) };
|
||||||
opts.noFilesystemLookup = true;
|
|
||||||
|
|
||||||
const ts = tsb.create(opts, true, undefined, err => reporter(err.toString()));
|
const compilation = tsb.create(projectPath, overrideOptions, false, err => reporter(err));
|
||||||
|
|
||||||
return function (token?: util.ICancellationToken) {
|
function pipeline(token?: util.ICancellationToken) {
|
||||||
|
|
||||||
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
||||||
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
||||||
@@ -65,39 +58,31 @@ function createCompile(src: string, build: boolean, emitError?: boolean): (token
|
|||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
.pipe(ts(token))
|
.pipe(compilation(token))
|
||||||
.pipe(noDeclarationsFilter)
|
.pipe(noDeclarationsFilter)
|
||||||
.pipe(build ? nls() : es.through())
|
.pipe(build ? nls() : es.through())
|
||||||
.pipe(noDeclarationsFilter.restore)
|
.pipe(noDeclarationsFilter.restore)
|
||||||
.pipe(sourcemaps.write('.', {
|
.pipe(sourcemaps.write('.', {
|
||||||
addComment: false,
|
addComment: false,
|
||||||
includeContent: !!build,
|
includeContent: !!build,
|
||||||
sourceRoot: opts.sourceRoot
|
sourceRoot: overrideOptions.sourceRoot
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(reporter.end(!!emitError));
|
.pipe(reporter.end(!!emitError));
|
||||||
|
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
|
}
|
||||||
|
pipeline.tsProjectSrc = () => {
|
||||||
|
return compilation.src({ base: src });
|
||||||
};
|
};
|
||||||
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
const typesDts = [
|
|
||||||
'node_modules/typescript/lib/*.d.ts',
|
|
||||||
'node_modules/@types/**/*.d.ts',
|
|
||||||
'!node_modules/@types/webpack/**/*',
|
|
||||||
'!node_modules/@types/uglify-js/**/*',
|
|
||||||
];
|
|
||||||
|
|
||||||
export function compileTask(src: string, out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
export function compileTask(src: string, out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile(src, build, true);
|
const compile = createCompile(src, build, true);
|
||||||
|
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
|
||||||
const srcPipe = es.merge(
|
|
||||||
gulp.src(`${src}/**`, { base: `${src}` }),
|
|
||||||
gulp.src(typesDts),
|
|
||||||
);
|
|
||||||
|
|
||||||
let generator = new MonacoGenerator(false);
|
let generator = new MonacoGenerator(false);
|
||||||
if (src === 'src') {
|
if (src === 'src') {
|
||||||
generator.execute();
|
generator.execute();
|
||||||
@@ -115,11 +100,8 @@ export function watchTask(out: string, build: boolean): () => NodeJS.ReadWriteSt
|
|||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile('src', build);
|
const compile = createCompile('src', build);
|
||||||
|
|
||||||
const src = es.merge(
|
const src = gulp.src('src/**', { base: 'src' });
|
||||||
gulp.src('src/**', { base: 'src' }),
|
const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
|
||||||
gulp.src(typesDts),
|
|
||||||
);
|
|
||||||
const watchSrc = watch('src/**', { base: 'src' });
|
|
||||||
|
|
||||||
let generator = new MonacoGenerator(true);
|
let generator = new MonacoGenerator(true);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ function fromLocalWebpack(extensionPath) {
|
|||||||
result.emit('error', compilation.warnings.join('\n'));
|
result.emit('error', compilation.warnings.join('\n'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const webpackConfig = Object.assign({}, require(webpackConfigPath), { mode: 'production' });
|
const webpackConfig = Object.assign(Object.assign({}, require(webpackConfigPath)), { mode: 'production' });
|
||||||
const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
|
const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
|
||||||
return webpackGulp(webpackConfig, webpack, webpackDone)
|
return webpackGulp(webpackConfig, webpack, webpackDone)
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
@@ -199,13 +199,10 @@ const sqlBuiltInExtensions = [
|
|||||||
'admin-pack',
|
'admin-pack',
|
||||||
'dacpac',
|
'dacpac',
|
||||||
'schema-compare',
|
'schema-compare',
|
||||||
'cms'
|
'cms',
|
||||||
|
'query-history',
|
||||||
|
'liveshare'
|
||||||
];
|
];
|
||||||
// make resource deployment and BDC extension only available in insiders
|
|
||||||
if (process.env['VSCODE_QUALITY'] === 'stable') {
|
|
||||||
sqlBuiltInExtensions.push('resource-deployment');
|
|
||||||
sqlBuiltInExtensions.push('big-data-cluster');
|
|
||||||
}
|
|
||||||
const builtInExtensions = process.env['VSCODE_QUALITY'] === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
const builtInExtensions = process.env['VSCODE_QUALITY'] === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
||||||
// {{SQL CARBON EDIT}} - End
|
// {{SQL CARBON EDIT}} - End
|
||||||
function packageLocalExtensionsStream() {
|
function packageLocalExtensionsStream() {
|
||||||
|
|||||||
@@ -235,16 +235,11 @@ const sqlBuiltInExtensions = [
|
|||||||
'admin-pack',
|
'admin-pack',
|
||||||
'dacpac',
|
'dacpac',
|
||||||
'schema-compare',
|
'schema-compare',
|
||||||
'cms'
|
'cms',
|
||||||
|
'query-history',
|
||||||
|
'liveshare'
|
||||||
];
|
];
|
||||||
|
|
||||||
// make resource deployment and BDC extension only available in insiders
|
|
||||||
if (process.env['VSCODE_QUALITY'] === 'stable') {
|
|
||||||
sqlBuiltInExtensions.push('resource-deployment');
|
|
||||||
sqlBuiltInExtensions.push('big-data-cluster');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
interface IBuiltInExtension {
|
interface IBuiltInExtension {
|
||||||
name: string;
|
name: string;
|
||||||
version: string;
|
version: string;
|
||||||
@@ -355,4 +350,4 @@ export function packageExtensionTask(extensionName: string, platform: string, ar
|
|||||||
return result.pipe(vfs.dest(destination));
|
return result.pipe(vfs.dest(destination));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// {{SQL CARBON EDIT}} - End
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ class XLF {
|
|||||||
this.buffer.push(line.toString());
|
this.buffer.push(line.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
exports.XLF = XLF;
|
||||||
XLF.parsePseudo = function (xlfString) {
|
XLF.parsePseudo = function (xlfString) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
let parser = new xml2js.Parser();
|
let parser = new xml2js.Parser();
|
||||||
@@ -248,7 +249,6 @@ XLF.parse = function (xlfString) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
exports.XLF = XLF;
|
|
||||||
class Limiter {
|
class Limiter {
|
||||||
constructor(maxDegreeOfParalellism) {
|
constructor(maxDegreeOfParalellism) {
|
||||||
this.maxDegreeOfParalellism = maxDegreeOfParalellism;
|
this.maxDegreeOfParalellism = maxDegreeOfParalellism;
|
||||||
@@ -586,7 +586,7 @@ function createXlfFilesForExtensions() {
|
|||||||
}
|
}
|
||||||
return _xlf;
|
return _xlf;
|
||||||
}
|
}
|
||||||
gulp.src([`./extensions/${extensionName}/package.nls.json`, `./extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }).pipe(event_stream_1.through(function (file) {
|
gulp.src([`.build/extensions/${extensionName}/package.nls.json`, `.build/extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }).pipe(event_stream_1.through(function (file) {
|
||||||
if (file.isBuffer()) {
|
if (file.isBuffer()) {
|
||||||
const buffer = file.contents;
|
const buffer = file.contents;
|
||||||
const basename = path.basename(file.path);
|
const basename = path.basename(file.path);
|
||||||
@@ -609,7 +609,7 @@ function createXlfFilesForExtensions() {
|
|||||||
}
|
}
|
||||||
else if (basename === 'nls.metadata.json') {
|
else if (basename === 'nls.metadata.json') {
|
||||||
const json = JSON.parse(buffer.toString('utf8'));
|
const json = JSON.parse(buffer.toString('utf8'));
|
||||||
const relPath = path.relative(`./extensions/${extensionName}`, path.dirname(file.path));
|
const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path));
|
||||||
for (let file in json) {
|
for (let file in json) {
|
||||||
const fileContent = json[file];
|
const fileContent = json[file];
|
||||||
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
||||||
@@ -912,8 +912,8 @@ function pullCoreAndExtensionsXlfFiles(apiHostname, username, password, language
|
|||||||
_coreAndExtensionResources.push(...json.workbench);
|
_coreAndExtensionResources.push(...json.workbench);
|
||||||
// extensions
|
// extensions
|
||||||
let extensionsToLocalize = Object.create(null);
|
let extensionsToLocalize = Object.create(null);
|
||||||
glob.sync('./extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('.build/extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
glob.sync('./extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('.build/extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
Object.keys(extensionsToLocalize).forEach(extension => {
|
Object.keys(extensionsToLocalize).forEach(extension => {
|
||||||
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
||||||
});
|
});
|
||||||
@@ -1086,7 +1086,7 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse
|
|||||||
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
||||||
this.queue(translatedMainFile);
|
this.queue(translatedMainFile);
|
||||||
for (let extension in extensionsPacks) {
|
for (let extension in extensionsPacks) {
|
||||||
const translatedExtFile = createI18nFile(`./extensions/${extension}`, extensionsPacks[extension]);
|
const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]);
|
||||||
this.queue(translatedExtFile);
|
this.queue(translatedExtFile);
|
||||||
const externalExtensionId = externalExtensions[extension];
|
const externalExtensionId = externalExtensions[extension];
|
||||||
if (externalExtensionId) {
|
if (externalExtensionId) {
|
||||||
|
|||||||
@@ -106,6 +106,10 @@
|
|||||||
"name": "vs/workbench/contrib/quickopen",
|
"name": "vs/workbench/contrib/quickopen",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/userData",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/remote",
|
"name": "vs/workbench/contrib/remote",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -170,6 +174,10 @@
|
|||||||
"name": "vs/workbench/contrib/webview",
|
"name": "vs/workbench/contrib/webview",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/customEditor",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/welcome",
|
"name": "vs/workbench/contrib/welcome",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -178,6 +186,10 @@
|
|||||||
"name": "vs/workbench/contrib/outline",
|
"name": "vs/workbench/contrib/outline",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/userDataSync",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/actions",
|
"name": "vs/workbench/services/actions",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -230,6 +242,10 @@
|
|||||||
"name": "vs/workbench/services/keybinding",
|
"name": "vs/workbench/services/keybinding",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/lifecycle",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/mode",
|
"name": "vs/workbench/services/mode",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -255,7 +271,7 @@
|
|||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/workspace",
|
"name": "vs/workbench/services/workspaces",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -273,6 +289,10 @@
|
|||||||
{
|
{
|
||||||
"name": "vs/workbench/services/notification",
|
"name": "vs/workbench/services/notification",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/userData",
|
||||||
|
"project": "vscode-workbench"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -709,7 +709,7 @@ export function createXlfFilesForExtensions(): ThroughStream {
|
|||||||
}
|
}
|
||||||
return _xlf;
|
return _xlf;
|
||||||
}
|
}
|
||||||
gulp.src([`./extensions/${extensionName}/package.nls.json`, `./extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }).pipe(through(function (file: File) {
|
gulp.src([`.build/extensions/${extensionName}/package.nls.json`, `.build/extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }).pipe(through(function (file: File) {
|
||||||
if (file.isBuffer()) {
|
if (file.isBuffer()) {
|
||||||
const buffer: Buffer = file.contents as Buffer;
|
const buffer: Buffer = file.contents as Buffer;
|
||||||
const basename = path.basename(file.path);
|
const basename = path.basename(file.path);
|
||||||
@@ -729,7 +729,7 @@ export function createXlfFilesForExtensions(): ThroughStream {
|
|||||||
getXlf().addFile(`extensions/${extensionName}/package`, keys, messages);
|
getXlf().addFile(`extensions/${extensionName}/package`, keys, messages);
|
||||||
} else if (basename === 'nls.metadata.json') {
|
} else if (basename === 'nls.metadata.json') {
|
||||||
const json: BundledExtensionFormat = JSON.parse(buffer.toString('utf8'));
|
const json: BundledExtensionFormat = JSON.parse(buffer.toString('utf8'));
|
||||||
const relPath = path.relative(`./extensions/${extensionName}`, path.dirname(file.path));
|
const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path));
|
||||||
for (let file in json) {
|
for (let file in json) {
|
||||||
const fileContent = json[file];
|
const fileContent = json[file];
|
||||||
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
||||||
@@ -1053,8 +1053,8 @@ export function pullCoreAndExtensionsXlfFiles(apiHostname: string, username: str
|
|||||||
|
|
||||||
// extensions
|
// extensions
|
||||||
let extensionsToLocalize = Object.create(null);
|
let extensionsToLocalize = Object.create(null);
|
||||||
glob.sync('./extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('.build/extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
glob.sync('./extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('.build/extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
|
|
||||||
Object.keys(extensionsToLocalize).forEach(extension => {
|
Object.keys(extensionsToLocalize).forEach(extension => {
|
||||||
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
||||||
@@ -1253,7 +1253,7 @@ export function prepareI18nPackFiles(externalExtensions: Map<string>, resultingT
|
|||||||
|
|
||||||
this.queue(translatedMainFile);
|
this.queue(translatedMainFile);
|
||||||
for (let extension in extensionsPacks) {
|
for (let extension in extensionsPacks) {
|
||||||
const translatedExtFile = createI18nFile(`./extensions/${extension}`, extensionsPacks[extension]);
|
const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]);
|
||||||
this.queue(translatedExtFile);
|
this.queue(translatedExtFile);
|
||||||
|
|
||||||
const externalExtensionId = externalExtensions[extension];
|
const externalExtensionId = externalExtensions[extension];
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const es = require("event-stream");
|
const es = require("event-stream");
|
||||||
|
const fs = require("fs");
|
||||||
const gulp = require("gulp");
|
const gulp = require("gulp");
|
||||||
const concat = require("gulp-concat");
|
const concat = require("gulp-concat");
|
||||||
const minifyCSS = require("gulp-cssnano");
|
const minifyCSS = require("gulp-cssnano");
|
||||||
@@ -17,7 +18,7 @@ const fancyLog = require("fancy-log");
|
|||||||
const ansiColors = require("ansi-colors");
|
const ansiColors = require("ansi-colors");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const pump = require("pump");
|
const pump = require("pump");
|
||||||
const uglifyes = require("uglify-es");
|
const terser = require("terser");
|
||||||
const VinylFile = require("vinyl");
|
const VinylFile = require("vinyl");
|
||||||
const bundle = require("./bundle");
|
const bundle = require("./bundle");
|
||||||
const i18n_1 = require("./i18n");
|
const i18n_1 = require("./i18n");
|
||||||
@@ -134,6 +135,14 @@ function optimizeTask(opts) {
|
|||||||
if (err || !result) {
|
if (err || !result) {
|
||||||
return bundlesStream.emit('error', JSON.stringify(err));
|
return bundlesStream.emit('error', JSON.stringify(err));
|
||||||
}
|
}
|
||||||
|
if (opts.inlineAmdImages) {
|
||||||
|
try {
|
||||||
|
result = inlineAmdImages(src, result);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
return bundlesStream.emit('error', JSON.stringify(err));
|
||||||
|
}
|
||||||
|
}
|
||||||
toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream);
|
toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream);
|
||||||
// Remove css inlined resources
|
// Remove css inlined resources
|
||||||
const filteredResources = resources.slice();
|
const filteredResources = resources.slice();
|
||||||
@@ -169,6 +178,39 @@ function optimizeTask(opts) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
exports.optimizeTask = optimizeTask;
|
exports.optimizeTask = optimizeTask;
|
||||||
|
function inlineAmdImages(src, result) {
|
||||||
|
for (const outputFile of result.files) {
|
||||||
|
for (const sourceFile of outputFile.sources) {
|
||||||
|
if (sourceFile.path && /\.js$/.test(sourceFile.path)) {
|
||||||
|
sourceFile.contents = sourceFile.contents.replace(/\([^.]+\.registerAndGetAmdImageURL\(([^)]+)\)\)/g, (_, m0) => {
|
||||||
|
let imagePath = m0;
|
||||||
|
// remove `` or ''
|
||||||
|
if ((imagePath.charAt(0) === '`' && imagePath.charAt(imagePath.length - 1) === '`')
|
||||||
|
|| (imagePath.charAt(0) === '\'' && imagePath.charAt(imagePath.length - 1) === '\'')) {
|
||||||
|
imagePath = imagePath.substr(1, imagePath.length - 2);
|
||||||
|
}
|
||||||
|
if (!/\.(png|svg)$/.test(imagePath)) {
|
||||||
|
console.log(`original: ${_}`);
|
||||||
|
return _;
|
||||||
|
}
|
||||||
|
const repoLocation = path.join(src, imagePath);
|
||||||
|
const absoluteLocation = path.join(REPO_ROOT_PATH, repoLocation);
|
||||||
|
if (!fs.existsSync(absoluteLocation)) {
|
||||||
|
const message = `Invalid amd image url in file ${sourceFile.path}: ${imagePath}`;
|
||||||
|
console.log(message);
|
||||||
|
throw new Error(message);
|
||||||
|
}
|
||||||
|
const fileContents = fs.readFileSync(absoluteLocation);
|
||||||
|
const mime = /\.svg$/.test(imagePath) ? 'image/svg+xml' : 'image/png';
|
||||||
|
// Mark the file as inlined so we don't ship it by itself
|
||||||
|
result.cssInlinedResources.push(repoLocation);
|
||||||
|
return `("data:${mime};base64,${fileContents.toString('base64')}")`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Wrap around uglify and allow the preserveComments function
|
* Wrap around uglify and allow the preserveComments function
|
||||||
* to have a file "context" to include our copyright only once per file.
|
* to have a file "context" to include our copyright only once per file.
|
||||||
@@ -199,7 +241,7 @@ function uglifyWithCopyrights() {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
const minify = composer(uglifyes);
|
const minify = composer(terser);
|
||||||
const input = es.through();
|
const input = es.through();
|
||||||
const output = input
|
const output = input
|
||||||
.pipe(flatmap((stream, f) => {
|
.pipe(flatmap((stream, f) => {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import * as es from 'event-stream';
|
import * as es from 'event-stream';
|
||||||
|
import * as fs from 'fs';
|
||||||
import * as gulp from 'gulp';
|
import * as gulp from 'gulp';
|
||||||
import * as concat from 'gulp-concat';
|
import * as concat from 'gulp-concat';
|
||||||
import * as minifyCSS from 'gulp-cssnano';
|
import * as minifyCSS from 'gulp-cssnano';
|
||||||
@@ -19,7 +20,7 @@ import * as ansiColors from 'ansi-colors';
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as pump from 'pump';
|
import * as pump from 'pump';
|
||||||
import * as sm from 'source-map';
|
import * as sm from 'source-map';
|
||||||
import * as uglifyes from 'uglify-es';
|
import * as terser from 'terser';
|
||||||
import * as VinylFile from 'vinyl';
|
import * as VinylFile from 'vinyl';
|
||||||
import * as bundle from './bundle';
|
import * as bundle from './bundle';
|
||||||
import { Language, processNlsFiles } from './i18n';
|
import { Language, processNlsFiles } from './i18n';
|
||||||
@@ -161,6 +162,10 @@ export interface IOptimizeTaskOpts {
|
|||||||
* (emit bundleInfo.json file)
|
* (emit bundleInfo.json file)
|
||||||
*/
|
*/
|
||||||
bundleInfo: boolean;
|
bundleInfo: boolean;
|
||||||
|
/**
|
||||||
|
* replace calls to `registerAndGetAmdImageURL` with data uris
|
||||||
|
*/
|
||||||
|
inlineAmdImages: boolean;
|
||||||
/**
|
/**
|
||||||
* (out folder name)
|
* (out folder name)
|
||||||
*/
|
*/
|
||||||
@@ -194,6 +199,14 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
bundle.bundle(entryPoints, loaderConfig, function (err, result) {
|
bundle.bundle(entryPoints, loaderConfig, function (err, result) {
|
||||||
if (err || !result) { return bundlesStream.emit('error', JSON.stringify(err)); }
|
if (err || !result) { return bundlesStream.emit('error', JSON.stringify(err)); }
|
||||||
|
|
||||||
|
if (opts.inlineAmdImages) {
|
||||||
|
try {
|
||||||
|
result = inlineAmdImages(src, result);
|
||||||
|
} catch (err) {
|
||||||
|
return bundlesStream.emit('error', JSON.stringify(err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream);
|
toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream);
|
||||||
|
|
||||||
// Remove css inlined resources
|
// Remove css inlined resources
|
||||||
@@ -238,6 +251,42 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function inlineAmdImages(src: string, result: bundle.IBundleResult): bundle.IBundleResult {
|
||||||
|
for (const outputFile of result.files) {
|
||||||
|
for (const sourceFile of outputFile.sources) {
|
||||||
|
if (sourceFile.path && /\.js$/.test(sourceFile.path)) {
|
||||||
|
sourceFile.contents = sourceFile.contents.replace(/\([^.]+\.registerAndGetAmdImageURL\(([^)]+)\)\)/g, (_, m0) => {
|
||||||
|
let imagePath = m0;
|
||||||
|
// remove `` or ''
|
||||||
|
if ((imagePath.charAt(0) === '`' && imagePath.charAt(imagePath.length - 1) === '`')
|
||||||
|
|| (imagePath.charAt(0) === '\'' && imagePath.charAt(imagePath.length - 1) === '\'')) {
|
||||||
|
imagePath = imagePath.substr(1, imagePath.length - 2);
|
||||||
|
}
|
||||||
|
if (!/\.(png|svg)$/.test(imagePath)) {
|
||||||
|
console.log(`original: ${_}`);
|
||||||
|
return _;
|
||||||
|
}
|
||||||
|
const repoLocation = path.join(src, imagePath);
|
||||||
|
const absoluteLocation = path.join(REPO_ROOT_PATH, repoLocation);
|
||||||
|
if (!fs.existsSync(absoluteLocation)) {
|
||||||
|
const message = `Invalid amd image url in file ${sourceFile.path}: ${imagePath}`;
|
||||||
|
console.log(message);
|
||||||
|
throw new Error(message);
|
||||||
|
}
|
||||||
|
const fileContents = fs.readFileSync(absoluteLocation);
|
||||||
|
const mime = /\.svg$/.test(imagePath) ? 'image/svg+xml' : 'image/png';
|
||||||
|
|
||||||
|
// Mark the file as inlined so we don't ship it by itself
|
||||||
|
result.cssInlinedResources.push(repoLocation);
|
||||||
|
|
||||||
|
return `("data:${mime};base64,${fileContents.toString('base64')}")`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
declare class FileWithCopyright extends VinylFile {
|
declare class FileWithCopyright extends VinylFile {
|
||||||
public __hasOurCopyright: boolean;
|
public __hasOurCopyright: boolean;
|
||||||
}
|
}
|
||||||
@@ -275,7 +324,7 @@ function uglifyWithCopyrights(): NodeJS.ReadWriteStream {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const minify = (composer as any)(uglifyes);
|
const minify = (composer as any)(terser);
|
||||||
const input = es.through();
|
const input = es.through();
|
||||||
const output = input
|
const output = input
|
||||||
.pipe(flatmap((stream, f) => {
|
.pipe(flatmap((stream, f) => {
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ function createESMSourcesAndResources2(options) {
|
|||||||
write(getDestAbsoluteFilePath(file), JSON.stringify(tsConfig, null, '\t'));
|
write(getDestAbsoluteFilePath(file), JSON.stringify(tsConfig, null, '\t'));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file)) {
|
if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file) || /\.ttf$/.test(file)) {
|
||||||
// Transport the files directly
|
// Transport the files directly
|
||||||
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
|
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
|
||||||
continue;
|
continue;
|
||||||
@@ -250,35 +250,37 @@ function transportCSS(module, enqueue, write) {
|
|||||||
const filename = path.join(SRC_DIR, module);
|
const filename = path.join(SRC_DIR, module);
|
||||||
const fileContents = fs.readFileSync(filename).toString();
|
const fileContents = fs.readFileSync(filename).toString();
|
||||||
const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148
|
const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148
|
||||||
const inlineResourcesLimit = 300000; //3000; // see https://github.com/Microsoft/monaco-editor/issues/336
|
const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64');
|
||||||
const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64', inlineResourcesLimit);
|
|
||||||
write(module, newContents);
|
write(module, newContents);
|
||||||
return true;
|
return true;
|
||||||
function _rewriteOrInlineUrls(contents, forceBase64, inlineByteLimit) {
|
function _rewriteOrInlineUrls(contents, forceBase64) {
|
||||||
return _replaceURL(contents, (url) => {
|
return _replaceURL(contents, (url) => {
|
||||||
let imagePath = path.join(path.dirname(module), url);
|
const fontMatch = url.match(/^(.*).ttf\?(.*)$/);
|
||||||
let fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath));
|
if (fontMatch) {
|
||||||
if (fileContents.length < inlineByteLimit) {
|
const relativeFontPath = `${fontMatch[1]}.ttf`; // trim the query parameter
|
||||||
const MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png';
|
const fontPath = path.join(path.dirname(module), relativeFontPath);
|
||||||
let DATA = ';base64,' + fileContents.toString('base64');
|
enqueue(fontPath);
|
||||||
if (!forceBase64 && /\.svg$/.test(url)) {
|
return relativeFontPath;
|
||||||
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
|
||||||
let newText = fileContents.toString()
|
|
||||||
.replace(/"/g, '\'')
|
|
||||||
.replace(/</g, '%3C')
|
|
||||||
.replace(/>/g, '%3E')
|
|
||||||
.replace(/&/g, '%26')
|
|
||||||
.replace(/#/g, '%23')
|
|
||||||
.replace(/\s+/g, ' ');
|
|
||||||
let encodedData = ',' + newText;
|
|
||||||
if (encodedData.length < DATA.length) {
|
|
||||||
DATA = encodedData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return '"data:' + MIME + DATA + '"';
|
|
||||||
}
|
}
|
||||||
enqueue(imagePath);
|
const imagePath = path.join(path.dirname(module), url);
|
||||||
return url;
|
const fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath));
|
||||||
|
const MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png';
|
||||||
|
let DATA = ';base64,' + fileContents.toString('base64');
|
||||||
|
if (!forceBase64 && /\.svg$/.test(url)) {
|
||||||
|
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
||||||
|
let newText = fileContents.toString()
|
||||||
|
.replace(/"/g, '\'')
|
||||||
|
.replace(/</g, '%3C')
|
||||||
|
.replace(/>/g, '%3E')
|
||||||
|
.replace(/&/g, '%26')
|
||||||
|
.replace(/#/g, '%23')
|
||||||
|
.replace(/\s+/g, ' ');
|
||||||
|
let encodedData = ',' + newText;
|
||||||
|
if (encodedData.length < DATA.length) {
|
||||||
|
DATA = encodedData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '"data:' + MIME + DATA + '"';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function _replaceURL(contents, replacer) {
|
function _replaceURL(contents, replacer) {
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ export function createESMSourcesAndResources2(options: IOptions2): void {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file)) {
|
if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file) || /\.ttf$/.test(file)) {
|
||||||
// Transport the files directly
|
// Transport the files directly
|
||||||
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
|
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
|
||||||
continue;
|
continue;
|
||||||
@@ -290,40 +290,41 @@ function transportCSS(module: string, enqueue: (module: string) => void, write:
|
|||||||
const filename = path.join(SRC_DIR, module);
|
const filename = path.join(SRC_DIR, module);
|
||||||
const fileContents = fs.readFileSync(filename).toString();
|
const fileContents = fs.readFileSync(filename).toString();
|
||||||
const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148
|
const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148
|
||||||
const inlineResourcesLimit = 300000;//3000; // see https://github.com/Microsoft/monaco-editor/issues/336
|
|
||||||
|
|
||||||
const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64', inlineResourcesLimit);
|
const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64');
|
||||||
write(module, newContents);
|
write(module, newContents);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
function _rewriteOrInlineUrls(contents: string, forceBase64: boolean, inlineByteLimit: number): string {
|
function _rewriteOrInlineUrls(contents: string, forceBase64: boolean): string {
|
||||||
return _replaceURL(contents, (url) => {
|
return _replaceURL(contents, (url) => {
|
||||||
let imagePath = path.join(path.dirname(module), url);
|
const fontMatch = url.match(/^(.*).ttf\?(.*)$/);
|
||||||
let fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath));
|
if (fontMatch) {
|
||||||
|
const relativeFontPath = `${fontMatch[1]}.ttf`; // trim the query parameter
|
||||||
if (fileContents.length < inlineByteLimit) {
|
const fontPath = path.join(path.dirname(module), relativeFontPath);
|
||||||
const MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png';
|
enqueue(fontPath);
|
||||||
let DATA = ';base64,' + fileContents.toString('base64');
|
return relativeFontPath;
|
||||||
|
|
||||||
if (!forceBase64 && /\.svg$/.test(url)) {
|
|
||||||
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
|
||||||
let newText = fileContents.toString()
|
|
||||||
.replace(/"/g, '\'')
|
|
||||||
.replace(/</g, '%3C')
|
|
||||||
.replace(/>/g, '%3E')
|
|
||||||
.replace(/&/g, '%26')
|
|
||||||
.replace(/#/g, '%23')
|
|
||||||
.replace(/\s+/g, ' ');
|
|
||||||
let encodedData = ',' + newText;
|
|
||||||
if (encodedData.length < DATA.length) {
|
|
||||||
DATA = encodedData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return '"data:' + MIME + DATA + '"';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enqueue(imagePath);
|
const imagePath = path.join(path.dirname(module), url);
|
||||||
return url;
|
const fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath));
|
||||||
|
const MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png';
|
||||||
|
let DATA = ';base64,' + fileContents.toString('base64');
|
||||||
|
|
||||||
|
if (!forceBase64 && /\.svg$/.test(url)) {
|
||||||
|
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
||||||
|
let newText = fileContents.toString()
|
||||||
|
.replace(/"/g, '\'')
|
||||||
|
.replace(/</g, '%3C')
|
||||||
|
.replace(/>/g, '%3E')
|
||||||
|
.replace(/&/g, '%26')
|
||||||
|
.replace(/#/g, '%23')
|
||||||
|
.replace(/\s+/g, ' ');
|
||||||
|
let encodedData = ',' + newText;
|
||||||
|
if (encodedData.length < DATA.length) {
|
||||||
|
DATA = encodedData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '"data:' + MIME + DATA + '"';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
33
build/lib/tslint/noSyncRule.js
Normal file
33
build/lib/tslint/noSyncRule.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const Lint = require("tslint");
|
||||||
|
const minimatch = require("minimatch");
|
||||||
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
|
apply(sourceFile) {
|
||||||
|
const args = this.getOptions().ruleArguments[0];
|
||||||
|
if (args.exclude.every(x => !minimatch(sourceFile.fileName, x))) {
|
||||||
|
return this.applyWithWalker(new NoSyncRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Rule = Rule;
|
||||||
|
class NoSyncRuleWalker extends Lint.RuleWalker {
|
||||||
|
constructor(file, opts) {
|
||||||
|
super(file, opts);
|
||||||
|
}
|
||||||
|
visitCallExpression(node) {
|
||||||
|
if (node.expression && NoSyncRuleWalker.operations.some(x => node.expression.getText().indexOf(x) >= 0)) {
|
||||||
|
this.addFailureAtNode(node, `Do not use Sync operations`);
|
||||||
|
}
|
||||||
|
super.visitCallExpression(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NoSyncRuleWalker.operations = ['readFileSync', 'writeFileSync', 'existsSync', 'fchmodSync', 'lchmodSync',
|
||||||
|
'statSync', 'fstatSync', 'lstatSync', 'linkSync', 'symlinkSync', 'readlinkSync', 'realpathSync', 'unlinkSync', 'rmdirSync',
|
||||||
|
'mkdirSync', 'mkdtempSync', 'readdirSync', 'openSync', 'utimesSync', 'futimesSync', 'fsyncSync', 'writeSync', 'readSync',
|
||||||
|
'appendFileSync', 'accessSync', 'fdatasyncSync', 'copyFileSync'];
|
||||||
45
build/lib/tslint/noSyncRule.ts
Normal file
45
build/lib/tslint/noSyncRule.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
import * as Lint from 'tslint';
|
||||||
|
import * as minimatch from 'minimatch';
|
||||||
|
|
||||||
|
interface NoSyncRuleConfig {
|
||||||
|
exclude: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Rule extends Lint.Rules.AbstractRule {
|
||||||
|
|
||||||
|
apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
|
||||||
|
const args = <NoSyncRuleConfig>this.getOptions().ruleArguments[0];
|
||||||
|
|
||||||
|
if (args.exclude.every(x => !minimatch(sourceFile.fileName, x))) {
|
||||||
|
return this.applyWithWalker(new NoSyncRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NoSyncRuleWalker extends Lint.RuleWalker {
|
||||||
|
|
||||||
|
private static readonly operations = ['readFileSync', 'writeFileSync', 'existsSync', 'fchmodSync', 'lchmodSync',
|
||||||
|
'statSync', 'fstatSync', 'lstatSync', 'linkSync', 'symlinkSync', 'readlinkSync', 'realpathSync', 'unlinkSync', 'rmdirSync',
|
||||||
|
'mkdirSync', 'mkdtempSync', 'readdirSync', 'openSync', 'utimesSync', 'futimesSync', 'fsyncSync', 'writeSync', 'readSync',
|
||||||
|
'appendFileSync', 'accessSync', 'fdatasyncSync', 'copyFileSync'];
|
||||||
|
|
||||||
|
constructor(file: ts.SourceFile, opts: Lint.IOptions) {
|
||||||
|
super(file, opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
visitCallExpression(node: ts.CallExpression) {
|
||||||
|
if (node.expression && NoSyncRuleWalker.operations.some(x => node.expression.getText().indexOf(x) >= 0)) {
|
||||||
|
this.addFailureAtNode(node, `Do not use Sync operations`);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.visitCallExpression(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,9 @@ const Lint = require("tslint");
|
|||||||
*/
|
*/
|
||||||
class Rule extends Lint.Rules.AbstractRule {
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
apply(sourceFile) {
|
apply(sourceFile) {
|
||||||
|
if (/\.d.ts$/.test(sourceFile.fileName)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
return this.applyWithWalker(new NoUnexternalizedStringsRuleWalker(sourceFile, this.getOptions()));
|
return this.applyWithWalker(new NoUnexternalizedStringsRuleWalker(sourceFile, this.getOptions()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ import * as Lint from 'tslint';
|
|||||||
*/
|
*/
|
||||||
export class Rule extends Lint.Rules.AbstractRule {
|
export class Rule extends Lint.Rules.AbstractRule {
|
||||||
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
|
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
|
||||||
|
if (/\.d.ts$/.test(sourceFile.fileName)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
return this.applyWithWalker(new NoUnexternalizedStringsRuleWalker(sourceFile, this.getOptions()));
|
return this.applyWithWalker(new NoUnexternalizedStringsRuleWalker(sourceFile, this.getOptions()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
28
build/lib/tslint/noUselessStrictRule.js
Normal file
28
build/lib/tslint/noUselessStrictRule.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const Lint = require("tslint");
|
||||||
|
class Rule extends Lint.Rules.TypedRule {
|
||||||
|
applyWithProgram(sourceFile, program) {
|
||||||
|
if (program.getCompilerOptions().alwaysStrict) {
|
||||||
|
return this.applyWithWalker(new NoUselessStrictRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Rule = Rule;
|
||||||
|
class NoUselessStrictRuleWalker extends Lint.RuleWalker {
|
||||||
|
visitStringLiteral(node) {
|
||||||
|
this.checkStringLiteral(node);
|
||||||
|
super.visitStringLiteral(node);
|
||||||
|
}
|
||||||
|
checkStringLiteral(node) {
|
||||||
|
const text = node.getText();
|
||||||
|
if (text === '\'use strict\'' || text === '"use strict"') {
|
||||||
|
this.addFailureAtNode(node, 'use strict directive is unnecessary');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
30
build/lib/tslint/noUselessStrictRule.ts
Normal file
30
build/lib/tslint/noUselessStrictRule.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as Lint from 'tslint';
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
|
export class Rule extends Lint.Rules.TypedRule {
|
||||||
|
public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] {
|
||||||
|
if (program.getCompilerOptions().alwaysStrict) {
|
||||||
|
return this.applyWithWalker(new NoUselessStrictRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NoUselessStrictRuleWalker extends Lint.RuleWalker {
|
||||||
|
protected visitStringLiteral(node: ts.StringLiteral): void {
|
||||||
|
this.checkStringLiteral(node);
|
||||||
|
super.visitStringLiteral(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
private checkStringLiteral(node: ts.StringLiteral): void {
|
||||||
|
const text = node.getText();
|
||||||
|
if (text === '\'use strict\'' || text === '"use strict"') {
|
||||||
|
this.addFailureAtNode(node, 'use strict directive is unnecessary');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
12
build/lib/typings/gulp-tsb.d.ts
vendored
12
build/lib/typings/gulp-tsb.d.ts
vendored
@@ -7,10 +7,12 @@ declare module "gulp-tsb" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface IncrementalCompiler {
|
export interface IncrementalCompiler {
|
||||||
(token?:ICancellationToken): NodeJS.ReadWriteStream;
|
(token?: ICancellationToken): NodeJS.ReadWriteStream;
|
||||||
// program?: ts.Program;
|
src(opts?: {
|
||||||
|
cwd?: string;
|
||||||
|
base?: string;
|
||||||
|
}): NodeJS.ReadStream;
|
||||||
}
|
}
|
||||||
|
export function create(projectPath: string, existingOptions: any, verbose?: boolean, onError?: (message: any) => void): IncrementalCompiler;
|
||||||
|
|
||||||
export function create(configOrName: { [option: string]: string | number | boolean; } | string, verbose?: boolean, json?: boolean, onError?: (message: any) => void): IncrementalCompiler;
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ function loadSourcemaps() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!f.contents) {
|
if (!f.contents) {
|
||||||
cb(new Error('empty file'));
|
cb(undefined, f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const contents = f.contents.toString('utf8');
|
const contents = f.contents.toString('utf8');
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ export function loadSourcemaps(): NodeJS.ReadWriteStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!f.contents) {
|
if (!f.contents) {
|
||||||
cb(new Error('empty file'));
|
cb(undefined, f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,17 +5,6 @@
|
|||||||
|
|
||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
|
|
||||||
/** Ugly hack for gulp-tsb */
|
|
||||||
function handleDeletions() {
|
|
||||||
return es.mapSync(f => {
|
|
||||||
if (/\.ts$/.test(f.relative) && !f.contents) {
|
|
||||||
f.contents = Buffer.from('');
|
|
||||||
f.stat = { mtime: new Date() };
|
|
||||||
}
|
|
||||||
|
|
||||||
return f;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let watch = undefined;
|
let watch = undefined;
|
||||||
|
|
||||||
@@ -24,6 +13,5 @@ if (!watch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
module.exports = function () {
|
module.exports = function () {
|
||||||
return watch.apply(null, arguments)
|
return watch.apply(null, arguments);
|
||||||
.pipe(handleDeletions());
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -148,8 +148,9 @@ function getMassagedTopLevelDeclarationText(sourceFile, declaration, importName,
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
result = result.replace(/export default/g, 'export');
|
result = result.replace(/export default /g, 'export ');
|
||||||
result = result.replace(/export declare/g, 'export');
|
result = result.replace(/export declare /g, 'export ');
|
||||||
|
result = result.replace(/declare /g, '');
|
||||||
if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
|
if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
|
||||||
result = result.replace(/const enum/, 'enum');
|
result = result.replace(/const enum/, 'enum');
|
||||||
enums.push(result);
|
enums.push(result);
|
||||||
|
|||||||
@@ -178,8 +178,9 @@ function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declarati
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
result = result.replace(/export default/g, 'export');
|
result = result.replace(/export default /g, 'export ');
|
||||||
result = result.replace(/export declare/g, 'export');
|
result = result.replace(/export declare /g, 'export ');
|
||||||
|
result = result.replace(/declare /g, '');
|
||||||
|
|
||||||
if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
|
if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
|
||||||
result = result.replace(/const enum/, 'enum');
|
result = result.replace(/const enum/, 'enum');
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ declare namespace monaco.editor {
|
|||||||
#include(vs/editor/standalone/common/standaloneThemeService): BuiltinTheme, IStandaloneThemeData, IColors
|
#include(vs/editor/standalone/common/standaloneThemeService): BuiltinTheme, IStandaloneThemeData, IColors
|
||||||
#include(vs/editor/common/modes/supports/tokenization): ITokenThemeRule
|
#include(vs/editor/common/modes/supports/tokenization): ITokenThemeRule
|
||||||
#include(vs/editor/common/services/webWorker): MonacoWebWorker, IWebWorkerOptions
|
#include(vs/editor/common/services/webWorker): MonacoWebWorker, IWebWorkerOptions
|
||||||
#include(vs/editor/standalone/browser/standaloneCodeEditor): IActionDescriptor, IEditorConstructionOptions, IDiffEditorConstructionOptions, IStandaloneCodeEditor, IStandaloneDiffEditor
|
#include(vs/editor/standalone/browser/standaloneCodeEditor): IActionDescriptor, IStandaloneEditorConstructionOptions, IDiffEditorConstructionOptions, IStandaloneCodeEditor, IStandaloneDiffEditor
|
||||||
export interface ICommandHandler {
|
export interface ICommandHandler {
|
||||||
(...args: any[]): void;
|
(...args: any[]): void;
|
||||||
}
|
}
|
||||||
@@ -62,6 +62,7 @@ export interface ICommandHandler {
|
|||||||
#includeAll(vs/editor/common/editorCommon;editorOptions.=>): IScrollEvent
|
#includeAll(vs/editor/common/editorCommon;editorOptions.=>): IScrollEvent
|
||||||
#includeAll(vs/editor/common/model/textModelEvents):
|
#includeAll(vs/editor/common/model/textModelEvents):
|
||||||
#includeAll(vs/editor/common/controller/cursorEvents):
|
#includeAll(vs/editor/common/controller/cursorEvents):
|
||||||
|
#include(vs/platform/accessibility/common/accessibility): AccessibilitySupport
|
||||||
#includeAll(vs/editor/common/config/editorOptions):
|
#includeAll(vs/editor/common/config/editorOptions):
|
||||||
#includeAll(vs/editor/browser/editorBrowser;editorCommon.=>;editorOptions.=>):
|
#includeAll(vs/editor/browser/editorBrowser;editorCommon.=>;editorOptions.=>):
|
||||||
#include(vs/editor/common/config/fontInfo): FontInfo, BareFontInfo
|
#include(vs/editor/common/config/fontInfo): FontInfo, BareFontInfo
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "monaco-editor-core",
|
"name": "monaco-editor-core",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.16.0",
|
"version": "0.18.0",
|
||||||
"description": "A browser based code editor",
|
"description": "A browser based code editor",
|
||||||
"author": "Microsoft Corporation",
|
"author": "Microsoft Corporation",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ runtime "${runtime}"`;
|
|||||||
}
|
}
|
||||||
|
|
||||||
yarnInstall(`build`); // node modules required for build
|
yarnInstall(`build`); // node modules required for build
|
||||||
|
yarnInstall('test/automation'); // node modules required for smoketest
|
||||||
yarnInstall('test/smoke'); // node modules required for smoketest
|
yarnInstall('test/smoke'); // node modules required for smoketest
|
||||||
yarnInstallBuildDependencies(); // node modules for watching, specific to host node version, not electron
|
yarnInstallBuildDependencies(); // node modules for watching, specific to host node version, not electron
|
||||||
|
|
||||||
|
|||||||
@@ -31,4 +31,4 @@ if (!/yarn\.js$|yarnpkg$/.test(process.env['npm_execpath'])) {
|
|||||||
if (err) {
|
if (err) {
|
||||||
console.error('');
|
console.error('');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,9 @@
|
|||||||
"@types/pump": "^1.0.1",
|
"@types/pump": "^1.0.1",
|
||||||
"@types/request": "^2.47.0",
|
"@types/request": "^2.47.0",
|
||||||
"@types/rimraf": "^2.0.2",
|
"@types/rimraf": "^2.0.2",
|
||||||
|
"@types/terser": "^3.12.0",
|
||||||
"@types/through": "^0.0.29",
|
"@types/through": "^0.0.29",
|
||||||
"@types/through2": "^2.0.34",
|
"@types/through2": "^2.0.34",
|
||||||
"@types/uglify-es": "^3.0.0",
|
|
||||||
"@types/underscore": "^1.8.9",
|
"@types/underscore": "^1.8.9",
|
||||||
"@types/xml2js": "0.0.33",
|
"@types/xml2js": "0.0.33",
|
||||||
"applicationinsights": "1.0.8",
|
"applicationinsights": "1.0.8",
|
||||||
@@ -36,13 +36,18 @@
|
|||||||
"github-releases": "^0.4.1",
|
"github-releases": "^0.4.1",
|
||||||
"gulp-bom": "^1.0.0",
|
"gulp-bom": "^1.0.0",
|
||||||
"gulp-sourcemaps": "^1.11.0",
|
"gulp-sourcemaps": "^1.11.0",
|
||||||
|
"gulp-uglify": "^3.0.0",
|
||||||
"iconv-lite": "0.4.23",
|
"iconv-lite": "0.4.23",
|
||||||
"mime": "^1.3.4",
|
"mime": "^1.3.4",
|
||||||
"minimist": "^1.2.0",
|
"minimist": "^1.2.0",
|
||||||
"request": "^2.85.0",
|
"request": "^2.85.0",
|
||||||
|
"rollup": "^1.20.3",
|
||||||
|
"rollup-plugin-commonjs": "^10.1.0",
|
||||||
|
"rollup-plugin-node-resolve": "^5.2.0",
|
||||||
|
"terser": "4.3.1",
|
||||||
"tslint": "^5.9.1",
|
"tslint": "^5.9.1",
|
||||||
"service-downloader": "github:anthonydresser/service-downloader#0.1.7",
|
"service-downloader": "github:anthonydresser/service-downloader#0.1.7",
|
||||||
"typescript": "3.5.2",
|
"typescript": "3.6.2",
|
||||||
"vsce": "1.48.0",
|
"vsce": "1.48.0",
|
||||||
"vscode-telemetry-extractor": "^1.5.4",
|
"vscode-telemetry-extractor": "^1.5.4",
|
||||||
"xml2js": "^0.4.17"
|
"xml2js": "^0.4.17"
|
||||||
|
|||||||
57
build/testSetup.js
Normal file
57
build/testSetup.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
const fs = require('fs').promises;
|
||||||
|
const path = require('path');
|
||||||
|
const readConfiguration = (async () => {
|
||||||
|
const parseConfigString = ((content) => {
|
||||||
|
try {
|
||||||
|
const result = JSON.parse(content);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
console.log('Could NOT parse TEST_RUN_LIST:', content);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Attempt to read from an enviornment variable
|
||||||
|
const testRunlist = process.env['TEST_RUN_LIST'];
|
||||||
|
if (testRunlist && testRunlist !== '') {
|
||||||
|
const result = parseConfigString(testRunlist);
|
||||||
|
if (result) {
|
||||||
|
console.log('Using the environment test run list:', result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Attempt to read from a config file
|
||||||
|
let testRunPath = process.env['TEST_RUN_LIST_FILE'];
|
||||||
|
if (!testRunPath || testRunPath === '') {
|
||||||
|
testRunPath = path.resolve(__dirname, '..', 'runlist.json');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const contents = await fs.readFile(testRunPath);
|
||||||
|
return parseConfigString(contents);
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
console.log(`error reading file ${testRunPath}:`, ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
(async () => {
|
||||||
|
const keys = process.argv.slice(2);
|
||||||
|
const configuration = await readConfiguration();
|
||||||
|
if (!configuration) {
|
||||||
|
console.log('no configuration was setup');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const testList = [];
|
||||||
|
keys.forEach((key) => {
|
||||||
|
const arr = configuration[key];
|
||||||
|
if (arr) {
|
||||||
|
testList.push(...arr);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const result = `(${testList.join('|')})`;
|
||||||
|
console.log(result);
|
||||||
|
process.env['TEST_GREP'] = result;
|
||||||
|
})();
|
||||||
67
build/testSetup.ts
Normal file
67
build/testSetup.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
const fs = require('fs').promises;
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
interface IntegrationTestConfig {
|
||||||
|
[key: string]: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const readConfiguration = (async (): Promise<IntegrationTestConfig | void> => {
|
||||||
|
const parseConfigString = ((content: string): (IntegrationTestConfig | void) => {
|
||||||
|
try {
|
||||||
|
const result = JSON.parse(content);
|
||||||
|
return result as IntegrationTestConfig;
|
||||||
|
} catch (ex) {
|
||||||
|
console.log('Could NOT parse TEST_RUN_LIST:', content);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Attempt to read from an enviornment variable
|
||||||
|
const testRunlist = process.env['TEST_RUN_LIST'];
|
||||||
|
if (testRunlist && testRunlist !== '') {
|
||||||
|
const result = parseConfigString(testRunlist);
|
||||||
|
if (result) {
|
||||||
|
console.log('Using the environment test run list:', result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to read from a config file
|
||||||
|
let testRunPath = process.env['TEST_RUN_LIST_FILE'];
|
||||||
|
if (!testRunPath || testRunPath === '') {
|
||||||
|
testRunPath = path.resolve(__dirname, '..', 'runlist.json');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const contents = await fs.readFile(testRunPath);
|
||||||
|
return parseConfigString(contents);
|
||||||
|
} catch (ex) {
|
||||||
|
console.log(`error reading file ${testRunPath}:`, ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
(async (): Promise<string | void> => {
|
||||||
|
const keys = process.argv.slice(2);
|
||||||
|
|
||||||
|
const configuration = await readConfiguration();
|
||||||
|
|
||||||
|
if (!configuration) {
|
||||||
|
console.log('no configuration was setup');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const testList: string[] = [];
|
||||||
|
keys.forEach((key) => {
|
||||||
|
const arr = configuration[key];
|
||||||
|
if (arr) {
|
||||||
|
testList.push(...arr);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = `(${testList.join('|')})`;
|
||||||
|
console.log(result);
|
||||||
|
process.env['TEST_GREP'] = result;
|
||||||
|
})();
|
||||||
@@ -20,8 +20,8 @@ Compression=lzma
|
|||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
AppMutex={code:GetAppMutex}
|
AppMutex={code:GetAppMutex}
|
||||||
SetupMutex={#AppMutex}setup
|
SetupMutex={#AppMutex}setup
|
||||||
WizardImageFile="{#RepoDir}\resources\win32\inno-big-100.bmp,{#RepoDir}\resources\win32\inno-big-125.bmp,{#RepoDir}\resources\win32\inno-big-150.bmp,{#RepoDir}\resources\win32\inno-big-175.bmp,{#RepoDir}\resources\win32\inno-big-200.bmp,{#RepoDir}\resources\win32\inno-big-225.bmp,{#RepoDir}\resources\win32\inno-big-250.bmp"
|
WizardImageFile="{#RepoDir}\resources\win32\sql-big.bmp"
|
||||||
WizardSmallImageFile="{#RepoDir}\resources\win32\inno-small-100.bmp,{#RepoDir}\resources\win32\inno-small-125.bmp,{#RepoDir}\resources\win32\inno-small-150.bmp,{#RepoDir}\resources\win32\inno-small-175.bmp,{#RepoDir}\resources\win32\inno-small-200.bmp,{#RepoDir}\resources\win32\inno-small-225.bmp,{#RepoDir}\resources\win32\inno-small-250.bmp"
|
WizardSmallImageFile="{#RepoDir}\resources\win32\sql-small.bmp"
|
||||||
SetupIconFile={#RepoDir}\resources\win32\code.ico
|
SetupIconFile={#RepoDir}\resources\win32\code.ico
|
||||||
UninstallDisplayIcon={app}\{#ExeBasename}.exe
|
UninstallDisplayIcon={app}\{#ExeBasename}.exe
|
||||||
ChangesEnvironment=true
|
ChangesEnvironment=true
|
||||||
|
|||||||
233
build/yarn.lock
233
build/yarn.lock
@@ -68,6 +68,11 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/estree@0.0.39":
|
||||||
|
version "0.0.39"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
|
||||||
|
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
|
||||||
|
|
||||||
"@types/events@*":
|
"@types/events@*":
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
|
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
|
||||||
@@ -192,6 +197,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.13.tgz#ac786d623860adf39a3f51d629480aacd6a6eec7"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.13.tgz#ac786d623860adf39a3f51d629480aacd6a6eec7"
|
||||||
integrity sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==
|
integrity sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==
|
||||||
|
|
||||||
|
"@types/node@^12.7.5":
|
||||||
|
version "12.7.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.8.tgz#cb1bf6800238898bc2ff6ffa5702c3cadd350708"
|
||||||
|
integrity sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==
|
||||||
|
|
||||||
"@types/pump@^1.0.1":
|
"@types/pump@^1.0.1":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/pump/-/pump-1.0.1.tgz#ae8157cefef04d1a4d24c1cc91d403c2f5da5cd0"
|
resolved "https://registry.yarnpkg.com/@types/pump/-/pump-1.0.1.tgz#ae8157cefef04d1a4d24c1cc91d403c2f5da5cd0"
|
||||||
@@ -209,6 +219,13 @@
|
|||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
"@types/tough-cookie" "*"
|
"@types/tough-cookie" "*"
|
||||||
|
|
||||||
|
"@types/resolve@0.0.8":
|
||||||
|
version "0.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194"
|
||||||
|
integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/rimraf@^2.0.2":
|
"@types/rimraf@^2.0.2":
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e"
|
resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e"
|
||||||
@@ -217,6 +234,13 @@
|
|||||||
"@types/glob" "*"
|
"@types/glob" "*"
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/terser@^3.12.0":
|
||||||
|
version "3.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/terser/-/terser-3.12.0.tgz#25e020fe9a7a6ae92ce46261f00ced67de6c12ac"
|
||||||
|
integrity sha512-J0Wy8A7ULEqVJftkWhrXZbH0iBk4tYuTj0gBiiveKaY9deNi6cCsxl0ApJ27ojqwYv51bvEw85lOb8Wt4ng9zA==
|
||||||
|
dependencies:
|
||||||
|
terser "*"
|
||||||
|
|
||||||
"@types/through2@^2.0.34":
|
"@types/through2@^2.0.34":
|
||||||
version "2.0.34"
|
version "2.0.34"
|
||||||
resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.34.tgz#9c2a259a238dace2a05a2f8e94b786961bc27ac4"
|
resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.34.tgz#9c2a259a238dace2a05a2f8e94b786961bc27ac4"
|
||||||
@@ -236,20 +260,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.2.tgz#e0d481d8bb282ad8a8c9e100ceb72c995fb5e709"
|
resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.2.tgz#e0d481d8bb282ad8a8c9e100ceb72c995fb5e709"
|
||||||
integrity sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==
|
integrity sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==
|
||||||
|
|
||||||
"@types/uglify-es@^3.0.0":
|
|
||||||
version "3.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/uglify-es/-/uglify-es-3.0.0.tgz#2c5e70b43c0e86643ac1c223f61df15fa0b87bc2"
|
|
||||||
integrity sha512-Oc/c7pGIQL0MVhC6g+VftWiDQethKsT4c3fQKYm6nOprkvkx9s1MLrnJprDTKlZL3ZJulMpCF9Qn7s6u3uCNxQ==
|
|
||||||
dependencies:
|
|
||||||
"@types/uglify-js" "*"
|
|
||||||
|
|
||||||
"@types/uglify-js@*":
|
|
||||||
version "3.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.3.tgz#801a5ca1dc642861f47c46d14b700ed2d610840b"
|
|
||||||
integrity sha512-MAT0BW2ruO0LhQKjvlipLGCF/Yx0y/cj+tT67tK3QIQDrM2+9R78HgJ54VlrE8AbfjYJJBCQCEPM5ZblPVTuww==
|
|
||||||
dependencies:
|
|
||||||
source-map "^0.6.1"
|
|
||||||
|
|
||||||
"@types/uglify-js@^2":
|
"@types/uglify-js@^2":
|
||||||
version "2.6.32"
|
version "2.6.32"
|
||||||
resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.32.tgz#1b60906946fcf6ee4ceafa812d2b86f1358da904"
|
resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.32.tgz#1b60906946fcf6ee4ceafa812d2b86f1358da904"
|
||||||
@@ -307,6 +317,11 @@ acorn@4.X:
|
|||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
|
||||||
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
|
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
|
||||||
|
|
||||||
|
acorn@^7.0.0:
|
||||||
|
version "7.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
|
||||||
|
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
|
||||||
|
|
||||||
agent-base@4, agent-base@^4.1.0:
|
agent-base@4, agent-base@^4.1.0:
|
||||||
version "4.2.1"
|
version "4.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
|
||||||
@@ -433,6 +448,11 @@ array-differ@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
|
resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
|
||||||
integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
|
integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
|
||||||
|
|
||||||
|
array-each@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
|
||||||
|
integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
|
||||||
|
|
||||||
array-union@^1.0.1:
|
array-union@^1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
|
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
|
||||||
@@ -686,6 +706,11 @@ buffer-fill@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
||||||
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
||||||
|
|
||||||
|
buffer-from@^1.0.0:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||||
|
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
|
||||||
|
|
||||||
buffer@^5.2.1:
|
buffer@^5.2.1:
|
||||||
version "5.2.1"
|
version "5.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
|
||||||
@@ -699,6 +724,11 @@ builtin-modules@^1.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
|
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
|
||||||
integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
|
integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
|
||||||
|
|
||||||
|
builtin-modules@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
|
||||||
|
integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
|
||||||
|
|
||||||
cache-base@^1.0.1:
|
cache-base@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
|
resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
|
||||||
@@ -869,6 +899,11 @@ commander@^2.12.1, commander@^2.8.1:
|
|||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||||
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
|
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
|
||||||
|
|
||||||
|
commander@^2.20.0, commander@~2.20.0:
|
||||||
|
version "2.20.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
||||||
|
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
|
||||||
|
|
||||||
commander@~2.8.1:
|
commander@~2.8.1:
|
||||||
version "2.8.1"
|
version "2.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
||||||
@@ -1239,6 +1274,11 @@ esprima@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||||
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
||||||
|
|
||||||
|
estree-walker@^0.6.1:
|
||||||
|
version "0.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
|
||||||
|
integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
|
||||||
|
|
||||||
esutils@^2.0.2:
|
esutils@^2.0.2:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
|
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
|
||||||
@@ -1619,6 +1659,22 @@ gulp-sourcemaps@^1.11.0:
|
|||||||
through2 "2.X"
|
through2 "2.X"
|
||||||
vinyl "1.X"
|
vinyl "1.X"
|
||||||
|
|
||||||
|
gulp-uglify@^3.0.0:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.2.tgz#5f5b2e8337f879ca9dec971feb1b82a5a87850b0"
|
||||||
|
integrity sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==
|
||||||
|
dependencies:
|
||||||
|
array-each "^1.0.1"
|
||||||
|
extend-shallow "^3.0.2"
|
||||||
|
gulplog "^1.0.0"
|
||||||
|
has-gulplog "^0.1.0"
|
||||||
|
isobject "^3.0.1"
|
||||||
|
make-error-cause "^1.1.1"
|
||||||
|
safe-buffer "^5.1.2"
|
||||||
|
through2 "^2.0.0"
|
||||||
|
uglify-js "^3.0.5"
|
||||||
|
vinyl-sourcemaps-apply "^0.2.0"
|
||||||
|
|
||||||
gulp-util@^3.0.0:
|
gulp-util@^3.0.0:
|
||||||
version "3.0.8"
|
version "3.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
|
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
|
||||||
@@ -1985,6 +2041,11 @@ is-glob@^4.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-extglob "^2.1.1"
|
is-extglob "^2.1.1"
|
||||||
|
|
||||||
|
is-module@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
|
||||||
|
integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
|
||||||
|
|
||||||
is-natural-number@^4.0.1:
|
is-natural-number@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
||||||
@@ -2033,6 +2094,13 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
isobject "^3.0.1"
|
isobject "^3.0.1"
|
||||||
|
|
||||||
|
is-reference@^1.1.2:
|
||||||
|
version "1.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427"
|
||||||
|
integrity sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==
|
||||||
|
dependencies:
|
||||||
|
"@types/estree" "0.0.39"
|
||||||
|
|
||||||
is-relative@^1.0.0:
|
is-relative@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
|
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
|
||||||
@@ -2313,6 +2381,13 @@ lodash@^4.15.0, lodash@^4.17.10:
|
|||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
||||||
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
|
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
|
||||||
|
|
||||||
|
magic-string@^0.25.2:
|
||||||
|
version "0.25.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.3.tgz#34b8d2a2c7fec9d9bdf9929a3fd81d271ef35be9"
|
||||||
|
integrity sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==
|
||||||
|
dependencies:
|
||||||
|
sourcemap-codec "^1.4.4"
|
||||||
|
|
||||||
make-dir@^1.0.0:
|
make-dir@^1.0.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
||||||
@@ -2320,6 +2395,18 @@ make-dir@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
pify "^3.0.0"
|
pify "^3.0.0"
|
||||||
|
|
||||||
|
make-error-cause@^1.1.1:
|
||||||
|
version "1.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d"
|
||||||
|
integrity sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=
|
||||||
|
dependencies:
|
||||||
|
make-error "^1.2.0"
|
||||||
|
|
||||||
|
make-error@^1.2.0:
|
||||||
|
version "1.3.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
|
||||||
|
integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
|
||||||
|
|
||||||
map-cache@^0.2.2:
|
map-cache@^0.2.2:
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
|
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
|
||||||
@@ -2719,7 +2806,7 @@ path-is-inside@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
|
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
|
||||||
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
|
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
|
||||||
|
|
||||||
path-parse@^1.0.5:
|
path-parse@^1.0.5, path-parse@^1.0.6:
|
||||||
version "1.0.6"
|
version "1.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
|
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
|
||||||
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
|
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
|
||||||
@@ -2978,6 +3065,13 @@ resolve-url@^0.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
||||||
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
|
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
|
||||||
|
|
||||||
|
resolve@^1.11.0, resolve@^1.11.1:
|
||||||
|
version "1.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
|
||||||
|
integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
|
||||||
|
dependencies:
|
||||||
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
resolve@^1.3.2:
|
resolve@^1.3.2:
|
||||||
version "1.8.1"
|
version "1.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
|
||||||
@@ -3007,6 +3101,44 @@ rimraf@^2.2.8, rimraf@^2.6.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.1.3"
|
glob "^7.1.3"
|
||||||
|
|
||||||
|
rollup-plugin-commonjs@^10.1.0:
|
||||||
|
version "10.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb"
|
||||||
|
integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==
|
||||||
|
dependencies:
|
||||||
|
estree-walker "^0.6.1"
|
||||||
|
is-reference "^1.1.2"
|
||||||
|
magic-string "^0.25.2"
|
||||||
|
resolve "^1.11.0"
|
||||||
|
rollup-pluginutils "^2.8.1"
|
||||||
|
|
||||||
|
rollup-plugin-node-resolve@^5.2.0:
|
||||||
|
version "5.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523"
|
||||||
|
integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==
|
||||||
|
dependencies:
|
||||||
|
"@types/resolve" "0.0.8"
|
||||||
|
builtin-modules "^3.1.0"
|
||||||
|
is-module "^1.0.0"
|
||||||
|
resolve "^1.11.1"
|
||||||
|
rollup-pluginutils "^2.8.1"
|
||||||
|
|
||||||
|
rollup-pluginutils@^2.8.1:
|
||||||
|
version "2.8.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
|
||||||
|
integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
|
||||||
|
dependencies:
|
||||||
|
estree-walker "^0.6.1"
|
||||||
|
|
||||||
|
rollup@^1.20.3:
|
||||||
|
version "1.21.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.21.4.tgz#00a41a30f90095db890301b226cbe2918e4cf54d"
|
||||||
|
integrity sha512-Pl512XVCmVzgcBz5h/3Li4oTaoDcmpuFZ+kdhS/wLreALz//WuDAMfomD3QEYl84NkDu6Z6wV9twlcREb4qQsw==
|
||||||
|
dependencies:
|
||||||
|
"@types/estree" "0.0.39"
|
||||||
|
"@types/node" "^12.7.5"
|
||||||
|
acorn "^7.0.0"
|
||||||
|
|
||||||
run-parallel@^1.1.9:
|
run-parallel@^1.1.9:
|
||||||
version "1.1.9"
|
version "1.1.9"
|
||||||
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
|
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
|
||||||
@@ -3017,7 +3149,12 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
|
||||||
integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==
|
integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==
|
||||||
|
|
||||||
safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
safe-buffer@^5.1.2:
|
||||||
|
version "5.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
|
||||||
|
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
|
||||||
|
|
||||||
|
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||||
@@ -3163,21 +3300,34 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
|
|||||||
source-map-url "^0.4.0"
|
source-map-url "^0.4.0"
|
||||||
urix "^0.1.0"
|
urix "^0.1.0"
|
||||||
|
|
||||||
|
source-map-support@~0.5.12:
|
||||||
|
version "0.5.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
|
||||||
|
integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
|
||||||
|
dependencies:
|
||||||
|
buffer-from "^1.0.0"
|
||||||
|
source-map "^0.6.0"
|
||||||
|
|
||||||
source-map-url@^0.4.0:
|
source-map-url@^0.4.0:
|
||||||
version "0.4.0"
|
version "0.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
|
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
|
||||||
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
|
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
|
||||||
|
|
||||||
source-map@^0.5.6:
|
source-map@^0.5.1, source-map@^0.5.6:
|
||||||
version "0.5.7"
|
version "0.5.7"
|
||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||||
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
|
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
|
||||||
|
|
||||||
source-map@^0.6.1, source-map@~0.6.0:
|
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||||
|
|
||||||
|
sourcemap-codec@^1.4.4:
|
||||||
|
version "1.4.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9"
|
||||||
|
integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==
|
||||||
|
|
||||||
sparkles@^1.0.0:
|
sparkles@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
|
resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
|
||||||
@@ -3323,6 +3473,24 @@ tar@^4:
|
|||||||
safe-buffer "^5.1.2"
|
safe-buffer "^5.1.2"
|
||||||
yallist "^3.0.2"
|
yallist "^3.0.2"
|
||||||
|
|
||||||
|
terser@*:
|
||||||
|
version "4.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/terser/-/terser-4.2.1.tgz#1052cfe17576c66e7bc70fcc7119f22b155bdac1"
|
||||||
|
integrity sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A==
|
||||||
|
dependencies:
|
||||||
|
commander "^2.20.0"
|
||||||
|
source-map "~0.6.1"
|
||||||
|
source-map-support "~0.5.12"
|
||||||
|
|
||||||
|
terser@4.3.1:
|
||||||
|
version "4.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.1.tgz#09820bcb3398299c4b48d9a86aefc65127d0ed65"
|
||||||
|
integrity sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==
|
||||||
|
dependencies:
|
||||||
|
commander "^2.20.0"
|
||||||
|
source-map "~0.6.1"
|
||||||
|
source-map-support "~0.5.12"
|
||||||
|
|
||||||
through2@2.X, through2@^2.0.0, through2@^2.0.3:
|
through2@2.X, through2@^2.0.0, through2@^2.0.3:
|
||||||
version "2.0.3"
|
version "2.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
|
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
|
||||||
@@ -3475,10 +3643,10 @@ typed-rest-client@^0.9.0:
|
|||||||
tunnel "0.0.4"
|
tunnel "0.0.4"
|
||||||
underscore "1.8.3"
|
underscore "1.8.3"
|
||||||
|
|
||||||
typescript@3.5.2:
|
typescript@3.6.2:
|
||||||
version "3.5.2"
|
version "3.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.2.tgz#a09e1dc69bc9551cadf17dba10ee42cf55e5d56c"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.2.tgz#105b0f1934119dde543ac8eb71af3a91009efe54"
|
||||||
integrity sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==
|
integrity sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==
|
||||||
|
|
||||||
typescript@^3.0.1:
|
typescript@^3.0.1:
|
||||||
version "3.5.3"
|
version "3.5.3"
|
||||||
@@ -3495,6 +3663,14 @@ uc.micro@^1.0.1, uc.micro@^1.0.5:
|
|||||||
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
|
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
|
||||||
integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==
|
integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==
|
||||||
|
|
||||||
|
uglify-js@^3.0.5:
|
||||||
|
version "3.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5"
|
||||||
|
integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==
|
||||||
|
dependencies:
|
||||||
|
commander "~2.20.0"
|
||||||
|
source-map "~0.6.1"
|
||||||
|
|
||||||
unbzip2-stream@^1.0.9:
|
unbzip2-stream@^1.0.9:
|
||||||
version "1.3.3"
|
version "1.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
|
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
|
||||||
@@ -3590,6 +3766,13 @@ verror@1.10.0:
|
|||||||
core-util-is "1.0.2"
|
core-util-is "1.0.2"
|
||||||
extsprintf "^1.2.0"
|
extsprintf "^1.2.0"
|
||||||
|
|
||||||
|
vinyl-sourcemaps-apply@^0.2.0:
|
||||||
|
version "0.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
|
||||||
|
integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=
|
||||||
|
dependencies:
|
||||||
|
source-map "^0.5.1"
|
||||||
|
|
||||||
vinyl@1.X:
|
vinyl@1.X:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
|
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
|
||||||
@@ -3632,9 +3815,9 @@ vsce@1.48.0:
|
|||||||
yazl "^2.2.2"
|
yazl "^2.2.2"
|
||||||
|
|
||||||
vscode-ripgrep@^1.5.6:
|
vscode-ripgrep@^1.5.6:
|
||||||
version "1.5.6"
|
version "1.5.7"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.5.6.tgz#93bf5c99ca5f8248950a305e224f6ca153c30af4"
|
resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.5.7.tgz#acb6b548af488a4bca5d0f1bb5faf761343289ce"
|
||||||
integrity sha512-WRIM9XpUj6dsfdAmuI3ANbmT1ysPUVsYy/2uCLDHJa9kbiB4T7uGvFnnc0Rgx2qQnyRAwL7PeWaFgUljPPxf2g==
|
integrity sha512-/Vsz/+k8kTvui0q3O74pif9FK0nKopgFTiGNVvxicZANxtSA8J8gUE9GQ/4dpi7D/2yI/YVORszwVskFbz46hQ==
|
||||||
|
|
||||||
vscode-telemetry-extractor@^1.5.4:
|
vscode-telemetry-extractor@^1.5.4:
|
||||||
version "1.5.4"
|
version "1.5.4"
|
||||||
|
|||||||
@@ -46,56 +46,6 @@
|
|||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
|
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// Reason: The npm module does not contain a repository field.
|
|
||||||
"name": "xterm-addon-search",
|
|
||||||
"fullLicenseText": [
|
|
||||||
"Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy",
|
|
||||||
"of this software and associated documentation files (the \"Software\"), to deal",
|
|
||||||
"in the Software without restriction, including without limitation the rights",
|
|
||||||
"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell",
|
|
||||||
"copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
"furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in",
|
|
||||||
"all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
|
|
||||||
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN",
|
|
||||||
"THE SOFTWARE."
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Reason: The npm module does not contain a repository field.
|
|
||||||
"name": "xterm-addon-web-links",
|
|
||||||
"fullLicenseText": [
|
|
||||||
"Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy",
|
|
||||||
"of this software and associated documentation files (the \"Software\"), to deal",
|
|
||||||
"in the Software without restriction, including without limitation the rights",
|
|
||||||
"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell",
|
|
||||||
"copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
"furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in",
|
|
||||||
"all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
|
|
||||||
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN",
|
|
||||||
"THE SOFTWARE."
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// Reason: The license at https://git.coolaj86.com/coolaj86/atob.js/src/branch/master/LICENSE
|
// Reason: The license at https://git.coolaj86.com/coolaj86/atob.js/src/branch/master/LICENSE
|
||||||
// cannot be found by the OSS tool automatically.
|
// cannot be found by the OSS tool automatically.
|
||||||
|
|||||||
@@ -60,12 +60,12 @@
|
|||||||
"git": {
|
"git": {
|
||||||
"name": "electron",
|
"name": "electron",
|
||||||
"repositoryUrl": "https://github.com/electron/electron",
|
"repositoryUrl": "https://github.com/electron/electron",
|
||||||
"commitHash": "3d4d6454007f14fa9a5f0e1fa49206fb91b676cc"
|
"commitHash": "4e4c7527c63fcf27dffaeb58bde996b8d859c0ed"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"isOnlyProductionDependency": true,
|
"isOnlyProductionDependency": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"version": "4.2.9"
|
"version": "4.2.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"component": {
|
"component": {
|
||||||
@@ -98,11 +98,11 @@
|
|||||||
"git": {
|
"git": {
|
||||||
"name": "vscode-octicons-font",
|
"name": "vscode-octicons-font",
|
||||||
"repositoryUrl": "https://github.com/Microsoft/vscode-octicons-font",
|
"repositoryUrl": "https://github.com/Microsoft/vscode-octicons-font",
|
||||||
"commitHash": "415cd5b42ab699b6b46c0bf011ada0a2ae50bfb4"
|
"commitHash": "4cbf2bd35cf0084eabd47d322cc58339fd7743cf"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"version": "1.3.1"
|
"version": "1.3.2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"component": {
|
"component": {
|
||||||
|
|||||||
@@ -1,84 +1,86 @@
|
|||||||
{
|
{
|
||||||
"name": "admin-tool-ext-win",
|
"name": "admin-tool-ext-win",
|
||||||
"displayName": "%adminToolExtWin.displayName%",
|
"displayName": "%adminToolExtWin.displayName%",
|
||||||
"description": "%adminToolExtWin.description%",
|
"description": "%adminToolExtWin.description%",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
"publisher": "Microsoft",
|
"publisher": "Microsoft",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/extensions/admin-tool-ext-win/license/Azure%20Data%20Studio%20Extension%20-%20Standalone%20(free)%20Use%20Terms.txt",
|
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/extensions/admin-tool-ext-win/license/Azure%20Data%20Studio%20Extension%20-%20Standalone%20(free)%20Use%20Terms.txt",
|
||||||
"icon": "images/sqlserver.png",
|
"icon": "images/sqlserver.png",
|
||||||
"aiKey": "AIF-5574968e-856d-40d2-af67-c89a14e76412",
|
"aiKey": "AIF-444c3af9-8e69-4462-ab49-4191e6ad1916",
|
||||||
"engines": {
|
"engines": {
|
||||||
"vscode": "^1.30.1",
|
"vscode": "^1.30.1",
|
||||||
"azdata": ">=1.8.0"
|
"azdata": ">=1.8.0"
|
||||||
},
|
},
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"main": "./out/main",
|
"main": "./out/main",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Microsoft/azuredatastudio.git"
|
"url": "https://github.com/Microsoft/azuredatastudio.git"
|
||||||
},
|
},
|
||||||
"extensionDependencies": [
|
"extensionDependencies": [
|
||||||
"Microsoft.mssql"
|
"Microsoft.mssql"
|
||||||
],
|
],
|
||||||
"contributes": {
|
"contributes": {
|
||||||
"commands": [
|
"commands": [
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
||||||
"title": "%adminToolExtWin.propertiesMenuItem%",
|
"title": "%adminToolExtWin.propertiesMenuItem%",
|
||||||
"category": "AdminToolExtWin"
|
"category": "AdminToolExtWin"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinGswDialog",
|
"command": "adminToolExtWin.launchSsmsMinGswDialog",
|
||||||
"title": "%adminToolExtWin.launchGswMenuItem%",
|
"title": "%adminToolExtWin.launchGswMenuItem%",
|
||||||
"category": "AdminToolExtWin"
|
"category": "AdminToolExtWin"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"menus": {
|
"menus": {
|
||||||
"commandPalette": [
|
"commandPalette": [
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
||||||
"when": "false"
|
"when": "false"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinGswDialog",
|
"command": "adminToolExtWin.launchSsmsMinGswDialog",
|
||||||
"when": "false"
|
"when": "false"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"objectExplorer/item/context": [
|
"objectExplorer/item/context": [
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinGswDialog",
|
"command": "adminToolExtWin.launchSsmsMinGswDialog",
|
||||||
"when": "isWindows && connectionProvider == MSSQL && nodeType && nodeType == Database",
|
"when": "isWindows && connectionProvider == MSSQL && nodeType && nodeType == Database && mssql:engineedition != 11",
|
||||||
"group": "z-AdminToolExt@1"
|
"group": "z-AdminToolExt@1"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
||||||
"when": "isWindows && connectionProvider == MSSQL && serverInfo && !isCloud && nodeType && nodeType == Server",
|
"when": "isWindows && connectionProvider == MSSQL && serverInfo && !isCloud && nodeType && nodeType == Server && mssql:engineedition != 11",
|
||||||
"group": "z-AdminToolExt@2"
|
"group": "z-AdminToolExt@2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
"command": "adminToolExtWin.launchSsmsMinPropertiesDialog",
|
||||||
"when": "isWindows && connectionProvider == MSSQL && serverInfo && nodeType && nodeType =~ /^(Database|Table|Column|Index|Statistic|View|ServerLevelLogin|ServerLevelServerRole|ServerLevelCredential|ServerLevelServerAudit|ServerLevelServerAuditSpecification|StoredProcedure|ScalarValuedFunction|TableValuedFunction|AggregateFunction|Synonym|Assembly|UserDefinedDataType|UserDefinedType|UserDefinedTableType|Sequence|User|DatabaseRole|ApplicationRole|Schema|SecurityPolicy|ServerLevelLinkedServer)$/",
|
"when": "isWindows && connectionProvider == MSSQL && serverInfo && nodeType && mssql:engineedition != 11 && nodeType =~ /^(Database|Table|Column|Index|Statistic|View|ServerLevelLogin|ServerLevelServerRole|ServerLevelCredential|ServerLevelServerAudit|ServerLevelServerAuditSpecification|StoredProcedure|ScalarValuedFunction|TableValuedFunction|AggregateFunction|Synonym|Assembly|UserDefinedDataType|UserDefinedType|UserDefinedTableType|Sequence|User|DatabaseRole|ApplicationRole|Schema|SecurityPolicy|ServerLevelLinkedServer)$/",
|
||||||
"group": "z-AdminToolExt@2"
|
"group": "z-AdminToolExt@2"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"outputChannels": [
|
"outputChannels": [
|
||||||
"admin-tool-ext-win"
|
"admin-tool-ext-win"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ads-extension-telemetry": "github:Charles-Gagnon/ads-extension-telemetry#0.1.0",
|
"ads-extension-telemetry": "github:Charles-Gagnon/ads-extension-telemetry#0.1.0",
|
||||||
"vscode-nls": "^3.2.1"
|
"vscode-nls": "^3.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vscode": "1.0.1"
|
"vscode": "^1.1.10",
|
||||||
},
|
"mocha-junit-reporter": "^1.17.0",
|
||||||
"__metadata": {
|
"mocha-multi-reporters": "^1.1.7"
|
||||||
"id": "41",
|
},
|
||||||
"publisherDisplayName": "Microsoft",
|
"__metadata": {
|
||||||
"publisherId": "Microsoft"
|
"id": "41",
|
||||||
}
|
"publisherDisplayName": "Microsoft",
|
||||||
}
|
"publisherId": "Microsoft"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ import * as vscode from 'vscode';
|
|||||||
import { TelemetryReporter, TelemetryViews } from './telemetry';
|
import { TelemetryReporter, TelemetryViews } from './telemetry';
|
||||||
import { doubleEscapeSingleQuotes, backEscapeDoubleQuotes, getTelemetryErrorType } from './utils';
|
import { doubleEscapeSingleQuotes, backEscapeDoubleQuotes, getTelemetryErrorType } from './utils';
|
||||||
import { ChildProcess, exec } from 'child_process';
|
import { ChildProcess, exec } from 'child_process';
|
||||||
|
import { promises as fs } from 'fs';
|
||||||
|
|
||||||
const localize = nls.loadMessageBundle();
|
const localize = nls.loadMessageBundle();
|
||||||
const ssmsMinVer = JSON.parse(JSON.stringify(require('./config.json'))).version;
|
|
||||||
|
|
||||||
let exePath: string;
|
let exePath: string;
|
||||||
const runningProcesses: Map<number, ChildProcess> = new Map<number, ChildProcess>();
|
const runningProcesses: Map<number, ChildProcess> = new Map<number, ChildProcess>();
|
||||||
@@ -66,6 +67,8 @@ export interface LaunchSsmsDialogParams {
|
|||||||
export async function activate(context: vscode.ExtensionContext): Promise<void> {
|
export async function activate(context: vscode.ExtensionContext): Promise<void> {
|
||||||
// This is for Windows-specific support so do nothing on other platforms
|
// This is for Windows-specific support so do nothing on other platforms
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
|
const rawConfig = await fs.readFile(path.join(context.extensionPath, 'config.json'));
|
||||||
|
const ssmsMinVer = JSON.parse(rawConfig.toString()).version;
|
||||||
exePath = path.join(context.extensionPath, 'ssmsmin', 'Windows', ssmsMinVer, 'ssmsmin.exe');
|
exePath = path.join(context.extensionPath, 'ssmsmin', 'Windows', ssmsMinVer, 'ssmsmin.exe');
|
||||||
registerCommands(context);
|
registerCommands(context);
|
||||||
}
|
}
|
||||||
@@ -259,4 +262,4 @@ export async function buildUrn(node: azdata.objectexplorer.ObjectExplorerNode):
|
|||||||
}
|
}
|
||||||
|
|
||||||
return ['Server'].concat(urnNodes).join('/');
|
return ['Server'].concat(urnNodes).join('/');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const testRunner = require('vscode/lib/testrunner');
|
const testRunner = require('vscode/lib/testrunner');
|
||||||
|
|
||||||
const suite = 'Database Admin Tool Extensions for Windows';
|
const suite = 'admin-tool-ext-win Extension Tests';
|
||||||
|
|
||||||
const options: any = {
|
const options: any = {
|
||||||
ui: 'bdd',
|
ui: 'bdd',
|
||||||
@@ -14,6 +14,24 @@ const options: any = {
|
|||||||
timeout: 600000
|
timeout: 600000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// set relevant mocha options from the environment
|
||||||
|
if (process.env.ADS_TEST_GREP) {
|
||||||
|
options.grep = process.env.ADS_TEST_GREP;
|
||||||
|
console.log(`setting options.grep to: ${options.grep}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_INVERT_GREP) {
|
||||||
|
options.invert = parseInt(process.env.ADS_TEST_INVERT_GREP);
|
||||||
|
console.log(`setting options.invert to: ${options.invert}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_TIMEOUT) {
|
||||||
|
options.timeout = parseInt(process.env.ADS_TEST_TIMEOUT);
|
||||||
|
console.log(`setting options.timeout to: ${options.timeout}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_RETRIES) {
|
||||||
|
options.retries = parseInt(process.env.ADS_TEST_RETRIES);
|
||||||
|
console.log(`setting options.retries to: ${options.retries}`);
|
||||||
|
}
|
||||||
|
|
||||||
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
||||||
options.reporter = 'mocha-multi-reporters';
|
options.reporter = 'mocha-multi-reporters';
|
||||||
options.reporterOptions = {
|
options.reporterOptions = {
|
||||||
@@ -27,4 +45,4 @@ if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
|||||||
|
|
||||||
testRunner.configure(options);
|
testRunner.configure(options);
|
||||||
|
|
||||||
export = testRunner;
|
export = testRunner;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,62 +1,98 @@
|
|||||||
{
|
{
|
||||||
"name": "agent",
|
"name": "agent",
|
||||||
"displayName": "SQL Server Agent",
|
"displayName": "SQL Server Agent",
|
||||||
"description": "Manage and troubleshoot SQL Server Agent jobs",
|
"description": "Manage and troubleshoot SQL Server Agent jobs",
|
||||||
"version": "0.41.0",
|
"version": "0.44.0",
|
||||||
"publisher": "Microsoft",
|
"publisher": "Microsoft",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt",
|
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt",
|
||||||
"icon": "images/sqlserver.png",
|
"icon": "images/sqlserver.png",
|
||||||
"aiKey": "AIF-5574968e-856d-40d2-af67-c89a14e76412",
|
"aiKey": "AIF-444c3af9-8e69-4462-ab49-4191e6ad1916",
|
||||||
"engines": {
|
"engines": {
|
||||||
"vscode": "^1.25.0"
|
"vscode": "^1.25.0"
|
||||||
},
|
},
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"main": "./out/main",
|
"main": "./out/main",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Microsoft/azuredatastudio.git"
|
"url": "https://github.com/Microsoft/azuredatastudio.git"
|
||||||
},
|
},
|
||||||
"extensionDependencies": [
|
"extensionDependencies": [
|
||||||
"Microsoft.mssql"
|
"Microsoft.mssql"
|
||||||
],
|
],
|
||||||
"contributes": {
|
"contributes": {
|
||||||
"outputChannels": [
|
"outputChannels": [
|
||||||
"sqlagent"
|
"sqlagent"
|
||||||
],
|
],
|
||||||
"dashboard.tabs": [
|
"dashboard.tabs": [
|
||||||
{
|
{
|
||||||
"id": "data-management-agent",
|
"id": "data-management-agent",
|
||||||
"description": "Manage and troubleshoot SQL Agent jobs",
|
"description": "Manage and troubleshoot SQL Agent jobs",
|
||||||
"provider": "MSSQL",
|
"provider": "MSSQL",
|
||||||
"title": "SQL Agent",
|
"title": "SQL Agent",
|
||||||
"when": "connectionProvider == 'MSSQL' && !mssql:iscloud",
|
"when": "connectionProvider == 'MSSQL' && !mssql:iscloud && mssql:engineedition != 11",
|
||||||
"container": {
|
"container": {
|
||||||
"controlhost-container": {
|
"controlhost-container": {
|
||||||
"type": "agent"
|
"type": "agent"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
},
|
"commands": [
|
||||||
"dependencies": {
|
{
|
||||||
"vscode-nls": "^3.2.1"
|
"command": "agent.openNotebookDialog",
|
||||||
},
|
"title": "Schedule Notebook",
|
||||||
"devDependencies": {
|
"icon": {
|
||||||
"mocha-junit-reporter": "^1.17.0",
|
"dark": "resources/dark/open_notebook_inverse.svg",
|
||||||
"mocha-multi-reporters": "^1.1.7",
|
"light": "resources/light/open_notebook.svg"
|
||||||
"@types/mocha": "^5.2.5",
|
}
|
||||||
"@types/node": "^8.10.25",
|
},
|
||||||
"mocha": "^5.2.0",
|
{
|
||||||
"should": "^13.2.1",
|
"command": "agent.reuploadTemplate",
|
||||||
"typemoq": "^2.1.0",
|
"title": "Update Template",
|
||||||
"vscode": "1.1.5"
|
"icon": {
|
||||||
},
|
"dark": "resources/dark/open_notebook_inverse.svg",
|
||||||
"__metadata": {
|
"light": "resources/light/open_notebook.svg"
|
||||||
"id": "10",
|
}
|
||||||
"publisherDisplayName": "Microsoft",
|
}
|
||||||
"publisherId": "Microsoft"
|
],
|
||||||
}
|
"menus": {
|
||||||
|
"notebook/toolbar": [
|
||||||
|
{
|
||||||
|
"command": "agent.openNotebookDialog",
|
||||||
|
"when": "providerId == sql && !agent:trackedTemplate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "agent.reuploadTemplate",
|
||||||
|
"when": "agent:trackedTemplate"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"explorer/context": [
|
||||||
|
{
|
||||||
|
"command": "agent.openNotebookDialog",
|
||||||
|
"when": "resourceExtname == .ipynb"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"vscode-nls": "^3.2.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"mocha-junit-reporter": "^1.17.0",
|
||||||
|
"mocha-multi-reporters": "^1.1.7",
|
||||||
|
"@types/mocha": "^5.2.5",
|
||||||
|
"@types/node": "^10.14.8",
|
||||||
|
"mocha": "^5.2.0",
|
||||||
|
"should": "^13.2.1",
|
||||||
|
"typemoq": "^2.1.0",
|
||||||
|
"vscode": "^1.1.10"
|
||||||
|
},
|
||||||
|
"__metadata": {
|
||||||
|
"id": "10",
|
||||||
|
"publisherDisplayName": "Microsoft",
|
||||||
|
"publisherId": "Microsoft"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
extensions/agent/resources/dark/notebook_inverse.svg
Normal file
1
extensions/agent/resources/dark/notebook_inverse.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#fff;}</style></defs><title>notebook_inverse</title><path class="cls-1" d="M15.46,2V15H.46V2h2V1h3a4.19,4.19,0,0,1,1.32.21A3.87,3.87,0,0,1,8,1.84a3.87,3.87,0,0,1,1.18-.63A4.19,4.19,0,0,1,10.46,1h3V2Zm-14,12h6.3a4.43,4.43,0,0,0-.51-.43,3.41,3.41,0,0,0-.54-.31,2.74,2.74,0,0,0-.59-.2A3.2,3.2,0,0,0,5.46,13h-3V3h-1Zm2-2h2a4.18,4.18,0,0,1,1,.13,4,4,0,0,1,1,.39V2.72a3,3,0,0,0-.94-.54A3.15,3.15,0,0,0,5.46,2h-2Zm11-9h-1V13h-3a3.2,3.2,0,0,0-.67.07,2.74,2.74,0,0,0-.59.2,3.41,3.41,0,0,0-.54.31,4.43,4.43,0,0,0-.51.43h6.3Zm-4-1a3.15,3.15,0,0,0-1.06.18,3,3,0,0,0-.94.54v9.8a4,4,0,0,1,1-.39,4.18,4.18,0,0,1,1-.13h2V2Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 734 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#0095d7;}</style></defs><title>open_notebook_inverse</title><path class="cls-1" d="M12.55,4.21l-.08-.11h-.56l-.69.06a1.54,1.54,0,0,0-.23.29v8.69H9.18a3.32,3.32,0,0,0-.93.13,3.34,3.34,0,0,0-.87.34V4.76a2.88,2.88,0,0,1,.43-.31A5.58,5.58,0,0,1,8.29,3.3a2.63,2.63,0,0,0-.3.09A3.62,3.62,0,0,0,6.93,4a3.68,3.68,0,0,0-1.07-.57A3.58,3.58,0,0,0,4.67,3.2H2v.9H.15V15.85H13.72V5.48ZM2.86,4.1H4.67a2.61,2.61,0,0,1,1,.17,2.32,2.32,0,0,1,.86.49v8.85a3.27,3.27,0,0,0-.88-.34,3.22,3.22,0,0,0-.93-.13H2.86ZM1,15V5H2v9H4.67a3.94,3.94,0,0,1,.61.06,3.2,3.2,0,0,1,.52.18,4.19,4.19,0,0,1,.49.29,2.28,2.28,0,0,1,.45.39ZM12.8,15H7.11a2.7,2.7,0,0,1,.47-.39A2.83,2.83,0,0,1,8,14.28a3.42,3.42,0,0,1,.54-.18A3.81,3.81,0,0,1,9.18,14h2.73V5h.89Z"/><polygon class="cls-2" points="13.2 3.56 13.2 3.58 13.19 3.57 13.2 3.56"/><path class="cls-2" d="M13.19,3.57h0v0Z"/><polygon class="cls-2" points="13.2 3.56 13.2 3.58 13.19 3.57 13.2 3.56"/><polygon class="cls-2" points="14.21 1.65 14.19 1.65 14.19 1.63 14.21 1.65"/><path class="cls-2" d="M15.91,2.1,14.2,3.81l-.38.38-.62-.61v0l1-1H12.79a3.35,3.35,0,0,0-1.09.26h0a3.94,3.94,0,0,0-.86.52l-.24.21s0,0,0,0a3.3,3.3,0,0,0-.51.67,3.1,3.1,0,0,0-.26.47A3.41,3.41,0,0,0,9.5,6.11H8.6a4.68,4.68,0,0,1,.16-1.19A4.74,4.74,0,0,1,9,4.26a2.21,2.21,0,0,1,.2-.41,4.66,4.66,0,0,1,.36-.51c.1-.13.22-.26.34-.39a4.14,4.14,0,0,1,.66-.53,1.19,1.19,0,0,1,.23-.16,2.79,2.79,0,0,1,.34-.18l.31-.13.42-.14a4.32,4.32,0,0,1,1.19-.16h1.15l-1-1L13.82,0Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
1
extensions/agent/resources/light/notebook.svg
Normal file
1
extensions/agent/resources/light/notebook.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><title>notebook</title><path d="M15.5,2V15H.5V2h2V1h3a4.19,4.19,0,0,1,1.32.21A3.87,3.87,0,0,1,8,1.84a3.87,3.87,0,0,1,1.18-.63A4.19,4.19,0,0,1,10.5,1h3V2ZM1.5,14H7.8a4.43,4.43,0,0,0-.51-.43,3.41,3.41,0,0,0-.54-.31,2.74,2.74,0,0,0-.59-.2A3.2,3.2,0,0,0,5.5,13h-3V3h-1Zm2-2h2a4.18,4.18,0,0,1,1,.13,4,4,0,0,1,1,.39V2.72a3,3,0,0,0-.94-.54A3.15,3.15,0,0,0,5.5,2h-2Zm11-9h-1V13h-3a3.2,3.2,0,0,0-.67.07,2.74,2.74,0,0,0-.59.2,3.41,3.41,0,0,0-.54.31A4.43,4.43,0,0,0,8.2,14h6.3Zm-4-1a3.15,3.15,0,0,0-1.06.18,3,3,0,0,0-.94.54v9.8a4,4,0,0,1,1-.39,4.18,4.18,0,0,1,1-.13h2V2Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 661 B |
1
extensions/agent/resources/light/open_notebook.svg
Normal file
1
extensions/agent/resources/light/open_notebook.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#00539c;}</style></defs><title>open_notebook</title><path d="M12.4,4.21l-.08-.11h-.56l-.69.06a1.54,1.54,0,0,0-.23.29v8.69H9a3.32,3.32,0,0,0-.93.13,3.34,3.34,0,0,0-.87.34V4.76a2.88,2.88,0,0,1,.43-.31A5.58,5.58,0,0,1,8.14,3.3a2.63,2.63,0,0,0-.3.09A3.62,3.62,0,0,0,6.78,4a3.68,3.68,0,0,0-1.07-.57A3.58,3.58,0,0,0,4.52,3.2H1.81v.9H0V15.85H13.57V5.48ZM2.71,4.1H4.52a2.61,2.61,0,0,1,1,.17,2.32,2.32,0,0,1,.86.49v8.85a3.27,3.27,0,0,0-.88-.34,3.22,3.22,0,0,0-.93-.13H2.71ZM.9,15V5h.91v9H4.52a3.94,3.94,0,0,1,.61.06,3.2,3.2,0,0,1,.52.18,4.19,4.19,0,0,1,.49.29,2.28,2.28,0,0,1,.45.39Zm11.75,0H7a2.7,2.7,0,0,1,.47-.39,2.83,2.83,0,0,1,.47-.29,3.42,3.42,0,0,1,.54-.18A3.81,3.81,0,0,1,9,14h2.73V5h.89Z"/><polygon class="cls-1" points="13.05 3.56 13.05 3.58 13.04 3.57 13.05 3.56"/><path class="cls-1" d="M13,3.57h0v0Z"/><polygon class="cls-1" points="13.05 3.56 13.05 3.58 13.04 3.57 13.05 3.56"/><polygon class="cls-1" points="14.06 1.65 14.04 1.65 14.04 1.63 14.06 1.65"/><path class="cls-1" d="M15.76,2.1,14,3.81l-.38.38L13,3.58v0l1-1H12.64a3.35,3.35,0,0,0-1.09.26h0a3.94,3.94,0,0,0-.86.52l-.24.21s0,0,0,0a3.3,3.3,0,0,0-.51.67,3.1,3.1,0,0,0-.26.47,3.41,3.41,0,0,0-.27,1.39h-.9a4.68,4.68,0,0,1,.16-1.19,4.74,4.74,0,0,1,.25-.66,2.21,2.21,0,0,1,.2-.41,4.66,4.66,0,0,1,.36-.51c.1-.13.22-.26.34-.39a4.14,4.14,0,0,1,.66-.53,1.19,1.19,0,0,1,.23-.16A2.79,2.79,0,0,1,11,2.08l.31-.13.42-.14a4.32,4.32,0,0,1,1.19-.16h1.15l-1-1L13.67,0Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -6,6 +6,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import * as azdata from 'azdata';
|
import * as azdata from 'azdata';
|
||||||
|
import { promises as fs } from 'fs';
|
||||||
|
|
||||||
export class AgentUtils {
|
export class AgentUtils {
|
||||||
|
|
||||||
@@ -13,6 +14,12 @@ export class AgentUtils {
|
|||||||
private static _connectionService: azdata.ConnectionProvider;
|
private static _connectionService: azdata.ConnectionProvider;
|
||||||
private static _queryProvider: azdata.QueryProvider;
|
private static _queryProvider: azdata.QueryProvider;
|
||||||
|
|
||||||
|
public static async setupProvidersFromConnection(connection?: azdata.connection.Connection) {
|
||||||
|
this._agentService = azdata.dataprotocol.getProvider<azdata.AgentServicesProvider>(connection.providerName, azdata.DataProviderType.AgentServicesProvider);
|
||||||
|
this._connectionService = azdata.dataprotocol.getProvider<azdata.ConnectionProvider>(connection.providerName, azdata.DataProviderType.ConnectionProvider);
|
||||||
|
this._queryProvider = azdata.dataprotocol.getProvider<azdata.QueryProvider>(connection.providerName, azdata.DataProviderType.QueryProvider);
|
||||||
|
}
|
||||||
|
|
||||||
public static async getAgentService(): Promise<azdata.AgentServicesProvider> {
|
public static async getAgentService(): Promise<azdata.AgentServicesProvider> {
|
||||||
if (!AgentUtils._agentService) {
|
if (!AgentUtils._agentService) {
|
||||||
let currentConnection = await azdata.connection.getCurrentConnection();
|
let currentConnection = await azdata.connection.getCurrentConnection();
|
||||||
@@ -41,4 +48,13 @@ export class AgentUtils {
|
|||||||
return this._queryProvider;
|
return this._queryProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function exists(path: string): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
await fs.access(path);
|
||||||
|
return true;
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
258
extensions/agent/src/data/notebookData.ts
Normal file
258
extensions/agent/src/data/notebookData.ts
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as nls from 'vscode-nls';
|
||||||
|
import * as azdata from 'azdata';
|
||||||
|
import * as vscode from 'vscode';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { AgentUtils, exists } from '../agentUtils';
|
||||||
|
import { IAgentDialogData, AgentDialogMode } from '../interfaces';
|
||||||
|
import { NotebookDialogOptions } from '../dialogs/notebookDialog';
|
||||||
|
|
||||||
|
const localize = nls.loadMessageBundle();
|
||||||
|
const NotebookCompletionActionCondition_Always: string = localize('notebookData.whenJobCompletes', 'When the notebook completes');
|
||||||
|
const NotebookCompletionActionCondition_OnFailure: string = localize('notebookData.whenJobFails', 'When the notebook fails');
|
||||||
|
const NotebookCompletionActionCondition_OnSuccess: string = localize('notebookData.whenJobSucceeds', 'When the notebook succeeds');
|
||||||
|
|
||||||
|
// Error Messages
|
||||||
|
const CreateNotebookErrorMessage_NameIsEmpty = localize('notebookData.jobNameRequired', 'Notebook name must be provided');
|
||||||
|
const TemplatePathEmptyErrorMessage = localize('notebookData.templatePathRequired', 'Template path must be provided');
|
||||||
|
const InvalidNotebookPathErrorMessage = localize('notebookData.invalidNotebookPath', 'Invalid notebook path');
|
||||||
|
const SelectStorageDatabaseErrorMessage = localize('notebookData.selectStorageDatabase', 'Select storage database');
|
||||||
|
const SelectExecutionDatabaseErrorMessage = localize('notebookData.selectExecutionDatabase', 'Select execution database');
|
||||||
|
const JobWithSameNameExistsErrorMessage = localize('notebookData.jobExists', 'Job with similar name already exists');
|
||||||
|
|
||||||
|
export class NotebookData implements IAgentDialogData {
|
||||||
|
|
||||||
|
private _ownerUri: string;
|
||||||
|
private _jobCategories: string[];
|
||||||
|
private _operators: string[];
|
||||||
|
private _defaultOwner: string;
|
||||||
|
private _jobCompletionActionConditions: azdata.CategoryValue[];
|
||||||
|
private _jobCategoryIdsMap: azdata.AgentJobCategory[];
|
||||||
|
|
||||||
|
public dialogMode: AgentDialogMode = AgentDialogMode.CREATE;
|
||||||
|
public name: string;
|
||||||
|
public originalName: string;
|
||||||
|
public enabled: boolean = true;
|
||||||
|
public description: string;
|
||||||
|
public category: string;
|
||||||
|
public categoryId: number;
|
||||||
|
public owner: string;
|
||||||
|
public emailLevel: azdata.JobCompletionActionCondition = azdata.JobCompletionActionCondition.OnFailure;
|
||||||
|
public pageLevel: azdata.JobCompletionActionCondition = azdata.JobCompletionActionCondition.OnFailure;
|
||||||
|
public eventLogLevel: azdata.JobCompletionActionCondition = azdata.JobCompletionActionCondition.OnFailure;
|
||||||
|
public deleteLevel: azdata.JobCompletionActionCondition = azdata.JobCompletionActionCondition.OnSuccess;
|
||||||
|
public operatorToEmail: string;
|
||||||
|
public operatorToPage: string;
|
||||||
|
public jobSteps: azdata.AgentJobStepInfo[];
|
||||||
|
public jobSchedules: azdata.AgentJobScheduleInfo[];
|
||||||
|
public alerts: azdata.AgentAlertInfo[];
|
||||||
|
public jobId: string;
|
||||||
|
public startStepId: number;
|
||||||
|
public categoryType: number;
|
||||||
|
public targetDatabase: string;
|
||||||
|
public executeDatabase: string;
|
||||||
|
public templateId: number;
|
||||||
|
public templatePath: string;
|
||||||
|
public static jobLists: azdata.AgentJobInfo[];
|
||||||
|
public connection: azdata.connection.Connection;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
ownerUri: string,
|
||||||
|
options: NotebookDialogOptions = undefined,
|
||||||
|
private _agentService: azdata.AgentServicesProvider = undefined) {
|
||||||
|
this._ownerUri = ownerUri;
|
||||||
|
this.enabled = true;
|
||||||
|
if (options.notebookInfo) {
|
||||||
|
let notebookInfo = options.notebookInfo;
|
||||||
|
this.dialogMode = AgentDialogMode.EDIT;
|
||||||
|
this.name = notebookInfo.name;
|
||||||
|
this.originalName = notebookInfo.name;
|
||||||
|
this.owner = notebookInfo.owner;
|
||||||
|
this.category = notebookInfo.category;
|
||||||
|
this.description = notebookInfo.description;
|
||||||
|
this.enabled = notebookInfo.enabled;
|
||||||
|
this.jobSteps = notebookInfo.jobSteps;
|
||||||
|
this.jobSchedules = notebookInfo.jobSchedules;
|
||||||
|
this.alerts = notebookInfo.alerts;
|
||||||
|
this.jobId = notebookInfo.jobId;
|
||||||
|
this.startStepId = notebookInfo.startStepId;
|
||||||
|
this.categoryId = notebookInfo.categoryId;
|
||||||
|
this.categoryType = notebookInfo.categoryType;
|
||||||
|
this.targetDatabase = notebookInfo.targetDatabase;
|
||||||
|
this.executeDatabase = notebookInfo.executeDatabase;
|
||||||
|
}
|
||||||
|
if (options.filePath) {
|
||||||
|
this.name = path.basename(options.filePath).split('.').slice(0, -1).join('.');
|
||||||
|
this.templatePath = options.filePath;
|
||||||
|
}
|
||||||
|
if (options.connection) {
|
||||||
|
this.connection = options.connection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get jobCategories(): string[] {
|
||||||
|
return this._jobCategories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get jobCategoryIdsMap(): azdata.AgentJobCategory[] {
|
||||||
|
return this._jobCategoryIdsMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get operators(): string[] {
|
||||||
|
return this._operators;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get ownerUri(): string {
|
||||||
|
return this._ownerUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get defaultOwner(): string {
|
||||||
|
return this._defaultOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get JobCompletionActionConditions(): azdata.CategoryValue[] {
|
||||||
|
return this._jobCompletionActionConditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async initialize() {
|
||||||
|
if (this.connection) {
|
||||||
|
await AgentUtils.setupProvidersFromConnection(this.connection);
|
||||||
|
}
|
||||||
|
this._agentService = await AgentUtils.getAgentService();
|
||||||
|
let jobDefaults = await this._agentService.getJobDefaults(this.ownerUri);
|
||||||
|
if (jobDefaults && jobDefaults.success) {
|
||||||
|
this._jobCategories = jobDefaults.categories.map((cat) => {
|
||||||
|
return cat.name;
|
||||||
|
});
|
||||||
|
this._jobCategoryIdsMap = jobDefaults.categories;
|
||||||
|
this._defaultOwner = jobDefaults.owner;
|
||||||
|
|
||||||
|
this._operators = ['', this._defaultOwner];
|
||||||
|
this.owner = this.owner ? this.owner : this._defaultOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._jobCompletionActionConditions = [{
|
||||||
|
displayName: NotebookCompletionActionCondition_OnSuccess,
|
||||||
|
name: azdata.JobCompletionActionCondition.OnSuccess.toString()
|
||||||
|
}, {
|
||||||
|
displayName: NotebookCompletionActionCondition_OnFailure,
|
||||||
|
name: azdata.JobCompletionActionCondition.OnFailure.toString()
|
||||||
|
}, {
|
||||||
|
displayName: NotebookCompletionActionCondition_Always,
|
||||||
|
name: azdata.JobCompletionActionCondition.Always.toString()
|
||||||
|
}];
|
||||||
|
|
||||||
|
this._agentService.getJobs(this.ownerUri).then((value) => {
|
||||||
|
NotebookData.jobLists = value.jobs;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async save() {
|
||||||
|
let notebookInfo: azdata.AgentNotebookInfo = this.toAgentJobInfo();
|
||||||
|
let result = this.dialogMode === AgentDialogMode.CREATE
|
||||||
|
? await this._agentService.createNotebook(this.ownerUri, notebookInfo, this.templatePath)
|
||||||
|
: await this._agentService.updateNotebook(this.ownerUri, this.originalName, notebookInfo, this.templatePath);
|
||||||
|
if (!result || !result.success) {
|
||||||
|
if (this.dialogMode === AgentDialogMode.EDIT) {
|
||||||
|
vscode.window.showErrorMessage(
|
||||||
|
localize('notebookData.saveErrorMessage', "Notebook update failed '{0}'", result.errorMessage ? result.errorMessage : 'Unknown'));
|
||||||
|
} else {
|
||||||
|
vscode.window.showErrorMessage(
|
||||||
|
localize('notebookData.newJobErrorMessage', "Notebook creation failed '{0}'", result.errorMessage ? result.errorMessage : 'Unknown'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.dialogMode === AgentDialogMode.EDIT) {
|
||||||
|
vscode.window.showInformationMessage(
|
||||||
|
localize('notebookData.saveSucessMessage', "Notebook '{0}' updated successfully", notebookInfo.name));
|
||||||
|
} else {
|
||||||
|
vscode.window.showInformationMessage(
|
||||||
|
localize('notebookData.newJobSuccessMessage', "Notebook '{0}' created successfully", notebookInfo.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async validate(): Promise<{ valid: boolean, errorMessages: string[] }> {
|
||||||
|
let validationErrors: string[] = [];
|
||||||
|
if (this.dialogMode !== AgentDialogMode.EDIT) {
|
||||||
|
if (!(this.name && this.name.trim())) {
|
||||||
|
validationErrors.push(CreateNotebookErrorMessage_NameIsEmpty);
|
||||||
|
}
|
||||||
|
if (!(this.templatePath && this.name.trim())) {
|
||||||
|
validationErrors.push(TemplatePathEmptyErrorMessage);
|
||||||
|
}
|
||||||
|
if (!(await exists(this.templatePath))) {
|
||||||
|
validationErrors.push(InvalidNotebookPathErrorMessage);
|
||||||
|
}
|
||||||
|
if (NotebookData.jobLists) {
|
||||||
|
for (let i = 0; i < NotebookData.jobLists.length; i++) {
|
||||||
|
if (this.name === NotebookData.jobLists[i].name) {
|
||||||
|
validationErrors.push(JobWithSameNameExistsErrorMessage);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.templatePath && this.templatePath !== '' && !(await exists(this.templatePath))) {
|
||||||
|
validationErrors.push(InvalidNotebookPathErrorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.targetDatabase === 'Select Database') {
|
||||||
|
validationErrors.push(SelectStorageDatabaseErrorMessage);
|
||||||
|
}
|
||||||
|
if (this.executeDatabase === 'Select Database') {
|
||||||
|
validationErrors.push(SelectExecutionDatabaseErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
valid: validationErrors.length === 0,
|
||||||
|
errorMessages: validationErrors
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public toAgentJobInfo(): azdata.AgentNotebookInfo {
|
||||||
|
return {
|
||||||
|
name: this.name,
|
||||||
|
owner: this.owner ? this.owner : this.defaultOwner,
|
||||||
|
description: this.description,
|
||||||
|
emailLevel: this.emailLevel,
|
||||||
|
pageLevel: this.pageLevel,
|
||||||
|
eventLogLevel: this.eventLogLevel,
|
||||||
|
deleteLevel: this.deleteLevel,
|
||||||
|
operatorToEmail: this.operatorToEmail,
|
||||||
|
operatorToPage: this.operatorToPage,
|
||||||
|
enabled: this.enabled,
|
||||||
|
category: this.category,
|
||||||
|
alerts: this.alerts,
|
||||||
|
jobSchedules: this.jobSchedules,
|
||||||
|
jobSteps: this.jobSteps,
|
||||||
|
targetDatabase: this.targetDatabase,
|
||||||
|
executeDatabase: this.executeDatabase,
|
||||||
|
// The properties below are not collected from UI
|
||||||
|
// We could consider using a seperate class for create job request
|
||||||
|
//
|
||||||
|
templateId: this.templateId,
|
||||||
|
currentExecutionStatus: 0,
|
||||||
|
lastRunOutcome: 0,
|
||||||
|
currentExecutionStep: '',
|
||||||
|
hasTarget: true,
|
||||||
|
hasSchedule: false,
|
||||||
|
hasStep: false,
|
||||||
|
runnable: true,
|
||||||
|
categoryId: this.categoryId,
|
||||||
|
categoryType: this.categoryType,
|
||||||
|
lastRun: '',
|
||||||
|
nextRun: '',
|
||||||
|
jobId: this.jobId,
|
||||||
|
startStepId: this.startStepId,
|
||||||
|
lastRunNotebookError: '',
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -648,7 +648,6 @@ export class JobDialog extends AgentDialog<JobData> {
|
|||||||
private createRowContainer(view: azdata.ModelView): azdata.FlexBuilder {
|
private createRowContainer(view: azdata.ModelView): azdata.FlexBuilder {
|
||||||
return view.modelBuilder.flexContainer().withLayout({
|
return view.modelBuilder.flexContainer().withLayout({
|
||||||
flexFlow: 'row',
|
flexFlow: 'row',
|
||||||
alignItems: 'left',
|
|
||||||
justifyContent: 'space-between'
|
justifyContent: 'space-between'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -723,4 +722,4 @@ export class JobDialog extends AgentDialog<JobData> {
|
|||||||
this.model.alerts = this.alerts;
|
this.model.alerts = this.alerts;
|
||||||
this.model.categoryId = +this.model.jobCategoryIdsMap.find(cat => cat.name === this.model.category).id;
|
this.model.categoryId = +this.model.jobCategoryIdsMap.find(cat => cat.name === this.model.category).id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ export class JobStepDialog extends AgentDialog<JobStepData> {
|
|||||||
isFile: false
|
isFile: false
|
||||||
}).component();
|
}).component();
|
||||||
this.openButton.onDidClick(e => {
|
this.openButton.onDidClick(e => {
|
||||||
let queryContent = e;
|
let queryContent = e.fileContent;
|
||||||
this.commandTextBox.value = queryContent;
|
this.commandTextBox.value = queryContent;
|
||||||
});
|
});
|
||||||
this.parseButton.onDidClick(e => {
|
this.parseButton.onDidClick(e => {
|
||||||
@@ -259,9 +259,9 @@ export class JobStepDialog extends AgentDialog<JobStepData> {
|
|||||||
title: this.CommandLabelString,
|
title: this.CommandLabelString,
|
||||||
actions: [this.openButton, this.parseButton]
|
actions: [this.openButton, this.parseButton]
|
||||||
}], {
|
}], {
|
||||||
horizontal: false,
|
horizontal: false,
|
||||||
componentWidth: 420
|
componentWidth: 420
|
||||||
}).component();
|
}).component();
|
||||||
this.typeDropdown.onValueChanged((type) => {
|
this.typeDropdown.onValueChanged((type) => {
|
||||||
switch (type.selected) {
|
switch (type.selected) {
|
||||||
case (JobStepDialog.TSQLScript):
|
case (JobStepDialog.TSQLScript):
|
||||||
@@ -375,8 +375,8 @@ export class JobStepDialog extends AgentDialog<JobStepData> {
|
|||||||
component: this.userInputBox,
|
component: this.userInputBox,
|
||||||
title: this.RunAsUserLabel
|
title: this.RunAsUserLabel
|
||||||
}], {
|
}], {
|
||||||
componentWidth: 400
|
componentWidth: 400
|
||||||
}).component();
|
}).component();
|
||||||
|
|
||||||
let formWrapper = view.modelBuilder.loadingComponent().withItem(formModel).component();
|
let formWrapper = view.modelBuilder.loadingComponent().withItem(formModel).component();
|
||||||
formWrapper.loading = false;
|
formWrapper.loading = false;
|
||||||
@@ -419,9 +419,9 @@ export class JobStepDialog extends AgentDialog<JobStepData> {
|
|||||||
component: this.retryAttemptsBox,
|
component: this.retryAttemptsBox,
|
||||||
title: this.RetryAttemptsLabel
|
title: this.RetryAttemptsLabel
|
||||||
}], {
|
}], {
|
||||||
horizontal: false,
|
horizontal: false,
|
||||||
componentWidth: '100%'
|
componentWidth: '100%'
|
||||||
})
|
})
|
||||||
.component();
|
.component();
|
||||||
|
|
||||||
let retryIntervalContainer = view.modelBuilder.formContainer()
|
let retryIntervalContainer = view.modelBuilder.formContainer()
|
||||||
@@ -430,8 +430,8 @@ export class JobStepDialog extends AgentDialog<JobStepData> {
|
|||||||
component: this.retryIntervalBox,
|
component: this.retryIntervalBox,
|
||||||
title: this.RetryIntervalLabel
|
title: this.RetryIntervalLabel
|
||||||
}], {
|
}], {
|
||||||
horizontal: false
|
horizontal: false
|
||||||
})
|
})
|
||||||
.component();
|
.component();
|
||||||
|
|
||||||
let retryFlexContainer = view.modelBuilder.flexContainer()
|
let retryFlexContainer = view.modelBuilder.flexContainer()
|
||||||
@@ -574,4 +574,4 @@ export class JobStepDialog extends AgentDialog<JobStepData> {
|
|||||||
return validationResult.valid;
|
return validationResult.valid;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
337
extensions/agent/src/dialogs/notebookDialog.ts
Normal file
337
extensions/agent/src/dialogs/notebookDialog.ts
Normal file
@@ -0,0 +1,337 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
import * as nls from 'vscode-nls';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as azdata from 'azdata';
|
||||||
|
import { PickScheduleDialog } from './pickScheduleDialog';
|
||||||
|
import { AgentDialog } from './agentDialog';
|
||||||
|
import { AgentUtils } from '../agentUtils';
|
||||||
|
import { NotebookData } from '../data/notebookData';
|
||||||
|
|
||||||
|
const localize = nls.loadMessageBundle();
|
||||||
|
// TODO: localize
|
||||||
|
// Top level
|
||||||
|
const CreateDialogTitle: string = localize('notebookDialog.newJob', "New Notebook Job");
|
||||||
|
const EditDialogTitle: string = localize('notebookDialog.editJob', "Edit Notebook Job");
|
||||||
|
const GeneralTabText: string = localize('notebookDialog.general', "General");
|
||||||
|
const BlankJobNameErrorText: string = localize('notebookDialog.blankJobNameError', "The name of the job cannot be blank.");
|
||||||
|
|
||||||
|
// Notebook details strings
|
||||||
|
const NotebookDetailsSeparatorTitle: string = localize('notebookDialog.notebookSection', "Notebook Details");
|
||||||
|
const TemplateNotebookTextBoxLabel: string = localize('notebookDialog.templateNotebook', "Notebook Path");
|
||||||
|
const TargetDatabaseDropdownLabel: string = localize('notebookDialog.targetDatabase', "Storage Database");
|
||||||
|
const ExecuteDatabaseDropdownLabel: string = localize('notebookDialog.executeDatabase', "Execution Database");
|
||||||
|
const DefaultDropdownString: string = localize('notebookDialog.defaultDropdownString', "Select Database");
|
||||||
|
|
||||||
|
// Job details string
|
||||||
|
const JobDetailsSeparatorTitle: string = localize('notebookDialog.jobSection', "Job Details");
|
||||||
|
const NameTextBoxLabel: string = localize('notebookDialog.name', "Name");
|
||||||
|
const OwnerTextBoxLabel: string = localize('notebookDialog.owner', "Owner");
|
||||||
|
const SchedulesTopLabelString: string = localize('notebookDialog.schedulesaLabel', "Schedules list");
|
||||||
|
const PickScheduleButtonString: string = localize('notebookDialog.pickSchedule', "Pick Schedule");
|
||||||
|
const RemoveScheduleButtonString: string = localize('notebookDialog.removeSchedule', "Remove Schedule");
|
||||||
|
const ScheduleNameLabelString: string = localize('notebookDialog.scheduleNameLabel', "Schedule Name");
|
||||||
|
const DescriptionTextBoxLabel: string = localize('notebookDialog.description', "Description");
|
||||||
|
|
||||||
|
// Event Name strings
|
||||||
|
const NewJobDialogEvent: string = 'NewNotebookJobDialogOpened';
|
||||||
|
const EditJobDialogEvent: string = 'EditNotebookJobDialogOpened';
|
||||||
|
|
||||||
|
export class NotebookDialogOptions {
|
||||||
|
notebookInfo?: azdata.AgentNotebookInfo;
|
||||||
|
filePath?: string;
|
||||||
|
connection?: azdata.connection.Connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class NotebookDialog extends AgentDialog<NotebookData> {
|
||||||
|
|
||||||
|
// UI Components
|
||||||
|
private generalTab: azdata.window.DialogTab;
|
||||||
|
|
||||||
|
// Notebook Details controls
|
||||||
|
private templateFilePathBox: azdata.InputBoxComponent;
|
||||||
|
private openTemplateFileButton: azdata.ButtonComponent;
|
||||||
|
private targetDatabaseDropDown: azdata.DropDownComponent;
|
||||||
|
private executeDatabaseDropDown: azdata.DropDownComponent;
|
||||||
|
|
||||||
|
// Job Details controls
|
||||||
|
|
||||||
|
private nameTextBox: azdata.InputBoxComponent;
|
||||||
|
private ownerTextBox: azdata.InputBoxComponent;
|
||||||
|
private schedulesTable: azdata.TableComponent;
|
||||||
|
private pickScheduleButton: azdata.ButtonComponent;
|
||||||
|
private removeScheduleButton: azdata.ButtonComponent;
|
||||||
|
private descriptionTextBox: azdata.InputBoxComponent;
|
||||||
|
|
||||||
|
private isEdit: boolean = false;
|
||||||
|
|
||||||
|
// Job objects
|
||||||
|
private steps: azdata.AgentJobStepInfo[];
|
||||||
|
private schedules: azdata.AgentJobScheduleInfo[];
|
||||||
|
|
||||||
|
constructor(ownerUri: string, options: NotebookDialogOptions = undefined) {
|
||||||
|
super(
|
||||||
|
ownerUri,
|
||||||
|
new NotebookData(ownerUri, options),
|
||||||
|
options.notebookInfo ? EditDialogTitle : CreateDialogTitle);
|
||||||
|
this.steps = this.model.jobSteps ? this.model.jobSteps : [];
|
||||||
|
this.schedules = this.model.jobSchedules ? this.model.jobSchedules : [];
|
||||||
|
this.isEdit = options.notebookInfo ? true : false;
|
||||||
|
this.dialogName = this.isEdit ? EditJobDialogEvent : NewJobDialogEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async initializeDialog() {
|
||||||
|
this.generalTab = azdata.window.createTab(GeneralTabText);
|
||||||
|
this.initializeGeneralTab();
|
||||||
|
this.dialog.content = [this.generalTab];
|
||||||
|
this.dialog.registerCloseValidator(async () => {
|
||||||
|
this.updateModel();
|
||||||
|
let validationResult = await this.model.validate();
|
||||||
|
if (!validationResult.valid) {
|
||||||
|
// TODO: Show Error Messages
|
||||||
|
this.dialog.message = { text: validationResult.errorMessages[0] };
|
||||||
|
console.error(validationResult.errorMessages.join(','));
|
||||||
|
}
|
||||||
|
|
||||||
|
return validationResult.valid;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private initializeGeneralTab() {
|
||||||
|
this.generalTab.registerContent(async view => {
|
||||||
|
this.templateFilePathBox = view.modelBuilder.inputBox()
|
||||||
|
.withProperties({
|
||||||
|
width: 400,
|
||||||
|
inputType: 'text'
|
||||||
|
}).component();
|
||||||
|
this.openTemplateFileButton = view.modelBuilder.button()
|
||||||
|
.withProperties({
|
||||||
|
label: '...',
|
||||||
|
title: '...',
|
||||||
|
width: '20px',
|
||||||
|
isFile: true,
|
||||||
|
fileType: '.ipynb'
|
||||||
|
}).component();
|
||||||
|
this.openTemplateFileButton.onDidClick(e => {
|
||||||
|
if (e) {
|
||||||
|
this.templateFilePathBox.value = e.filePath;
|
||||||
|
if (!this.isEdit) {
|
||||||
|
let fileName = path.basename(e.filePath).split('.').slice(0, -1).join('.');
|
||||||
|
this.nameTextBox.value = fileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let outputButtonContainer = view.modelBuilder.flexContainer()
|
||||||
|
.withLayout({
|
||||||
|
flexFlow: 'row',
|
||||||
|
textAlign: 'right',
|
||||||
|
width: 20
|
||||||
|
}).withItems([this.openTemplateFileButton], { flex: '1 1 80%' }).component();
|
||||||
|
let notebookPathFlexBox = view.modelBuilder.flexContainer()
|
||||||
|
.withLayout({
|
||||||
|
flexFlow: 'row',
|
||||||
|
width: '100%',
|
||||||
|
}).withItems([this.templateFilePathBox, outputButtonContainer], {
|
||||||
|
flex: '1 1 50%'
|
||||||
|
}).component();
|
||||||
|
this.targetDatabaseDropDown = view.modelBuilder.dropDown().component();
|
||||||
|
this.executeDatabaseDropDown = view.modelBuilder.dropDown().component();
|
||||||
|
let databases = await AgentUtils.getDatabases(this.ownerUri);
|
||||||
|
databases.unshift(DefaultDropdownString);
|
||||||
|
this.targetDatabaseDropDown = view.modelBuilder.dropDown()
|
||||||
|
.withProperties({
|
||||||
|
value: databases[0],
|
||||||
|
values: databases
|
||||||
|
}).component();
|
||||||
|
this.descriptionTextBox = view.modelBuilder.inputBox().withProperties({
|
||||||
|
multiline: true,
|
||||||
|
height: 50
|
||||||
|
}).component();
|
||||||
|
this.executeDatabaseDropDown = view.modelBuilder.dropDown()
|
||||||
|
.withProperties({
|
||||||
|
value: databases[0],
|
||||||
|
values: databases
|
||||||
|
}).component();
|
||||||
|
this.targetDatabaseDropDown.required = true;
|
||||||
|
this.executeDatabaseDropDown.required = true;
|
||||||
|
this.descriptionTextBox = view.modelBuilder.inputBox().withProperties({
|
||||||
|
multiline: true,
|
||||||
|
height: 50
|
||||||
|
}).component();
|
||||||
|
this.nameTextBox = view.modelBuilder.inputBox().component();
|
||||||
|
this.nameTextBox.required = true;
|
||||||
|
this.nameTextBox.onTextChanged(() => {
|
||||||
|
if (this.nameTextBox.value && this.nameTextBox.value.length > 0) {
|
||||||
|
this.dialog.message = null;
|
||||||
|
// Change the job name immediately since steps
|
||||||
|
// depends on the job name
|
||||||
|
this.model.name = this.nameTextBox.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.ownerTextBox = view.modelBuilder.inputBox().component();
|
||||||
|
this.schedulesTable = view.modelBuilder.table()
|
||||||
|
.withProperties({
|
||||||
|
columns: [
|
||||||
|
PickScheduleDialog.SchedulesIDText,
|
||||||
|
PickScheduleDialog.ScheduleNameLabelText,
|
||||||
|
PickScheduleDialog.ScheduleDescription
|
||||||
|
],
|
||||||
|
data: [],
|
||||||
|
height: 50,
|
||||||
|
width: 420
|
||||||
|
}).component();
|
||||||
|
|
||||||
|
this.pickScheduleButton = view.modelBuilder.button().withProperties({
|
||||||
|
label: PickScheduleButtonString,
|
||||||
|
width: 110
|
||||||
|
}).component();
|
||||||
|
this.removeScheduleButton = view.modelBuilder.button().withProperties({
|
||||||
|
label: RemoveScheduleButtonString,
|
||||||
|
width: 110
|
||||||
|
}).component();
|
||||||
|
this.pickScheduleButton.onDidClick(() => {
|
||||||
|
let pickScheduleDialog = new PickScheduleDialog(this.model.ownerUri, this.model.name);
|
||||||
|
pickScheduleDialog.onSuccess((dialogModel) => {
|
||||||
|
let selectedSchedule = dialogModel.selectedSchedule;
|
||||||
|
if (selectedSchedule) {
|
||||||
|
let existingSchedule = this.schedules.find(item => item.name === selectedSchedule.name);
|
||||||
|
if (!existingSchedule) {
|
||||||
|
selectedSchedule.jobName = this.model.name ? this.model.name : this.nameTextBox.value;
|
||||||
|
this.schedules.push(selectedSchedule);
|
||||||
|
}
|
||||||
|
this.populateScheduleTable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
pickScheduleDialog.showDialog();
|
||||||
|
});
|
||||||
|
this.removeScheduleButton.onDidClick(() => {
|
||||||
|
if (this.schedulesTable.selectedRows.length === 1) {
|
||||||
|
let selectedRow = this.schedulesTable.selectedRows[0];
|
||||||
|
let selectedScheduleName = this.schedulesTable.data[selectedRow][1];
|
||||||
|
for (let i = 0; i < this.schedules.length; i++) {
|
||||||
|
if (this.schedules[i].name === selectedScheduleName) {
|
||||||
|
this.schedules.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.populateScheduleTable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let formModel = view.modelBuilder.formContainer()
|
||||||
|
.withFormItems([
|
||||||
|
{
|
||||||
|
components: [{
|
||||||
|
component: notebookPathFlexBox,
|
||||||
|
title: TemplateNotebookTextBoxLabel,
|
||||||
|
layout: {
|
||||||
|
info: localize('notebookDialog.templatePath', 'Select a notebook to schedule from PC')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: this.targetDatabaseDropDown,
|
||||||
|
title: TargetDatabaseDropdownLabel,
|
||||||
|
layout: {
|
||||||
|
info: localize('notebookDialog.targetDatabaseInfo', 'Select a database to store all notebook job metadata and results')
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
component: this.executeDatabaseDropDown,
|
||||||
|
title: ExecuteDatabaseDropdownLabel,
|
||||||
|
layout: {
|
||||||
|
info: localize('notebookDialog.executionDatabaseInfo', 'Select a database against which notebook queries will run')
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
title: NotebookDetailsSeparatorTitle
|
||||||
|
}, {
|
||||||
|
components: [{
|
||||||
|
component: this.nameTextBox,
|
||||||
|
title: NameTextBoxLabel
|
||||||
|
}, {
|
||||||
|
component: this.ownerTextBox,
|
||||||
|
title: OwnerTextBoxLabel
|
||||||
|
}, {
|
||||||
|
component: this.schedulesTable,
|
||||||
|
title: SchedulesTopLabelString,
|
||||||
|
actions: [this.pickScheduleButton, this.removeScheduleButton]
|
||||||
|
}, {
|
||||||
|
component: this.descriptionTextBox,
|
||||||
|
title: DescriptionTextBoxLabel
|
||||||
|
}],
|
||||||
|
title: JobDetailsSeparatorTitle
|
||||||
|
}]).withLayout({ width: '100%' }).component();
|
||||||
|
|
||||||
|
await view.initializeModel(formModel);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.nameTextBox.value = this.model.name;
|
||||||
|
this.ownerTextBox.value = this.model.owner;
|
||||||
|
this.templateFilePathBox.value = this.model.templatePath;
|
||||||
|
if (this.isEdit) {
|
||||||
|
this.templateFilePathBox.placeHolder = this.model.targetDatabase + '\\' + this.model.name;
|
||||||
|
this.targetDatabaseDropDown.value = this.model.targetDatabase;
|
||||||
|
this.executeDatabaseDropDown.value = this.model.executeDatabase;
|
||||||
|
this.targetDatabaseDropDown.enabled = false;
|
||||||
|
this.schedules = this.model.jobSchedules;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.templateFilePathBox.required = true;
|
||||||
|
}
|
||||||
|
let idx: number = undefined;
|
||||||
|
if (this.model.category && this.model.category !== '') {
|
||||||
|
idx = this.model.jobCategories.indexOf(this.model.category);
|
||||||
|
}
|
||||||
|
this.descriptionTextBox.value = this.model.description;
|
||||||
|
this.openTemplateFileButton.onDidClick(e => {
|
||||||
|
});
|
||||||
|
this.populateScheduleTable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private populateScheduleTable() {
|
||||||
|
let data = this.convertSchedulesToData(this.schedules);
|
||||||
|
this.schedulesTable.data = data;
|
||||||
|
this.schedulesTable.height = 100;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private createRowContainer(view: azdata.ModelView): azdata.FlexBuilder {
|
||||||
|
return view.modelBuilder.flexContainer().withLayout({
|
||||||
|
flexFlow: 'row',
|
||||||
|
justifyContent: 'space-between'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
private convertSchedulesToData(jobSchedules: azdata.AgentJobScheduleInfo[]): any[][] {
|
||||||
|
let result = [];
|
||||||
|
jobSchedules.forEach(schedule => {
|
||||||
|
let cols = [];
|
||||||
|
cols.push(schedule.id);
|
||||||
|
cols.push(schedule.name);
|
||||||
|
cols.push(schedule.description);
|
||||||
|
result.push(cols);
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected updateModel() {
|
||||||
|
this.model.name = this.nameTextBox.value;
|
||||||
|
this.model.owner = this.ownerTextBox.value;
|
||||||
|
this.model.description = this.descriptionTextBox.value;
|
||||||
|
this.model.templatePath = this.templateFilePathBox.value;
|
||||||
|
this.model.targetDatabase = this.targetDatabaseDropDown.value as string;
|
||||||
|
this.model.executeDatabase = this.executeDatabaseDropDown.value as string;
|
||||||
|
if (!this.model.jobSchedules) {
|
||||||
|
this.model.jobSchedules = [];
|
||||||
|
}
|
||||||
|
this.model.alerts = [];
|
||||||
|
this.model.jobSteps = [];
|
||||||
|
this.model.jobSchedules = this.schedules;
|
||||||
|
this.model.category = '[Uncategorized (Local)]';
|
||||||
|
this.model.categoryId = 0;
|
||||||
|
this.model.eventLogLevel = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -82,9 +82,22 @@ export class PickScheduleDialog {
|
|||||||
}]).withLayout({ width: '100%' }).component();
|
}]).withLayout({ width: '100%' }).component();
|
||||||
|
|
||||||
this.loadingComponent = view.modelBuilder.loadingComponent().withItem(formModel).component();
|
this.loadingComponent = view.modelBuilder.loadingComponent().withItem(formModel).component();
|
||||||
|
this.loadingComponent.loading = true;
|
||||||
|
this.model.initialize().then((result) => {
|
||||||
|
this.loadingComponent.loading = false;
|
||||||
|
if (this.model.schedules) {
|
||||||
|
let data: any[][] = [];
|
||||||
|
for (let i = 0; i < this.model.schedules.length; ++i) {
|
||||||
|
let schedule = this.model.schedules[i];
|
||||||
|
data[i] = [schedule.id, schedule.name, schedule.description];
|
||||||
|
}
|
||||||
|
this.schedulesTable.data = data;
|
||||||
|
}
|
||||||
|
});
|
||||||
this.loadingComponent.loading = !this.model.isInitialized();
|
this.loadingComponent.loading = !this.model.isInitialized();
|
||||||
await view.initializeModel(this.loadingComponent);
|
await view.initializeModel(this.loadingComponent);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async execute() {
|
private async execute() {
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
import * as nls from 'vscode-nls';
|
import * as nls from 'vscode-nls';
|
||||||
import * as azdata from 'azdata';
|
import * as azdata from 'azdata';
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
|
import { promises as fs } from 'fs';
|
||||||
|
import * as os from 'os';
|
||||||
|
import * as path from 'path';
|
||||||
import { AlertDialog } from './dialogs/alertDialog';
|
import { AlertDialog } from './dialogs/alertDialog';
|
||||||
import { JobDialog } from './dialogs/jobDialog';
|
import { JobDialog } from './dialogs/jobDialog';
|
||||||
import { OperatorDialog } from './dialogs/operatorDialog';
|
import { OperatorDialog } from './dialogs/operatorDialog';
|
||||||
@@ -14,13 +17,21 @@ import { ProxyDialog } from './dialogs/proxyDialog';
|
|||||||
import { JobStepDialog } from './dialogs/jobStepDialog';
|
import { JobStepDialog } from './dialogs/jobStepDialog';
|
||||||
import { PickScheduleDialog } from './dialogs/pickScheduleDialog';
|
import { PickScheduleDialog } from './dialogs/pickScheduleDialog';
|
||||||
import { JobData } from './data/jobData';
|
import { JobData } from './data/jobData';
|
||||||
import { AgentUtils } from './agentUtils';
|
import { AgentUtils, exists } from './agentUtils';
|
||||||
|
import { NotebookDialog, NotebookDialogOptions } from './dialogs/notebookDialog';
|
||||||
|
|
||||||
|
|
||||||
const localize = nls.loadMessageBundle();
|
const localize = nls.loadMessageBundle();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main controller class that initializes the extension
|
* The main controller class that initializes the extension
|
||||||
*/
|
*/
|
||||||
|
export class TemplateMapObject {
|
||||||
|
notebookInfo: azdata.AgentNotebookInfo;
|
||||||
|
fileUri: vscode.Uri;
|
||||||
|
tempPath: string;
|
||||||
|
ownerUri: string;
|
||||||
|
}
|
||||||
export class MainController {
|
export class MainController {
|
||||||
|
|
||||||
protected _context: vscode.ExtensionContext;
|
protected _context: vscode.ExtensionContext;
|
||||||
@@ -29,7 +40,8 @@ export class MainController {
|
|||||||
private alertDialog: AlertDialog;
|
private alertDialog: AlertDialog;
|
||||||
private operatorDialog: OperatorDialog;
|
private operatorDialog: OperatorDialog;
|
||||||
private proxyDialog: ProxyDialog;
|
private proxyDialog: ProxyDialog;
|
||||||
|
private notebookDialog: NotebookDialog;
|
||||||
|
private notebookTemplateMap = new Map<string, TemplateMapObject>();
|
||||||
// PUBLIC METHODS //////////////////////////////////////////////////////
|
// PUBLIC METHODS //////////////////////////////////////////////////////
|
||||||
public constructor(context: vscode.ExtensionContext) {
|
public constructor(context: vscode.ExtensionContext) {
|
||||||
this._context = context;
|
this._context = context;
|
||||||
@@ -82,6 +94,26 @@ export class MainController {
|
|||||||
this.operatorDialog.dialogName ? await this.operatorDialog.openDialog(this.operatorDialog.dialogName) : await this.operatorDialog.openDialog();
|
this.operatorDialog.dialogName ? await this.operatorDialog.openDialog(this.operatorDialog.dialogName) : await this.operatorDialog.openDialog();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('agent.reuploadTemplate', async (ownerUri: string, operatorInfo: azdata.AgentOperatorInfo) => {
|
||||||
|
let nbEditor = azdata.nb.activeNotebookEditor;
|
||||||
|
// await nbEditor.document.save();
|
||||||
|
let templateMap = this.notebookTemplateMap.get(nbEditor.document.uri.toString());
|
||||||
|
let vsEditor = await vscode.workspace.openTextDocument(templateMap.fileUri);
|
||||||
|
let content = vsEditor.getText();
|
||||||
|
await fs.writeFile(templateMap.tempPath, content);
|
||||||
|
AgentUtils.getAgentService().then(async (agentService) => {
|
||||||
|
let result = await agentService.updateNotebook(templateMap.ownerUri, templateMap.notebookInfo.name, templateMap.notebookInfo, templateMap.tempPath);
|
||||||
|
if (result.success) {
|
||||||
|
vscode.window.showInformationMessage(localize('agent.templateUploadSuccessful', 'Template updated successfully'));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vscode.window.showInformationMessage(localize('agent.templateUploadError', 'Template update failure'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
vscode.commands.registerCommand('agent.openProxyDialog', async (ownerUri: string, proxyInfo: azdata.AgentProxyInfo, credentials: azdata.CredentialInfo[]) => {
|
vscode.commands.registerCommand('agent.openProxyDialog', async (ownerUri: string, proxyInfo: azdata.AgentProxyInfo, credentials: azdata.CredentialInfo[]) => {
|
||||||
if (!this.proxyDialog || (this.proxyDialog && !this.proxyDialog.isOpen)) {
|
if (!this.proxyDialog || (this.proxyDialog && !this.proxyDialog.isOpen)) {
|
||||||
this.proxyDialog = new ProxyDialog(ownerUri, proxyInfo, credentials);
|
this.proxyDialog = new ProxyDialog(ownerUri, proxyInfo, credentials);
|
||||||
@@ -91,6 +123,116 @@ export class MainController {
|
|||||||
}
|
}
|
||||||
this.proxyDialog.dialogName ? await this.proxyDialog.openDialog(this.proxyDialog.dialogName) : await this.proxyDialog.openDialog();
|
this.proxyDialog.dialogName ? await this.proxyDialog.openDialog(this.proxyDialog.dialogName) : await this.proxyDialog.openDialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('agent.openNotebookEditorFromJsonString', async (filename: string, jsonNotebook: string, notebookInfo?: azdata.AgentNotebookInfo, ownerUri?: string) => {
|
||||||
|
const tempfilePath = path.join(os.tmpdir(), 'mssql_notebooks', filename + '.ipynb');
|
||||||
|
if (!await exists(path.join(os.tmpdir(), 'mssql_notebooks'))) {
|
||||||
|
await fs.mkdir(path.join(os.tmpdir(), 'mssql_notebooks'));
|
||||||
|
}
|
||||||
|
if (await exists(tempfilePath)) {
|
||||||
|
await fs.unlink(tempfilePath);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await fs.writeFile(tempfilePath, jsonNotebook);
|
||||||
|
let uri = vscode.Uri.parse(`untitled:${path.basename(tempfilePath)}`);
|
||||||
|
if (notebookInfo) {
|
||||||
|
this.notebookTemplateMap.set(uri.toString(), { notebookInfo: notebookInfo, fileUri: uri, ownerUri: ownerUri, tempPath: tempfilePath });
|
||||||
|
vscode.commands.executeCommand('setContext', 'agent:trackedTemplate', true);
|
||||||
|
}
|
||||||
|
await azdata.nb.showNotebookDocument(uri, {
|
||||||
|
initialContent: jsonNotebook,
|
||||||
|
initialDirtyState: false
|
||||||
|
});
|
||||||
|
vscode.commands.executeCommand('setContext', 'agent:trackedTemplate', false);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
vscode.window.showErrorMessage(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('agent.openNotebookDialog', async (ownerUri: any, notebookInfo: azdata.AgentNotebookInfo) => {
|
||||||
|
|
||||||
|
/*
|
||||||
|
There are four entry points to this commands:
|
||||||
|
1. Explorer context menu:
|
||||||
|
The first arg becomes a vscode URI
|
||||||
|
the second argument is undefined
|
||||||
|
2. Notebook toolbar:
|
||||||
|
both the args are undefined
|
||||||
|
3. Agent New Notebook Action
|
||||||
|
the first arg is database OwnerUri
|
||||||
|
the second arg is undefined
|
||||||
|
4. Agent Edit Notebook Action
|
||||||
|
the first arg is database OwnerUri
|
||||||
|
the second arg is notebookInfo from database
|
||||||
|
*/
|
||||||
|
if (!ownerUri || ownerUri instanceof vscode.Uri) {
|
||||||
|
let path: string;
|
||||||
|
if (!ownerUri) {
|
||||||
|
if (azdata.nb.activeNotebookEditor.document.isDirty || azdata.nb.activeNotebookEditor.document.isUntitled) {
|
||||||
|
vscode.window.showErrorMessage(localize('agent.unsavedFileSchedulingError', 'The notebook must be saved before being scheduled. Please save and then retry scheduling again.'), { modal: true });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
path = azdata.nb.activeNotebookEditor.document.fileName;
|
||||||
|
} else {
|
||||||
|
path = ownerUri.fsPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
let connection = await this.getConnectionFromUser();
|
||||||
|
ownerUri = await azdata.connection.getUriForConnection(connection.connectionId);
|
||||||
|
this.notebookDialog = new NotebookDialog(ownerUri, <NotebookDialogOptions>{ filePath: path, connection: connection });
|
||||||
|
if (!this.notebookDialog.isOpen) {
|
||||||
|
this.notebookDialog.dialogName ? await this.notebookDialog.openDialog(this.notebookDialog.dialogName) : await this.notebookDialog.openDialog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!this.notebookDialog || (this.notebookDialog && !this.notebookDialog.isOpen)) {
|
||||||
|
this.notebookDialog = new NotebookDialog(ownerUri, <NotebookDialogOptions>{ notebookInfo: notebookInfo });
|
||||||
|
}
|
||||||
|
if (!this.notebookDialog.isOpen) {
|
||||||
|
this.notebookDialog.dialogName ? await this.notebookDialog.openDialog(this.notebookDialog.dialogName) : await this.notebookDialog.openDialog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getConnectionFromUser(): Promise<azdata.connection.Connection> {
|
||||||
|
let connection: azdata.connection.Connection = null;
|
||||||
|
|
||||||
|
let connections = await azdata.connection.getActiveConnections();
|
||||||
|
if (!connections || connections.length === 0) {
|
||||||
|
connection = await azdata.connection.openConnectionDialog();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let sqlConnectionsPresent: boolean;
|
||||||
|
for (let i = 0; i < connections.length; i++) {
|
||||||
|
if (connections[i].providerName === 'MSSQL') {
|
||||||
|
sqlConnectionsPresent = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let connectionNames: azdata.connection.Connection[] = [];
|
||||||
|
let connectionDisplayString: string[] = [];
|
||||||
|
for (let i = 0; i < connections.length; i++) {
|
||||||
|
let currentConnectionString = connections[i].options.server + ' (' + connections[i].options.user + ')';
|
||||||
|
connectionNames.push(connections[i]);
|
||||||
|
connectionDisplayString.push(currentConnectionString);
|
||||||
|
}
|
||||||
|
connectionDisplayString.push(localize('agent.AddNewConnection', 'Add new connection'));
|
||||||
|
let connectionName = await vscode.window.showQuickPick(connectionDisplayString, { placeHolder: localize('agent.selectConnection', 'Select a connection') });
|
||||||
|
if (connectionDisplayString.indexOf(connectionName) !== -1) {
|
||||||
|
if (connectionName === localize('agent.AddNewConnection', 'Add new connection')) {
|
||||||
|
connection = await azdata.connection.openConnectionDialog();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
connection = connections[connectionDisplayString.indexOf(connectionName)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vscode.window.showErrorMessage(localize('agent.selectValidConnection', 'Please select a valid connection'), { modal: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const testRunner = require('vscode/lib/testrunner');
|
const testRunner = require('vscode/lib/testrunner');
|
||||||
|
|
||||||
const suite = 'Agent Tests';
|
const suite = 'agent Extension Tests';
|
||||||
|
|
||||||
const options: any = {
|
const options: any = {
|
||||||
ui: 'bdd',
|
ui: 'bdd',
|
||||||
@@ -14,6 +14,24 @@ const options: any = {
|
|||||||
timeout: 600000
|
timeout: 600000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// set relevant mocha options from the environment
|
||||||
|
if (process.env.ADS_TEST_GREP) {
|
||||||
|
options.grep = process.env.ADS_TEST_GREP;
|
||||||
|
console.log(`setting options.grep to: ${options.grep}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_INVERT_GREP) {
|
||||||
|
options.invert = parseInt(process.env.ADS_TEST_INVERT_GREP);
|
||||||
|
console.log(`setting options.invert to: ${options.invert}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_TIMEOUT) {
|
||||||
|
options.timeout = parseInt(process.env.ADS_TEST_TIMEOUT);
|
||||||
|
console.log(`setting options.timeout to: ${options.timeout}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_RETRIES) {
|
||||||
|
options.retries = parseInt(process.env.ADS_TEST_RETRIES);
|
||||||
|
console.log(`setting options.retries to: ${options.retries}`);
|
||||||
|
}
|
||||||
|
|
||||||
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
||||||
options.reporter = 'mocha-multi-reporters';
|
options.reporter = 'mocha-multi-reporters';
|
||||||
options.reporterOptions = {
|
options.reporterOptions = {
|
||||||
@@ -27,4 +45,4 @@ if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
|||||||
|
|
||||||
testRunner.configure(options);
|
testRunner.configure(options);
|
||||||
|
|
||||||
export = testRunner;
|
export = testRunner;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,202 +1,203 @@
|
|||||||
{
|
{
|
||||||
"name": "azurecore",
|
"name": "azurecore",
|
||||||
"displayName": "%azure.displayName%",
|
"displayName": "%azure.displayName%",
|
||||||
"description": "%azure.description%",
|
"description": "%azure.description%",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"publisher": "Microsoft",
|
"publisher": "Microsoft",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"vscode": "^1.30.1",
|
"vscode": "^1.30.1",
|
||||||
"azdata": "*"
|
"azdata": "*"
|
||||||
},
|
},
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"main": "./out/extension",
|
"main": "./out/extension",
|
||||||
"contributes": {
|
"contributes": {
|
||||||
"configuration": [
|
"configuration": [
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "%azure.resource.config.title%",
|
"title": "%azure.resource.config.title%",
|
||||||
"properties": {
|
"properties": {
|
||||||
"azure.resource.config.filter": {
|
"azure.resource.config.filter": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"default": null,
|
"default": null,
|
||||||
"description": "%azure.resource.config.filter.description%"
|
"description": "%azure.resource.config.filter.description%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"title": "Azure Account Configuration",
|
"title": "Azure Account Configuration",
|
||||||
"properties": {
|
"properties": {
|
||||||
"accounts.azure.enablePublicCloud": {
|
"accounts.azure.enablePublicCloud": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": true,
|
||||||
"description": "%config.enablePublicCloudDescription%"
|
"description": "%config.enablePublicCloudDescription%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"account-type": [
|
"account-type": [
|
||||||
{
|
{
|
||||||
"id": "microsoft",
|
"id": "microsoft",
|
||||||
"icon": {
|
"icon": {
|
||||||
"light": "./resources/light/microsoft_account_light.svg",
|
"light": "./resources/light/microsoft_account_light.svg",
|
||||||
"dark": "./resources/dark/microsoft_account_dark.svg"
|
"dark": "./resources/dark/microsoft_account_dark.svg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "work_school",
|
"id": "work_school",
|
||||||
"icon": {
|
"icon": {
|
||||||
"light": "./resources/light/work_school_account_light.svg",
|
"light": "./resources/light/work_school_account_light.svg",
|
||||||
"dark": "./resources/dark/work_school_account_dark.svg"
|
"dark": "./resources/dark/work_school_account_dark.svg"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"commands": [
|
"commands": [
|
||||||
{
|
{
|
||||||
"command": "accounts.clearTokenCache",
|
"command": "accounts.clearTokenCache",
|
||||||
"title": "%accounts.clearTokenCache%",
|
"title": "%accounts.clearTokenCache%",
|
||||||
"category": "Azure Accounts"
|
"category": "Azure Accounts"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.signin",
|
"command": "azure.resource.signin",
|
||||||
"title": "%azure.resource.signin.title%",
|
"title": "%azure.resource.signin.title%",
|
||||||
"icon": {
|
"icon": {
|
||||||
"dark": "resources/dark/add_inverse.svg",
|
"dark": "resources/dark/add_inverse.svg",
|
||||||
"light": "resources/light/add.svg"
|
"light": "resources/light/add.svg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.refreshall",
|
"command": "azure.resource.refreshall",
|
||||||
"title": "%azure.resource.refreshall.title%",
|
"title": "%azure.resource.refreshall.title%",
|
||||||
"icon": {
|
"icon": {
|
||||||
"dark": "resources/dark/refresh_inverse.svg",
|
"dark": "resources/dark/refresh_inverse.svg",
|
||||||
"light": "resources/light/refresh.svg"
|
"light": "resources/light/refresh.svg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.refresh",
|
"command": "azure.resource.refresh",
|
||||||
"title": "%azure.resource.refresh.title%",
|
"title": "%azure.resource.refresh.title%",
|
||||||
"icon": {
|
"icon": {
|
||||||
"dark": "resources/dark/refresh_inverse.svg",
|
"dark": "resources/dark/refresh_inverse.svg",
|
||||||
"light": "resources/light/refresh.svg"
|
"light": "resources/light/refresh.svg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.selectsubscriptions",
|
"command": "azure.resource.selectsubscriptions",
|
||||||
"title": "%azure.resource.selectsubscriptions.title%",
|
"title": "%azure.resource.selectsubscriptions.title%",
|
||||||
"icon": {
|
"icon": {
|
||||||
"dark": "resources/dark/filter_inverse.svg",
|
"dark": "resources/dark/filter_inverse.svg",
|
||||||
"light": "resources/light/filter.svg"
|
"light": "resources/light/filter.svg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.connectsqlserver",
|
"command": "azure.resource.connectsqlserver",
|
||||||
"title": "%azure.resource.connectsqlserver.title%",
|
"title": "%azure.resource.connectsqlserver.title%",
|
||||||
"icon": {
|
"icon": {
|
||||||
"dark": "resources/dark/connect_to_inverse.svg",
|
"dark": "resources/dark/connect_to_inverse.svg",
|
||||||
"light": "resources/light/connect_to.svg"
|
"light": "resources/light/connect_to.svg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.connectsqldb",
|
"command": "azure.resource.connectsqldb",
|
||||||
"title": "%azure.resource.connectsqldb.title%",
|
"title": "%azure.resource.connectsqldb.title%",
|
||||||
"icon": {
|
"icon": {
|
||||||
"dark": "resources/dark/add_to_server_list_inverse.svg",
|
"dark": "resources/dark/add_to_server_list_inverse.svg",
|
||||||
"light": "resources/light/add_to_server_list.svg"
|
"light": "resources/light/add_to_server_list.svg"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dataExplorer": {
|
"dataExplorer": {
|
||||||
"azureResource": [
|
"azureResource": [
|
||||||
{
|
{
|
||||||
"id": "azureResourceExplorer",
|
"id": "azureResourceExplorer",
|
||||||
"name": "%azure.resource.explorer.title%"
|
"name": "%azure.resource.explorer.title%"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"menus": {
|
"menus": {
|
||||||
"commandPalette": [
|
"commandPalette": [
|
||||||
{
|
{
|
||||||
"command": "azure.resource.signin",
|
"command": "azure.resource.signin",
|
||||||
"when": "true"
|
"when": "true"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.refreshall",
|
"command": "azure.resource.refreshall",
|
||||||
"when": "true"
|
"when": "true"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.selectsubscriptions",
|
"command": "azure.resource.selectsubscriptions",
|
||||||
"when": "false"
|
"when": "false"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.refresh",
|
"command": "azure.resource.refresh",
|
||||||
"when": "false"
|
"when": "false"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.connectsqlserver",
|
"command": "azure.resource.connectsqlserver",
|
||||||
"when": "false"
|
"when": "false"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "azure.resource.connectsqldb",
|
"command": "azure.resource.connectsqldb",
|
||||||
"when": "false"
|
"when": "false"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
],
|
"view/title": [
|
||||||
"view/title": [
|
{
|
||||||
{
|
"command": "azure.resource.signin",
|
||||||
"command": "azure.resource.signin",
|
"when": "view == azureResourceExplorer",
|
||||||
"when": "view == azureResourceExplorer",
|
"group": "navigation@1"
|
||||||
"group": "navigation@1"
|
},
|
||||||
},
|
{
|
||||||
{
|
"command": "azure.resource.refreshall",
|
||||||
"command": "azure.resource.refreshall",
|
"when": "view == azureResourceExplorer",
|
||||||
"when": "view == azureResourceExplorer",
|
"group": "navigation@2"
|
||||||
"group": "navigation@2"
|
}
|
||||||
}
|
],
|
||||||
],
|
"view/item/context": [
|
||||||
"view/item/context": [
|
{
|
||||||
{
|
"command": "azure.resource.selectsubscriptions",
|
||||||
"command": "azure.resource.selectsubscriptions",
|
"when": "viewItem == azure.resource.itemType.account",
|
||||||
"when": "viewItem == azure.resource.itemType.account",
|
"group": "inline"
|
||||||
"group": "inline"
|
},
|
||||||
},
|
{
|
||||||
{
|
"command": "azure.resource.refresh",
|
||||||
"command": "azure.resource.refresh",
|
"when": "viewItem =~ /^azure\\.resource\\.itemType\\.(?:account|subscription|databaseContainer|databaseServerContainer)$/",
|
||||||
"when": "viewItem =~ /^azure\\.resource\\.itemType\\.(?:account|subscription|databaseContainer|databaseServerContainer)$/",
|
"group": "inline"
|
||||||
"group": "inline"
|
},
|
||||||
},
|
{
|
||||||
{
|
"command": "azure.resource.connectsqlserver",
|
||||||
"command": "azure.resource.connectsqlserver",
|
"when": "viewItem == azure.resource.itemType.databaseServer",
|
||||||
"when": "viewItem == azure.resource.itemType.databaseServer",
|
"group": "inline"
|
||||||
"group": "inline"
|
},
|
||||||
},
|
{
|
||||||
{
|
"command": "azure.resource.connectsqldb",
|
||||||
"command": "azure.resource.connectsqldb",
|
"when": "viewItem == azure.resource.itemType.database",
|
||||||
"when": "viewItem == azure.resource.itemType.database",
|
"group": "inline"
|
||||||
"group": "inline"
|
}
|
||||||
}
|
]
|
||||||
]
|
},
|
||||||
},
|
"hasAzureResourceProviders": true
|
||||||
"hasAzureResourceProviders": true
|
},
|
||||||
},
|
"dependencies": {
|
||||||
"dependencies": {
|
"adal-node": "^0.1.28",
|
||||||
"adal-node": "^0.1.28",
|
"azure-arm-resource": "^7.0.0",
|
||||||
"azure-arm-resource": "^7.0.0",
|
"azure-arm-sql": "^5.0.1",
|
||||||
"azure-arm-sql": "^5.0.1",
|
"ms-rest": "^2.5.0",
|
||||||
"ms-rest": "^2.5.0",
|
"request": "2.88.0",
|
||||||
"request": "2.88.0",
|
"vscode-nls": "^4.0.0"
|
||||||
"vscode-nls": "^4.0.0"
|
},
|
||||||
},
|
"devDependencies": {
|
||||||
"devDependencies": {
|
"@types/mocha": "^5.2.5",
|
||||||
"@types/mocha": "^5.2.5",
|
"@types/node": "^10.12.12",
|
||||||
"@types/node": "^10.12.12",
|
"@types/request": "^2.48.1",
|
||||||
"@types/request": "^2.48.1",
|
"mocha-junit-reporter": "^1.17.0",
|
||||||
"mocha": "^5.2.0",
|
"mocha-multi-reporters": "^1.1.7",
|
||||||
"should": "^13.2.1",
|
"mocha": "^5.2.0",
|
||||||
"typemoq": "^2.1.0",
|
"should": "^13.2.1",
|
||||||
"vscode": "1.1.26"
|
"typemoq": "^2.1.0",
|
||||||
}
|
"vscode": "1.1.26"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16"><defs><style>.cls-1,.cls-2{clip-rule:evenodd;}.cls-2,.cls-5,.cls-7{fill:#fff;}.cls-3,.cls-5{fill-rule:evenodd;}.cls-4{clip-path:url(#clip-path);}.cls-6{clip-path:url(#clip-path-2);}</style><clipPath id="clip-path"><path class="cls-1" d="M11.5-15.92v3.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77A3.43,3.43,0,0,1,8.5-9v6h-1V-9a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05,3.4,3.4,0,0,1-.23-1.24v-3.5h1v-3h1v3h3v-3h1v3Zm-1,1h-5v2.5a2.45,2.45,0,0,0,.2,1,2.53,2.53,0,0,0,.53.8,2.53,2.53,0,0,0,.8.53,2.45,2.45,0,0,0,1,.2,2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/></clipPath><clipPath id="clip-path-2"><path class="cls-2" d="M11.5,3V6.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77A3.43,3.43,0,0,1,8.5,10v6h-1V10a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05A3.4,3.4,0,0,1,4.5,6.5V3h1V0h1V3h3V0h1V3Zm-1,1h-5V6.5a2.45,2.45,0,0,0,.2,1A2.49,2.49,0,0,0,7,8.8,2.45,2.45,0,0,0,8,9a2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/></clipPath></defs><title>connect_to_inverse</title><path class="cls-3" d="M11.5-15.92v3.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77A3.43,3.43,0,0,1,8.5-9v6h-1V-9a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05,3.4,3.4,0,0,1-.23-1.24v-3.5h1v-3h1v3h3v-3h1v3Zm-1,1h-5v2.5a2.45,2.45,0,0,0,.2,1,2.53,2.53,0,0,0,.53.8,2.53,2.53,0,0,0,.8.53,2.45,2.45,0,0,0,1,.2,2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/><g class="cls-4"><rect x="-0.5" y="-23.92" width="17" height="26"/></g><path class="cls-5" d="M11.5,3V6.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77A3.43,3.43,0,0,1,8.5,10v6h-1V10a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05A3.4,3.4,0,0,1,4.5,6.5V3h1V0h1V3h3V0h1V3Zm-1,1h-5V6.5a2.45,2.45,0,0,0,.2,1A2.49,2.49,0,0,0,7,8.8,2.45,2.45,0,0,0,8,9a2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/><g class="cls-6"><rect class="cls-7" x="-0.5" y="-5" width="17" height="26"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
1
extensions/azurecore/resources/light/connect_to.svg
Normal file
1
extensions/azurecore/resources/light/connect_to.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16"><defs><style>.cls-1,.cls-2{clip-rule:evenodd;}.cls-2,.cls-5,.cls-7{fill:#fff;}.cls-3,.cls-5{fill-rule:evenodd;}.cls-4{clip-path:url(#clip-path);}.cls-6{clip-path:url(#clip-path-2);}</style><clipPath id="clip-path"><path class="cls-1" d="M11.5,3V6.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77A3.43,3.43,0,0,1,8.5,10v6h-1V10a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05A3.4,3.4,0,0,1,4.5,6.5V3h1V0h1V3h3V0h1V3Zm-1,1h-5V6.5a2.45,2.45,0,0,0,.2,1A2.49,2.49,0,0,0,7,8.8,2.45,2.45,0,0,0,8,9a2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/></clipPath><clipPath id="clip-path-2"><path class="cls-2" d="M11.5,21.92v3.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77,3.43,3.43,0,0,1-1.19.4v6h-1v-6a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05,3.4,3.4,0,0,1-.23-1.24v-3.5h1v-3h1v3h3v-3h1v3Zm-1,1h-5v2.5a2.45,2.45,0,0,0,.2,1A2.49,2.49,0,0,0,7,27.72a2.45,2.45,0,0,0,1,.2,2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/></clipPath></defs><title>connect_to</title><path class="cls-3" d="M11.5,3V6.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77A3.43,3.43,0,0,1,8.5,10v6h-1V10a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05A3.4,3.4,0,0,1,4.5,6.5V3h1V0h1V3h3V0h1V3Zm-1,1h-5V6.5a2.45,2.45,0,0,0,.2,1A2.49,2.49,0,0,0,7,8.8,2.45,2.45,0,0,0,8,9a2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/><g class="cls-4"><rect x="-0.5" y="-5" width="17" height="26"/></g><path class="cls-5" d="M11.5,21.92v3.5a3.4,3.4,0,0,1-.23,1.24,3.48,3.48,0,0,1-.63,1.05,3.57,3.57,0,0,1-1,.77,3.43,3.43,0,0,1-1.19.4v6h-1v-6a3.39,3.39,0,0,1-1.2-.4,3.59,3.59,0,0,1-.95-.77,3.48,3.48,0,0,1-.63-1.05,3.4,3.4,0,0,1-.23-1.24v-3.5h1v-3h1v3h3v-3h1v3Zm-1,1h-5v2.5a2.45,2.45,0,0,0,.2,1A2.49,2.49,0,0,0,7,27.72a2.45,2.45,0,0,0,1,.2,2.42,2.42,0,0,0,1-.2,2.53,2.53,0,0,0,.79-.53,2.59,2.59,0,0,0,.54-.8,2.41,2.41,0,0,0,.2-1Z"/><g class="cls-6"><rect class="cls-7" x="-0.5" y="13.92" width="17" height="26"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -6,7 +6,7 @@
|
|||||||
import * as adal from 'adal-node';
|
import * as adal from 'adal-node';
|
||||||
import * as azdata from 'azdata';
|
import * as azdata from 'azdata';
|
||||||
import * as crypto from 'crypto';
|
import * as crypto from 'crypto';
|
||||||
import * as fs from 'fs';
|
import { promises as fs } from 'fs';
|
||||||
|
|
||||||
export default class TokenCache implements adal.TokenCache {
|
export default class TokenCache implements adal.TokenCache {
|
||||||
private static CipherAlgorithm = 'aes-256-cbc';
|
private static CipherAlgorithm = 'aes-256-cbc';
|
||||||
@@ -58,23 +58,19 @@ export default class TokenCache implements adal.TokenCache {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public clear(): Thenable<void> {
|
public async clear(): Promise<void> {
|
||||||
let self = this;
|
|
||||||
|
|
||||||
// 1) Delete encrypted serialization file
|
// 1) Delete encrypted serialization file
|
||||||
// If we got an 'ENOENT' response, the file doesn't exist, which is fine
|
// If we got an 'ENOENT' response, the file doesn't exist, which is fine
|
||||||
// 3) Delete the encryption key
|
// 3) Delete the encryption key
|
||||||
return new Promise<void>((resolve, reject) => {
|
try {
|
||||||
fs.unlink(self._cacheSerializationPath, err => {
|
await fs.unlink(this._cacheSerializationPath);
|
||||||
if (err && err.code !== 'ENOENT') {
|
} catch (err) {
|
||||||
reject(err);
|
if (err.code !== 'ENOENT') {
|
||||||
} else {
|
throw err;
|
||||||
resolve();
|
}
|
||||||
}
|
}
|
||||||
});
|
await this._credentialProvider.deleteCredential(this._credentialServiceKey);
|
||||||
})
|
|
||||||
.then(() => { return self._credentialProvider.deleteCredential(self._credentialServiceKey); })
|
|
||||||
.then(() => { });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public find(query: any, callback: (error: Error, results: any[]) => void): void {
|
public find(query: any, callback: (error: Error, results: any[]) => void): void {
|
||||||
@@ -230,7 +226,7 @@ export default class TokenCache implements adal.TokenCache {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private readCache(): Thenable<adal.TokenResponse[]> {
|
private async readCache(): Promise<adal.TokenResponse[]> {
|
||||||
let self = this;
|
let self = this;
|
||||||
|
|
||||||
// NOTE: File system operations are performed synchronously to avoid annoying nested callbacks
|
// NOTE: File system operations are performed synchronously to avoid annoying nested callbacks
|
||||||
@@ -239,13 +235,13 @@ export default class TokenCache implements adal.TokenCache {
|
|||||||
// 3) Decrypt the file contents
|
// 3) Decrypt the file contents
|
||||||
// 4) Deserialize and return
|
// 4) Deserialize and return
|
||||||
return this.getOrCreateEncryptionParams()
|
return this.getOrCreateEncryptionParams()
|
||||||
.then(encryptionParams => {
|
.then(async encryptionParams => {
|
||||||
try {
|
try {
|
||||||
return self.decryptCache('utf8', encryptionParams);
|
return self.decryptCache('utf8', encryptionParams);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
try {
|
try {
|
||||||
// try to parse using 'binary' encoding and rewrite cache as UTF8
|
// try to parse using 'binary' encoding and rewrite cache as UTF8
|
||||||
let response = self.decryptCache('binary', encryptionParams);
|
let response = await self.decryptCache('binary', encryptionParams);
|
||||||
self.writeCache(response);
|
self.writeCache(response);
|
||||||
return response;
|
return response;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -260,17 +256,17 @@ export default class TokenCache implements adal.TokenCache {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private decryptCache(encoding: crypto.Utf8AsciiBinaryEncoding, encryptionParams: EncryptionParams): adal.TokenResponse[] {
|
private async decryptCache(encoding: crypto.Utf8AsciiBinaryEncoding, encryptionParams: EncryptionParams): Promise<adal.TokenResponse[]> {
|
||||||
let cacheCipher = fs.readFileSync(this._cacheSerializationPath, TokenCache.FsOptions);
|
let cacheCipher = await fs.readFile(this._cacheSerializationPath, TokenCache.FsOptions);
|
||||||
let decipher = crypto.createDecipheriv(TokenCache.CipherAlgorithm, encryptionParams.key, encryptionParams.initializationVector);
|
let decipher = crypto.createDecipheriv(TokenCache.CipherAlgorithm, encryptionParams.key, encryptionParams.initializationVector);
|
||||||
let cacheJson = decipher.update(cacheCipher, 'hex', encoding);
|
let cacheJson = decipher.update(cacheCipher.toString(), 'hex', encoding);
|
||||||
cacheJson += decipher.final(encoding);
|
cacheJson += decipher.final(encoding);
|
||||||
|
|
||||||
// Deserialize the JSON into the array of tokens
|
// Deserialize the JSON into the array of tokens
|
||||||
let cacheObj = <adal.TokenResponse[]>JSON.parse(cacheJson);
|
let cacheObj = <adal.TokenResponse[]>JSON.parse(cacheJson);
|
||||||
for (let objIndex in cacheObj) {
|
for (const obj of cacheObj) {
|
||||||
// Rehydrate Date objects since they will always serialize as a string
|
// Rehydrate Date objects since they will always serialize as a string
|
||||||
cacheObj[objIndex].expiresOn = new Date(<string>cacheObj[objIndex].expiresOn);
|
obj.expiresOn = new Date(<string>obj.expiresOn);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cacheObj;
|
return cacheObj;
|
||||||
@@ -297,7 +293,7 @@ export default class TokenCache implements adal.TokenCache {
|
|||||||
// 4) Encrypt the JSON
|
// 4) Encrypt the JSON
|
||||||
// 3) Write to the file
|
// 3) Write to the file
|
||||||
return this.getOrCreateEncryptionParams()
|
return this.getOrCreateEncryptionParams()
|
||||||
.then(encryptionParams => {
|
.then(async encryptionParams => {
|
||||||
try {
|
try {
|
||||||
let cacheJson = JSON.stringify(cache);
|
let cacheJson = JSON.stringify(cache);
|
||||||
|
|
||||||
@@ -305,7 +301,7 @@ export default class TokenCache implements adal.TokenCache {
|
|||||||
let cacheCipher = cipher.update(cacheJson, 'utf8', 'hex');
|
let cacheCipher = cipher.update(cacheJson, 'utf8', 'hex');
|
||||||
cacheCipher += cipher.final('hex');
|
cacheCipher += cipher.final('hex');
|
||||||
|
|
||||||
fs.writeFileSync(self._cacheSerializationPath, cacheCipher, TokenCache.FsOptions);
|
await fs.writeFile(self._cacheSerializationPath, cacheCipher, TokenCache.FsOptions);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import * as fs from 'fs';
|
import { promises as fs } from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import * as constants from './constants';
|
import * as constants from './constants';
|
||||||
@@ -54,12 +54,12 @@ function pushDisposable(disposable: vscode.Disposable): void {
|
|||||||
|
|
||||||
// this method is called when your extension is activated
|
// this method is called when your extension is activated
|
||||||
// your extension is activated the very first time the command is executed
|
// your extension is activated the very first time the command is executed
|
||||||
export function activate(context: vscode.ExtensionContext) {
|
export async function activate(context: vscode.ExtensionContext) {
|
||||||
extensionContext = context;
|
extensionContext = context;
|
||||||
const apiWrapper = new ApiWrapper();
|
const apiWrapper = new ApiWrapper();
|
||||||
let appContext = new AppContext(extensionContext, apiWrapper);
|
let appContext = new AppContext(extensionContext, apiWrapper);
|
||||||
|
|
||||||
let storagePath = findOrMakeStoragePath();
|
let storagePath = await findOrMakeStoragePath();
|
||||||
if (!storagePath) {
|
if (!storagePath) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
@@ -83,18 +83,30 @@ export function activate(context: vscode.ExtensionContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the folder for storing the token caches
|
// Create the folder for storing the token caches
|
||||||
function findOrMakeStoragePath() {
|
async function findOrMakeStoragePath() {
|
||||||
let storagePath = path.join(getDefaultLogLocation(), constants.extensionName);
|
let defaultLogLocation = getDefaultLogLocation();
|
||||||
|
let storagePath = path.join(defaultLogLocation, constants.extensionName);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!fs.existsSync(storagePath)) {
|
await fs.mkdir(defaultLogLocation, { recursive: true });
|
||||||
fs.mkdirSync(storagePath);
|
} catch (e) {
|
||||||
console.log('Initialized Azure account extension storage.');
|
if (e.code !== 'EEXIST') {
|
||||||
|
console.log(`Creating the base directory failed... ${e}`);
|
||||||
|
return undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
|
||||||
console.error(`Initialization of Azure account extension storage failed: ${e}`);
|
try {
|
||||||
console.error('Azure accounts will not be available');
|
await fs.mkdir(storagePath, { recursive: true });
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code !== 'EEXIST') {
|
||||||
|
console.error(`Initialization of Azure account extension storage failed: ${e}`);
|
||||||
|
console.error('Azure accounts will not be available');
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('Initialized Azure account extension storage.');
|
||||||
return storagePath;
|
return storagePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,4 +136,3 @@ function registerCommands(appContext: AppContext, azureResourceTree: AzureResour
|
|||||||
|
|
||||||
registerAzureResourceDatabaseCommands(appContext);
|
registerAzureResourceDatabaseCommands(appContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const testRunner = require('vscode/lib/testrunner');
|
const testRunner = require('vscode/lib/testrunner');
|
||||||
|
|
||||||
const suite = 'Integration Azure Tests';
|
const suite = 'azurecore Extension Tests';
|
||||||
|
|
||||||
const options: any = {
|
const options: any = {
|
||||||
ui: 'bdd',
|
ui: 'bdd',
|
||||||
@@ -14,6 +14,24 @@ const options: any = {
|
|||||||
timeout: 60000
|
timeout: 60000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// set relevant mocha options from the environment
|
||||||
|
if (process.env.ADS_TEST_GREP) {
|
||||||
|
options.grep = process.env.ADS_TEST_GREP;
|
||||||
|
console.log(`setting options.grep to: ${options.grep}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_INVERT_GREP) {
|
||||||
|
options.invert = parseInt(process.env.ADS_TEST_INVERT_GREP);
|
||||||
|
console.log(`setting options.invert to: ${options.invert}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_TIMEOUT) {
|
||||||
|
options.timeout = parseInt(process.env.ADS_TEST_TIMEOUT);
|
||||||
|
console.log(`setting options.timeout to: ${options.timeout}`);
|
||||||
|
}
|
||||||
|
if (process.env.ADS_TEST_RETRIES) {
|
||||||
|
options.retries = parseInt(process.env.ADS_TEST_RETRIES);
|
||||||
|
console.log(`setting options.retries to: ${options.retries}`);
|
||||||
|
}
|
||||||
|
|
||||||
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
||||||
options.reporter = 'mocha-multi-reporters';
|
options.reporter = 'mocha-multi-reporters';
|
||||||
options.reporterOptions = {
|
options.reporterOptions = {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user