Compare commits

...
5 Commits
33 changed files with 5881 additions and 5010 deletions

No files matched your search

+18
View File
@@ -7,6 +7,24 @@
"commands": [
"dotnet-format"
]
},
"fable": {
"version": "4.0.0-theta-018",
"commands": [
"fable"
]
},
"fantomas": {
"version": "5.2.2",
"commands": [
"fantomas"
]
},
"fake-cli": {
"version": "6.0.0",
"commands": [
"fake"
]
}
}
}
@@ -63,9 +63,9 @@ namespace mbts.spark {
vs_input, vs_nonvol_data.contracts, aux_data_map);
_timer.stop();
var tag_str = tag == null ? "Null" : tag.ToString();
bts.Log.Gen.info($"SingleVolSurfaceCommittedOutputRetriever._recompute_and_publish " +
$"vs_id: {_vs_id} time:{_timer.lastIntervalTime} ms tag:{tag_str} " +
$"tid:{_tid()}"); //output: {vs_output.log_string()}*/");
// bts.Log.Gen.info($"SingleVolSurfaceCommittedOutputRetriever._recompute_and_publish " +
// $"vs_id: {_vs_id} time:{_timer.lastIntervalTime} ms tag:{tag_str} " +
// $"tid:{_tid()}"); //output: {vs_output.log_string()}*/");
_logger.log(_log_id, _log_id, _timer.lastIntervalTime);
_bb.post(_out_bb_computed_vol_tag, vs_output);
}
@@ -75,7 +75,7 @@ namespace mbts.spark {
var exp_price_map = OptionDriverPriceMap.get_vs_price_map(
all_sym_price_map, (s) => _option_symbols.Contains(s));
if (sc_data != null && vs_nonvol_input != null && exp_price_map != null) {
bts.Log.Gen.info($"SingleVolSurfaceNonVolDataSource vs_id:{_vs_id} " +
bts.Log.Gen.diag($"SingleVolSurfaceNonVolDataSource vs_id:{_vs_id} " +
"publishing VolSurfaceNonVolData");
_bb.post(_out_bb_vs_nonvol_data_tag,
new VolSurfaceNonVolData(
@@ -81,7 +81,7 @@ namespace mbts.analytics {
output.Add(symbol, symbol_data);
}
IReadOnlyDictionary<string, TData> ro_output = output;
bts.Log.Gen.info($"SymbolAggregationPublisher._on_timer publishing " +
bts.Log.Gen.diag($"SymbolAggregationPublisher._on_timer publishing " +
$"tag: {_out_tag} sz: {ro_output.Count}");
_bb.post(_out_tag, ro_output);
}
@@ -28,9 +28,10 @@ namespace mbts.spark {
_candidate_value.Changed += on_candidate_changed;
_is_dirty.Changed += (o, n) => {
Log.assert(o != n);
Log.Ui.info(
$"VolSurface '{expiration}.{column}' is_dirty changed to {n}. " +
$"commited: {committed_value}; candidate: {candidate_value}");
// TODO: John, this was logged too many times
// Log.Ui.info(
// $"VolSurface '{expiration}.{column}' is_dirty changed to {n}. " +
// $"commited: {committed_value}; candidate: {candidate_value}");
};
void on_committed_changed(object? oldval, object? newval) =>
@@ -88,8 +88,8 @@ namespace mbts.analytics {
public void set_driver_price(
IDictionary<VolSurfaceExpiration, double> driver_price_map) {
Log.Gen.info($"VolSurfaceInterpGreeksProducer.set_driver_price " +
$"vs_id: {_vs_id} exp_count: {driver_price_map.Count}");
// Log.Gen.info($"VolSurfaceInterpGreeksProducer.set_driver_price " +
// $"vs_id: {_vs_id} exp_count: {driver_price_map.Count}");
_driver_price_map = new Dictionary<VolSurfaceExpiration, double>(driver_price_map);
_compute_and_fire(InputType.DriverPrice);
}
+1 -1
View File
@@ -62,7 +62,7 @@ namespace bts {
}
private void _on_server_sec_map(IReadOnlyDictionary<uint, SecurityMD> sec_map) {
_log_options(sec_map);
//_log_options(sec_map);
bts.Log.Gen.info(String.Format("MergedMDDaemon._on_server_sec_map sz: {0}", sec_map.Count()));
_server_sec_map = new Dictionary<uint, SecurityMD>(sec_map);
_merge_and_post();
@@ -58,5 +58,10 @@ namespace BCG {
public static UInt32 get_ask_size(BBOPacket md) {
return md != null ? md._ask_size : (UInt32)0;
}
public static Tuple<double, UInt32> get_md(BBOPacket md, bool is_bid) {
double price = is_bid ? BBOPacket.get_bid_price(md) : BBOPacket.get_ask_price(md);
UInt32 sz = is_bid ? BBOPacket.get_bid_size(md) : BBOPacket.get_ask_size(md);
return Tuple.Create(price, sz);
}
}
}
@@ -123,6 +123,15 @@ namespace BCG {
#endregion
#region Orders
[System.ComponentModel.Category("Orders / Algo")]
[System.ComponentModel.DisplayName("Default Account")]
public string Account { get; set; }
[System.ComponentModel.Category("Orders / Algo")]
[System.ComponentModel.DisplayName("Default Qty")]
public Nullable<double> DefaultQty { get; set; }
#endregion
public NMSheetSettingLayout() {
show_settings_header = false;
show_exp_navigator = false;
@@ -18,6 +18,7 @@ using mbts.spark.filters;
using System.Collections;
using System.Reactive.Linq;
using System.Threading;
using bts.api.orderman;
namespace BCG {
public partial class NMSheetControl : UserControl {
@@ -555,6 +556,17 @@ namespace BCG {
}
private void _launch_order_entry_window(NMSheetTheoGrid.GridCell cell,
OrderEntryWindow window_type) {
Func<string, bts.AccountTuple> get_account = (string default_acc) => {
string account = _settings.setting_layout.Account;
if (String.IsNullOrEmpty(account)) {
account = default_acc;
}
Nullable<uint> id = _get_account_id(account);
if (!id.HasValue) {
id = 0;
}
return new bts.AccountTuple(id.Value, account);
};
uint key;
var found = _sheet_data.get_security_key(cell.expiration,
cell.strike, cell.call_selected, out key);
@@ -566,7 +578,20 @@ namespace BCG {
if (sc_data.sec_md_map.TryGetValue(key, out var smd)) {
switch (window_type) {
case OrderEntryWindow.Ticket:
_threaded_bb.post(SparkTags.ShowOrderTicketFromSecurityTag, smd);
bool is_bid = NMSheetSettingColumnOrganization.get_column_info(cell.col).is_bid;
bts.AccountTuple acc_tup = get_account("SMALL");
Nullable<double> qty = _settings.setting_layout.DefaultQty;
OrderDefinition od = new OrderDefinition() {
SecurityKey = smd.id,
TimeInForce = TimeInForce.Gtc,
Account = acc_tup.name,
AccountId = acc_tup.id
};
BBOPacket bbo = _sheet_data.get_bbo(smd.id);
Tuple<double, UInt32> pr_sz = BBOPacket.get_md(bbo, is_bid);
UInt32 effective_qty = qty.HasValue ? Convert.ToUInt32(Math.Abs(qty.Value)) : pr_sz.Item2;
_threaded_bb.post(SparkTags.ShowOrderTicketTag,
(new OrderDefinitionImmutable(od), pr_sz.Item1, effective_qty));
break;
case OrderEntryWindow.Ladder:
_threaded_bb.post(SparkTags.ShowLadderTag, smd);
@@ -121,7 +121,7 @@ namespace mbts.analytics {
timer.stop();
Log.Ui.info($"PNLReportCalculator n_pos: {output.position_data.Count()} " +
$"n_day_trades: {output.day_trades.Count()} time(msecs): {timer.lastIntervalTime}");
_log_before_posting(output.position_data);
//_log_before_posting(output.position_data);
_bus.post(SparkTags.ReportBlackboardTags.PNL.PNLData, output);
});
}
@@ -115,21 +115,21 @@ namespace mbts.analytics {
}
private void _handle_nonvol_data(VolSurfaceNonVolData vs_nonvol_data) {
bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_nonvol_data report {0}",
_report.ReportName));
// bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_nonvol_data report {0}",
// _report.ReportName));
_vs_nonvol_data = vs_nonvol_data;
}
private void _handle_future_prices(
IReadOnlyDictionary<SecurityExpiration, FutureTheoStructure> future_prices_map) {
bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_future_prices report {0}",
_report.ReportName));
// bts.Log.Gen.Diag(String.Format("SlideReportCalculator._handle_future_prices report {0}",
// _report.ReportName));
_future_prices_map = future_prices_map.ToDictionary(kv => kv.Key, kv => kv.Value.theo);
}
private void _handle_trades(IEnumerable<ITradeLogRow> trades) {
bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_trades report {0}",
_report.ReportName));
// bts.Log.Gen.info(String.Format("SlideReportCalculator._handle_trades report {0}",
// _report.ReportName));
_all_trades = trades.Where(t => t.is_active);
if (_report.CalcMode == Report.Types.ReportCalculationMode.PositionOrTheoChange) {
_compute_dirty = true;
+2 -2
View File
@@ -35,7 +35,7 @@ namespace bts.core {
// TODO: for debugging purposes, remove it later
if (tag != mbts.spark.SparkTags.SparkTimer) {
var tid = System.Threading.Thread.CurrentThread.ManagedThreadId;
bts.Log.Ui.diag($"SimpleBus.post tag:{tag} tid:{tid}");
//bts.Log.Ui.diag($"SimpleBus.post tag:{tag} tid:{tid}");
return;
}
} catch (Exception e) {
@@ -45,7 +45,7 @@ namespace bts.core {
public IObservable<T> subscribe<T>(ITag<T> tag) {
var tid = System.Threading.Thread.CurrentThread.ManagedThreadId;
bts.Log.Ui.info($"SimpleBus.post tag:{tag} tid:{tid}");
//bts.Log.Ui.info($"SimpleBus.subscribe tag:{tag} tid:{tid}");
return subject<T>(tag);
}
}
+1 -1
View File
@@ -161,7 +161,7 @@ def to_type_model(field, msg):
elif field.type == types.TYPE_DOUBLE: return TypeModel("double", islist, "double?", jstype='number')
elif field.type == types.TYPE_FLOAT: return TypeModel("float", islist, "float?", jstype='number', fstype='float32')
elif field.type == types.TYPE_STRING: return TypeModel("string", islist, cpptype="std::string")
elif field.type == types.TYPE_BYTES: return TypeModel("ByteString", islist, cpptype="std::string", jstype='Uint8Array', fstype='Fable.Import.JS.Uint8Array')
elif field.type == types.TYPE_BYTES: return TypeModel("ByteString", islist, cpptype="std::string", jstype='Uint8Array', fstype='Fable.Core.JS.Uint8Array')
elif field.type == types.TYPE_BOOL: return TypeModel("bool", islist, "bool?", jstype='boolean', natural_key=True)
elif field.type == types.TYPE_ENUM:
nested_enums = [x.name for x in msg.enum_type]
+2409 -1369
View File
File diff suppressed because it is too large. Load diff
+8 -8
View File
@@ -1,23 +1,23 @@
{
"dependencies": {
"protobufjs": "^6.11.3",
"tslib": "^2.4.0",
"protobufjs": "^7.2.2",
"tslib": "^2.5.0",
"watch": "^1.0.2"
},
"devDependencies": {
"jest": "^28.1.1",
"ts-jest": "^28.0.4",
"jest": "^29.4.3",
"protobufjs-cli": "^1.1.1",
"ts-jest": "^29.0.5",
"ts2fable": "^0.7.1",
"tsutils": "^3.21.0",
"typescript": "^4.7.3",
"ws": "^8.7.0"
"typescript": "^4.9.5",
"ws": "^8.12.1"
},
"scripts": {
"build": "tsc -p tsconfig.release.json",
"watch": "tsc -w -p tsconfig.release.json",
"protogen": "pbjs -t json-module -w commonjs -o %build%/proto.js ../../lib/api/*.proto ../../lib/api/services/*.proto ../../lib/domain_model/*.proto ../../lib/sparkproto/*.proto ../../lib/md/protos/*.proto",
"test": "jest",
"test:watch": "jest --watch",
"fable": "ts2fable %build%/ServiceContext.d.ts %build%/ServiceContext.fs && ts2fable %build%/HelloService.d.ts %build%/HelloService.fs"
"test:watch": "jest --watch"
}
}
+2833 -3529
View File
File diff suppressed because it is too large. Load diff
+18 -21
View File
@@ -8,37 +8,34 @@
"author": "",
"license": "ISC",
"dependencies": {
"@babel/plugin-transform-runtime": "^7.18.2",
"@babel/preset-env": "^7.18.2",
"@babel/runtime": "^7.18.3",
"babel-loader": "^8.2.5",
"fable-loader": "^2.1.9",
"@babel/plugin-transform-runtime": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@babel/runtime": "^7.21.0",
"babel-loader": "^9.1.2",
"fable-utils": "^1.2.0",
"node-sass": "^7.0.1",
"protobufjs": "^6.11.3",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"node-sass": "^8.0.0",
"protobufjs": "^7.2.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"remotedev": "^0.2.9",
"ts2fable": "^0.7.1",
"webpack": "^5.73.0"
"webpack": "^5.75.0"
},
"devDependencies": {
"@babel/core": "^7.18.2",
"@babel/core": "^7.21.0",
"@fortawesome/fontawesome-free": "^5.15.4",
"bulma": "^0.9.4",
"copy-webpack-plugin": "^11.0.0",
"core-js": "^3.22.8",
"css-loader": "^6.7.1",
"fable-compiler": "^2.13.0",
"file-loader": "^6.2.0",
"core-js": "^3.28.0",
"css-loader": "^6.7.3",
"html-webpack-plugin": "^5.5.0",
"mini-css-extract-plugin": "^2.6.0",
"mini-css-extract-plugin": "^2.7.2",
"npx": "^10.2.2",
"sass": "^1.52.3",
"sass-loader": "^13.0.0",
"sass": "^1.58.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.1",
"tslib": "^2.4.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.9.2"
"tslib": "^2.5.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
}
}
+2 -2
View File
@@ -170,8 +170,8 @@ let marginSub model dispatch =
let selectSub (tab:Tab option) model =
match tab, model.tab with
| Some PositionManagementTab, _ | None, PositionManagementTab -> Cmd.ofSub (positionSub model)
| Some MarginTab, _ | None, MarginTab -> Cmd.ofMsg GetMarginData //Cmd.ofSub (marginSub model)
| Some PositionManagementTab, _ | None, PositionManagementTab -> Cmd.ofEffect (positionSub model)
| Some MarginTab, _ | None, MarginTab -> Cmd.ofMsg GetMarginData //Cmd.ofEffect (marginSub model)
| _ ->
match model.unsub with
| Some (unsub) -> unsub.Dispose()
+3 -3
View File
@@ -1225,7 +1225,7 @@ let accountSelectionGrid (accountList:BTSAccount list) (currentAccount:BTSAccoun
onClick = None
}
]
div[] [
div [] [
TableControl.createSelectorTable (Some headerRow) rws
]
@@ -1265,7 +1265,7 @@ let menuItem account selectedAccount model dispatch =
]
]
]
else span[][])
else span [] [])
]
let NavRoot (accounts:BTSAccount[]) selectedAccount model dispatch =
@@ -1312,7 +1312,7 @@ let root (model:Model) dispatch =
| "" -> span [] []
| _ -> Modal.showConfirm (fst model.ConfirmModal) (fun () -> (snd model.ConfirmModal) |> dispatch) (fun _ -> OpenConfirmModal ("", Msg.SelectTab model.tab ) |> dispatch)
match model.adminData with
| None -> div[][str "Loading account list..."]
| None -> div [] [str "Loading account list..."]
| Some data ->
div
[ Class "columns is-fullheight"
-4
View File
@@ -7,10 +7,6 @@ open Types
open App.State
open App.Types
open Global
open Fable.Core.JsInterop
open Types
open App.State
open Global
importAll "../sass/main.scss"
+2 -2
View File
@@ -146,8 +146,8 @@ let buttonColumn action header icon misc =
rowIdx = 0;
misc = misc;
}
[ Fable.React.Props.HTMLAttr.Name header
Fable.React.Props.HTMLAttr.Style [ Fable.React.Props.CSSProp.Width 60 ]
[ HTMLAttr.Name header
Style [ Fable.React.Props.CSSProp.Width 60 ]
]
// [ Name header
-1
View File
@@ -6,7 +6,6 @@ open System
open System.Runtime.InteropServices
open Fable.Core
open Fable.Core.JsInterop
open System.Xml
open bts.api.admin
open Global
+5 -5
View File
@@ -119,7 +119,7 @@ let generalTabView (model:Model) (dispatch:Msg->Unit) (readonly: bool)=
Fields.text "Company" model.scratchUser.company [Disabled readonly] (Company >> UpdateField >> dispatch)
Fields.checkbox "Can Login?" "Unchecking this stops the user from logging into Spark" model.scratchUser.isActive [Disabled can_login_disabled] (IsActive >> UpdateField >> dispatch)
Fields.checkbox "Can Create?" "Checking this allows the user to create other users and accounts" model.scratchUser.canCreate [Disabled (readonly || not can_create)] (CanCreate >> UpdateField >> dispatch)
(if (State.isNewUser model.scratchUser) then modal else span[][])
(if (State.isNewUser model.scratchUser) then modal else span [] [])
]
let accountNameLookup (accountsList:BTSAccount list) (id:string) =
@@ -334,7 +334,7 @@ let tabContent (model:Model) (dispatch:Msg->Unit) display_md display_risk =
| Tab.MarketData, true -> MarketDataTabView model dispatch (not display_md)
| Tab.OrderRouting, true -> orderRoutingTabView model dispatch (not display_risk) )
(if (State.userIsSelected model.scratchUser State.defaultScratchUser) then userControls model dispatch else span[][])
(if (State.userIsSelected model.scratchUser State.defaultScratchUser) then userControls model dispatch else span [] [])
]
let usersMenu (usersList:BTSUser list) (currentUser:BTSUser) (dispatch:Msg->Unit) =
@@ -395,7 +395,7 @@ let userSelectionGrid (usersList:BTSUser list) (currentUser:BTSUser) (dispatch:M
onClick = None
}
]
div[][
div [] [
TableControl.createSelectorTable (Some headerRow) rws
]
@@ -444,7 +444,7 @@ let menuItem (user:BTSUser) (selectedUser:BTSUser) model dispatch =
]
]
else
span[][])
span [] [])
]
let NavRoot (usersList:BTSUser list) (currentUser:BTSUser) model (dispatch:Msg->Unit) =
@@ -496,7 +496,7 @@ let root (model:Model) (dispatch:Msg->Unit) =
| "" -> span [] []
| _ -> Modal.showConfirm (fst model.ConfirmModal) (fun () -> (snd model.ConfirmModal) |> dispatch) (fun _ -> OpenConfirmModal ("", Msg.SwitchTab model.currentTab ) |> dispatch)
(match model.adminData with
| None -> div[][str "Loading user list..."]
| None -> div [] [str "Loading user list..."]
| Some data ->
div
[ Class "columns is-fullheight"
@@ -0,0 +1,486 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"ui/1.0.0": {
"dependencies": {
"Elmish": "4.0.1",
"Elmish.Navigation": "1.0.0",
"Fable.Core": "4.0.0-theta-007",
"Fable.Elmish": "4.0.1",
"Fable.Elmish.Browser": "4.0.1",
"Fable.Elmish.Debugger": "4.0.0",
"Fable.Elmish.HMR": "7.0.0",
"Fable.Elmish.React": "4.0.0",
"Fable.Elmish.UrlParser": "1.0.1",
"Fable.Promise": "3.2.0",
"Fable.React": "9.2.0",
"System.Runtime": "4.3.1"
},
"runtime": {
"ui.dll": {}
}
},
"Elmish/4.0.1": {
"runtime": {
"lib/netstandard2.0/Elmish.dll": {
"assemblyVersion": "4.0.1.0",
"fileVersion": "4.0.1.0"
}
}
},
"Elmish.Navigation/1.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Elmish": "4.0.1"
},
"runtime": {
"lib/net5.0/Elmish.Navigation.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"Fable.Browser.Blob/1.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Blob.dll": {
"assemblyVersion": "1.2.0.0",
"fileVersion": "1.2.0.0"
}
}
},
"Fable.Browser.Dom/2.10.1": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Blob": "1.2.0",
"Fable.Browser.Event": "1.5.0",
"Fable.Browser.WebStorage": "1.1.0",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Dom.dll": {
"assemblyVersion": "2.10.1.0",
"fileVersion": "2.10.1.0"
}
}
},
"Fable.Browser.Event/1.5.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Gamepad": "1.1.0",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Event.dll": {
"assemblyVersion": "1.5.0.0",
"fileVersion": "1.5.0.0"
}
}
},
"Fable.Browser.Gamepad/1.1.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.Gamepad.dll": {
"assemblyVersion": "1.1.0.0",
"fileVersion": "1.1.0.0"
}
}
},
"Fable.Browser.WebStorage/1.1.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Event": "1.5.0",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Browser.WebStorage.dll": {
"assemblyVersion": "1.1.0.0",
"fileVersion": "1.1.0.0"
}
}
},
"Fable.Core/4.0.0-theta-007": {
"runtime": {
"lib/netstandard2.0/Fable.Core.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.0.0.0"
}
}
},
"Fable.Elmish/4.0.1": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.dll": {
"assemblyVersion": "4.0.1.0",
"fileVersion": "4.0.1.0"
}
}
},
"Fable.Elmish.Browser/4.0.1": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Dom": "2.10.1",
"Fable.Elmish": "4.0.1",
"Fable.Elmish.UrlParser": "1.0.1"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.Browser.dll": {
"assemblyVersion": "4.0.1.0",
"fileVersion": "4.0.1.0"
}
}
},
"Fable.Elmish.Debugger/4.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Elmish": "4.0.1",
"Thoth.Json": "6.0.0"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.Debugger.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.0.0.0"
}
}
},
"Fable.Elmish.HMR/7.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007",
"Fable.Elmish.React": "4.0.0"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.HMR.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.0"
}
}
},
"Fable.Elmish.React/4.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Elmish": "4.0.1",
"Fable.ReactDom.Types": "18.2.0"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.React.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.0.0.0"
}
}
},
"Fable.Elmish.UrlParser/1.0.1": {
"dependencies": {
"FSharp.Core": "6.0.7"
},
"runtime": {
"lib/netstandard2.0/Fable.Elmish.UrlParser.dll": {
"assemblyVersion": "1.0.1.0",
"fileVersion": "1.0.1.0"
}
}
},
"Fable.Promise/3.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Fable.Promise.dll": {
"assemblyVersion": "3.2.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"Fable.React/9.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.React.Types": "18.3.0",
"Fable.ReactDom.Types": "18.2.0"
},
"runtime": {
"lib/netstandard2.0/Fable.React.dll": {
"assemblyVersion": "9.2.0.0",
"fileVersion": "9.2.0.0"
}
}
},
"Fable.React.Types/18.3.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Browser.Dom": "2.10.1",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Fable.React.Types.dll": {
"assemblyVersion": "18.3.0.0",
"fileVersion": "18.3.0.0"
}
}
},
"Fable.ReactDom.Types/18.2.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.React.Types": "18.3.0"
},
"runtime": {
"lib/netstandard2.0/Fable.ReactDom.Types.dll": {
"assemblyVersion": "18.2.0.0",
"fileVersion": "18.2.0.0"
}
}
},
"FSharp.Core/6.0.7": {
"runtime": {
"lib/netstandard2.1/FSharp.Core.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.722.51308"
}
},
"resources": {
"lib/netstandard2.1/cs/FSharp.Core.resources.dll": {
"locale": "cs"
},
"lib/netstandard2.1/de/FSharp.Core.resources.dll": {
"locale": "de"
},
"lib/netstandard2.1/es/FSharp.Core.resources.dll": {
"locale": "es"
},
"lib/netstandard2.1/fr/FSharp.Core.resources.dll": {
"locale": "fr"
},
"lib/netstandard2.1/it/FSharp.Core.resources.dll": {
"locale": "it"
},
"lib/netstandard2.1/ja/FSharp.Core.resources.dll": {
"locale": "ja"
},
"lib/netstandard2.1/ko/FSharp.Core.resources.dll": {
"locale": "ko"
},
"lib/netstandard2.1/pl/FSharp.Core.resources.dll": {
"locale": "pl"
},
"lib/netstandard2.1/pt-BR/FSharp.Core.resources.dll": {
"locale": "pt-BR"
},
"lib/netstandard2.1/ru/FSharp.Core.resources.dll": {
"locale": "ru"
},
"lib/netstandard2.1/tr/FSharp.Core.resources.dll": {
"locale": "tr"
},
"lib/netstandard2.1/zh-Hans/FSharp.Core.resources.dll": {
"locale": "zh-Hans"
},
"lib/netstandard2.1/zh-Hant/FSharp.Core.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.NETCore.Platforms/1.1.1": {},
"Microsoft.NETCore.Targets/1.1.3": {},
"System.Runtime/4.3.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.1",
"Microsoft.NETCore.Targets": "1.1.3"
}
},
"Thoth.Json/6.0.0": {
"dependencies": {
"FSharp.Core": "6.0.7",
"Fable.Core": "4.0.0-theta-007"
},
"runtime": {
"lib/netstandard2.0/Thoth.Json.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.0.0"
}
}
}
}
},
"libraries": {
"ui/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Elmish/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6AI++9Ula33yMUG9F83iVrZClurQn5cgriwK7aX9FvlhJFXgRB6IYybD+wx26NNhdPOKQIvfBYZYWwRWWWqJmA==",
"path": "elmish/4.0.1",
"hashPath": "elmish.4.0.1.nupkg.sha512"
},
"Elmish.Navigation/1.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0+CYaZzb988Oi02KeXPTUf0HTi1NXgFXTZ5/OROU22GKAohZe519QK3Be+jkbT0hvQq5EEiJJjPfp3FAgpqDaA==",
"path": "elmish.navigation/1.0.0",
"hashPath": "elmish.navigation.1.0.0.nupkg.sha512"
},
"Fable.Browser.Blob/1.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bM4zbtIeycTFFCH7o4WuN28W70dTxNTMZiMvR70XUTYrBnbz7GpS5XxzUy5caDB4l7s2l7wiuVDhh52t7NXxDg==",
"path": "fable.browser.blob/1.2.0",
"hashPath": "fable.browser.blob.1.2.0.nupkg.sha512"
},
"Fable.Browser.Dom/2.10.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-G1Ul9D3suwBPUxEw0hwclZzDxDk/hLkwAZytgAoxHmv4uGth9Zpi9Fz4gm6C8v6W87qvhcM8lrCpg1awPeATyg==",
"path": "fable.browser.dom/2.10.1",
"hashPath": "fable.browser.dom.2.10.1.nupkg.sha512"
},
"Fable.Browser.Event/1.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Bx2AOOASIG1Eq1Pe8869H8baMePte6STmKGccGuOYMT2p6nWVS8G6ZBZb5encQ0tAL2/0vhA4KJOl4bYwUaQqg==",
"path": "fable.browser.event/1.5.0",
"hashPath": "fable.browser.event.1.5.0.nupkg.sha512"
},
"Fable.Browser.Gamepad/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8m/Ae/mrH2Hb2ue435rTPEeVb2FhfWsRJJLpCxMvk+5EUOO2+IIjIkLq4thUfRL98uQVt9V5cQd14h2aBf2XJA==",
"path": "fable.browser.gamepad/1.1.0",
"hashPath": "fable.browser.gamepad.1.1.0.nupkg.sha512"
},
"Fable.Browser.WebStorage/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tGktTk6QHIOeX7JtG5ISem1p9Rc1iYkgcbpIEzHS2YuvpOa9YomUKABU0Lraz4GMjAGxhhNvAXLRry2w89HdVQ==",
"path": "fable.browser.webstorage/1.1.0",
"hashPath": "fable.browser.webstorage.1.1.0.nupkg.sha512"
},
"Fable.Core/4.0.0-theta-007": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9nDQRQfhz6/NjoXLBMqixCjRYvx8jgHAuGjJow4W0vHoFWNauPhTex+psQsw9FRRuQF2AhIwuhHoh9Tb8JoCfw==",
"path": "fable.core/4.0.0-theta-007",
"hashPath": "fable.core.4.0.0-theta-007.nupkg.sha512"
},
"Fable.Elmish/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BtsXTur95XkWmZaXwIoqfUk8puWpiwgJK8YMTg62C/FYxMl8Z6WM4yuGAjQ6rVpKWw5Ha47VfmOL6k/znK3msw==",
"path": "fable.elmish/4.0.1",
"hashPath": "fable.elmish.4.0.1.nupkg.sha512"
},
"Fable.Elmish.Browser/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XqTMh3TzkyuWmKXOoNAHRDjxcnCAiDkUMIZZX6tkxoHPhtruxnOG5zniOm7K/RZD+NGbreKi82pPswcvmjw6/w==",
"path": "fable.elmish.browser/4.0.1",
"hashPath": "fable.elmish.browser.4.0.1.nupkg.sha512"
},
"Fable.Elmish.Debugger/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-a1gABGh8L6kkzGDeVJP6VJtcimfSi/l3Xaa1lzuMlnzb3oXgtfmzXfx1DV/dtDVujIujueCOsA+JmiBh/2HB7A==",
"path": "fable.elmish.debugger/4.0.0",
"hashPath": "fable.elmish.debugger.4.0.0.nupkg.sha512"
},
"Fable.Elmish.HMR/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4A3u0H3wdmF00UBFJGJK6jlRxzEgkYOegDj2bgVzYTD1L17+0mCy9+QqAYJMuOGtA2klrKAHcU43tYdm0o2Fnw==",
"path": "fable.elmish.hmr/7.0.0",
"hashPath": "fable.elmish.hmr.7.0.0.nupkg.sha512"
},
"Fable.Elmish.React/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cMuWet7DhxgN2G1caYLwjLvoMkH1u75U36cUyL07yxNt/dmGp8GD/+RTtL9wpkfeThfeJHHouCkR708mJcMRpA==",
"path": "fable.elmish.react/4.0.0",
"hashPath": "fable.elmish.react.4.0.0.nupkg.sha512"
},
"Fable.Elmish.UrlParser/1.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Jpw1TPR3YsEeLHF0HMoeHKMYzTgjH+gslq8kNa3/d68GIK09eDpASNzA1gu9YLJkRYy5iUXvvvYtHUOKh+mzEw==",
"path": "fable.elmish.urlparser/1.0.1",
"hashPath": "fable.elmish.urlparser.1.0.1.nupkg.sha512"
},
"Fable.Promise/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4A+Iiembrny2h3AE2BIbchfuLmWHNhpkOTvbTtFXHtGzHVMqEVFRXrAfdy83wX2wK5Og3fqRo1y8t/Bqkd7j6g==",
"path": "fable.promise/3.2.0",
"hashPath": "fable.promise.3.2.0.nupkg.sha512"
},
"Fable.React/9.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZMRkZpBy+6ytUHPk0WjRh15kigncmSGLOAbtf12VaSy48mtgqIW4lC/23X/FEvz8tUGwHvBUen2GzUU1G/L+RQ==",
"path": "fable.react/9.2.0",
"hashPath": "fable.react.9.2.0.nupkg.sha512"
},
"Fable.React.Types/18.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/b8WZ3Bdfhqy9r60ZK9JGZaGNjIMb0ogsrvWIg3k7KfCEvJs5X6+7hCybVkyjVoxwzn9wLyYGRbh5wmuHQT/Vg==",
"path": "fable.react.types/18.3.0",
"hashPath": "fable.react.types.18.3.0.nupkg.sha512"
},
"Fable.ReactDom.Types/18.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2WoBjsLiSgrvR68OJXko0iVaqeMbkPM5Bx813A1WlxOSCJ50M9fwnlwG/MUEZtiOIhQmku/YTJY5a8E8r1+j2Q==",
"path": "fable.reactdom.types/18.2.0",
"hashPath": "fable.reactdom.types.18.2.0.nupkg.sha512"
},
"FSharp.Core/6.0.7": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e6wGrq5smV3Yk2fBE/Y0nBG5oFyF59k5Je0a0QDydUpg6liyaafGjD3xvutciKepCP2knspZ/sWViC/F1OyyQQ==",
"path": "fsharp.core/6.0.7",
"hashPath": "fsharp.core.6.0.7.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/1.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ==",
"path": "microsoft.netcore.platforms/1.1.1",
"hashPath": "microsoft.netcore.platforms.1.1.1.nupkg.sha512"
},
"Microsoft.NETCore.Targets/1.1.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==",
"path": "microsoft.netcore.targets/1.1.3",
"hashPath": "microsoft.netcore.targets.1.1.3.nupkg.sha512"
},
"System.Runtime/4.3.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==",
"path": "system.runtime/4.3.1",
"hashPath": "system.runtime.4.3.1.nupkg.sha512"
},
"Thoth.Json/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fJ9nhZezOyRIsaluEIj5ytCSCbnsvA7ZCa1kY7KkWPqyHtc+SDvjthz5edoFxOAHH44iSmxl6zakapjMSRJbbw==",
"path": "thoth.json/6.0.0",
"hashPath": "thoth.json.6.0.0.nupkg.sha512"
}
}
}
+16 -10
View File
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Version>1.0.0</Version>
<AssemblyVersion>1.0.0</AssemblyVersion>
</PropertyGroup>
@@ -17,6 +17,10 @@
</Otherwise>
</Choose>
<ItemGroup>
<!-- Global to the app -->
<Compile Include="Lens.fs" />
<Compile Include="Cmd.fs" />
<Compile Include="$(API)/ServiceContext.fs" />
<Compile Include="$(API)/DynamicService.fs" />
<Compile Include="Imports.fs" />
@@ -37,9 +41,7 @@
<Compile Include="$(API)/fable/co2.fable.fs" />
<Compile Include="$(API)/fable/MarketDataRelay.fable.fs" />
<!-- Global to the app -->
<Compile Include="Lens.fs" />
<Compile Include="Global.fs" />
<Compile Include="Cmd.fs" />
<Compile Include="Controls/nbsp.fs" />
<Compile Include="Controls/Button.fs" />
<Compile Include="Controls/ReactGrid.fs" />
@@ -68,13 +70,17 @@
<Compile Include="App.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Elmish" Version="4.0.1" />
<PackageReference Include="Elmish.Navigation" Version="1.0.0" />
<PackageReference Include="Fable.Core" Version="4.0.0-snake-island-alpha-005" />
<PackageReference Include="Fable.Elmish" Version="4.0.0-beta-3" />
<PackageReference Include="Fable.Elmish.React" Version="4.0.0-beta-2" />
<PackageReference Include="Fable.Elmish.UrlParser" Version="1.0.0-beta-1" />
<PackageReference Include="Fable.Elmish.Debugger" Version="4.0.0-beta-1" />
<PackageReference Include="Fable.Elmish.HMR" Version="6.0.0-beta-002" />
<PackageReference Include="Fable.Fetch" Version="2.4.0" />
<PackageReference Include="Fable.Core" Version="4.0.0-theta-007" />
<PackageReference Include="Fable.Elmish" Version="4.0.1" />
<PackageReference Include="Fable.Elmish.Browser" Version="4.0.1" />
<PackageReference Include="Fable.Elmish.React" Version="4.0.0" />
<PackageReference Include="Fable.Elmish.UrlParser" Version="1.0.1" />
<PackageReference Include="Fable.Elmish.Debugger" Version="4.0.0" />
<PackageReference Include="Fable.Elmish.HMR" Version="7.0.0" />
<PackageReference Include="Fable.Promise" Version="3.2.0" />
<PackageReference Include="Fable.React" Version="9.2.0" />
<PackageReference Include="System.Runtime" Version="4.3.1" />
</ItemGroup>
</Project>
+1 -11
View File
@@ -33,7 +33,7 @@ module.exports = env => {
ignored: "./**/*"
},
devtool: isProduction ? undefined : "source-map",
entry: resolve('src/ui.fsproj'),
entry: resolve(`${output_path}/App.js`),
output: {
filename: 'bundle.js',
path: output_path,
@@ -58,16 +58,6 @@ module.exports = env => {
},
module: {
rules: [
{
test: /\.fs(x|proj)?$/,
use: {
loader: "fable-loader",
options: {
babel: babelOptions,
define: isProduction ? [] : ["DEBUG"]
}
}
},
{
test: /\.js$/,
exclude: /node_modules/,
-16
View File
@@ -1,16 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2015
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "ui", "web/ui/src/ui.fsproj", "{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5DEFC96-37CF-4844-9C9E-CFA0A9A8AED3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
+6 -3
View File
@@ -307,10 +307,13 @@ def build(
bins = SparkPaths.client_bins(build_dir, configuration=configuration)
for t in publish_tgts:
build_cmd_steps.append(f'cd {Path(t.path).parent}')
build_cmd_steps.append('dotnet publish -c Release -r win-x64 --sc')
build_cmd_steps.append(f'cmake --build {build_dir} --config {configuration}')
build_cmd_steps.append(f'dotnet publish -c Release -r win-x64 --sc {t.path}')
libspark_path=build_dir.joinpath("src", "lib", configuration, "libspark.dll")
print(f'libspark-src: {libspark_path}')
print(f'libspark-dst: {bins.joinpath("win-x64", "publish")}')
build_cmd_steps.append(
f'copy {bins.joinpath("libspark.dll")} {bins.joinpath("win-x64", "publish")}')
f'copy {libspark_path} {bins.joinpath("win-x64", "publish")}')
build_cmd = ' && '.join(build_cmd_steps)
proc_results.append(subprocess.run(build_cmd))
+8
View File
@@ -154,6 +154,14 @@ def _fable_webpack(src_path, ui_out_path):
copytree(str(src_path.joinpath('ui', 'public')), str(ui_out_path))
os.chdir(src_path.joinpath('ui', 'src'))
_wrapped_run('dotnet restore')
_wrapped_run('dotnet tool restore')
# Note: We used to convert fs -> js via webpack, using the node pkgs
# fable-compiler & fable-loader. However, as of 02/24/2023, they are
# incompatible w/ net7.0. Fortunately the dotnet tool 'fable' IS
# compatible w/ net7.0.
_wrapped_run(f'dotnet fable -o {ui_out_path}')
# Run webpack via 'npm run build'
# (the build cmd is defined in package.json)
_wrapped_run('npm run build')
+1 -1
View File
@@ -42,7 +42,7 @@ class SparkPaths:
@staticmethod
def client_bins(build_root=_default_build(), configuration='Release'):
return build_root.joinpath(configuration, 'bin', 'net6.0-windows')
return build_root.joinpath(configuration, 'bin', 'net7.0-windows')
@staticmethod
def client_sln():
+2 -2
View File
@@ -38,10 +38,10 @@ def _main():
output_dir = args.output_dir or SparkPaths.default_build()
output_dir = Path(output_dir)
build(
configuration='release',
configuration='Release',
restore=True,
build_dir=output_dir,
targets=['libspark', 'publish'],
targets=['publish'],
verbosity=args.verbosity)