@microsoft/load-themed-styles 1.10.284 → 1.10.285

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -48,7 +48,7 @@ function initializeThemeState() {
48
48
  duration: 0
49
49
  }, runState: {
50
50
  flushTimer: 0,
51
- mode: 0 /* sync */,
51
+ mode: 0 /* Mode.sync */,
52
52
  buffer: []
53
53
  } });
54
54
  }
@@ -69,7 +69,7 @@ function loadStyles(styles, loadAsync) {
69
69
  measure(function () {
70
70
  var styleParts = Array.isArray(styles) ? styles : splitStyles(styles);
71
71
  var _a = _themeState.runState, mode = _a.mode, buffer = _a.buffer, flushTimer = _a.flushTimer;
72
- if (loadAsync || mode === 1 /* async */) {
72
+ if (loadAsync || mode === 1 /* Mode.async */) {
73
73
  buffer.push(styleParts);
74
74
  if (!flushTimer) {
75
75
  _themeState.runState.flushTimer = asyncLoadStyles();
@@ -152,12 +152,12 @@ exports.loadTheme = loadTheme;
152
152
  * Default to be both themable and non-themable styles will be cleared
153
153
  */
154
154
  function clearStyles(option) {
155
- if (option === void 0) { option = 3 /* all */; }
156
- if (option === 3 /* all */ || option === 2 /* onlyNonThemable */) {
155
+ if (option === void 0) { option = 3 /* ClearStyleOptions.all */; }
156
+ if (option === 3 /* ClearStyleOptions.all */ || option === 2 /* ClearStyleOptions.onlyNonThemable */) {
157
157
  clearStylesInternal(_themeState.registeredStyles);
158
158
  _themeState.registeredStyles = [];
159
159
  }
160
- if (option === 3 /* all */ || option === 1 /* onlyThemable */) {
160
+ if (option === 3 /* ClearStyleOptions.all */ || option === 1 /* ClearStyleOptions.onlyThemable */) {
161
161
  clearStylesInternal(_themeState.registeredThemableStyles);
162
162
  _themeState.registeredThemableStyles = [];
163
163
  }
@@ -182,7 +182,7 @@ function reloadStyles() {
182
182
  themableStyles.push(styleRecord.themableStyle);
183
183
  }
184
184
  if (themableStyles.length > 0) {
185
- clearStyles(1 /* onlyThemable */);
185
+ clearStyles(1 /* ClearStyleOptions.onlyThemable */);
186
186
  applyThemableStyles([].concat.apply([], themableStyles));
187
187
  }
188
188
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An IThemingInstruction can specify a rawString to be preserved or a theme slot and a default value\n * to use if that slot is not specified by the theme.\n */\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Declaring a global here in case that the execution environment is Node.js (without importing the\n// entire node.js d.ts for now)\ndeclare let global: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface IThemingInstruction {\n theme?: string;\n defaultValue?: string;\n rawString?: string;\n}\n\nexport type ThemableArray = IThemingInstruction[];\n\nexport interface ITheme {\n [key: string]: string;\n}\n\ninterface IStyleSheet {\n cssText: string;\n}\n\ninterface IExtendedHtmlStyleElement extends HTMLStyleElement {\n styleSheet: IStyleSheet;\n}\n\n/**\n * Performance Measurement of loading styles\n */\ninterface IMeasurement {\n /**\n * Count of style element injected, which is the slow operation in IE\n */\n count: number;\n /**\n * Total duration of all loadStyles exections\n */\n duration: number;\n}\n\ninterface IRunState {\n mode: Mode;\n buffer: ThemableArray[];\n flushTimer: number;\n}\n\ninterface IThemeState {\n theme: ITheme | undefined;\n lastStyleElement: IExtendedHtmlStyleElement;\n registeredStyles: IStyleRecord[]; // records of already registered non-themable styles\n registeredThemableStyles: IStyleRecord[]; // records of already registered themable styles\n loadStyles: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined;\n perf: IMeasurement;\n runState: IRunState;\n}\n\ninterface IStyleRecord {\n styleElement: Element;\n themableStyle: ThemableArray;\n}\n\ninterface ICustomEvent<T> extends Event {\n args?: T;\n}\n\n/**\n * object returned from resolveThemableArray function\n */\ninterface IThemableArrayResolveResult {\n /** this string is the processed styles in string */\n styleString: string;\n\n /** this boolean indicates if this style array is themable */\n themable: boolean;\n}\n\n/**\n * In sync mode, styles are registered as style elements synchronously with loadStyles() call.\n * In async mode, styles are buffered and registered as batch in async timer for performance purpose.\n */\nexport const enum Mode {\n sync,\n async\n}\n\n/**\n * Themable styles and non-themable styles are tracked separately\n * Specify ClearStyleOptions when calling clearStyles API to specify which group of registered styles should be cleared.\n */\nexport const enum ClearStyleOptions {\n /** only themable styles will be cleared */\n onlyThemable = 1,\n /** only non-themable styles will be cleared */\n onlyNonThemable = 2,\n /** both themable and non-themable styles will be cleared */\n all = 3\n}\n\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nconst _root: any = typeof window === 'undefined' ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nconst _styleNonce: string = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n\nconst _themeState: IThemeState = initializeThemeState();\n\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */\nconst _themeTokenRegex: RegExp =\n /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\n\nconst now: () => number = () =>\n typeof performance !== 'undefined' && !!performance.now ? performance.now() : Date.now();\n\nfunction measure(func: () => void): void {\n const start: number = now();\n func();\n const end: number = now();\n _themeState.perf.duration += end - start;\n}\n\n/**\n * initialize global state object\n */\nfunction initializeThemeState(): IThemeState {\n let state: IThemeState = _root.__themeState__ || {\n theme: undefined,\n lastStyleElement: undefined,\n registeredStyles: []\n };\n\n if (!state.runState) {\n state = {\n ...state,\n perf: {\n count: 0,\n duration: 0\n },\n runState: {\n flushTimer: 0,\n mode: Mode.sync,\n buffer: []\n }\n };\n }\n if (!state.registeredThemableStyles) {\n state = {\n ...state,\n registeredThemableStyles: []\n };\n }\n _root.__themeState__ = state;\n return state;\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */\nexport function loadStyles(styles: string | ThemableArray, loadAsync: boolean = false): void {\n measure(() => {\n const styleParts: ThemableArray = Array.isArray(styles) ? styles : splitStyles(styles);\n const { mode, buffer, flushTimer } = _themeState.runState;\n if (loadAsync || mode === Mode.async) {\n buffer.push(styleParts);\n if (!flushTimer) {\n _themeState.runState.flushTimer = asyncLoadStyles();\n }\n } else {\n applyThemableStyles(styleParts);\n }\n });\n}\n\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */\nexport function configureLoadStyles(\n loadStylesFn: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined\n): void {\n _themeState.loadStyles = loadStylesFn;\n}\n\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */\nexport function configureRunMode(mode: Mode): void {\n _themeState.runState.mode = mode;\n}\n\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */\nexport function flush(): void {\n measure(() => {\n const styleArrays: ThemableArray[] = _themeState.runState.buffer.slice();\n _themeState.runState.buffer = [];\n const mergedStyleArray: ThemableArray = ([] as ThemableArray).concat.apply([], styleArrays);\n if (mergedStyleArray.length > 0) {\n applyThemableStyles(mergedStyleArray);\n }\n });\n}\n\n/**\n * register async loadStyles\n */\nfunction asyncLoadStyles(): number {\n return setTimeout(() => {\n _themeState.runState.flushTimer = 0;\n flush();\n }, 0);\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */\nfunction applyThemableStyles(stylesArray: ThemableArray, styleRecord?: IStyleRecord): void {\n if (_themeState.loadStyles) {\n _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n } else {\n registerStyles(stylesArray);\n }\n}\n\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */\nexport function loadTheme(theme: ITheme | undefined): void {\n _themeState.theme = theme;\n\n // reload styles.\n reloadStyles();\n}\n\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */\nexport function clearStyles(option: ClearStyleOptions = ClearStyleOptions.all): void {\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyNonThemable) {\n clearStylesInternal(_themeState.registeredStyles);\n _themeState.registeredStyles = [];\n }\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyThemable) {\n clearStylesInternal(_themeState.registeredThemableStyles);\n _themeState.registeredThemableStyles = [];\n }\n}\n\nfunction clearStylesInternal(records: IStyleRecord[]): void {\n records.forEach((styleRecord: IStyleRecord) => {\n const styleElement: HTMLStyleElement = styleRecord && (styleRecord.styleElement as HTMLStyleElement);\n if (styleElement && styleElement.parentElement) {\n styleElement.parentElement.removeChild(styleElement);\n }\n });\n}\n\n/**\n * Reloads styles.\n */\nfunction reloadStyles(): void {\n if (_themeState.theme) {\n const themableStyles: ThemableArray[] = [];\n for (const styleRecord of _themeState.registeredThemableStyles) {\n themableStyles.push(styleRecord.themableStyle);\n }\n if (themableStyles.length > 0) {\n clearStyles(ClearStyleOptions.onlyThemable);\n applyThemableStyles(([] as ThemableArray).concat.apply([], themableStyles));\n }\n }\n}\n\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */\nexport function detokenize(styles: string | undefined): string | undefined {\n if (styles) {\n styles = resolveThemableArray(splitStyles(styles)).styleString;\n }\n\n return styles;\n}\n\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */\nfunction resolveThemableArray(splitStyleArray: ThemableArray): IThemableArrayResolveResult {\n const { theme }: IThemeState = _themeState;\n let themable: boolean = false;\n // Resolve the array of theming instructions to an array of strings.\n // Then join the array to produce the final CSS string.\n const resolvedArray: (string | undefined)[] = (splitStyleArray || []).map(\n (currentValue: IThemingInstruction) => {\n const themeSlot: string | undefined = currentValue.theme;\n if (themeSlot) {\n themable = true;\n // A theming annotation. Resolve it.\n const themedValue: string | undefined = theme ? theme[themeSlot] : undefined;\n const defaultValue: string = currentValue.defaultValue || 'inherit';\n\n // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n // Allow the themedValue to be undefined to explicitly request the default value.\n if (\n theme &&\n !themedValue &&\n console &&\n !(themeSlot in theme) &&\n typeof DEBUG !== 'undefined' &&\n DEBUG\n ) {\n console.warn(`Theming value not provided for \"${themeSlot}\". Falling back to \"${defaultValue}\".`);\n }\n\n return themedValue || defaultValue;\n } else {\n // A non-themable string. Preserve it.\n return currentValue.rawString;\n }\n }\n );\n\n return {\n styleString: resolvedArray.join(''),\n themable: themable\n };\n}\n\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */\nexport function splitStyles(styles: string): ThemableArray {\n const result: ThemableArray = [];\n if (styles) {\n let pos: number = 0; // Current position in styles.\n let tokenMatch: RegExpExecArray | null;\n while ((tokenMatch = _themeTokenRegex.exec(styles))) {\n const matchIndex: number = tokenMatch.index;\n if (matchIndex > pos) {\n result.push({\n rawString: styles.substring(pos, matchIndex)\n });\n }\n\n result.push({\n theme: tokenMatch[1],\n defaultValue: tokenMatch[2] // May be undefined\n });\n\n // index of the first character after the current match\n pos = _themeTokenRegex.lastIndex;\n }\n\n // Push the rest of the string after the last match.\n result.push({\n rawString: styles.substring(pos)\n });\n }\n\n return result;\n}\n\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */\nfunction registerStyles(styleArray: ThemableArray): void {\n if (typeof document === 'undefined') {\n return;\n }\n const head: HTMLHeadElement = document.getElementsByTagName('head')[0];\n const styleElement: HTMLStyleElement = document.createElement('style');\n const { styleString, themable } = resolveThemableArray(styleArray);\n\n styleElement.setAttribute('data-load-themed-styles', 'true');\n if (_styleNonce) {\n styleElement.setAttribute('nonce', _styleNonce);\n }\n styleElement.appendChild(document.createTextNode(styleString));\n _themeState.perf.count++;\n head.appendChild(styleElement);\n\n const ev: ICustomEvent<{ newStyle: HTMLStyleElement }> = document.createEvent('HTMLEvents');\n ev.initEvent('styleinsert', true /* bubbleEvent */, false /* cancelable */);\n ev.args = {\n newStyle: styleElement\n };\n document.dispatchEvent(ev);\n\n const record: IStyleRecord = {\n styleElement: styleElement,\n themableStyle: styleArray\n };\n\n if (themable) {\n _themeState.registeredThemableStyles.push(record);\n } else {\n _themeState.registeredStyles.push(record);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An IThemingInstruction can specify a rawString to be preserved or a theme slot and a default value\n * to use if that slot is not specified by the theme.\n */\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Declaring a global here in case that the execution environment is Node.js (without importing the\n// entire node.js d.ts for now)\ndeclare let global: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface IThemingInstruction {\n theme?: string;\n defaultValue?: string;\n rawString?: string;\n}\n\nexport type ThemableArray = IThemingInstruction[];\n\nexport interface ITheme {\n [key: string]: string;\n}\n\ninterface IStyleSheet {\n cssText: string;\n}\n\ninterface IExtendedHtmlStyleElement extends HTMLStyleElement {\n styleSheet: IStyleSheet;\n}\n\n/**\n * Performance Measurement of loading styles\n */\ninterface IMeasurement {\n /**\n * Count of style element injected, which is the slow operation in IE\n */\n count: number;\n /**\n * Total duration of all loadStyles exections\n */\n duration: number;\n}\n\ninterface IRunState {\n mode: Mode;\n buffer: ThemableArray[];\n flushTimer: number;\n}\n\ninterface IThemeState {\n theme: ITheme | undefined;\n lastStyleElement: IExtendedHtmlStyleElement;\n registeredStyles: IStyleRecord[]; // records of already registered non-themable styles\n registeredThemableStyles: IStyleRecord[]; // records of already registered themable styles\n loadStyles: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined;\n perf: IMeasurement;\n runState: IRunState;\n}\n\ninterface IStyleRecord {\n styleElement: Element;\n themableStyle: ThemableArray;\n}\n\ninterface ICustomEvent<T> extends Event {\n args?: T;\n}\n\n/**\n * object returned from resolveThemableArray function\n */\ninterface IThemableArrayResolveResult {\n /** this string is the processed styles in string */\n styleString: string;\n\n /** this boolean indicates if this style array is themable */\n themable: boolean;\n}\n\n/**\n * In sync mode, styles are registered as style elements synchronously with loadStyles() call.\n * In async mode, styles are buffered and registered as batch in async timer for performance purpose.\n */\nexport const enum Mode {\n sync,\n async\n}\n\n/**\n * Themable styles and non-themable styles are tracked separately\n * Specify ClearStyleOptions when calling clearStyles API to specify which group of registered styles should be cleared.\n */\nexport const enum ClearStyleOptions {\n /** only themable styles will be cleared */\n onlyThemable = 1,\n /** only non-themable styles will be cleared */\n onlyNonThemable = 2,\n /** both themable and non-themable styles will be cleared */\n all = 3\n}\n\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nconst _root: any = typeof window === 'undefined' ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nconst _styleNonce: string = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n\nconst _themeState: IThemeState = initializeThemeState();\n\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */\nconst _themeTokenRegex: RegExp =\n /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\n\nconst now: () => number = () =>\n typeof performance !== 'undefined' && !!performance.now ? performance.now() : Date.now();\n\nfunction measure(func: () => void): void {\n const start: number = now();\n func();\n const end: number = now();\n _themeState.perf.duration += end - start;\n}\n\n/**\n * initialize global state object\n */\nfunction initializeThemeState(): IThemeState {\n let state: IThemeState = _root.__themeState__ || {\n theme: undefined,\n lastStyleElement: undefined,\n registeredStyles: []\n };\n\n if (!state.runState) {\n state = {\n ...state,\n perf: {\n count: 0,\n duration: 0\n },\n runState: {\n flushTimer: 0,\n mode: Mode.sync,\n buffer: []\n }\n };\n }\n if (!state.registeredThemableStyles) {\n state = {\n ...state,\n registeredThemableStyles: []\n };\n }\n _root.__themeState__ = state;\n return state;\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */\nexport function loadStyles(styles: string | ThemableArray, loadAsync: boolean = false): void {\n measure(() => {\n const styleParts: ThemableArray = Array.isArray(styles) ? styles : splitStyles(styles);\n const { mode, buffer, flushTimer } = _themeState.runState;\n if (loadAsync || mode === Mode.async) {\n buffer.push(styleParts);\n if (!flushTimer) {\n _themeState.runState.flushTimer = asyncLoadStyles();\n }\n } else {\n applyThemableStyles(styleParts);\n }\n });\n}\n\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */\nexport function configureLoadStyles(\n loadStylesFn: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined\n): void {\n _themeState.loadStyles = loadStylesFn;\n}\n\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */\nexport function configureRunMode(mode: Mode): void {\n _themeState.runState.mode = mode;\n}\n\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */\nexport function flush(): void {\n measure(() => {\n const styleArrays: ThemableArray[] = _themeState.runState.buffer.slice();\n _themeState.runState.buffer = [];\n const mergedStyleArray: ThemableArray = ([] as ThemableArray).concat.apply([], styleArrays);\n if (mergedStyleArray.length > 0) {\n applyThemableStyles(mergedStyleArray);\n }\n });\n}\n\n/**\n * register async loadStyles\n */\nfunction asyncLoadStyles(): number {\n return setTimeout(() => {\n _themeState.runState.flushTimer = 0;\n flush();\n }, 0);\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */\nfunction applyThemableStyles(stylesArray: ThemableArray, styleRecord?: IStyleRecord): void {\n if (_themeState.loadStyles) {\n _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n } else {\n registerStyles(stylesArray);\n }\n}\n\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */\nexport function loadTheme(theme: ITheme | undefined): void {\n _themeState.theme = theme;\n\n // reload styles.\n reloadStyles();\n}\n\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */\nexport function clearStyles(option: ClearStyleOptions = ClearStyleOptions.all): void {\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyNonThemable) {\n clearStylesInternal(_themeState.registeredStyles);\n _themeState.registeredStyles = [];\n }\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyThemable) {\n clearStylesInternal(_themeState.registeredThemableStyles);\n _themeState.registeredThemableStyles = [];\n }\n}\n\nfunction clearStylesInternal(records: IStyleRecord[]): void {\n records.forEach((styleRecord: IStyleRecord) => {\n const styleElement: HTMLStyleElement = styleRecord && (styleRecord.styleElement as HTMLStyleElement);\n if (styleElement && styleElement.parentElement) {\n styleElement.parentElement.removeChild(styleElement);\n }\n });\n}\n\n/**\n * Reloads styles.\n */\nfunction reloadStyles(): void {\n if (_themeState.theme) {\n const themableStyles: ThemableArray[] = [];\n for (const styleRecord of _themeState.registeredThemableStyles) {\n themableStyles.push(styleRecord.themableStyle);\n }\n if (themableStyles.length > 0) {\n clearStyles(ClearStyleOptions.onlyThemable);\n applyThemableStyles(([] as ThemableArray).concat.apply([], themableStyles));\n }\n }\n}\n\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */\nexport function detokenize(styles: string | undefined): string | undefined {\n if (styles) {\n styles = resolveThemableArray(splitStyles(styles)).styleString;\n }\n\n return styles;\n}\n\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */\nfunction resolveThemableArray(splitStyleArray: ThemableArray): IThemableArrayResolveResult {\n const { theme }: IThemeState = _themeState;\n let themable: boolean = false;\n // Resolve the array of theming instructions to an array of strings.\n // Then join the array to produce the final CSS string.\n const resolvedArray: (string | undefined)[] = (splitStyleArray || []).map(\n (currentValue: IThemingInstruction) => {\n const themeSlot: string | undefined = currentValue.theme;\n if (themeSlot) {\n themable = true;\n // A theming annotation. Resolve it.\n const themedValue: string | undefined = theme ? theme[themeSlot] : undefined;\n const defaultValue: string = currentValue.defaultValue || 'inherit';\n\n // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n // Allow the themedValue to be undefined to explicitly request the default value.\n if (\n theme &&\n !themedValue &&\n console &&\n !(themeSlot in theme) &&\n typeof DEBUG !== 'undefined' &&\n DEBUG\n ) {\n console.warn(`Theming value not provided for \"${themeSlot}\". Falling back to \"${defaultValue}\".`);\n }\n\n return themedValue || defaultValue;\n } else {\n // A non-themable string. Preserve it.\n return currentValue.rawString;\n }\n }\n );\n\n return {\n styleString: resolvedArray.join(''),\n themable: themable\n };\n}\n\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */\nexport function splitStyles(styles: string): ThemableArray {\n const result: ThemableArray = [];\n if (styles) {\n let pos: number = 0; // Current position in styles.\n let tokenMatch: RegExpExecArray | null;\n while ((tokenMatch = _themeTokenRegex.exec(styles))) {\n const matchIndex: number = tokenMatch.index;\n if (matchIndex > pos) {\n result.push({\n rawString: styles.substring(pos, matchIndex)\n });\n }\n\n result.push({\n theme: tokenMatch[1],\n defaultValue: tokenMatch[2] // May be undefined\n });\n\n // index of the first character after the current match\n pos = _themeTokenRegex.lastIndex;\n }\n\n // Push the rest of the string after the last match.\n result.push({\n rawString: styles.substring(pos)\n });\n }\n\n return result;\n}\n\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */\nfunction registerStyles(styleArray: ThemableArray): void {\n if (typeof document === 'undefined') {\n return;\n }\n const head: HTMLHeadElement = document.getElementsByTagName('head')[0];\n const styleElement: HTMLStyleElement = document.createElement('style');\n const { styleString, themable } = resolveThemableArray(styleArray);\n\n styleElement.setAttribute('data-load-themed-styles', 'true');\n if (_styleNonce) {\n styleElement.setAttribute('nonce', _styleNonce);\n }\n styleElement.appendChild(document.createTextNode(styleString));\n _themeState.perf.count++;\n head.appendChild(styleElement);\n\n const ev: ICustomEvent<{ newStyle: HTMLStyleElement }> = document.createEvent('HTMLEvents');\n ev.initEvent('styleinsert', true /* bubbleEvent */, false /* cancelable */);\n ev.args = {\n newStyle: styleElement\n };\n document.dispatchEvent(ev);\n\n const record: IStyleRecord = {\n styleElement: styleElement,\n themableStyle: styleArray\n };\n\n if (themable) {\n _themeState.registeredThemableStyles.push(record);\n } else {\n _themeState.registeredStyles.push(record);\n }\n}\n"]}
package/lib-amd/index.js CHANGED
@@ -49,7 +49,7 @@ define(["require", "exports"], function (require, exports) {
49
49
  duration: 0
50
50
  }, runState: {
51
51
  flushTimer: 0,
52
- mode: 0 /* sync */,
52
+ mode: 0 /* Mode.sync */,
53
53
  buffer: []
54
54
  } });
55
55
  }
@@ -70,7 +70,7 @@ define(["require", "exports"], function (require, exports) {
70
70
  measure(function () {
71
71
  var styleParts = Array.isArray(styles) ? styles : splitStyles(styles);
72
72
  var _a = _themeState.runState, mode = _a.mode, buffer = _a.buffer, flushTimer = _a.flushTimer;
73
- if (loadAsync || mode === 1 /* async */) {
73
+ if (loadAsync || mode === 1 /* Mode.async */) {
74
74
  buffer.push(styleParts);
75
75
  if (!flushTimer) {
76
76
  _themeState.runState.flushTimer = asyncLoadStyles();
@@ -153,12 +153,12 @@ define(["require", "exports"], function (require, exports) {
153
153
  * Default to be both themable and non-themable styles will be cleared
154
154
  */
155
155
  function clearStyles(option) {
156
- if (option === void 0) { option = 3 /* all */; }
157
- if (option === 3 /* all */ || option === 2 /* onlyNonThemable */) {
156
+ if (option === void 0) { option = 3 /* ClearStyleOptions.all */; }
157
+ if (option === 3 /* ClearStyleOptions.all */ || option === 2 /* ClearStyleOptions.onlyNonThemable */) {
158
158
  clearStylesInternal(_themeState.registeredStyles);
159
159
  _themeState.registeredStyles = [];
160
160
  }
161
- if (option === 3 /* all */ || option === 1 /* onlyThemable */) {
161
+ if (option === 3 /* ClearStyleOptions.all */ || option === 1 /* ClearStyleOptions.onlyThemable */) {
162
162
  clearStylesInternal(_themeState.registeredThemableStyles);
163
163
  _themeState.registeredThemableStyles = [];
164
164
  }
@@ -183,7 +183,7 @@ define(["require", "exports"], function (require, exports) {
183
183
  themableStyles.push(styleRecord.themableStyle);
184
184
  }
185
185
  if (themableStyles.length > 0) {
186
- clearStyles(1 /* onlyThemable */);
186
+ clearStyles(1 /* ClearStyleOptions.onlyThemable */);
187
187
  applyThemableStyles([].concat.apply([], themableStyles));
188
188
  }
189
189
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An IThemingInstruction can specify a rawString to be preserved or a theme slot and a default value\n * to use if that slot is not specified by the theme.\n */\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Declaring a global here in case that the execution environment is Node.js (without importing the\n// entire node.js d.ts for now)\ndeclare let global: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface IThemingInstruction {\n theme?: string;\n defaultValue?: string;\n rawString?: string;\n}\n\nexport type ThemableArray = IThemingInstruction[];\n\nexport interface ITheme {\n [key: string]: string;\n}\n\ninterface IStyleSheet {\n cssText: string;\n}\n\ninterface IExtendedHtmlStyleElement extends HTMLStyleElement {\n styleSheet: IStyleSheet;\n}\n\n/**\n * Performance Measurement of loading styles\n */\ninterface IMeasurement {\n /**\n * Count of style element injected, which is the slow operation in IE\n */\n count: number;\n /**\n * Total duration of all loadStyles exections\n */\n duration: number;\n}\n\ninterface IRunState {\n mode: Mode;\n buffer: ThemableArray[];\n flushTimer: number;\n}\n\ninterface IThemeState {\n theme: ITheme | undefined;\n lastStyleElement: IExtendedHtmlStyleElement;\n registeredStyles: IStyleRecord[]; // records of already registered non-themable styles\n registeredThemableStyles: IStyleRecord[]; // records of already registered themable styles\n loadStyles: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined;\n perf: IMeasurement;\n runState: IRunState;\n}\n\ninterface IStyleRecord {\n styleElement: Element;\n themableStyle: ThemableArray;\n}\n\ninterface ICustomEvent<T> extends Event {\n args?: T;\n}\n\n/**\n * object returned from resolveThemableArray function\n */\ninterface IThemableArrayResolveResult {\n /** this string is the processed styles in string */\n styleString: string;\n\n /** this boolean indicates if this style array is themable */\n themable: boolean;\n}\n\n/**\n * In sync mode, styles are registered as style elements synchronously with loadStyles() call.\n * In async mode, styles are buffered and registered as batch in async timer for performance purpose.\n */\nexport const enum Mode {\n sync,\n async\n}\n\n/**\n * Themable styles and non-themable styles are tracked separately\n * Specify ClearStyleOptions when calling clearStyles API to specify which group of registered styles should be cleared.\n */\nexport const enum ClearStyleOptions {\n /** only themable styles will be cleared */\n onlyThemable = 1,\n /** only non-themable styles will be cleared */\n onlyNonThemable = 2,\n /** both themable and non-themable styles will be cleared */\n all = 3\n}\n\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nconst _root: any = typeof window === 'undefined' ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nconst _styleNonce: string = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n\nconst _themeState: IThemeState = initializeThemeState();\n\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */\nconst _themeTokenRegex: RegExp =\n /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\n\nconst now: () => number = () =>\n typeof performance !== 'undefined' && !!performance.now ? performance.now() : Date.now();\n\nfunction measure(func: () => void): void {\n const start: number = now();\n func();\n const end: number = now();\n _themeState.perf.duration += end - start;\n}\n\n/**\n * initialize global state object\n */\nfunction initializeThemeState(): IThemeState {\n let state: IThemeState = _root.__themeState__ || {\n theme: undefined,\n lastStyleElement: undefined,\n registeredStyles: []\n };\n\n if (!state.runState) {\n state = {\n ...state,\n perf: {\n count: 0,\n duration: 0\n },\n runState: {\n flushTimer: 0,\n mode: Mode.sync,\n buffer: []\n }\n };\n }\n if (!state.registeredThemableStyles) {\n state = {\n ...state,\n registeredThemableStyles: []\n };\n }\n _root.__themeState__ = state;\n return state;\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */\nexport function loadStyles(styles: string | ThemableArray, loadAsync: boolean = false): void {\n measure(() => {\n const styleParts: ThemableArray = Array.isArray(styles) ? styles : splitStyles(styles);\n const { mode, buffer, flushTimer } = _themeState.runState;\n if (loadAsync || mode === Mode.async) {\n buffer.push(styleParts);\n if (!flushTimer) {\n _themeState.runState.flushTimer = asyncLoadStyles();\n }\n } else {\n applyThemableStyles(styleParts);\n }\n });\n}\n\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */\nexport function configureLoadStyles(\n loadStylesFn: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined\n): void {\n _themeState.loadStyles = loadStylesFn;\n}\n\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */\nexport function configureRunMode(mode: Mode): void {\n _themeState.runState.mode = mode;\n}\n\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */\nexport function flush(): void {\n measure(() => {\n const styleArrays: ThemableArray[] = _themeState.runState.buffer.slice();\n _themeState.runState.buffer = [];\n const mergedStyleArray: ThemableArray = ([] as ThemableArray).concat.apply([], styleArrays);\n if (mergedStyleArray.length > 0) {\n applyThemableStyles(mergedStyleArray);\n }\n });\n}\n\n/**\n * register async loadStyles\n */\nfunction asyncLoadStyles(): number {\n return setTimeout(() => {\n _themeState.runState.flushTimer = 0;\n flush();\n }, 0);\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */\nfunction applyThemableStyles(stylesArray: ThemableArray, styleRecord?: IStyleRecord): void {\n if (_themeState.loadStyles) {\n _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n } else {\n registerStyles(stylesArray);\n }\n}\n\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */\nexport function loadTheme(theme: ITheme | undefined): void {\n _themeState.theme = theme;\n\n // reload styles.\n reloadStyles();\n}\n\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */\nexport function clearStyles(option: ClearStyleOptions = ClearStyleOptions.all): void {\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyNonThemable) {\n clearStylesInternal(_themeState.registeredStyles);\n _themeState.registeredStyles = [];\n }\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyThemable) {\n clearStylesInternal(_themeState.registeredThemableStyles);\n _themeState.registeredThemableStyles = [];\n }\n}\n\nfunction clearStylesInternal(records: IStyleRecord[]): void {\n records.forEach((styleRecord: IStyleRecord) => {\n const styleElement: HTMLStyleElement = styleRecord && (styleRecord.styleElement as HTMLStyleElement);\n if (styleElement && styleElement.parentElement) {\n styleElement.parentElement.removeChild(styleElement);\n }\n });\n}\n\n/**\n * Reloads styles.\n */\nfunction reloadStyles(): void {\n if (_themeState.theme) {\n const themableStyles: ThemableArray[] = [];\n for (const styleRecord of _themeState.registeredThemableStyles) {\n themableStyles.push(styleRecord.themableStyle);\n }\n if (themableStyles.length > 0) {\n clearStyles(ClearStyleOptions.onlyThemable);\n applyThemableStyles(([] as ThemableArray).concat.apply([], themableStyles));\n }\n }\n}\n\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */\nexport function detokenize(styles: string | undefined): string | undefined {\n if (styles) {\n styles = resolveThemableArray(splitStyles(styles)).styleString;\n }\n\n return styles;\n}\n\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */\nfunction resolveThemableArray(splitStyleArray: ThemableArray): IThemableArrayResolveResult {\n const { theme }: IThemeState = _themeState;\n let themable: boolean = false;\n // Resolve the array of theming instructions to an array of strings.\n // Then join the array to produce the final CSS string.\n const resolvedArray: (string | undefined)[] = (splitStyleArray || []).map(\n (currentValue: IThemingInstruction) => {\n const themeSlot: string | undefined = currentValue.theme;\n if (themeSlot) {\n themable = true;\n // A theming annotation. Resolve it.\n const themedValue: string | undefined = theme ? theme[themeSlot] : undefined;\n const defaultValue: string = currentValue.defaultValue || 'inherit';\n\n // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n // Allow the themedValue to be undefined to explicitly request the default value.\n if (\n theme &&\n !themedValue &&\n console &&\n !(themeSlot in theme) &&\n typeof DEBUG !== 'undefined' &&\n DEBUG\n ) {\n console.warn(`Theming value not provided for \"${themeSlot}\". Falling back to \"${defaultValue}\".`);\n }\n\n return themedValue || defaultValue;\n } else {\n // A non-themable string. Preserve it.\n return currentValue.rawString;\n }\n }\n );\n\n return {\n styleString: resolvedArray.join(''),\n themable: themable\n };\n}\n\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */\nexport function splitStyles(styles: string): ThemableArray {\n const result: ThemableArray = [];\n if (styles) {\n let pos: number = 0; // Current position in styles.\n let tokenMatch: RegExpExecArray | null;\n while ((tokenMatch = _themeTokenRegex.exec(styles))) {\n const matchIndex: number = tokenMatch.index;\n if (matchIndex > pos) {\n result.push({\n rawString: styles.substring(pos, matchIndex)\n });\n }\n\n result.push({\n theme: tokenMatch[1],\n defaultValue: tokenMatch[2] // May be undefined\n });\n\n // index of the first character after the current match\n pos = _themeTokenRegex.lastIndex;\n }\n\n // Push the rest of the string after the last match.\n result.push({\n rawString: styles.substring(pos)\n });\n }\n\n return result;\n}\n\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */\nfunction registerStyles(styleArray: ThemableArray): void {\n if (typeof document === 'undefined') {\n return;\n }\n const head: HTMLHeadElement = document.getElementsByTagName('head')[0];\n const styleElement: HTMLStyleElement = document.createElement('style');\n const { styleString, themable } = resolveThemableArray(styleArray);\n\n styleElement.setAttribute('data-load-themed-styles', 'true');\n if (_styleNonce) {\n styleElement.setAttribute('nonce', _styleNonce);\n }\n styleElement.appendChild(document.createTextNode(styleString));\n _themeState.perf.count++;\n head.appendChild(styleElement);\n\n const ev: ICustomEvent<{ newStyle: HTMLStyleElement }> = document.createEvent('HTMLEvents');\n ev.initEvent('styleinsert', true /* bubbleEvent */, false /* cancelable */);\n ev.args = {\n newStyle: styleElement\n };\n document.dispatchEvent(ev);\n\n const record: IStyleRecord = {\n styleElement: styleElement,\n themableStyle: styleArray\n };\n\n if (themable) {\n _themeState.registeredThemableStyles.push(record);\n } else {\n _themeState.registeredStyles.push(record);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An IThemingInstruction can specify a rawString to be preserved or a theme slot and a default value\n * to use if that slot is not specified by the theme.\n */\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Declaring a global here in case that the execution environment is Node.js (without importing the\n// entire node.js d.ts for now)\ndeclare let global: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface IThemingInstruction {\n theme?: string;\n defaultValue?: string;\n rawString?: string;\n}\n\nexport type ThemableArray = IThemingInstruction[];\n\nexport interface ITheme {\n [key: string]: string;\n}\n\ninterface IStyleSheet {\n cssText: string;\n}\n\ninterface IExtendedHtmlStyleElement extends HTMLStyleElement {\n styleSheet: IStyleSheet;\n}\n\n/**\n * Performance Measurement of loading styles\n */\ninterface IMeasurement {\n /**\n * Count of style element injected, which is the slow operation in IE\n */\n count: number;\n /**\n * Total duration of all loadStyles exections\n */\n duration: number;\n}\n\ninterface IRunState {\n mode: Mode;\n buffer: ThemableArray[];\n flushTimer: number;\n}\n\ninterface IThemeState {\n theme: ITheme | undefined;\n lastStyleElement: IExtendedHtmlStyleElement;\n registeredStyles: IStyleRecord[]; // records of already registered non-themable styles\n registeredThemableStyles: IStyleRecord[]; // records of already registered themable styles\n loadStyles: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined;\n perf: IMeasurement;\n runState: IRunState;\n}\n\ninterface IStyleRecord {\n styleElement: Element;\n themableStyle: ThemableArray;\n}\n\ninterface ICustomEvent<T> extends Event {\n args?: T;\n}\n\n/**\n * object returned from resolveThemableArray function\n */\ninterface IThemableArrayResolveResult {\n /** this string is the processed styles in string */\n styleString: string;\n\n /** this boolean indicates if this style array is themable */\n themable: boolean;\n}\n\n/**\n * In sync mode, styles are registered as style elements synchronously with loadStyles() call.\n * In async mode, styles are buffered and registered as batch in async timer for performance purpose.\n */\nexport const enum Mode {\n sync,\n async\n}\n\n/**\n * Themable styles and non-themable styles are tracked separately\n * Specify ClearStyleOptions when calling clearStyles API to specify which group of registered styles should be cleared.\n */\nexport const enum ClearStyleOptions {\n /** only themable styles will be cleared */\n onlyThemable = 1,\n /** only non-themable styles will be cleared */\n onlyNonThemable = 2,\n /** both themable and non-themable styles will be cleared */\n all = 3\n}\n\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nconst _root: any = typeof window === 'undefined' ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nconst _styleNonce: string = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n\nconst _themeState: IThemeState = initializeThemeState();\n\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */\nconst _themeTokenRegex: RegExp =\n /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\n\nconst now: () => number = () =>\n typeof performance !== 'undefined' && !!performance.now ? performance.now() : Date.now();\n\nfunction measure(func: () => void): void {\n const start: number = now();\n func();\n const end: number = now();\n _themeState.perf.duration += end - start;\n}\n\n/**\n * initialize global state object\n */\nfunction initializeThemeState(): IThemeState {\n let state: IThemeState = _root.__themeState__ || {\n theme: undefined,\n lastStyleElement: undefined,\n registeredStyles: []\n };\n\n if (!state.runState) {\n state = {\n ...state,\n perf: {\n count: 0,\n duration: 0\n },\n runState: {\n flushTimer: 0,\n mode: Mode.sync,\n buffer: []\n }\n };\n }\n if (!state.registeredThemableStyles) {\n state = {\n ...state,\n registeredThemableStyles: []\n };\n }\n _root.__themeState__ = state;\n return state;\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */\nexport function loadStyles(styles: string | ThemableArray, loadAsync: boolean = false): void {\n measure(() => {\n const styleParts: ThemableArray = Array.isArray(styles) ? styles : splitStyles(styles);\n const { mode, buffer, flushTimer } = _themeState.runState;\n if (loadAsync || mode === Mode.async) {\n buffer.push(styleParts);\n if (!flushTimer) {\n _themeState.runState.flushTimer = asyncLoadStyles();\n }\n } else {\n applyThemableStyles(styleParts);\n }\n });\n}\n\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */\nexport function configureLoadStyles(\n loadStylesFn: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined\n): void {\n _themeState.loadStyles = loadStylesFn;\n}\n\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */\nexport function configureRunMode(mode: Mode): void {\n _themeState.runState.mode = mode;\n}\n\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */\nexport function flush(): void {\n measure(() => {\n const styleArrays: ThemableArray[] = _themeState.runState.buffer.slice();\n _themeState.runState.buffer = [];\n const mergedStyleArray: ThemableArray = ([] as ThemableArray).concat.apply([], styleArrays);\n if (mergedStyleArray.length > 0) {\n applyThemableStyles(mergedStyleArray);\n }\n });\n}\n\n/**\n * register async loadStyles\n */\nfunction asyncLoadStyles(): number {\n return setTimeout(() => {\n _themeState.runState.flushTimer = 0;\n flush();\n }, 0);\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */\nfunction applyThemableStyles(stylesArray: ThemableArray, styleRecord?: IStyleRecord): void {\n if (_themeState.loadStyles) {\n _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n } else {\n registerStyles(stylesArray);\n }\n}\n\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */\nexport function loadTheme(theme: ITheme | undefined): void {\n _themeState.theme = theme;\n\n // reload styles.\n reloadStyles();\n}\n\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */\nexport function clearStyles(option: ClearStyleOptions = ClearStyleOptions.all): void {\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyNonThemable) {\n clearStylesInternal(_themeState.registeredStyles);\n _themeState.registeredStyles = [];\n }\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyThemable) {\n clearStylesInternal(_themeState.registeredThemableStyles);\n _themeState.registeredThemableStyles = [];\n }\n}\n\nfunction clearStylesInternal(records: IStyleRecord[]): void {\n records.forEach((styleRecord: IStyleRecord) => {\n const styleElement: HTMLStyleElement = styleRecord && (styleRecord.styleElement as HTMLStyleElement);\n if (styleElement && styleElement.parentElement) {\n styleElement.parentElement.removeChild(styleElement);\n }\n });\n}\n\n/**\n * Reloads styles.\n */\nfunction reloadStyles(): void {\n if (_themeState.theme) {\n const themableStyles: ThemableArray[] = [];\n for (const styleRecord of _themeState.registeredThemableStyles) {\n themableStyles.push(styleRecord.themableStyle);\n }\n if (themableStyles.length > 0) {\n clearStyles(ClearStyleOptions.onlyThemable);\n applyThemableStyles(([] as ThemableArray).concat.apply([], themableStyles));\n }\n }\n}\n\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */\nexport function detokenize(styles: string | undefined): string | undefined {\n if (styles) {\n styles = resolveThemableArray(splitStyles(styles)).styleString;\n }\n\n return styles;\n}\n\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */\nfunction resolveThemableArray(splitStyleArray: ThemableArray): IThemableArrayResolveResult {\n const { theme }: IThemeState = _themeState;\n let themable: boolean = false;\n // Resolve the array of theming instructions to an array of strings.\n // Then join the array to produce the final CSS string.\n const resolvedArray: (string | undefined)[] = (splitStyleArray || []).map(\n (currentValue: IThemingInstruction) => {\n const themeSlot: string | undefined = currentValue.theme;\n if (themeSlot) {\n themable = true;\n // A theming annotation. Resolve it.\n const themedValue: string | undefined = theme ? theme[themeSlot] : undefined;\n const defaultValue: string = currentValue.defaultValue || 'inherit';\n\n // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n // Allow the themedValue to be undefined to explicitly request the default value.\n if (\n theme &&\n !themedValue &&\n console &&\n !(themeSlot in theme) &&\n typeof DEBUG !== 'undefined' &&\n DEBUG\n ) {\n console.warn(`Theming value not provided for \"${themeSlot}\". Falling back to \"${defaultValue}\".`);\n }\n\n return themedValue || defaultValue;\n } else {\n // A non-themable string. Preserve it.\n return currentValue.rawString;\n }\n }\n );\n\n return {\n styleString: resolvedArray.join(''),\n themable: themable\n };\n}\n\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */\nexport function splitStyles(styles: string): ThemableArray {\n const result: ThemableArray = [];\n if (styles) {\n let pos: number = 0; // Current position in styles.\n let tokenMatch: RegExpExecArray | null;\n while ((tokenMatch = _themeTokenRegex.exec(styles))) {\n const matchIndex: number = tokenMatch.index;\n if (matchIndex > pos) {\n result.push({\n rawString: styles.substring(pos, matchIndex)\n });\n }\n\n result.push({\n theme: tokenMatch[1],\n defaultValue: tokenMatch[2] // May be undefined\n });\n\n // index of the first character after the current match\n pos = _themeTokenRegex.lastIndex;\n }\n\n // Push the rest of the string after the last match.\n result.push({\n rawString: styles.substring(pos)\n });\n }\n\n return result;\n}\n\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */\nfunction registerStyles(styleArray: ThemableArray): void {\n if (typeof document === 'undefined') {\n return;\n }\n const head: HTMLHeadElement = document.getElementsByTagName('head')[0];\n const styleElement: HTMLStyleElement = document.createElement('style');\n const { styleString, themable } = resolveThemableArray(styleArray);\n\n styleElement.setAttribute('data-load-themed-styles', 'true');\n if (_styleNonce) {\n styleElement.setAttribute('nonce', _styleNonce);\n }\n styleElement.appendChild(document.createTextNode(styleString));\n _themeState.perf.count++;\n head.appendChild(styleElement);\n\n const ev: ICustomEvent<{ newStyle: HTMLStyleElement }> = document.createEvent('HTMLEvents');\n ev.initEvent('styleinsert', true /* bubbleEvent */, false /* cancelable */);\n ev.args = {\n newStyle: styleElement\n };\n document.dispatchEvent(ev);\n\n const record: IStyleRecord = {\n styleElement: styleElement,\n themableStyle: styleArray\n };\n\n if (themable) {\n _themeState.registeredThemableStyles.push(record);\n } else {\n _themeState.registeredStyles.push(record);\n }\n}\n"]}
package/lib-es6/index.js CHANGED
@@ -45,7 +45,7 @@ function initializeThemeState() {
45
45
  duration: 0
46
46
  }, runState: {
47
47
  flushTimer: 0,
48
- mode: 0 /* sync */,
48
+ mode: 0 /* Mode.sync */,
49
49
  buffer: []
50
50
  } });
51
51
  }
@@ -66,7 +66,7 @@ export function loadStyles(styles, loadAsync) {
66
66
  measure(function () {
67
67
  var styleParts = Array.isArray(styles) ? styles : splitStyles(styles);
68
68
  var _a = _themeState.runState, mode = _a.mode, buffer = _a.buffer, flushTimer = _a.flushTimer;
69
- if (loadAsync || mode === 1 /* async */) {
69
+ if (loadAsync || mode === 1 /* Mode.async */) {
70
70
  buffer.push(styleParts);
71
71
  if (!flushTimer) {
72
72
  _themeState.runState.flushTimer = asyncLoadStyles();
@@ -144,12 +144,12 @@ export function loadTheme(theme) {
144
144
  * Default to be both themable and non-themable styles will be cleared
145
145
  */
146
146
  export function clearStyles(option) {
147
- if (option === void 0) { option = 3 /* all */; }
148
- if (option === 3 /* all */ || option === 2 /* onlyNonThemable */) {
147
+ if (option === void 0) { option = 3 /* ClearStyleOptions.all */; }
148
+ if (option === 3 /* ClearStyleOptions.all */ || option === 2 /* ClearStyleOptions.onlyNonThemable */) {
149
149
  clearStylesInternal(_themeState.registeredStyles);
150
150
  _themeState.registeredStyles = [];
151
151
  }
152
- if (option === 3 /* all */ || option === 1 /* onlyThemable */) {
152
+ if (option === 3 /* ClearStyleOptions.all */ || option === 1 /* ClearStyleOptions.onlyThemable */) {
153
153
  clearStylesInternal(_themeState.registeredThemableStyles);
154
154
  _themeState.registeredThemableStyles = [];
155
155
  }
@@ -173,7 +173,7 @@ function reloadStyles() {
173
173
  themableStyles.push(styleRecord.themableStyle);
174
174
  }
175
175
  if (themableStyles.length > 0) {
176
- clearStyles(1 /* onlyThemable */);
176
+ clearStyles(1 /* ClearStyleOptions.onlyThemable */);
177
177
  applyThemableStyles([].concat.apply([], themableStyles));
178
178
  }
179
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An IThemingInstruction can specify a rawString to be preserved or a theme slot and a default value\n * to use if that slot is not specified by the theme.\n */\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Declaring a global here in case that the execution environment is Node.js (without importing the\n// entire node.js d.ts for now)\ndeclare let global: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface IThemingInstruction {\n theme?: string;\n defaultValue?: string;\n rawString?: string;\n}\n\nexport type ThemableArray = IThemingInstruction[];\n\nexport interface ITheme {\n [key: string]: string;\n}\n\ninterface IStyleSheet {\n cssText: string;\n}\n\ninterface IExtendedHtmlStyleElement extends HTMLStyleElement {\n styleSheet: IStyleSheet;\n}\n\n/**\n * Performance Measurement of loading styles\n */\ninterface IMeasurement {\n /**\n * Count of style element injected, which is the slow operation in IE\n */\n count: number;\n /**\n * Total duration of all loadStyles exections\n */\n duration: number;\n}\n\ninterface IRunState {\n mode: Mode;\n buffer: ThemableArray[];\n flushTimer: number;\n}\n\ninterface IThemeState {\n theme: ITheme | undefined;\n lastStyleElement: IExtendedHtmlStyleElement;\n registeredStyles: IStyleRecord[]; // records of already registered non-themable styles\n registeredThemableStyles: IStyleRecord[]; // records of already registered themable styles\n loadStyles: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined;\n perf: IMeasurement;\n runState: IRunState;\n}\n\ninterface IStyleRecord {\n styleElement: Element;\n themableStyle: ThemableArray;\n}\n\ninterface ICustomEvent<T> extends Event {\n args?: T;\n}\n\n/**\n * object returned from resolveThemableArray function\n */\ninterface IThemableArrayResolveResult {\n /** this string is the processed styles in string */\n styleString: string;\n\n /** this boolean indicates if this style array is themable */\n themable: boolean;\n}\n\n/**\n * In sync mode, styles are registered as style elements synchronously with loadStyles() call.\n * In async mode, styles are buffered and registered as batch in async timer for performance purpose.\n */\nexport const enum Mode {\n sync,\n async\n}\n\n/**\n * Themable styles and non-themable styles are tracked separately\n * Specify ClearStyleOptions when calling clearStyles API to specify which group of registered styles should be cleared.\n */\nexport const enum ClearStyleOptions {\n /** only themable styles will be cleared */\n onlyThemable = 1,\n /** only non-themable styles will be cleared */\n onlyNonThemable = 2,\n /** both themable and non-themable styles will be cleared */\n all = 3\n}\n\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nconst _root: any = typeof window === 'undefined' ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nconst _styleNonce: string = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n\nconst _themeState: IThemeState = initializeThemeState();\n\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */\nconst _themeTokenRegex: RegExp =\n /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\n\nconst now: () => number = () =>\n typeof performance !== 'undefined' && !!performance.now ? performance.now() : Date.now();\n\nfunction measure(func: () => void): void {\n const start: number = now();\n func();\n const end: number = now();\n _themeState.perf.duration += end - start;\n}\n\n/**\n * initialize global state object\n */\nfunction initializeThemeState(): IThemeState {\n let state: IThemeState = _root.__themeState__ || {\n theme: undefined,\n lastStyleElement: undefined,\n registeredStyles: []\n };\n\n if (!state.runState) {\n state = {\n ...state,\n perf: {\n count: 0,\n duration: 0\n },\n runState: {\n flushTimer: 0,\n mode: Mode.sync,\n buffer: []\n }\n };\n }\n if (!state.registeredThemableStyles) {\n state = {\n ...state,\n registeredThemableStyles: []\n };\n }\n _root.__themeState__ = state;\n return state;\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */\nexport function loadStyles(styles: string | ThemableArray, loadAsync: boolean = false): void {\n measure(() => {\n const styleParts: ThemableArray = Array.isArray(styles) ? styles : splitStyles(styles);\n const { mode, buffer, flushTimer } = _themeState.runState;\n if (loadAsync || mode === Mode.async) {\n buffer.push(styleParts);\n if (!flushTimer) {\n _themeState.runState.flushTimer = asyncLoadStyles();\n }\n } else {\n applyThemableStyles(styleParts);\n }\n });\n}\n\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */\nexport function configureLoadStyles(\n loadStylesFn: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined\n): void {\n _themeState.loadStyles = loadStylesFn;\n}\n\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */\nexport function configureRunMode(mode: Mode): void {\n _themeState.runState.mode = mode;\n}\n\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */\nexport function flush(): void {\n measure(() => {\n const styleArrays: ThemableArray[] = _themeState.runState.buffer.slice();\n _themeState.runState.buffer = [];\n const mergedStyleArray: ThemableArray = ([] as ThemableArray).concat.apply([], styleArrays);\n if (mergedStyleArray.length > 0) {\n applyThemableStyles(mergedStyleArray);\n }\n });\n}\n\n/**\n * register async loadStyles\n */\nfunction asyncLoadStyles(): number {\n return setTimeout(() => {\n _themeState.runState.flushTimer = 0;\n flush();\n }, 0);\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */\nfunction applyThemableStyles(stylesArray: ThemableArray, styleRecord?: IStyleRecord): void {\n if (_themeState.loadStyles) {\n _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n } else {\n registerStyles(stylesArray);\n }\n}\n\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */\nexport function loadTheme(theme: ITheme | undefined): void {\n _themeState.theme = theme;\n\n // reload styles.\n reloadStyles();\n}\n\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */\nexport function clearStyles(option: ClearStyleOptions = ClearStyleOptions.all): void {\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyNonThemable) {\n clearStylesInternal(_themeState.registeredStyles);\n _themeState.registeredStyles = [];\n }\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyThemable) {\n clearStylesInternal(_themeState.registeredThemableStyles);\n _themeState.registeredThemableStyles = [];\n }\n}\n\nfunction clearStylesInternal(records: IStyleRecord[]): void {\n records.forEach((styleRecord: IStyleRecord) => {\n const styleElement: HTMLStyleElement = styleRecord && (styleRecord.styleElement as HTMLStyleElement);\n if (styleElement && styleElement.parentElement) {\n styleElement.parentElement.removeChild(styleElement);\n }\n });\n}\n\n/**\n * Reloads styles.\n */\nfunction reloadStyles(): void {\n if (_themeState.theme) {\n const themableStyles: ThemableArray[] = [];\n for (const styleRecord of _themeState.registeredThemableStyles) {\n themableStyles.push(styleRecord.themableStyle);\n }\n if (themableStyles.length > 0) {\n clearStyles(ClearStyleOptions.onlyThemable);\n applyThemableStyles(([] as ThemableArray).concat.apply([], themableStyles));\n }\n }\n}\n\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */\nexport function detokenize(styles: string | undefined): string | undefined {\n if (styles) {\n styles = resolveThemableArray(splitStyles(styles)).styleString;\n }\n\n return styles;\n}\n\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */\nfunction resolveThemableArray(splitStyleArray: ThemableArray): IThemableArrayResolveResult {\n const { theme }: IThemeState = _themeState;\n let themable: boolean = false;\n // Resolve the array of theming instructions to an array of strings.\n // Then join the array to produce the final CSS string.\n const resolvedArray: (string | undefined)[] = (splitStyleArray || []).map(\n (currentValue: IThemingInstruction) => {\n const themeSlot: string | undefined = currentValue.theme;\n if (themeSlot) {\n themable = true;\n // A theming annotation. Resolve it.\n const themedValue: string | undefined = theme ? theme[themeSlot] : undefined;\n const defaultValue: string = currentValue.defaultValue || 'inherit';\n\n // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n // Allow the themedValue to be undefined to explicitly request the default value.\n if (\n theme &&\n !themedValue &&\n console &&\n !(themeSlot in theme) &&\n typeof DEBUG !== 'undefined' &&\n DEBUG\n ) {\n console.warn(`Theming value not provided for \"${themeSlot}\". Falling back to \"${defaultValue}\".`);\n }\n\n return themedValue || defaultValue;\n } else {\n // A non-themable string. Preserve it.\n return currentValue.rawString;\n }\n }\n );\n\n return {\n styleString: resolvedArray.join(''),\n themable: themable\n };\n}\n\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */\nexport function splitStyles(styles: string): ThemableArray {\n const result: ThemableArray = [];\n if (styles) {\n let pos: number = 0; // Current position in styles.\n let tokenMatch: RegExpExecArray | null;\n while ((tokenMatch = _themeTokenRegex.exec(styles))) {\n const matchIndex: number = tokenMatch.index;\n if (matchIndex > pos) {\n result.push({\n rawString: styles.substring(pos, matchIndex)\n });\n }\n\n result.push({\n theme: tokenMatch[1],\n defaultValue: tokenMatch[2] // May be undefined\n });\n\n // index of the first character after the current match\n pos = _themeTokenRegex.lastIndex;\n }\n\n // Push the rest of the string after the last match.\n result.push({\n rawString: styles.substring(pos)\n });\n }\n\n return result;\n}\n\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */\nfunction registerStyles(styleArray: ThemableArray): void {\n if (typeof document === 'undefined') {\n return;\n }\n const head: HTMLHeadElement = document.getElementsByTagName('head')[0];\n const styleElement: HTMLStyleElement = document.createElement('style');\n const { styleString, themable } = resolveThemableArray(styleArray);\n\n styleElement.setAttribute('data-load-themed-styles', 'true');\n if (_styleNonce) {\n styleElement.setAttribute('nonce', _styleNonce);\n }\n styleElement.appendChild(document.createTextNode(styleString));\n _themeState.perf.count++;\n head.appendChild(styleElement);\n\n const ev: ICustomEvent<{ newStyle: HTMLStyleElement }> = document.createEvent('HTMLEvents');\n ev.initEvent('styleinsert', true /* bubbleEvent */, false /* cancelable */);\n ev.args = {\n newStyle: styleElement\n };\n document.dispatchEvent(ev);\n\n const record: IStyleRecord = {\n styleElement: styleElement,\n themableStyle: styleArray\n };\n\n if (themable) {\n _themeState.registeredThemableStyles.push(record);\n } else {\n _themeState.registeredStyles.push(record);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;AAyG3D,4FAA4F;AAC5F,yCAAyC;AACzC,IAAM,KAAK,GAAQ,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,yDAAyD;AAE7H,yGAAyG;AACzG,IAAM,WAAW,GAAW,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;AAElF,IAAM,WAAW,GAAgB,oBAAoB,EAAE,CAAC;AAExD;;GAEG;AACH,IAAM,gBAAgB,GACpB,gHAAgH,CAAC;AAEnH,IAAM,GAAG,GAAiB;IACxB,OAAA,OAAO,WAAW,KAAK,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;AAAxF,CAAwF,CAAC;AAE3F,SAAS,OAAO,CAAC,IAAgB;IAC/B,IAAM,KAAK,GAAW,GAAG,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC;IACP,IAAM,GAAG,GAAW,GAAG,EAAE,CAAC;IAC1B,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,KAAK,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,IAAI,KAAK,GAAgB,KAAK,CAAC,cAAc,IAAI;QAC/C,KAAK,EAAE,SAAS;QAChB,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACnB,KAAK,yBACA,KAAK,KACR,IAAI,EAAE;gBACJ,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,CAAC;aACZ,EACD,QAAQ,EAAE;gBACR,UAAU,EAAE,CAAC;gBACb,IAAI,mBAAW;gBACf,MAAM,EAAE,EAAE;aACX,GACF,CAAC;KACH;IACD,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE;QACnC,KAAK,yBACA,KAAK,KACR,wBAAwB,EAAE,EAAE,GAC7B,CAAC;KACH;IACD,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAA8B,EAAE,SAA0B;IAA1B,0BAAA,EAAA,iBAA0B;IACnF,OAAO,CAAC;QACN,IAAM,UAAU,GAAkB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjF,IAAA,KAA+B,WAAW,CAAC,QAAQ,EAAjD,IAAI,UAAA,EAAE,MAAM,YAAA,EAAE,UAAU,gBAAyB,CAAC;QAC1D,IAAI,SAAS,IAAI,IAAI,uBAAe,EAAE;YACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,EAAE;gBACf,WAAW,CAAC,QAAQ,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;aACrD;SACF;aAAM;YACL,mBAAmB,CAAC,UAAU,CAAC,CAAC;SACjC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAAiG;IAEjG,WAAW,CAAC,UAAU,GAAG,YAAY,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,WAAW,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,CAAC;QACN,IAAM,WAAW,GAAoB,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzE,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;QACjC,IAAM,gBAAgB,GAAmB,EAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC5F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;SACvC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,OAAO,UAAU,CAAC;QAChB,WAAW,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;QACpC,KAAK,EAAE,CAAC;IACV,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,WAA0B,EAAE,WAA0B;IACjF,IAAI,WAAW,CAAC,UAAU,EAAE;QAC1B,WAAW,CAAC,UAAU,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;KACpF;SAAM;QACL,cAAc,CAAC,WAAW,CAAC,CAAC;KAC7B;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAyB;IACjD,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;IAE1B,iBAAiB;IACjB,YAAY,EAAE,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAiD;IAAjD,uBAAA,EAAA,sCAAiD;IAC3E,IAAI,MAAM,kCAA0B,IAAI,MAAM,8CAAsC,EAAE;QACpF,mBAAmB,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClD,WAAW,CAAC,gBAAgB,GAAG,EAAE,CAAC;KACnC;IACD,IAAI,MAAM,kCAA0B,IAAI,MAAM,2CAAmC,EAAE;QACjF,mBAAmB,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAC1D,WAAW,CAAC,wBAAwB,GAAG,EAAE,CAAC;KAC3C;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAuB;IAClD,OAAO,CAAC,OAAO,CAAC,UAAC,WAAyB;QACxC,IAAM,YAAY,GAAqB,WAAW,IAAK,WAAW,CAAC,YAAiC,CAAC;QACrG,IAAI,YAAY,IAAI,YAAY,CAAC,aAAa,EAAE;YAC9C,YAAY,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;SACtD;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,YAAY;IACnB,IAAI,WAAW,CAAC,KAAK,EAAE;QACrB,IAAM,cAAc,GAAoB,EAAE,CAAC;QAC3C,KAA0B,UAAoC,EAApC,KAAA,WAAW,CAAC,wBAAwB,EAApC,cAAoC,EAApC,IAAoC,EAAE;YAA3D,IAAM,WAAW,SAAA;YACpB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SAChD;QACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,WAAW,wCAAgC,CAAC;YAC5C,mBAAmB,CAAE,EAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;SAC7E;KACF;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAA0B;IACnD,IAAI,MAAM,EAAE;QACV,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;KAChE;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,eAA8B;IAClD,IAAA,KAAK,GAAkB,WAAW,MAA7B,CAA8B;IAC3C,IAAI,QAAQ,GAAY,KAAK,CAAC;IAC9B,oEAAoE;IACpE,uDAAuD;IACvD,IAAM,aAAa,GAA2B,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CACvE,UAAC,YAAiC;QAChC,IAAM,SAAS,GAAuB,YAAY,CAAC,KAAK,CAAC;QACzD,IAAI,SAAS,EAAE;YACb,QAAQ,GAAG,IAAI,CAAC;YAChB,oCAAoC;YACpC,IAAM,WAAW,GAAuB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,IAAM,YAAY,GAAW,YAAY,CAAC,YAAY,IAAI,SAAS,CAAC;YAEpE,0GAA0G;YAC1G,iFAAiF;YACjF,IACE,KAAK;gBACL,CAAC,WAAW;gBACZ,OAAO;gBACP,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC;gBACrB,OAAO,KAAK,KAAK,WAAW;gBAC5B,KAAK,EACL;gBACA,OAAO,CAAC,IAAI,CAAC,2CAAmC,SAAS,mCAAuB,YAAY,QAAI,CAAC,CAAC;aACnG;YAED,OAAO,WAAW,IAAI,YAAY,CAAC;SACpC;aAAM;YACL,sCAAsC;YACtC,OAAO,YAAY,CAAC,SAAS,CAAC;SAC/B;IACH,CAAC,CACF,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,QAAQ,EAAE,QAAQ;KACnB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,MAAM,EAAE;QACV,IAAI,GAAG,GAAW,CAAC,CAAC,CAAC,8BAA8B;QACnD,IAAI,UAAU,SAAwB,CAAC;QACvC,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACnD,IAAM,UAAU,GAAW,UAAU,CAAC,KAAK,CAAC;YAC5C,IAAI,UAAU,GAAG,GAAG,EAAE;gBACpB,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC;iBAC7C,CAAC,CAAC;aACJ;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpB,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB;aAChD,CAAC,CAAC;YAEH,uDAAuD;YACvD,GAAG,GAAG,gBAAgB,CAAC,SAAS,CAAC;SAClC;QAED,oDAAoD;QACpD,MAAM,CAAC,IAAI,CAAC;YACV,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;SACjC,CAAC,CAAC;KACJ;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,UAAyB;IAC/C,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;QACnC,OAAO;KACR;IACD,IAAM,IAAI,GAAoB,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,IAAM,YAAY,GAAqB,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACjE,IAAA,KAA4B,oBAAoB,CAAC,UAAU,CAAC,EAA1D,WAAW,iBAAA,EAAE,QAAQ,cAAqC,CAAC;IAEnE,YAAY,CAAC,YAAY,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,WAAW,EAAE;QACf,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;KACjD;IACD,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAE/B,IAAM,EAAE,GAAiD,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC5F,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC5E,EAAE,CAAC,IAAI,GAAG;QACR,QAAQ,EAAE,YAAY;KACvB,CAAC;IACF,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE3B,IAAM,MAAM,GAAiB;QAC3B,YAAY,EAAE,YAAY;QAC1B,aAAa,EAAE,UAAU;KAC1B,CAAC;IAEF,IAAI,QAAQ,EAAE;QACZ,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACnD;SAAM;QACL,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC3C;AACH,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An IThemingInstruction can specify a rawString to be preserved or a theme slot and a default value\n * to use if that slot is not specified by the theme.\n */\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Declaring a global here in case that the execution environment is Node.js (without importing the\n// entire node.js d.ts for now)\ndeclare let global: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport interface IThemingInstruction {\n theme?: string;\n defaultValue?: string;\n rawString?: string;\n}\n\nexport type ThemableArray = IThemingInstruction[];\n\nexport interface ITheme {\n [key: string]: string;\n}\n\ninterface IStyleSheet {\n cssText: string;\n}\n\ninterface IExtendedHtmlStyleElement extends HTMLStyleElement {\n styleSheet: IStyleSheet;\n}\n\n/**\n * Performance Measurement of loading styles\n */\ninterface IMeasurement {\n /**\n * Count of style element injected, which is the slow operation in IE\n */\n count: number;\n /**\n * Total duration of all loadStyles exections\n */\n duration: number;\n}\n\ninterface IRunState {\n mode: Mode;\n buffer: ThemableArray[];\n flushTimer: number;\n}\n\ninterface IThemeState {\n theme: ITheme | undefined;\n lastStyleElement: IExtendedHtmlStyleElement;\n registeredStyles: IStyleRecord[]; // records of already registered non-themable styles\n registeredThemableStyles: IStyleRecord[]; // records of already registered themable styles\n loadStyles: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined;\n perf: IMeasurement;\n runState: IRunState;\n}\n\ninterface IStyleRecord {\n styleElement: Element;\n themableStyle: ThemableArray;\n}\n\ninterface ICustomEvent<T> extends Event {\n args?: T;\n}\n\n/**\n * object returned from resolveThemableArray function\n */\ninterface IThemableArrayResolveResult {\n /** this string is the processed styles in string */\n styleString: string;\n\n /** this boolean indicates if this style array is themable */\n themable: boolean;\n}\n\n/**\n * In sync mode, styles are registered as style elements synchronously with loadStyles() call.\n * In async mode, styles are buffered and registered as batch in async timer for performance purpose.\n */\nexport const enum Mode {\n sync,\n async\n}\n\n/**\n * Themable styles and non-themable styles are tracked separately\n * Specify ClearStyleOptions when calling clearStyles API to specify which group of registered styles should be cleared.\n */\nexport const enum ClearStyleOptions {\n /** only themable styles will be cleared */\n onlyThemable = 1,\n /** only non-themable styles will be cleared */\n onlyNonThemable = 2,\n /** both themable and non-themable styles will be cleared */\n all = 3\n}\n\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nconst _root: any = typeof window === 'undefined' ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nconst _styleNonce: string = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n\nconst _themeState: IThemeState = initializeThemeState();\n\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */\nconst _themeTokenRegex: RegExp =\n /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\n\nconst now: () => number = () =>\n typeof performance !== 'undefined' && !!performance.now ? performance.now() : Date.now();\n\nfunction measure(func: () => void): void {\n const start: number = now();\n func();\n const end: number = now();\n _themeState.perf.duration += end - start;\n}\n\n/**\n * initialize global state object\n */\nfunction initializeThemeState(): IThemeState {\n let state: IThemeState = _root.__themeState__ || {\n theme: undefined,\n lastStyleElement: undefined,\n registeredStyles: []\n };\n\n if (!state.runState) {\n state = {\n ...state,\n perf: {\n count: 0,\n duration: 0\n },\n runState: {\n flushTimer: 0,\n mode: Mode.sync,\n buffer: []\n }\n };\n }\n if (!state.registeredThemableStyles) {\n state = {\n ...state,\n registeredThemableStyles: []\n };\n }\n _root.__themeState__ = state;\n return state;\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */\nexport function loadStyles(styles: string | ThemableArray, loadAsync: boolean = false): void {\n measure(() => {\n const styleParts: ThemableArray = Array.isArray(styles) ? styles : splitStyles(styles);\n const { mode, buffer, flushTimer } = _themeState.runState;\n if (loadAsync || mode === Mode.async) {\n buffer.push(styleParts);\n if (!flushTimer) {\n _themeState.runState.flushTimer = asyncLoadStyles();\n }\n } else {\n applyThemableStyles(styleParts);\n }\n });\n}\n\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */\nexport function configureLoadStyles(\n loadStylesFn: ((processedStyles: string, rawStyles?: string | ThemableArray) => void) | undefined\n): void {\n _themeState.loadStyles = loadStylesFn;\n}\n\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */\nexport function configureRunMode(mode: Mode): void {\n _themeState.runState.mode = mode;\n}\n\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */\nexport function flush(): void {\n measure(() => {\n const styleArrays: ThemableArray[] = _themeState.runState.buffer.slice();\n _themeState.runState.buffer = [];\n const mergedStyleArray: ThemableArray = ([] as ThemableArray).concat.apply([], styleArrays);\n if (mergedStyleArray.length > 0) {\n applyThemableStyles(mergedStyleArray);\n }\n });\n}\n\n/**\n * register async loadStyles\n */\nfunction asyncLoadStyles(): number {\n return setTimeout(() => {\n _themeState.runState.flushTimer = 0;\n flush();\n }, 0);\n}\n\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */\nfunction applyThemableStyles(stylesArray: ThemableArray, styleRecord?: IStyleRecord): void {\n if (_themeState.loadStyles) {\n _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n } else {\n registerStyles(stylesArray);\n }\n}\n\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */\nexport function loadTheme(theme: ITheme | undefined): void {\n _themeState.theme = theme;\n\n // reload styles.\n reloadStyles();\n}\n\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */\nexport function clearStyles(option: ClearStyleOptions = ClearStyleOptions.all): void {\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyNonThemable) {\n clearStylesInternal(_themeState.registeredStyles);\n _themeState.registeredStyles = [];\n }\n if (option === ClearStyleOptions.all || option === ClearStyleOptions.onlyThemable) {\n clearStylesInternal(_themeState.registeredThemableStyles);\n _themeState.registeredThemableStyles = [];\n }\n}\n\nfunction clearStylesInternal(records: IStyleRecord[]): void {\n records.forEach((styleRecord: IStyleRecord) => {\n const styleElement: HTMLStyleElement = styleRecord && (styleRecord.styleElement as HTMLStyleElement);\n if (styleElement && styleElement.parentElement) {\n styleElement.parentElement.removeChild(styleElement);\n }\n });\n}\n\n/**\n * Reloads styles.\n */\nfunction reloadStyles(): void {\n if (_themeState.theme) {\n const themableStyles: ThemableArray[] = [];\n for (const styleRecord of _themeState.registeredThemableStyles) {\n themableStyles.push(styleRecord.themableStyle);\n }\n if (themableStyles.length > 0) {\n clearStyles(ClearStyleOptions.onlyThemable);\n applyThemableStyles(([] as ThemableArray).concat.apply([], themableStyles));\n }\n }\n}\n\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */\nexport function detokenize(styles: string | undefined): string | undefined {\n if (styles) {\n styles = resolveThemableArray(splitStyles(styles)).styleString;\n }\n\n return styles;\n}\n\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */\nfunction resolveThemableArray(splitStyleArray: ThemableArray): IThemableArrayResolveResult {\n const { theme }: IThemeState = _themeState;\n let themable: boolean = false;\n // Resolve the array of theming instructions to an array of strings.\n // Then join the array to produce the final CSS string.\n const resolvedArray: (string | undefined)[] = (splitStyleArray || []).map(\n (currentValue: IThemingInstruction) => {\n const themeSlot: string | undefined = currentValue.theme;\n if (themeSlot) {\n themable = true;\n // A theming annotation. Resolve it.\n const themedValue: string | undefined = theme ? theme[themeSlot] : undefined;\n const defaultValue: string = currentValue.defaultValue || 'inherit';\n\n // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n // Allow the themedValue to be undefined to explicitly request the default value.\n if (\n theme &&\n !themedValue &&\n console &&\n !(themeSlot in theme) &&\n typeof DEBUG !== 'undefined' &&\n DEBUG\n ) {\n console.warn(`Theming value not provided for \"${themeSlot}\". Falling back to \"${defaultValue}\".`);\n }\n\n return themedValue || defaultValue;\n } else {\n // A non-themable string. Preserve it.\n return currentValue.rawString;\n }\n }\n );\n\n return {\n styleString: resolvedArray.join(''),\n themable: themable\n };\n}\n\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */\nexport function splitStyles(styles: string): ThemableArray {\n const result: ThemableArray = [];\n if (styles) {\n let pos: number = 0; // Current position in styles.\n let tokenMatch: RegExpExecArray | null;\n while ((tokenMatch = _themeTokenRegex.exec(styles))) {\n const matchIndex: number = tokenMatch.index;\n if (matchIndex > pos) {\n result.push({\n rawString: styles.substring(pos, matchIndex)\n });\n }\n\n result.push({\n theme: tokenMatch[1],\n defaultValue: tokenMatch[2] // May be undefined\n });\n\n // index of the first character after the current match\n pos = _themeTokenRegex.lastIndex;\n }\n\n // Push the rest of the string after the last match.\n result.push({\n rawString: styles.substring(pos)\n });\n }\n\n return result;\n}\n\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */\nfunction registerStyles(styleArray: ThemableArray): void {\n if (typeof document === 'undefined') {\n return;\n }\n const head: HTMLHeadElement = document.getElementsByTagName('head')[0];\n const styleElement: HTMLStyleElement = document.createElement('style');\n const { styleString, themable } = resolveThemableArray(styleArray);\n\n styleElement.setAttribute('data-load-themed-styles', 'true');\n if (_styleNonce) {\n styleElement.setAttribute('nonce', _styleNonce);\n }\n styleElement.appendChild(document.createTextNode(styleString));\n _themeState.perf.count++;\n head.appendChild(styleElement);\n\n const ev: ICustomEvent<{ newStyle: HTMLStyleElement }> = document.createEvent('HTMLEvents');\n ev.initEvent('styleinsert', true /* bubbleEvent */, false /* cancelable */);\n ev.args = {\n newStyle: styleElement\n };\n document.dispatchEvent(ev);\n\n const record: IStyleRecord = {\n styleElement: styleElement,\n themableStyle: styleArray\n };\n\n if (themable) {\n _themeState.registeredThemableStyles.push(record);\n } else {\n _themeState.registeredStyles.push(record);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/load-themed-styles",
3
- "version": "1.10.284",
3
+ "version": "1.10.285",
4
4
  "description": "Loads themed styles.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,9 +13,9 @@
13
13
  "typings": "lib/index.d.ts",
14
14
  "keywords": [],
15
15
  "devDependencies": {
16
- "@rushstack/eslint-config": "2.6.2",
17
- "@rushstack/heft": "0.46.7",
18
- "@rushstack/heft-web-rig": "0.10.25",
16
+ "@rushstack/eslint-config": "3.0.0",
17
+ "@rushstack/heft": "0.47.0",
18
+ "@rushstack/heft-web-rig": "0.11.0",
19
19
  "@types/heft-jest": "1.0.1",
20
20
  "@types/webpack-env": "1.13.0"
21
21
  },