@microsoft/load-themed-styles 2.0.78 → 2.0.80
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.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib-amd/index.js +1 -0
- package/lib-amd/index.js.map +1 -1
- package/lib-es6/index.js +1 -0
- package/lib-es6/index.js.map +1 -1
- package/package.json +3 -4
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAElD,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AA4DD;;;GAGG;AACH,0BAAkB,IAAI;IACpB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED;;;GAGG;AACH,0BAAkB,iBAAiB;IACjC,2CAA2C;IAC3C,YAAY,IAAI;IAChB,+CAA+C;IAC/C,eAAe,IAAI;IACnB,4DAA4D;IAC5D,GAAG,IAAI;CACR;AA6DD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI,CAa3F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,CAAC,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC,GAAG,SAAS,GAChG,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAS5B;AA4BD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAKzD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,GAAE,iBAAyC,GAAG,IAAI,CASnF;AA2BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMzE;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAElD,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AA4DD;;;GAGG;AACH,0BAAkB,IAAI;IACpB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED;;;GAGG;AACH,0BAAkB,iBAAiB;IACjC,2CAA2C;IAC3C,YAAY,IAAI;IAChB,+CAA+C;IAC/C,eAAe,IAAI;IACnB,4DAA4D;IAC5D,GAAG,IAAI;CACR;AA6DD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI,CAa3F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,CAAC,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC,GAAG,SAAS,GAChG,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAS5B;AA4BD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAKzD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,GAAE,iBAAyC,GAAG,IAAI,CASnF;AA2BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMzE;AAgDD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CA6BzD"}
|
package/lib/index.js
CHANGED
|
@@ -224,6 +224,7 @@ function resolveThemableArray(splitStyleArray) {
|
|
|
224
224
|
!(themeSlot in theme) &&
|
|
225
225
|
typeof DEBUG !== 'undefined' &&
|
|
226
226
|
DEBUG) {
|
|
227
|
+
// eslint-disable-next-line no-console
|
|
227
228
|
console.warn("Theming value not provided for \"".concat(themeSlot, "\". Falling back to \"").concat(defaultValue, "\"."));
|
|
228
229
|
}
|
|
229
230
|
return themedValue || defaultValue;
|
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 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
|
@@ -225,6 +225,7 @@ define(["require", "exports"], function (require, exports) {
|
|
|
225
225
|
!(themeSlot in theme) &&
|
|
226
226
|
typeof DEBUG !== 'undefined' &&
|
|
227
227
|
DEBUG) {
|
|
228
|
+
// eslint-disable-next-line no-console
|
|
228
229
|
console.warn("Theming value not provided for \"".concat(themeSlot, "\". Falling back to \"").concat(defaultValue, "\"."));
|
|
229
230
|
}
|
|
230
231
|
return themedValue || defaultValue;
|
package/lib-amd/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 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-es6/index.js
CHANGED
|
@@ -214,6 +214,7 @@ function resolveThemableArray(splitStyleArray) {
|
|
|
214
214
|
!(themeSlot in theme) &&
|
|
215
215
|
typeof DEBUG !== 'undefined' &&
|
|
216
216
|
DEBUG) {
|
|
217
|
+
// eslint-disable-next-line no-console
|
|
217
218
|
console.warn("Theming value not provided for \"".concat(themeSlot, "\". Falling back to \"").concat(defaultValue, "\"."));
|
|
218
219
|
}
|
|
219
220
|
return themedValue || defaultValue;
|
package/lib-es6/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 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.
|
|
3
|
+
"version": "2.0.80",
|
|
4
4
|
"description": "Loads themed styles.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -13,9 +13,8 @@
|
|
|
13
13
|
"typings": "lib/index.d.ts",
|
|
14
14
|
"keywords": [],
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@rushstack/
|
|
17
|
-
"local-web-rig": "1.0.0"
|
|
18
|
-
"@rushstack/heft": "0.61.0"
|
|
16
|
+
"@rushstack/heft": "0.61.2",
|
|
17
|
+
"local-web-rig": "1.0.0"
|
|
19
18
|
},
|
|
20
19
|
"scripts": {
|
|
21
20
|
"build": "heft build --clean",
|