@microsoft/load-themed-styles 2.0.163 → 2.0.165

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/CHANGELOG.json CHANGED
@@ -1,6 +1,30 @@
1
1
  {
2
2
  "name": "@microsoft/load-themed-styles",
3
3
  "entries": [
4
+ {
5
+ "version": "2.0.165",
6
+ "tag": "@microsoft/load-themed-styles_v2.0.165",
7
+ "date": "Tue, 11 Mar 2025 00:11:25 GMT",
8
+ "comments": {
9
+ "dependency": [
10
+ {
11
+ "comment": "Updating dependency \"@rushstack/heft\" to `0.69.3`"
12
+ }
13
+ ]
14
+ }
15
+ },
16
+ {
17
+ "version": "2.0.164",
18
+ "tag": "@microsoft/load-themed-styles_v2.0.164",
19
+ "date": "Sat, 01 Mar 2025 05:00:09 GMT",
20
+ "comments": {
21
+ "dependency": [
22
+ {
23
+ "comment": "Updating dependency \"@rushstack/heft\" to `0.69.2`"
24
+ }
25
+ ]
26
+ }
27
+ },
4
28
  {
5
29
  "version": "2.0.163",
6
30
  "tag": "@microsoft/load-themed-styles_v2.0.163",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Change Log - @microsoft/load-themed-styles
2
2
 
3
- This log was last generated on Thu, 27 Feb 2025 01:10:39 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 11 Mar 2025 00:11:25 GMT and should not be manually modified.
4
+
5
+ ## 2.0.165
6
+ Tue, 11 Mar 2025 00:11:25 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 2.0.164
11
+ Sat, 01 Mar 2025 05:00:09 GMT
12
+
13
+ _Version update only_
4
14
 
5
15
  ## 2.0.163
6
16
  Thu, 27 Feb 2025 01:10:39 GMT
package/lib/index.js CHANGED
@@ -13,7 +13,15 @@ var __assign = (this && this.__assign) || function () {
13
13
  return __assign.apply(this, arguments);
14
14
  };
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.splitStyles = exports.detokenize = exports.clearStyles = exports.loadTheme = exports.flush = exports.configureRunMode = exports.configureLoadStyles = exports.loadStyles = exports.ClearStyleOptions = exports.Mode = void 0;
16
+ exports.ClearStyleOptions = exports.Mode = void 0;
17
+ exports.loadStyles = loadStyles;
18
+ exports.configureLoadStyles = configureLoadStyles;
19
+ exports.configureRunMode = configureRunMode;
20
+ exports.flush = flush;
21
+ exports.loadTheme = loadTheme;
22
+ exports.clearStyles = clearStyles;
23
+ exports.detokenize = detokenize;
24
+ exports.splitStyles = splitStyles;
17
25
  /**
18
26
  * In sync mode, styles are registered as style elements synchronously with loadStyles() call.
19
27
  * In async mode, styles are buffered and registered as batch in async timer for performance purpose.
@@ -102,7 +110,6 @@ function loadStyles(styles, loadAsync) {
102
110
  }
103
111
  });
104
112
  }
105
- exports.loadStyles = loadStyles;
106
113
  /**
107
114
  * Allows for customizable loadStyles logic. e.g. for server side rendering application
108
115
  * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}
@@ -111,7 +118,6 @@ exports.loadStyles = loadStyles;
111
118
  function configureLoadStyles(loadStylesFn) {
112
119
  _themeState.loadStyles = loadStylesFn;
113
120
  }
114
- exports.configureLoadStyles = configureLoadStyles;
115
121
  /**
116
122
  * Configure run mode of load-themable-styles
117
123
  * @param mode load-themable-styles run mode, async or sync
@@ -119,7 +125,6 @@ exports.configureLoadStyles = configureLoadStyles;
119
125
  function configureRunMode(mode) {
120
126
  _themeState.runState.mode = mode;
121
127
  }
122
- exports.configureRunMode = configureRunMode;
123
128
  /**
124
129
  * external code can call flush to synchronously force processing of currently buffered styles
125
130
  */
@@ -133,7 +138,6 @@ function flush() {
133
138
  }
134
139
  });
135
140
  }
136
- exports.flush = flush;
137
141
  /**
138
142
  * register async loadStyles
139
143
  */
@@ -169,7 +173,6 @@ function loadTheme(theme) {
169
173
  // reload styles.
170
174
  reloadStyles();
171
175
  }
172
- exports.loadTheme = loadTheme;
173
176
  /**
174
177
  * Clear already registered style elements and style records in theme_State object
175
178
  * @param option - specify which group of registered styles should be cleared.
@@ -186,7 +189,6 @@ function clearStyles(option) {
186
189
  _themeState.registeredThemableStyles = [];
187
190
  }
188
191
  }
189
- exports.clearStyles = clearStyles;
190
192
  function clearStylesInternal(records) {
191
193
  records.forEach(function (styleRecord) {
192
194
  var styleElement = styleRecord && styleRecord.styleElement;
@@ -221,7 +223,6 @@ function detokenize(styles) {
221
223
  }
222
224
  return styles;
223
225
  }
224
- exports.detokenize = detokenize;
225
226
  /**
226
227
  * Resolves ThemingInstruction objects in an array and joins the result into a string.
227
228
  * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.
@@ -291,7 +292,6 @@ function splitStyles(styles) {
291
292
  }
292
293
  return result;
293
294
  }
294
- exports.splitStyles = splitStyles;
295
295
  /**
296
296
  * Registers a set of style text. If it is registered too early, we will register it when the
297
297
  * window.load event is fired.
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 // Use \"self\" to distinguish conflicting global typings for setTimeout() from lib.dom.d.ts vs Jest's @types/node\n // https://github.com/jestjs/jest/issues/14418\n return self.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 // eslint-disable-next-line no-console\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 // Use \"self\" to distinguish conflicting global typings for setTimeout() from lib.dom.d.ts vs Jest's @types/node\n // https://github.com/jestjs/jest/issues/14418\n return self.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 // eslint-disable-next-line no-console\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
@@ -14,7 +14,15 @@ var __assign = (this && this.__assign) || function () {
14
14
  define(["require", "exports"], function (require, exports) {
15
15
  "use strict";
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.splitStyles = exports.detokenize = exports.clearStyles = exports.loadTheme = exports.flush = exports.configureRunMode = exports.configureLoadStyles = exports.loadStyles = exports.ClearStyleOptions = exports.Mode = void 0;
17
+ exports.ClearStyleOptions = exports.Mode = void 0;
18
+ exports.loadStyles = loadStyles;
19
+ exports.configureLoadStyles = configureLoadStyles;
20
+ exports.configureRunMode = configureRunMode;
21
+ exports.flush = flush;
22
+ exports.loadTheme = loadTheme;
23
+ exports.clearStyles = clearStyles;
24
+ exports.detokenize = detokenize;
25
+ exports.splitStyles = splitStyles;
18
26
  /**
19
27
  * In sync mode, styles are registered as style elements synchronously with loadStyles() call.
20
28
  * In async mode, styles are buffered and registered as batch in async timer for performance purpose.
@@ -103,7 +111,6 @@ define(["require", "exports"], function (require, exports) {
103
111
  }
104
112
  });
105
113
  }
106
- exports.loadStyles = loadStyles;
107
114
  /**
108
115
  * Allows for customizable loadStyles logic. e.g. for server side rendering application
109
116
  * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}
@@ -112,7 +119,6 @@ define(["require", "exports"], function (require, exports) {
112
119
  function configureLoadStyles(loadStylesFn) {
113
120
  _themeState.loadStyles = loadStylesFn;
114
121
  }
115
- exports.configureLoadStyles = configureLoadStyles;
116
122
  /**
117
123
  * Configure run mode of load-themable-styles
118
124
  * @param mode load-themable-styles run mode, async or sync
@@ -120,7 +126,6 @@ define(["require", "exports"], function (require, exports) {
120
126
  function configureRunMode(mode) {
121
127
  _themeState.runState.mode = mode;
122
128
  }
123
- exports.configureRunMode = configureRunMode;
124
129
  /**
125
130
  * external code can call flush to synchronously force processing of currently buffered styles
126
131
  */
@@ -134,7 +139,6 @@ define(["require", "exports"], function (require, exports) {
134
139
  }
135
140
  });
136
141
  }
137
- exports.flush = flush;
138
142
  /**
139
143
  * register async loadStyles
140
144
  */
@@ -170,7 +174,6 @@ define(["require", "exports"], function (require, exports) {
170
174
  // reload styles.
171
175
  reloadStyles();
172
176
  }
173
- exports.loadTheme = loadTheme;
174
177
  /**
175
178
  * Clear already registered style elements and style records in theme_State object
176
179
  * @param option - specify which group of registered styles should be cleared.
@@ -187,7 +190,6 @@ define(["require", "exports"], function (require, exports) {
187
190
  _themeState.registeredThemableStyles = [];
188
191
  }
189
192
  }
190
- exports.clearStyles = clearStyles;
191
193
  function clearStylesInternal(records) {
192
194
  records.forEach(function (styleRecord) {
193
195
  var styleElement = styleRecord && styleRecord.styleElement;
@@ -222,7 +224,6 @@ define(["require", "exports"], function (require, exports) {
222
224
  }
223
225
  return styles;
224
226
  }
225
- exports.detokenize = detokenize;
226
227
  /**
227
228
  * Resolves ThemingInstruction objects in an array and joins the result into a string.
228
229
  * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.
@@ -292,7 +293,6 @@ define(["require", "exports"], function (require, exports) {
292
293
  }
293
294
  return result;
294
295
  }
295
- exports.splitStyles = splitStyles;
296
296
  /**
297
297
  * Registers a set of style text. If it is registered too early, we will register it when the
298
298
  * window.load event is fired.
@@ -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 // Use \"self\" to distinguish conflicting global typings for setTimeout() from lib.dom.d.ts vs Jest's @types/node\n // https://github.com/jestjs/jest/issues/14418\n return self.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 // eslint-disable-next-line no-console\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 // Use \"self\" to distinguish conflicting global typings for setTimeout() from lib.dom.d.ts vs Jest's @types/node\n // https://github.com/jestjs/jest/issues/14418\n return self.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 // eslint-disable-next-line no-console\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": "2.0.163",
3
+ "version": "2.0.165",
4
4
  "description": "Loads themed styles.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,8 +13,8 @@
13
13
  "typings": "lib/index.d.ts",
14
14
  "keywords": [],
15
15
  "devDependencies": {
16
- "@rushstack/heft": "0.69.1",
17
- "local-web-rig": "1.0.0"
16
+ "local-web-rig": "1.0.0",
17
+ "@rushstack/heft": "0.69.3"
18
18
  },
19
19
  "scripts": {
20
20
  "build": "heft build --clean",