simplestyle-js 3.1.1 → 3.1.4-beta.0

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.
Files changed (86) hide show
  1. package/{commonjs/createStyles.d.ts → createStyles.d.ts} +0 -0
  2. package/createStyles.js +170 -0
  3. package/createStyles.js.map +7 -0
  4. package/{commonjs/generateClassName.d.ts → generateClassName.d.ts} +0 -0
  5. package/generateClassName.js +47 -0
  6. package/generateClassName.js.map +7 -0
  7. package/index.cjs.js +255 -0
  8. package/{commonjs/index.d.ts → index.d.ts} +0 -0
  9. package/index.js +16 -0
  10. package/index.js.map +7 -0
  11. package/{commonjs/numToAlpha.d.ts → numToAlpha.d.ts} +0 -0
  12. package/numToAlpha.js +8 -0
  13. package/numToAlpha.js.map +7 -0
  14. package/package.json +23 -25
  15. package/{commonjs/plugins.d.ts → plugins.d.ts} +0 -0
  16. package/plugins.js +12 -0
  17. package/plugins.js.map +7 -0
  18. package/react/index.cjs.js +268 -0
  19. package/{commonjs/react → react}/index.d.ts +0 -0
  20. package/react/index.js +2 -0
  21. package/react/index.js.map +7 -0
  22. package/react/package.json +6 -0
  23. package/{commonjs/react → react}/useCreateStyles.d.ts +0 -0
  24. package/react/useCreateStyles.js +34 -0
  25. package/react/useCreateStyles.js.map +7 -0
  26. package/{commonjs/types.d.ts → types.d.ts} +0 -0
  27. package/types.js +1 -0
  28. package/types.js.map +7 -0
  29. package/{commonjs/util → util}/deepEqual.d.ts +0 -0
  30. package/util/deepEqual.js +22 -0
  31. package/util/deepEqual.js.map +7 -0
  32. package/util/index.cjs.js +45 -0
  33. package/{commonjs/util → util}/index.d.ts +0 -0
  34. package/util/index.js +2 -0
  35. package/util/index.js.map +7 -0
  36. package/util/package.json +6 -0
  37. package/commonjs/createStyles.js +0 -188
  38. package/commonjs/createStyles.js.map +0 -1
  39. package/commonjs/generateClassName.js +0 -52
  40. package/commonjs/generateClassName.js.map +0 -1
  41. package/commonjs/index.js +0 -19
  42. package/commonjs/index.js.map +0 -1
  43. package/commonjs/numToAlpha.js +0 -8
  44. package/commonjs/numToAlpha.js.map +0 -1
  45. package/commonjs/plugins.js +0 -13
  46. package/commonjs/plugins.js.map +0 -1
  47. package/commonjs/react/index.js +0 -14
  48. package/commonjs/react/index.js.map +0 -1
  49. package/commonjs/react/useCreateStyles.js +0 -52
  50. package/commonjs/react/useCreateStyles.js.map +0 -1
  51. package/commonjs/types.js +0 -3
  52. package/commonjs/types.js.map +0 -1
  53. package/commonjs/util/deepEqual.js +0 -26
  54. package/commonjs/util/deepEqual.js.map +0 -1
  55. package/commonjs/util/index.js +0 -14
  56. package/commonjs/util/index.js.map +0 -1
  57. package/esm/createStyles.d.ts +0 -36
  58. package/esm/createStyles.js +0 -179
  59. package/esm/createStyles.js.map +0 -1
  60. package/esm/generateClassName.d.ts +0 -3
  61. package/esm/generateClassName.js +0 -43
  62. package/esm/generateClassName.js.map +0 -1
  63. package/esm/index.d.ts +0 -4
  64. package/esm/index.js +0 -4
  65. package/esm/index.js.map +0 -1
  66. package/esm/numToAlpha.d.ts +0 -1
  67. package/esm/numToAlpha.js +0 -5
  68. package/esm/numToAlpha.js.map +0 -1
  69. package/esm/plugins.d.ts +0 -3
  70. package/esm/plugins.js +0 -8
  71. package/esm/plugins.js.map +0 -1
  72. package/esm/react/index.d.ts +0 -1
  73. package/esm/react/index.js +0 -2
  74. package/esm/react/index.js.map +0 -1
  75. package/esm/react/useCreateStyles.d.ts +0 -5
  76. package/esm/react/useCreateStyles.js +0 -45
  77. package/esm/react/useCreateStyles.js.map +0 -1
  78. package/esm/types.d.ts +0 -7
  79. package/esm/types.js +0 -2
  80. package/esm/types.js.map +0 -1
  81. package/esm/util/deepEqual.d.ts +0 -1
  82. package/esm/util/deepEqual.js +0 -22
  83. package/esm/util/deepEqual.js.map +0 -1
  84. package/esm/util/index.d.ts +0 -1
  85. package/esm/util/index.js +0 -2
  86. package/esm/util/index.js.map +0 -1
@@ -0,0 +1,170 @@
1
+ import merge from "deepmerge";
2
+ import { generateClassName } from "./generateClassName";
3
+ import { getPosthooks } from "./plugins";
4
+ function isNestedSelector(r) {
5
+ return /&/g.test(r);
6
+ }
7
+ function isMedia(r) {
8
+ return r.toLowerCase().startsWith("@media");
9
+ }
10
+ function formatCSSRuleName(rule) {
11
+ return rule.replace(/([A-Z])/g, (p1) => `-${p1.toLowerCase()}`);
12
+ }
13
+ function formatCSSRules(cssRules) {
14
+ return Object.entries(cssRules).reduce((prev, [cssProp, cssVal]) => `${prev}${formatCSSRuleName(cssProp)}:${cssVal};`, "");
15
+ }
16
+ function execCreateStyles(rules, options, parentSelector, noGenerateClassName = false) {
17
+ const out = {};
18
+ let sheetBuffer = "";
19
+ let mediaQueriesBuffer = "";
20
+ const styleEntries = Object.entries(rules);
21
+ let ruleWriteOpen = false;
22
+ const guardCloseRuleWrite = () => {
23
+ if (ruleWriteOpen)
24
+ sheetBuffer += "}";
25
+ ruleWriteOpen = false;
26
+ };
27
+ for (const [classNameOrCSSRule, classNameRules] of styleEntries) {
28
+ if (isMedia(classNameOrCSSRule)) {
29
+ if (typeof classNameRules !== "object")
30
+ throw new Error("Unable to map @media query because rules / props are an invalid type");
31
+ guardCloseRuleWrite();
32
+ mediaQueriesBuffer += `${classNameOrCSSRule}{`;
33
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(classNameRules, options, parentSelector);
34
+ mediaQueriesBuffer += regularOutput;
35
+ mediaQueriesBuffer += "}";
36
+ mediaQueriesBuffer += mediaQueriesOutput;
37
+ } else if (isNestedSelector(classNameOrCSSRule)) {
38
+ if (!parentSelector)
39
+ throw new Error("Unable to generate nested rule because parentSelector is missing");
40
+ guardCloseRuleWrite();
41
+ const replaced = classNameOrCSSRule.replace(/&/g, parentSelector);
42
+ for (const selector of replaced.split(/,\s*/)) {
43
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(classNameRules, options, selector);
44
+ sheetBuffer += regularOutput;
45
+ mediaQueriesBuffer += mediaQueriesOutput;
46
+ }
47
+ } else if (!parentSelector && typeof classNameRules === "object") {
48
+ guardCloseRuleWrite();
49
+ const generated = noGenerateClassName ? classNameOrCSSRule : generateClassName(classNameOrCSSRule);
50
+ out[classNameOrCSSRule] = generated;
51
+ const generatedSelector = `${noGenerateClassName ? "" : "."}${generated}`;
52
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(classNameRules, options, generatedSelector);
53
+ sheetBuffer += regularOutput;
54
+ mediaQueriesBuffer += mediaQueriesOutput;
55
+ } else {
56
+ if (!parentSelector)
57
+ throw new Error("Unable to write css props because parent selector is null");
58
+ if (!ruleWriteOpen) {
59
+ sheetBuffer += `${parentSelector}{${formatCSSRules({ [classNameOrCSSRule]: classNameRules })}`;
60
+ ruleWriteOpen = true;
61
+ } else
62
+ sheetBuffer += formatCSSRules({ [classNameOrCSSRule]: classNameRules });
63
+ }
64
+ }
65
+ guardCloseRuleWrite();
66
+ return {
67
+ classes: out,
68
+ sheetBuffer,
69
+ mediaQueriesBuffer
70
+ };
71
+ }
72
+ function replaceBackReferences(out, sheetContents) {
73
+ let outputSheetContents = sheetContents;
74
+ const toReplace = [];
75
+ const toReplaceRegex = /\$\w([a-zA-Z0-9_-]+)?/gm;
76
+ let matches = toReplaceRegex.exec(outputSheetContents);
77
+ while (matches) {
78
+ toReplace.push(matches[0].valueOf());
79
+ matches = toReplaceRegex.exec(outputSheetContents);
80
+ }
81
+ for (const r of toReplace) {
82
+ outputSheetContents = outputSheetContents.replace(r, `.${out[r.substring(1)]}`);
83
+ }
84
+ return getPosthooks().reduce((prev, hook) => hook(prev), outputSheetContents);
85
+ }
86
+ function createSheet(sheetContents) {
87
+ if (typeof document !== "undefined" && document.head && document.head.appendChild && typeof document.createElement === "function") {
88
+ const styleTag = document.createElement("style");
89
+ styleTag.innerHTML = sheetContents;
90
+ return styleTag;
91
+ }
92
+ return null;
93
+ }
94
+ function flushSheetContents(sheetContents, options) {
95
+ var _a, _b;
96
+ const styleTag = createSheet(sheetContents);
97
+ if (styleTag) {
98
+ if ((options == null ? void 0 : options.insertAfter) && (options == null ? void 0 : options.insertBefore)) {
99
+ throw new Error("Both insertAfter and insertBefore were provided. Please choose only one.");
100
+ }
101
+ if ((_a = options == null ? void 0 : options.insertAfter) == null ? void 0 : _a.after)
102
+ options.insertAfter.after(styleTag);
103
+ else if ((_b = options == null ? void 0 : options.insertBefore) == null ? void 0 : _b.before)
104
+ options.insertBefore.before(styleTag);
105
+ else
106
+ document.head.appendChild(styleTag);
107
+ }
108
+ return styleTag;
109
+ }
110
+ function coerceCreateStylesOptions(options) {
111
+ return {
112
+ flush: options && typeof options.flush === "boolean" ? options.flush : true
113
+ };
114
+ }
115
+ function rawStyles(rules, options) {
116
+ const coerced = coerceCreateStylesOptions(options);
117
+ const { sheetBuffer: sheetContents, mediaQueriesBuffer: mediaQueriesContents } = execCreateStyles(rules, coerced, null, true);
118
+ const mergedContents = `${sheetContents}${mediaQueriesContents}`;
119
+ if (coerced.flush)
120
+ flushSheetContents(mergedContents, options);
121
+ return mergedContents;
122
+ }
123
+ function keyframes(frames, options) {
124
+ const coerced = coerceCreateStylesOptions(options);
125
+ const keyframeName = generateClassName("keyframes_");
126
+ const { sheetBuffer: keyframesContents } = execCreateStyles(frames, coerced, null, true);
127
+ const sheetContents = `@keyframes ${keyframeName}{${keyframesContents}}`;
128
+ if (coerced.flush)
129
+ flushSheetContents(sheetContents);
130
+ return [keyframeName, sheetContents];
131
+ }
132
+ function createStyles(rules, options) {
133
+ const coerced = coerceCreateStylesOptions(options);
134
+ const {
135
+ classes: out,
136
+ sheetBuffer: sheetContents,
137
+ mediaQueriesBuffer: mediaQueriesContents
138
+ } = execCreateStyles(rules, coerced, null);
139
+ const mergedContents = `${sheetContents}${mediaQueriesContents}`;
140
+ const replacedSheetContents = replaceBackReferences(out, mergedContents);
141
+ let sheet = null;
142
+ const updateSheet = (updatedRules) => {
143
+ if (((options == null ? void 0 : options.flush) && sheet || !(options == null ? void 0 : options.flush)) && updatedRules) {
144
+ const {
145
+ classes: updatedOut,
146
+ sheetBuffer: updatedSheetContents,
147
+ mediaQueriesBuffer: updatedMediaQueriesContents
148
+ } = execCreateStyles(merge(rules, updatedRules), { flush: false }, null);
149
+ const updatedMergedContents = `${updatedSheetContents}${updatedMediaQueriesContents}`;
150
+ const updatedReplacedSheetContents = replaceBackReferences(out, updatedMergedContents);
151
+ if (sheet)
152
+ sheet.innerHTML = updatedReplacedSheetContents;
153
+ return { classes: updatedOut, stylesheet: updatedSheetContents };
154
+ }
155
+ return null;
156
+ };
157
+ if (coerced.flush)
158
+ sheet = flushSheetContents(replacedSheetContents, options);
159
+ return {
160
+ classes: out,
161
+ stylesheet: replacedSheetContents,
162
+ updateSheet
163
+ };
164
+ }
165
+ export {
166
+ createStyles as default,
167
+ keyframes,
168
+ rawStyles
169
+ };
170
+ //# sourceMappingURL=createStyles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/createStyles.ts"],
4
+ "sourcesContent": ["import { Properties } from 'csstype';\nimport merge from 'deepmerge';\n\nimport { generateClassName } from './generateClassName';\nimport { getPosthooks } from './plugins';\nimport { SimpleStyleRules } from './types';\n\nexport type CreateStylesOptions = Partial<{\n /**\n * If true, automatically renders generated styles\n * to the DOM in an injected <style /> tag\n */\n flush: boolean;\n\n /**\n * If set, along with flush: true,\n * will render the injected <style /> after this element\n */\n insertAfter?: HTMLElement;\n /**\n * If set, along with flush: true,\n * will render the injects <style /> before this element\n */\n insertBefore?: HTMLElement;\n}>;\n\nfunction isNestedSelector(r: string): boolean {\n return /&/g.test(r);\n}\n\nfunction isMedia(r: string): boolean {\n return r.toLowerCase().startsWith('@media');\n}\n\nfunction formatCSSRuleName(rule: string): string {\n return rule.replace(/([A-Z])/g, p1 => `-${p1.toLowerCase()}`);\n}\n\nfunction formatCSSRules(cssRules: Properties): string {\n return Object.entries(cssRules).reduce(\n (prev, [cssProp, cssVal]) => `${prev}${formatCSSRuleName(cssProp)}:${cssVal};`,\n '',\n );\n}\n\nfunction execCreateStyles<T extends SimpleStyleRules, K extends keyof T, O extends { [classKey in K]: string }>(\n rules: T,\n options: CreateStylesOptions,\n parentSelector: string | null,\n noGenerateClassName: boolean = false,\n): { classes: O; sheetBuffer: string; mediaQueriesBuffer: string } {\n const out = {} as O;\n let sheetBuffer = '';\n let mediaQueriesBuffer = '';\n const styleEntries = Object.entries(rules);\n let ruleWriteOpen = false;\n const guardCloseRuleWrite = () => {\n if (ruleWriteOpen) sheetBuffer += '}';\n ruleWriteOpen = false;\n };\n for (const [classNameOrCSSRule, classNameRules] of styleEntries) {\n // if the classNameRules is a string, we are dealing with a display: none; type rule\n if (isMedia(classNameOrCSSRule)) {\n if (typeof classNameRules !== 'object')\n throw new Error('Unable to map @media query because rules / props are an invalid type');\n guardCloseRuleWrite();\n mediaQueriesBuffer += `${classNameOrCSSRule}{`;\n const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(\n classNameRules as T,\n options,\n parentSelector,\n );\n mediaQueriesBuffer += regularOutput;\n mediaQueriesBuffer += '}';\n mediaQueriesBuffer += mediaQueriesOutput;\n } else if (isNestedSelector(classNameOrCSSRule)) {\n if (!parentSelector) throw new Error('Unable to generate nested rule because parentSelector is missing');\n guardCloseRuleWrite();\n // format of { '& > span': { display: 'none' } } (or further nesting)\n const replaced = classNameOrCSSRule.replace(/&/g, parentSelector);\n for (const selector of replaced.split(/,\\s*/)) {\n const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(\n classNameRules as T,\n options,\n selector,\n );\n sheetBuffer += regularOutput;\n mediaQueriesBuffer += mediaQueriesOutput;\n }\n } else if (!parentSelector && typeof classNameRules === 'object') {\n guardCloseRuleWrite();\n const generated = noGenerateClassName ? classNameOrCSSRule : generateClassName(classNameOrCSSRule);\n (out as any)[classNameOrCSSRule] = generated;\n const generatedSelector = `${noGenerateClassName ? '' : '.'}${generated}`;\n const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(\n classNameRules as T,\n options,\n generatedSelector,\n );\n sheetBuffer += regularOutput;\n mediaQueriesBuffer += mediaQueriesOutput;\n } else {\n if (!parentSelector) throw new Error('Unable to write css props because parent selector is null');\n if (!ruleWriteOpen) {\n sheetBuffer += `${parentSelector}{${formatCSSRules({ [classNameOrCSSRule]: classNameRules })}`;\n ruleWriteOpen = true;\n } else sheetBuffer += formatCSSRules({ [classNameOrCSSRule]: classNameRules });\n }\n }\n guardCloseRuleWrite();\n return {\n classes: out,\n sheetBuffer,\n mediaQueriesBuffer,\n };\n}\n\nfunction replaceBackReferences<O extends { [key: string]: string }>(out: O, sheetContents: string): string {\n let outputSheetContents = sheetContents;\n const toReplace: string[] = [];\n const toReplaceRegex = /\\$\\w([a-zA-Z0-9_-]+)?/gm;\n let matches = toReplaceRegex.exec(outputSheetContents);\n while (matches) {\n toReplace.push(matches[0].valueOf());\n matches = toReplaceRegex.exec(outputSheetContents);\n }\n for (const r of toReplace) {\n outputSheetContents = outputSheetContents.replace(r, `.${out[r.substring(1)]}`);\n }\n return getPosthooks().reduce((prev, hook) => hook(prev), outputSheetContents);\n}\n\nfunction createSheet(sheetContents: string) {\n if (\n typeof document !== 'undefined' &&\n document.head &&\n document.head.appendChild &&\n typeof document.createElement === 'function'\n ) {\n const styleTag = document.createElement('style');\n styleTag.innerHTML = sheetContents;\n return styleTag;\n }\n return null;\n}\n\nfunction flushSheetContents(sheetContents: string, options?: CreateStylesOptions) {\n // In case we're in come weird test environment that doesn't support JSDom\n const styleTag = createSheet(sheetContents);\n if (styleTag) {\n if (options?.insertAfter && options?.insertBefore) {\n throw new Error('Both insertAfter and insertBefore were provided. Please choose only one.');\n }\n if (options?.insertAfter?.after) options.insertAfter.after(styleTag as Node);\n else if (options?.insertBefore?.before) options.insertBefore.before(styleTag as Node);\n else document.head.appendChild(styleTag);\n }\n return styleTag;\n}\n\nfunction coerceCreateStylesOptions(options?: CreateStylesOptions): CreateStylesOptions {\n return {\n flush: options && typeof options.flush === 'boolean' ? options.flush : true,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function rawStyles<T extends SimpleStyleRules, K extends keyof T, O extends { [key in K]: string }>(\n rules: T,\n options?: Partial<CreateStylesOptions>,\n) {\n const coerced = coerceCreateStylesOptions(options);\n const { sheetBuffer: sheetContents, mediaQueriesBuffer: mediaQueriesContents } = execCreateStyles(\n rules,\n coerced,\n null,\n true,\n );\n\n const mergedContents = `${sheetContents}${mediaQueriesContents}`;\n\n if (coerced.flush) flushSheetContents(mergedContents, options);\n return mergedContents;\n}\n\nexport function keyframes<T extends { [increment: string]: Properties }>(\n frames: T,\n options?: CreateStylesOptions,\n): [string, string] {\n const coerced = coerceCreateStylesOptions(options);\n const keyframeName = generateClassName('keyframes_');\n const { sheetBuffer: keyframesContents } = execCreateStyles(frames, coerced, null, true);\n const sheetContents = `@keyframes ${keyframeName}{${keyframesContents}}`;\n if (coerced.flush) flushSheetContents(sheetContents);\n return [keyframeName, sheetContents];\n}\n\nexport default function createStyles<\n T extends SimpleStyleRules,\n K extends keyof T,\n O extends { [classKey in K]: string },\n>(rules: T, options?: Partial<CreateStylesOptions>) {\n const coerced = coerceCreateStylesOptions(options);\n const {\n classes: out,\n sheetBuffer: sheetContents,\n mediaQueriesBuffer: mediaQueriesContents,\n } = execCreateStyles(rules, coerced, null);\n\n const mergedContents = `${sheetContents}${mediaQueriesContents}`;\n\n const replacedSheetContents = replaceBackReferences(out, mergedContents);\n\n let sheet: ReturnType<typeof flushSheetContents> = null;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const updateSheet = <T2 extends SimpleStyleRules, K2 extends keyof T2, O2 extends { [classKey in K2]: string }>(\n updatedRules: Partial<T2>,\n ) => {\n if (((options?.flush && sheet) || !options?.flush) && updatedRules) {\n // We prefer the first set, and then we shallow merge\n const {\n classes: updatedOut,\n sheetBuffer: updatedSheetContents,\n mediaQueriesBuffer: updatedMediaQueriesContents,\n } = execCreateStyles(merge(rules, updatedRules), { flush: false }, null);\n\n const updatedMergedContents = `${updatedSheetContents}${updatedMediaQueriesContents}`;\n\n const updatedReplacedSheetContents = replaceBackReferences(out, updatedMergedContents);\n if (sheet) sheet.innerHTML = updatedReplacedSheetContents;\n return { classes: updatedOut, stylesheet: updatedSheetContents } as {\n classes: typeof updatedOut;\n stylesheet: string;\n };\n }\n return null;\n };\n\n if (coerced.flush) sheet = flushSheetContents(replacedSheetContents, options);\n // Need this TS cast to get solid code assist from the consumption-side\n return {\n classes: out as unknown,\n stylesheet: replacedSheetContents,\n updateSheet,\n } as {\n classes: O;\n stylesheet: string;\n updateSheet: typeof updateSheet;\n };\n}\n\nexport type CreateStylesArgs = Parameters<typeof createStyles>;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,47 @@
1
+ import numToAlpha from "./numToAlpha";
2
+ let inc = Date.now();
3
+ function setSeed(seed) {
4
+ if (seed === null) {
5
+ inc = Date.now();
6
+ return;
7
+ }
8
+ if (typeof seed !== "number")
9
+ throw Error("Unable to setSeed as provided seed was not a valid number");
10
+ if (seed === Number.MAX_SAFE_INTEGER)
11
+ throw Error("Unable to setSeed because the seed was already the maximum safe JavaScript number allowed");
12
+ if (seed === Number.POSITIVE_INFINITY || seed === Number.NEGATIVE_INFINITY)
13
+ throw new Error("Unable to setSeed. Positive or negative infinity is not allowed");
14
+ if (seed < 0)
15
+ throw new Error("Unable to setSeed. Seed must be a number >= 0");
16
+ inc = seed;
17
+ }
18
+ const numPairsRegex = /(\d{1,2})/g;
19
+ function getUniqueSuffix() {
20
+ const numPairs = [];
21
+ const incStr = inc.toString();
22
+ let result = numPairsRegex.exec(incStr);
23
+ while (result) {
24
+ numPairs.push(result[0]);
25
+ result = numPairsRegex.exec(incStr);
26
+ }
27
+ let out = "_";
28
+ numPairs.forEach((pair) => {
29
+ const val = +pair;
30
+ if (val > 25) {
31
+ const [first, second] = pair.split("");
32
+ out += `${numToAlpha(+first)}${numToAlpha(+second)}`;
33
+ } else
34
+ out += numToAlpha(val);
35
+ });
36
+ inc += 1;
37
+ return out;
38
+ }
39
+ function generateClassName(c) {
40
+ return `${c}${getUniqueSuffix()}`;
41
+ }
42
+ export {
43
+ generateClassName,
44
+ getUniqueSuffix,
45
+ setSeed
46
+ };
47
+ //# sourceMappingURL=generateClassName.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/generateClassName.ts"],
4
+ "sourcesContent": ["import numToAlpha from './numToAlpha';\n\nlet inc = Date.now();\n\nexport function setSeed(seed: number | null): void {\n if (seed === null) {\n inc = Date.now();\n return;\n }\n if (typeof seed !== 'number') throw Error('Unable to setSeed as provided seed was not a valid number');\n if (seed === Number.MAX_SAFE_INTEGER)\n throw Error('Unable to setSeed because the seed was already the maximum safe JavaScript number allowed');\n if (seed === Number.POSITIVE_INFINITY || seed === Number.NEGATIVE_INFINITY)\n throw new Error('Unable to setSeed. Positive or negative infinity is not allowed');\n if (seed < 0) throw new Error('Unable to setSeed. Seed must be a number >= 0');\n inc = seed;\n}\n\nconst numPairsRegex = /(\\d{1,2})/g;\n\nexport function getUniqueSuffix(): string {\n const numPairs: string[] = [];\n const incStr = inc.toString();\n let result = numPairsRegex.exec(incStr);\n while (result) {\n numPairs.push(result[0]);\n result = numPairsRegex.exec(incStr);\n }\n let out = '_';\n numPairs.forEach(pair => {\n const val = +pair;\n if (val > 25) {\n const [first, second] = pair.split('');\n out += `${numToAlpha(+first)}${numToAlpha(+second)}`;\n } else out += numToAlpha(val);\n });\n inc += 1;\n return out;\n}\n\nexport function generateClassName(c: string): string {\n return `${c}${getUniqueSuffix()}`;\n}\n"],
5
+ "mappings": "AAAA;AAEA,IAAI,MAAM,KAAK,IAAI;AAEZ,iBAAiB,MAA2B;AACjD,MAAI,SAAS,MAAM;AACjB,UAAM,KAAK,IAAI;AACf;AAAA,EACF;AACA,MAAI,OAAO,SAAS;AAAU,UAAM,MAAM,2DAA2D;AACrG,MAAI,SAAS,OAAO;AAClB,UAAM,MAAM,2FAA2F;AACzG,MAAI,SAAS,OAAO,qBAAqB,SAAS,OAAO;AACvD,UAAM,IAAI,MAAM,iEAAiE;AACnF,MAAI,OAAO;AAAG,UAAM,IAAI,MAAM,+CAA+C;AAC7E,QAAM;AACR;AAEA,MAAM,gBAAgB;AAEf,2BAAmC;AACxC,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAS,IAAI,SAAS;AAC5B,MAAI,SAAS,cAAc,KAAK,MAAM;AACtC,SAAO,QAAQ;AACb,aAAS,KAAK,OAAO,EAAE;AACvB,aAAS,cAAc,KAAK,MAAM;AAAA,EACpC;AACA,MAAI,MAAM;AACV,WAAS,QAAQ,UAAQ;AACvB,UAAM,MAAM,CAAC;AACb,QAAI,MAAM,IAAI;AACZ,YAAM,CAAC,OAAO,UAAU,KAAK,MAAM,EAAE;AACrC,aAAO,GAAG,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM;AAAA,IACnD;AAAO,aAAO,WAAW,GAAG;AAAA,EAC9B,CAAC;AACD,SAAO;AACP,SAAO;AACT;AAEO,2BAA2B,GAAmB;AACnD,SAAO,GAAG,IAAI,gBAAgB;AAChC;",
6
+ "names": []
7
+ }
package/index.cjs.js ADDED
@@ -0,0 +1,255 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/index.ts
23
+ var src_exports = {};
24
+ __export(src_exports, {
25
+ createStyles: () => createStyles,
26
+ keyframes: () => keyframes,
27
+ rawStyles: () => rawStyles,
28
+ registerPosthook: () => registerPosthook,
29
+ setSeed: () => setSeed
30
+ });
31
+ module.exports = __toCommonJS(src_exports);
32
+
33
+ // src/createStyles.ts
34
+ var import_deepmerge = __toESM(require("deepmerge"));
35
+
36
+ // src/numToAlpha.ts
37
+ var alphas = "abcdefghijklmnopqrstuvwxyz".split("");
38
+ function numToAlpha(num) {
39
+ return alphas[num];
40
+ }
41
+
42
+ // src/generateClassName.ts
43
+ var inc = Date.now();
44
+ function setSeed(seed) {
45
+ if (seed === null) {
46
+ inc = Date.now();
47
+ return;
48
+ }
49
+ if (typeof seed !== "number")
50
+ throw Error("Unable to setSeed as provided seed was not a valid number");
51
+ if (seed === Number.MAX_SAFE_INTEGER)
52
+ throw Error("Unable to setSeed because the seed was already the maximum safe JavaScript number allowed");
53
+ if (seed === Number.POSITIVE_INFINITY || seed === Number.NEGATIVE_INFINITY)
54
+ throw new Error("Unable to setSeed. Positive or negative infinity is not allowed");
55
+ if (seed < 0)
56
+ throw new Error("Unable to setSeed. Seed must be a number >= 0");
57
+ inc = seed;
58
+ }
59
+ var numPairsRegex = /(\d{1,2})/g;
60
+ function getUniqueSuffix() {
61
+ const numPairs = [];
62
+ const incStr = inc.toString();
63
+ let result = numPairsRegex.exec(incStr);
64
+ while (result) {
65
+ numPairs.push(result[0]);
66
+ result = numPairsRegex.exec(incStr);
67
+ }
68
+ let out = "_";
69
+ numPairs.forEach((pair) => {
70
+ const val = +pair;
71
+ if (val > 25) {
72
+ const [first, second] = pair.split("");
73
+ out += `${numToAlpha(+first)}${numToAlpha(+second)}`;
74
+ } else
75
+ out += numToAlpha(val);
76
+ });
77
+ inc += 1;
78
+ return out;
79
+ }
80
+ function generateClassName(c) {
81
+ return `${c}${getUniqueSuffix()}`;
82
+ }
83
+
84
+ // src/plugins.ts
85
+ var posthooks = [];
86
+ function getPosthooks() {
87
+ return posthooks;
88
+ }
89
+ function registerPosthook(posthook) {
90
+ posthooks.push(posthook);
91
+ }
92
+
93
+ // src/createStyles.ts
94
+ function isNestedSelector(r) {
95
+ return /&/g.test(r);
96
+ }
97
+ function isMedia(r) {
98
+ return r.toLowerCase().startsWith("@media");
99
+ }
100
+ function formatCSSRuleName(rule) {
101
+ return rule.replace(/([A-Z])/g, (p1) => `-${p1.toLowerCase()}`);
102
+ }
103
+ function formatCSSRules(cssRules) {
104
+ return Object.entries(cssRules).reduce((prev, [cssProp, cssVal]) => `${prev}${formatCSSRuleName(cssProp)}:${cssVal};`, "");
105
+ }
106
+ function execCreateStyles(rules, options, parentSelector, noGenerateClassName = false) {
107
+ const out = {};
108
+ let sheetBuffer = "";
109
+ let mediaQueriesBuffer = "";
110
+ const styleEntries = Object.entries(rules);
111
+ let ruleWriteOpen = false;
112
+ const guardCloseRuleWrite = () => {
113
+ if (ruleWriteOpen)
114
+ sheetBuffer += "}";
115
+ ruleWriteOpen = false;
116
+ };
117
+ for (const [classNameOrCSSRule, classNameRules] of styleEntries) {
118
+ if (isMedia(classNameOrCSSRule)) {
119
+ if (typeof classNameRules !== "object")
120
+ throw new Error("Unable to map @media query because rules / props are an invalid type");
121
+ guardCloseRuleWrite();
122
+ mediaQueriesBuffer += `${classNameOrCSSRule}{`;
123
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(classNameRules, options, parentSelector);
124
+ mediaQueriesBuffer += regularOutput;
125
+ mediaQueriesBuffer += "}";
126
+ mediaQueriesBuffer += mediaQueriesOutput;
127
+ } else if (isNestedSelector(classNameOrCSSRule)) {
128
+ if (!parentSelector)
129
+ throw new Error("Unable to generate nested rule because parentSelector is missing");
130
+ guardCloseRuleWrite();
131
+ const replaced = classNameOrCSSRule.replace(/&/g, parentSelector);
132
+ for (const selector of replaced.split(/,\s*/)) {
133
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(classNameRules, options, selector);
134
+ sheetBuffer += regularOutput;
135
+ mediaQueriesBuffer += mediaQueriesOutput;
136
+ }
137
+ } else if (!parentSelector && typeof classNameRules === "object") {
138
+ guardCloseRuleWrite();
139
+ const generated = noGenerateClassName ? classNameOrCSSRule : generateClassName(classNameOrCSSRule);
140
+ out[classNameOrCSSRule] = generated;
141
+ const generatedSelector = `${noGenerateClassName ? "" : "."}${generated}`;
142
+ const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(classNameRules, options, generatedSelector);
143
+ sheetBuffer += regularOutput;
144
+ mediaQueriesBuffer += mediaQueriesOutput;
145
+ } else {
146
+ if (!parentSelector)
147
+ throw new Error("Unable to write css props because parent selector is null");
148
+ if (!ruleWriteOpen) {
149
+ sheetBuffer += `${parentSelector}{${formatCSSRules({ [classNameOrCSSRule]: classNameRules })}`;
150
+ ruleWriteOpen = true;
151
+ } else
152
+ sheetBuffer += formatCSSRules({ [classNameOrCSSRule]: classNameRules });
153
+ }
154
+ }
155
+ guardCloseRuleWrite();
156
+ return {
157
+ classes: out,
158
+ sheetBuffer,
159
+ mediaQueriesBuffer
160
+ };
161
+ }
162
+ function replaceBackReferences(out, sheetContents) {
163
+ let outputSheetContents = sheetContents;
164
+ const toReplace = [];
165
+ const toReplaceRegex = /\$\w([a-zA-Z0-9_-]+)?/gm;
166
+ let matches = toReplaceRegex.exec(outputSheetContents);
167
+ while (matches) {
168
+ toReplace.push(matches[0].valueOf());
169
+ matches = toReplaceRegex.exec(outputSheetContents);
170
+ }
171
+ for (const r of toReplace) {
172
+ outputSheetContents = outputSheetContents.replace(r, `.${out[r.substring(1)]}`);
173
+ }
174
+ return getPosthooks().reduce((prev, hook) => hook(prev), outputSheetContents);
175
+ }
176
+ function createSheet(sheetContents) {
177
+ if (typeof document !== "undefined" && document.head && document.head.appendChild && typeof document.createElement === "function") {
178
+ const styleTag = document.createElement("style");
179
+ styleTag.innerHTML = sheetContents;
180
+ return styleTag;
181
+ }
182
+ return null;
183
+ }
184
+ function flushSheetContents(sheetContents, options) {
185
+ var _a, _b;
186
+ const styleTag = createSheet(sheetContents);
187
+ if (styleTag) {
188
+ if ((options == null ? void 0 : options.insertAfter) && (options == null ? void 0 : options.insertBefore)) {
189
+ throw new Error("Both insertAfter and insertBefore were provided. Please choose only one.");
190
+ }
191
+ if ((_a = options == null ? void 0 : options.insertAfter) == null ? void 0 : _a.after)
192
+ options.insertAfter.after(styleTag);
193
+ else if ((_b = options == null ? void 0 : options.insertBefore) == null ? void 0 : _b.before)
194
+ options.insertBefore.before(styleTag);
195
+ else
196
+ document.head.appendChild(styleTag);
197
+ }
198
+ return styleTag;
199
+ }
200
+ function coerceCreateStylesOptions(options) {
201
+ return {
202
+ flush: options && typeof options.flush === "boolean" ? options.flush : true
203
+ };
204
+ }
205
+ function rawStyles(rules, options) {
206
+ const coerced = coerceCreateStylesOptions(options);
207
+ const { sheetBuffer: sheetContents, mediaQueriesBuffer: mediaQueriesContents } = execCreateStyles(rules, coerced, null, true);
208
+ const mergedContents = `${sheetContents}${mediaQueriesContents}`;
209
+ if (coerced.flush)
210
+ flushSheetContents(mergedContents, options);
211
+ return mergedContents;
212
+ }
213
+ function keyframes(frames, options) {
214
+ const coerced = coerceCreateStylesOptions(options);
215
+ const keyframeName = generateClassName("keyframes_");
216
+ const { sheetBuffer: keyframesContents } = execCreateStyles(frames, coerced, null, true);
217
+ const sheetContents = `@keyframes ${keyframeName}{${keyframesContents}}`;
218
+ if (coerced.flush)
219
+ flushSheetContents(sheetContents);
220
+ return [keyframeName, sheetContents];
221
+ }
222
+ function createStyles(rules, options) {
223
+ const coerced = coerceCreateStylesOptions(options);
224
+ const {
225
+ classes: out,
226
+ sheetBuffer: sheetContents,
227
+ mediaQueriesBuffer: mediaQueriesContents
228
+ } = execCreateStyles(rules, coerced, null);
229
+ const mergedContents = `${sheetContents}${mediaQueriesContents}`;
230
+ const replacedSheetContents = replaceBackReferences(out, mergedContents);
231
+ let sheet = null;
232
+ const updateSheet = (updatedRules) => {
233
+ if (((options == null ? void 0 : options.flush) && sheet || !(options == null ? void 0 : options.flush)) && updatedRules) {
234
+ const {
235
+ classes: updatedOut,
236
+ sheetBuffer: updatedSheetContents,
237
+ mediaQueriesBuffer: updatedMediaQueriesContents
238
+ } = execCreateStyles((0, import_deepmerge.default)(rules, updatedRules), { flush: false }, null);
239
+ const updatedMergedContents = `${updatedSheetContents}${updatedMediaQueriesContents}`;
240
+ const updatedReplacedSheetContents = replaceBackReferences(out, updatedMergedContents);
241
+ if (sheet)
242
+ sheet.innerHTML = updatedReplacedSheetContents;
243
+ return { classes: updatedOut, stylesheet: updatedSheetContents };
244
+ }
245
+ return null;
246
+ };
247
+ if (coerced.flush)
248
+ sheet = flushSheetContents(replacedSheetContents, options);
249
+ return {
250
+ classes: out,
251
+ stylesheet: replacedSheetContents,
252
+ updateSheet
253
+ };
254
+ }
255
+ //# sourceMappingURL=index.js.map
File without changes
package/index.js ADDED
@@ -0,0 +1,16 @@
1
+ import { default as default2, CreateStylesArgs, CreateStylesOptions, keyframes, rawStyles } from "./createStyles";
2
+ import { setSeed } from "./generateClassName";
3
+ import { PosthookPlugin, registerPosthook } from "./plugins";
4
+ import { SimpleStyleRules } from "./types";
5
+ export {
6
+ CreateStylesArgs,
7
+ CreateStylesOptions,
8
+ PosthookPlugin,
9
+ SimpleStyleRules,
10
+ default2 as createStyles,
11
+ keyframes,
12
+ rawStyles,
13
+ registerPosthook,
14
+ setSeed
15
+ };
16
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts", "../../src/createStyles.ts", "../../src/numToAlpha.ts", "../../src/generateClassName.ts", "../../src/plugins.ts"],
4
+ "sourcesContent": ["export { default as createStyles, CreateStylesArgs, CreateStylesOptions, keyframes, rawStyles } from './createStyles';\nexport { setSeed } from './generateClassName';\nexport { PosthookPlugin, registerPosthook } from './plugins';\nexport { SimpleStyleRules } from './types';\n", "import { Properties } from 'csstype';\nimport merge from 'deepmerge';\n\nimport { generateClassName } from './generateClassName';\nimport { getPosthooks } from './plugins';\nimport { SimpleStyleRules } from './types';\n\nexport type CreateStylesOptions = Partial<{\n /**\n * If true, automatically renders generated styles\n * to the DOM in an injected <style /> tag\n */\n flush: boolean;\n\n /**\n * If set, along with flush: true,\n * will render the injected <style /> after this element\n */\n insertAfter?: HTMLElement;\n /**\n * If set, along with flush: true,\n * will render the injects <style /> before this element\n */\n insertBefore?: HTMLElement;\n}>;\n\nfunction isNestedSelector(r: string): boolean {\n return /&/g.test(r);\n}\n\nfunction isMedia(r: string): boolean {\n return r.toLowerCase().startsWith('@media');\n}\n\nfunction formatCSSRuleName(rule: string): string {\n return rule.replace(/([A-Z])/g, p1 => `-${p1.toLowerCase()}`);\n}\n\nfunction formatCSSRules(cssRules: Properties): string {\n return Object.entries(cssRules).reduce(\n (prev, [cssProp, cssVal]) => `${prev}${formatCSSRuleName(cssProp)}:${cssVal};`,\n '',\n );\n}\n\nfunction execCreateStyles<T extends SimpleStyleRules, K extends keyof T, O extends { [classKey in K]: string }>(\n rules: T,\n options: CreateStylesOptions,\n parentSelector: string | null,\n noGenerateClassName: boolean = false,\n): { classes: O; sheetBuffer: string; mediaQueriesBuffer: string } {\n const out = {} as O;\n let sheetBuffer = '';\n let mediaQueriesBuffer = '';\n const styleEntries = Object.entries(rules);\n let ruleWriteOpen = false;\n const guardCloseRuleWrite = () => {\n if (ruleWriteOpen) sheetBuffer += '}';\n ruleWriteOpen = false;\n };\n for (const [classNameOrCSSRule, classNameRules] of styleEntries) {\n // if the classNameRules is a string, we are dealing with a display: none; type rule\n if (isMedia(classNameOrCSSRule)) {\n if (typeof classNameRules !== 'object')\n throw new Error('Unable to map @media query because rules / props are an invalid type');\n guardCloseRuleWrite();\n mediaQueriesBuffer += `${classNameOrCSSRule}{`;\n const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(\n classNameRules as T,\n options,\n parentSelector,\n );\n mediaQueriesBuffer += regularOutput;\n mediaQueriesBuffer += '}';\n mediaQueriesBuffer += mediaQueriesOutput;\n } else if (isNestedSelector(classNameOrCSSRule)) {\n if (!parentSelector) throw new Error('Unable to generate nested rule because parentSelector is missing');\n guardCloseRuleWrite();\n // format of { '& > span': { display: 'none' } } (or further nesting)\n const replaced = classNameOrCSSRule.replace(/&/g, parentSelector);\n for (const selector of replaced.split(/,\\s*/)) {\n const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(\n classNameRules as T,\n options,\n selector,\n );\n sheetBuffer += regularOutput;\n mediaQueriesBuffer += mediaQueriesOutput;\n }\n } else if (!parentSelector && typeof classNameRules === 'object') {\n guardCloseRuleWrite();\n const generated = noGenerateClassName ? classNameOrCSSRule : generateClassName(classNameOrCSSRule);\n (out as any)[classNameOrCSSRule] = generated;\n const generatedSelector = `${noGenerateClassName ? '' : '.'}${generated}`;\n const { mediaQueriesBuffer: mediaQueriesOutput, sheetBuffer: regularOutput } = execCreateStyles(\n classNameRules as T,\n options,\n generatedSelector,\n );\n sheetBuffer += regularOutput;\n mediaQueriesBuffer += mediaQueriesOutput;\n } else {\n if (!parentSelector) throw new Error('Unable to write css props because parent selector is null');\n if (!ruleWriteOpen) {\n sheetBuffer += `${parentSelector}{${formatCSSRules({ [classNameOrCSSRule]: classNameRules })}`;\n ruleWriteOpen = true;\n } else sheetBuffer += formatCSSRules({ [classNameOrCSSRule]: classNameRules });\n }\n }\n guardCloseRuleWrite();\n return {\n classes: out,\n sheetBuffer,\n mediaQueriesBuffer,\n };\n}\n\nfunction replaceBackReferences<O extends { [key: string]: string }>(out: O, sheetContents: string): string {\n let outputSheetContents = sheetContents;\n const toReplace: string[] = [];\n const toReplaceRegex = /\\$\\w([a-zA-Z0-9_-]+)?/gm;\n let matches = toReplaceRegex.exec(outputSheetContents);\n while (matches) {\n toReplace.push(matches[0].valueOf());\n matches = toReplaceRegex.exec(outputSheetContents);\n }\n for (const r of toReplace) {\n outputSheetContents = outputSheetContents.replace(r, `.${out[r.substring(1)]}`);\n }\n return getPosthooks().reduce((prev, hook) => hook(prev), outputSheetContents);\n}\n\nfunction createSheet(sheetContents: string) {\n if (\n typeof document !== 'undefined' &&\n document.head &&\n document.head.appendChild &&\n typeof document.createElement === 'function'\n ) {\n const styleTag = document.createElement('style');\n styleTag.innerHTML = sheetContents;\n return styleTag;\n }\n return null;\n}\n\nfunction flushSheetContents(sheetContents: string, options?: CreateStylesOptions) {\n // In case we're in come weird test environment that doesn't support JSDom\n const styleTag = createSheet(sheetContents);\n if (styleTag) {\n if (options?.insertAfter && options?.insertBefore) {\n throw new Error('Both insertAfter and insertBefore were provided. Please choose only one.');\n }\n if (options?.insertAfter?.after) options.insertAfter.after(styleTag as Node);\n else if (options?.insertBefore?.before) options.insertBefore.before(styleTag as Node);\n else document.head.appendChild(styleTag);\n }\n return styleTag;\n}\n\nfunction coerceCreateStylesOptions(options?: CreateStylesOptions): CreateStylesOptions {\n return {\n flush: options && typeof options.flush === 'boolean' ? options.flush : true,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function rawStyles<T extends SimpleStyleRules, K extends keyof T, O extends { [key in K]: string }>(\n rules: T,\n options?: Partial<CreateStylesOptions>,\n) {\n const coerced = coerceCreateStylesOptions(options);\n const { sheetBuffer: sheetContents, mediaQueriesBuffer: mediaQueriesContents } = execCreateStyles(\n rules,\n coerced,\n null,\n true,\n );\n\n const mergedContents = `${sheetContents}${mediaQueriesContents}`;\n\n if (coerced.flush) flushSheetContents(mergedContents, options);\n return mergedContents;\n}\n\nexport function keyframes<T extends { [increment: string]: Properties }>(\n frames: T,\n options?: CreateStylesOptions,\n): [string, string] {\n const coerced = coerceCreateStylesOptions(options);\n const keyframeName = generateClassName('keyframes_');\n const { sheetBuffer: keyframesContents } = execCreateStyles(frames, coerced, null, true);\n const sheetContents = `@keyframes ${keyframeName}{${keyframesContents}}`;\n if (coerced.flush) flushSheetContents(sheetContents);\n return [keyframeName, sheetContents];\n}\n\nexport default function createStyles<\n T extends SimpleStyleRules,\n K extends keyof T,\n O extends { [classKey in K]: string },\n>(rules: T, options?: Partial<CreateStylesOptions>) {\n const coerced = coerceCreateStylesOptions(options);\n const {\n classes: out,\n sheetBuffer: sheetContents,\n mediaQueriesBuffer: mediaQueriesContents,\n } = execCreateStyles(rules, coerced, null);\n\n const mergedContents = `${sheetContents}${mediaQueriesContents}`;\n\n const replacedSheetContents = replaceBackReferences(out, mergedContents);\n\n let sheet: ReturnType<typeof flushSheetContents> = null;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const updateSheet = <T2 extends SimpleStyleRules, K2 extends keyof T2, O2 extends { [classKey in K2]: string }>(\n updatedRules: Partial<T2>,\n ) => {\n if (((options?.flush && sheet) || !options?.flush) && updatedRules) {\n // We prefer the first set, and then we shallow merge\n const {\n classes: updatedOut,\n sheetBuffer: updatedSheetContents,\n mediaQueriesBuffer: updatedMediaQueriesContents,\n } = execCreateStyles(merge(rules, updatedRules), { flush: false }, null);\n\n const updatedMergedContents = `${updatedSheetContents}${updatedMediaQueriesContents}`;\n\n const updatedReplacedSheetContents = replaceBackReferences(out, updatedMergedContents);\n if (sheet) sheet.innerHTML = updatedReplacedSheetContents;\n return { classes: updatedOut, stylesheet: updatedSheetContents } as {\n classes: typeof updatedOut;\n stylesheet: string;\n };\n }\n return null;\n };\n\n if (coerced.flush) sheet = flushSheetContents(replacedSheetContents, options);\n // Need this TS cast to get solid code assist from the consumption-side\n return {\n classes: out as unknown,\n stylesheet: replacedSheetContents,\n updateSheet,\n } as {\n classes: O;\n stylesheet: string;\n updateSheet: typeof updateSheet;\n };\n}\n\nexport type CreateStylesArgs = Parameters<typeof createStyles>;\n", "const alphas = 'abcdefghijklmnopqrstuvwxyz'.split('');\n\nexport default function numToAlpha(num: number): string {\n return alphas[num];\n}\n", "import numToAlpha from './numToAlpha';\n\nlet inc = Date.now();\n\nexport function setSeed(seed: number | null): void {\n if (seed === null) {\n inc = Date.now();\n return;\n }\n if (typeof seed !== 'number') throw Error('Unable to setSeed as provided seed was not a valid number');\n if (seed === Number.MAX_SAFE_INTEGER)\n throw Error('Unable to setSeed because the seed was already the maximum safe JavaScript number allowed');\n if (seed === Number.POSITIVE_INFINITY || seed === Number.NEGATIVE_INFINITY)\n throw new Error('Unable to setSeed. Positive or negative infinity is not allowed');\n if (seed < 0) throw new Error('Unable to setSeed. Seed must be a number >= 0');\n inc = seed;\n}\n\nconst numPairsRegex = /(\\d{1,2})/g;\n\nexport function getUniqueSuffix(): string {\n const numPairs: string[] = [];\n const incStr = inc.toString();\n let result = numPairsRegex.exec(incStr);\n while (result) {\n numPairs.push(result[0]);\n result = numPairsRegex.exec(incStr);\n }\n let out = '_';\n numPairs.forEach(pair => {\n const val = +pair;\n if (val > 25) {\n const [first, second] = pair.split('');\n out += `${numToAlpha(+first)}${numToAlpha(+second)}`;\n } else out += numToAlpha(val);\n });\n inc += 1;\n return out;\n}\n\nexport function generateClassName(c: string): string {\n return `${c}${getUniqueSuffix()}`;\n}\n", "export type PosthookPlugin = (sheetContents: string) => string;\n\nconst posthooks: PosthookPlugin[] = [];\n\nexport function getPosthooks(): PosthookPlugin[] {\n return posthooks;\n}\n\nexport function registerPosthook(posthook: PosthookPlugin) {\n posthooks.push(posthook);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
File without changes
package/numToAlpha.js ADDED
@@ -0,0 +1,8 @@
1
+ const alphas = "abcdefghijklmnopqrstuvwxyz".split("");
2
+ function numToAlpha(num) {
3
+ return alphas[num];
4
+ }
5
+ export {
6
+ numToAlpha as default
7
+ };
8
+ //# sourceMappingURL=numToAlpha.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/numToAlpha.ts"],
4
+ "sourcesContent": ["const alphas = 'abcdefghijklmnopqrstuvwxyz'.split('');\n\nexport default function numToAlpha(num: number): string {\n return alphas[num];\n}\n"],
5
+ "mappings": "AAAA,MAAM,SAAS,6BAA6B,MAAM,EAAE;AAErC,oBAAoB,KAAqB;AACtD,SAAO,OAAO;AAChB;",
6
+ "names": []
7
+ }