1
0

SettingsModel.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { action, computed, observable, toJS } from "mobx";
  6. import {
  7. getMonacoSetup,
  8. IMonacoSetup,
  9. prodMonacoSetup,
  10. } from "../../../monaco-loader";
  11. export class SettingsModel {
  12. private readonly settingsKey = "settings";
  13. @observable
  14. private _settings: Readonly<Settings>;
  15. get settings(): Readonly<Settings> {
  16. return this._settings;
  17. }
  18. @computed.struct
  19. get monacoSetup(): IMonacoSetup {
  20. return toLoaderConfig(this.settings);
  21. }
  22. get previewFullScreen() {
  23. return this._settings.previewFullScreen;
  24. }
  25. set previewFullScreen(value: boolean) {
  26. this.setSettings({ ...this._settings, previewFullScreen: value });
  27. }
  28. constructor() {
  29. const settingsStr = localStorage.getItem(this.settingsKey);
  30. if (settingsStr) {
  31. this._settings = JSON.parse(settingsStr);
  32. } else {
  33. this._settings = getDefaultSettings();
  34. }
  35. }
  36. @action
  37. setSettings(settings: Settings): void {
  38. const settingsJson = JSON.stringify(toJS(settings));
  39. this._settings = JSON.parse(settingsJson);
  40. localStorage.setItem(this.settingsKey, settingsJson);
  41. }
  42. }
  43. export type Stability = "dev" | "min";
  44. export const StabilityValues: Stability[] = ["dev", "min"];
  45. export interface Settings {
  46. monacoSource: "latest" | "npm" | "independent" | "custom";
  47. latestStability: Stability;
  48. npmStability: Stability;
  49. npmVersion: string;
  50. coreSource: "latest" | "url";
  51. latestCoreStability: Stability;
  52. coreUrl: string;
  53. languagesSource: "latest" | "source" | "url";
  54. latestLanguagesStability: Stability;
  55. languagesUrl: string;
  56. customConfig: JsonString<IMonacoSetup>;
  57. previewFullScreen: boolean;
  58. }
  59. export type JsonString<T> = string;
  60. export function toLoaderConfig(settings: Settings): IMonacoSetup {
  61. switch (settings.monacoSource) {
  62. case "latest":
  63. return {
  64. ...getMonacoSetup(
  65. `node_modules/monaco-editor/${settings.latestStability}/vs`
  66. ),
  67. monacoTypesUrl: "node_modules/monaco-editor/monaco.d.ts",
  68. };
  69. case "npm":
  70. const url = `https://cdn.jsdelivr.net/npm/monaco-editor@${settings.npmVersion}`;
  71. return {
  72. ...getMonacoSetup(`${url}/${settings.npmStability}/vs`),
  73. monacoTypesUrl: `${url}/monaco.d.ts`,
  74. };
  75. case "custom":
  76. try {
  77. return JSON.parse(settings.customConfig);
  78. } catch (e) {
  79. console.error(e);
  80. return prodMonacoSetup;
  81. }
  82. case "independent":
  83. const root = trimEnd(
  84. new URL(".", window.location.href).toString(),
  85. "/"
  86. );
  87. let coreUrl: string;
  88. switch (settings.coreSource) {
  89. case "latest":
  90. coreUrl = `${root}/node_modules/monaco-editor-core/${settings.latestCoreStability}/vs`;
  91. break;
  92. case "url":
  93. coreUrl = settings.coreUrl;
  94. break;
  95. }
  96. let languagesUrl: string;
  97. switch (settings.languagesSource) {
  98. case "latest":
  99. languagesUrl = `${root}/out/languages/bundled/amd-${settings.latestLanguagesStability}/vs`;
  100. break;
  101. case "source":
  102. languagesUrl = `${root}/out/languages/amd-tsc`;
  103. break;
  104. case "url":
  105. languagesUrl = settings.languagesUrl;
  106. break;
  107. }
  108. const setup = { ...getMonacoSetup(coreUrl) };
  109. if (
  110. !setup.monacoTypesUrl &&
  111. setup.loaderConfigPaths["vs"] &&
  112. setup.loaderConfigPaths["vs"].endsWith("/out/vs")
  113. ) {
  114. setup.monacoTypesUrl = setup.loaderConfigPaths["vs"].replace(
  115. "/out/vs",
  116. () => "/src/vs/monaco.d.ts"
  117. );
  118. }
  119. Object.assign(setup.loaderConfigPaths, {
  120. "vs/fillers/monaco-editor-core": `${root}/out/amd/fillers/monaco-editor-core-amd`,
  121. "vs/language": `${languagesUrl}/language`,
  122. "vs/basic-language": `${languagesUrl}/basic-language`,
  123. });
  124. return setup;
  125. }
  126. }
  127. export function getDefaultSettings(): Settings {
  128. const defaultSettings: Settings = {
  129. monacoSource: "latest",
  130. latestStability: "dev",
  131. npmStability: "dev",
  132. npmVersion: "0.33.0",
  133. coreSource: "latest",
  134. latestCoreStability: "dev",
  135. coreUrl: "http://localhost:5001/out/vs",
  136. languagesSource: "latest",
  137. latestLanguagesStability: "dev",
  138. languagesUrl: "http://localhost:5002/out/languages/amd-tsc",
  139. customConfig: JSON.stringify({
  140. loaderUrl: "",
  141. codiconUrl: "",
  142. loaderPathsConfig: "",
  143. }),
  144. previewFullScreen: false,
  145. };
  146. return defaultSettings;
  147. }
  148. function trimEnd(str: string, end: string): string {
  149. if (str.endsWith(end)) {
  150. return str.slice(0, str.length - end.length);
  151. }
  152. return str;
  153. }