@lipemat/js-boilerplate-shared 0.2.2 → 1.0.1

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/helpers/config.js CHANGED
@@ -1,6 +1,57 @@
1
1
  import { getPackageConfig } from './package-config.js';
2
2
  import { createRequire } from 'node:module';
3
+ import { resolve } from 'path';
3
4
  const requireModule = createRequire(import.meta.url);
5
+ /**
6
+ * Merged a configuration with a matching configuration from the project directory.
7
+ *
8
+ * For instance, if we have a file named config/babel.config.js in our project,
9
+ * we will merge the contents with our config/babel.config.js in favor of whatever
10
+ * is specified with the project's file.
11
+ *
12
+ * If the default export is a function, the existing configuration will be passed
13
+ * as the only argument. Otherwise, standard `exports` are also supported.
14
+ *
15
+ * @example ```ts
16
+ * // standard
17
+ *export default = {
18
+ * externals: {extra: 'Extra'}
19
+ * }
20
+ * // function
21
+ * export default function(config) {
22
+ * return {
23
+ * externals: {...config.externals, extra: 'Extra'}
24
+ * }
25
+ * }
26
+ * ```
27
+ *
28
+ * @param {string} fileName - Filename without extension.
29
+ * @param {Object} mergedConfig - Existing config to merge with.
30
+ *
31
+ * @return {Object}
32
+ */
33
+ export function mergeWithLocalConfig(fileName, mergedConfig = {}) {
34
+ try {
35
+ let localConfig = createRequire(import.meta.url)(resolve(getPackageConfig().packageDirectory, 'config', fileName.replace(/\.js$/, '')));
36
+ if ('default' in localConfig) {
37
+ localConfig = localConfig.default;
38
+ }
39
+ if ('function' === typeof localConfig) {
40
+ mergedConfig = { ...mergedConfig, ...localConfig(mergedConfig) };
41
+ }
42
+ else {
43
+ mergedConfig = { ...mergedConfig, ...localConfig };
44
+ }
45
+ }
46
+ catch (e) {
47
+ if (e instanceof Error) {
48
+ if (!('code' in e) || ('MODULE_NOT_FOUND' !== e.code && 'ERR_MODULE_NOT_FOUND' !== e.code)) {
49
+ console.error(e);
50
+ }
51
+ }
52
+ }
53
+ return mergedConfig;
54
+ }
4
55
  /**
5
56
  * Get a list of installed js-boilerplate extensions.
6
57
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAE1C,MAAM,aAAa,GAAG,aAAa,CAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC;AAGvD;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC5B,MAAM,EAAC,YAAY,EAAE,eAAe,EAAC,GAAG,gBAAgB,EAAE,CAAC;IAE3D,OAAO,CAAE,GAAG,MAAM,CAAC,IAAI,CAAE,YAAY,CAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAE,eAAe,CAAE,CAAE,CAAC,MAAM,CAAE,CAAE,SAAiB,EAAG,EAAE;QAC5G,OAAO,SAAS,CAAC,QAAQ,CAAE,iBAAiB,CAAE;YAC7C,SAAS,KAAK,gCAAgC;YAC9C,SAAS,KAAK,yBAAyB,CAAC;IAC1C,CAAC,CAAE,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAoB,QAAgB,EAAE,aAAgB;IACxF,IAAI,YAAY,GAAM,EAAO,CAAC;IAC9B,KAAM,MAAM,SAAS,IAAI,aAAa,EAAE,EAAG,CAAC;QAC3C,IAAI,CAAC;YACJ,IAAI,eAAe,GAAG,aAAa,CAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAE,CAAC;YACzE,qDAAqD;YACrD,IAAK,SAAS,IAAI,eAAe,EAAG,CAAC;gBACpC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC;YAC3C,CAAC;YACD,IAAK,UAAU,KAAK,OAAO,eAAe,EAAG,CAAC;gBAC7C,YAAY,GAAG,EAAC,GAAG,YAAY,EAAE,GAAG,eAAe,CAAE,EAAC,GAAG,aAAa,EAAE,GAAG,YAAY,EAAC,CAAE,EAAC,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACP,YAAY,GAAG,EAAC,GAAG,YAAY,EAAE,GAAG,eAAe,EAAC,CAAC;YACtD,CAAC;QACF,CAAC;QAAC,OAAQ,CAAC,EAAG,CAAC;YACd,IAAK,CAAC,YAAY,KAAK,EAAG,CAAC;gBAC1B,IAAK,CAAE,CAAE,MAAM,IAAI,CAAC,CAAE,IAAI,kBAAkB,KAAK,CAAC,CAAC,IAAI,EAAG,CAAC;oBAC1D,OAAO,CAAC,KAAK,CAAE,CAAC,CAAE,CAAC;gBACpB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,YAAY,CAAC;AACrB,CAAC;AAGD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAE,QAAgB;IAClD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAE,YAAY,EAAE,EAAE,CAAE,CAAC;IAC9D,IAAK,CAAE,gBAAgB,CAAC,QAAQ,CAAE,KAAK,CAAE,EAAG,CAAC;QAC5C,OAAO,gBAAgB,GAAG,KAAK,CAAC;IACjC,CAAC;IACD,OAAO,gBAAgB,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["config.ts"],"names":[],"mappings":"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"}
package/helpers/config.ts CHANGED
@@ -1,8 +1,58 @@
1
1
  import {getPackageConfig} from './package-config.js';
2
2
  import {createRequire} from 'node:module';
3
+ import {resolve} from 'path';
3
4
 
4
5
  const requireModule = createRequire( import.meta.url );
5
6
 
7
+ /**
8
+ * Merged a configuration with a matching configuration from the project directory.
9
+ *
10
+ * For instance, if we have a file named config/babel.config.js in our project,
11
+ * we will merge the contents with our config/babel.config.js in favor of whatever
12
+ * is specified with the project's file.
13
+ *
14
+ * If the default export is a function, the existing configuration will be passed
15
+ * as the only argument. Otherwise, standard `exports` are also supported.
16
+ *
17
+ * @example ```ts
18
+ * // standard
19
+ *export default = {
20
+ * externals: {extra: 'Extra'}
21
+ * }
22
+ * // function
23
+ * export default function(config) {
24
+ * return {
25
+ * externals: {...config.externals, extra: 'Extra'}
26
+ * }
27
+ * }
28
+ * ```
29
+ *
30
+ * @param {string} fileName - Filename without extension.
31
+ * @param {Object} mergedConfig - Existing config to merge with.
32
+ *
33
+ * @return {Object}
34
+ */
35
+ export function mergeWithLocalConfig<T extends object>( fileName: string, mergedConfig: object = {} ): T {
36
+ try {
37
+ let localConfig = createRequire( import.meta.url )( resolve( getPackageConfig().packageDirectory, 'config', fileName.replace( /\.js$/, '' ) ) );
38
+ if ( 'default' in localConfig ) {
39
+ localConfig = localConfig.default;
40
+ }
41
+
42
+ if ( 'function' === typeof localConfig ) {
43
+ mergedConfig = {...mergedConfig, ...localConfig( mergedConfig )};
44
+ } else {
45
+ mergedConfig = {...mergedConfig, ...localConfig};
46
+ }
47
+ } catch ( e ) {
48
+ if ( e instanceof Error ) {
49
+ if ( ! ( 'code' in e ) || ( 'MODULE_NOT_FOUND' !== e.code && 'ERR_MODULE_NOT_FOUND' !== e.code ) ) {
50
+ console.error( e );
51
+ }
52
+ }
53
+ }
54
+ return mergedConfig as T;
55
+ }
6
56
 
7
57
  /**
8
58
  * Get a list of installed js-boilerplate extensions.
@@ -1,8 +1,7 @@
1
1
  import { getPackageConfig } from './package-config.js';
2
2
  export const SHORT_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
3
3
  export const ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
4
- const classes = {};
5
- let counters = [-1];
4
+ const GLOBAL = '__JS_BOILERPLATE_CSS_CLASSNAMES_STATE__';
6
5
  /**
7
6
  * Check if short CSS classes are enabled.
8
7
  *
@@ -23,7 +22,9 @@ export function usingShortCssClasses() {
23
22
  * @notice Mostly here for unit tests.
24
23
  */
25
24
  export function resetCounters() {
26
- counters = [-1];
25
+ const state = getState();
26
+ state.counters = [-1];
27
+ state.classes = {};
27
28
  }
28
29
  /**
29
30
  * Get the next class in the sequence based on:
@@ -35,6 +36,7 @@ export function resetCounters() {
35
36
  * @return {string}
36
37
  */
37
38
  export function getNextClass() {
39
+ const counters = getState().counters;
38
40
  const last = counters.length - 1;
39
41
  let totalLetters = ALPHABET.length - 1;
40
42
  // The first level uses the SHORT_ALPHABET.
@@ -51,6 +53,19 @@ export function getNextClass() {
51
53
  return 0 === i ? SHORT_ALPHABET[counter] : ALPHABET[counter];
52
54
  }).join('');
53
55
  }
56
+ /**
57
+ * Use a global object to store state between
58
+ * entries in the same execution context.
59
+ *
60
+ * Prevents conflicts when webpack is running multiple entries.
61
+ */
62
+ function getState() {
63
+ const globalObject = globalThis;
64
+ return globalObject[GLOBAL] ||= {
65
+ classes: {},
66
+ counters: [-1],
67
+ };
68
+ }
54
69
  /**
55
70
  * When we run out of characters on the current level:
56
71
  * 1. Increment the parent level.
@@ -63,6 +78,7 @@ export function getNextClass() {
63
78
  *
64
79
  */
65
80
  function incrementParent() {
81
+ const counters = getState().counters;
66
82
  let parent = counters.length - 2;
67
83
  let totalLetters = ALPHABET.length - 1;
68
84
  while (counters[parent] !== undefined) {
@@ -97,6 +113,7 @@ function incrementParent() {
97
113
  * @link https://webpack.js.org/loaders/css-loader/#getlocalident
98
114
  */
99
115
  export const getLocalIdent = ({ resourcePath }, _, localName) => {
116
+ const classes = getState().classes;
100
117
  classes[resourcePath] ||= {};
101
118
  classes[resourcePath][localName] ||= getNextClass();
102
119
  return classes[resourcePath][localName];
@@ -1 +1 @@
1
- {"version":3,"file":"css-classnames.js","sourceRoot":"","sources":["css-classnames.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"css-classnames.js","sourceRoot":"","sources":["css-classnames.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,21 @@ import {getPackageConfig} from './package-config.js';
2
2
  import type {GetLocalIdent} from '../types/css-loader.ts';
3
3
  import type {AtLeast} from '../types/utility.ts';
4
4
 
5
- export const SHORT_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
6
- export const ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
7
-
8
- const classes: {
9
- [ filename: string ]: {
10
- [ className: string ]: string
5
+ type State = {
6
+ classes: {
7
+ [ filename: string ]: {
8
+ [ className: string ]: string
9
+ }
11
10
  }
12
- } = {};
11
+ counters: number[]
12
+ };
13
13
 
14
- let counters = [ -1 ];
14
+ type LocalIdentParams = Parameters<GetLocalIdent>;
15
+
16
+
17
+ export const SHORT_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
18
+ export const ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
19
+ const GLOBAL = '__JS_BOILERPLATE_CSS_CLASSNAMES_STATE__';
15
20
 
16
21
  /**
17
22
  * Check if short CSS classes are enabled.
@@ -34,7 +39,9 @@ export function usingShortCssClasses(): boolean {
34
39
  * @notice Mostly here for unit tests.
35
40
  */
36
41
  export function resetCounters(): void {
37
- counters = [ -1 ];
42
+ const state = getState();
43
+ state.counters = [ -1 ];
44
+ state.classes = {};
38
45
  }
39
46
 
40
47
  /**
@@ -47,6 +54,7 @@ export function resetCounters(): void {
47
54
  * @return {string}
48
55
  */
49
56
  export function getNextClass(): string {
57
+ const counters = getState().counters;
50
58
  const last = counters.length - 1;
51
59
  let totalLetters = ALPHABET.length - 1;
52
60
 
@@ -67,6 +75,22 @@ export function getNextClass(): string {
67
75
  }
68
76
 
69
77
 
78
+ /**
79
+ * Use a global object to store state between
80
+ * entries in the same execution context.
81
+ *
82
+ * Prevents conflicts when webpack is running multiple entries.
83
+ */
84
+ function getState(): State {
85
+ const globalObject = globalThis as typeof globalThis & Record<typeof GLOBAL, State>;
86
+
87
+ return globalObject[ GLOBAL ] ||= {
88
+ classes: {},
89
+ counters: [ -1 ],
90
+ };
91
+ }
92
+
93
+
70
94
  /**
71
95
  * When we run out of characters on the current level:
72
96
  * 1. Increment the parent level.
@@ -79,6 +103,8 @@ export function getNextClass(): string {
79
103
  *
80
104
  */
81
105
  function incrementParent() {
106
+ const counters = getState().counters;
107
+
82
108
  let parent = counters.length - 2;
83
109
  let totalLetters = ALPHABET.length - 1;
84
110
 
@@ -104,8 +130,6 @@ function incrementParent() {
104
130
  counters.push( 0 );
105
131
  }
106
132
 
107
- type LocalIdentParams = Parameters<GetLocalIdent>;
108
-
109
133
  /**
110
134
  * Return a single character unique CSS class name based on WebPack
111
135
  * css-loader's `getLocalIdentName` callback.
@@ -118,6 +142,8 @@ type LocalIdentParams = Parameters<GetLocalIdent>;
118
142
  * @link https://webpack.js.org/loaders/css-loader/#getlocalident
119
143
  */
120
144
  export const getLocalIdent = ( {resourcePath}: AtLeast<LocalIdentParams[0], 'resourcePath'>, _: LocalIdentParams[1], localName: LocalIdentParams[2] ): ReturnType<GetLocalIdent> => {
145
+ const classes = getState().classes;
146
+
121
147
  classes[ resourcePath ] ||= {};
122
148
  classes[ resourcePath ][ localName ] ||= getNextClass();
123
149
  return classes[ resourcePath ][ localName ];
@@ -9,6 +9,8 @@ const defaults = {
9
9
  cssEnums: true,
10
10
  cssTsFiles: true,
11
11
  css_folder: './css/dist/',
12
+ dependencies: {},
13
+ devDependencies: {},
12
14
  jsPath: './js',
13
15
  mainCssFileName: 'front-end',
14
16
  packageDirectory: workingDirectory,
@@ -1 +1 @@
1
- {"version":3,"file":"package-config.js","sourceRoot":"","sources":["package-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAEnD,SAAS,YAAY,CAAK,QAAgB;IACzC,OAAO,IAAI,CAAC,KAAK,CAAE,YAAY,CAAE,QAAQ,EAAE,MAAM,CAAE,CAAO,CAAC;AAC5D,CAAC;AAsDD,MAAM,gBAAgB,GAAG,YAAY,CAAE,OAAO,CAAC,GAAG,EAAE,CAAE,CAAC;AACvD,MAAM,QAAQ,GAA2B;IACxC,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;IAChB,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,MAAM;IACd,eAAe,EAAE,WAAW;IAC5B,gBAAgB,EAAE,gBAAgB;IAClC,SAAS,EAAE,CAAE,MAAM,EAAE,gBAAgB,CAAE;IACvC,QAAQ,EAAE,CAAE,GAAG,CAAE;IACjB,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;IAChB,GAAG,EAAE,kBAAkB;CACvB,CAAC;AAEF,IAAI,aAAa,GAAkB,YAAY,CAAiB,OAAO,CAAE,gBAAgB,EAAE,cAAc,CAAE,CAAE,CAAC;AAC9G,aAAa,GAAG,EAAC,GAAG,QAAQ,EAAE,GAAG,aAAa,EAAC,CAAC;AAChD,aAAa,CAAC,gBAAgB,GAAG,aAAa,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAE,aAAa,CAAC,MAAM,CAAE,CAAC,OAAO,CAAE,KAAK,EAAE,GAAG,CAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAExI,IAAI,CAAC;IACJ,MAAM,WAAW,GAAG,YAAY,CAA0B,OAAO,CAAE,gBAAgB,EAAE,qBAAqB,CAAE,CAAE,CAAC;IAC/G,aAAa,GAAG,EAAC,GAAG,aAAa,EAAE,GAAG,WAAW,EAAC,CAAC;AACpD,CAAC;AAAC,MAAM,CAAC;AACT,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,EAAC,GAAG,aAAa,EAAE,GAAG,aAAa,EAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,IAAI,aAAa,GAA2B,EAAE,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAE,SAAiC;IACrE,aAAa,GAAG,SAAS,CAAC;AAC3B,CAAC;AACD,MAAM,UAAU,kBAAkB;IACjC,aAAa,GAAG,EAAE,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"package-config.js","sourceRoot":"","sources":["package-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAEnD,SAAS,YAAY,CAAK,QAAgB;IACzC,OAAO,IAAI,CAAC,KAAK,CAAE,YAAY,CAAE,QAAQ,EAAE,MAAM,CAAE,CAAO,CAAC;AAC5D,CAAC;AAsDD,MAAM,gBAAgB,GAAG,YAAY,CAAE,OAAO,CAAC,GAAG,EAAE,CAAE,CAAC;AACvD,MAAM,QAAQ,GAA2B;IACxC,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;IAChB,UAAU,EAAE,aAAa;IACzB,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,EAAE;IACnB,MAAM,EAAE,MAAM;IACd,eAAe,EAAE,WAAW;IAC5B,gBAAgB,EAAE,gBAAgB;IAClC,SAAS,EAAE,CAAE,MAAM,EAAE,gBAAgB,CAAE;IACvC,QAAQ,EAAE,CAAE,GAAG,CAAE;IACjB,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;IAChB,GAAG,EAAE,kBAAkB;CACvB,CAAC;AAEF,IAAI,aAAa,GAAkB,YAAY,CAAiB,OAAO,CAAE,gBAAgB,EAAE,cAAc,CAAE,CAAE,CAAC;AAC9G,aAAa,GAAG,EAAC,GAAG,QAAQ,EAAE,GAAG,aAAa,EAAC,CAAC;AAChD,aAAa,CAAC,gBAAgB,GAAG,aAAa,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAE,aAAa,CAAC,MAAM,CAAE,CAAC,OAAO,CAAE,KAAK,EAAE,GAAG,CAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAExI,IAAI,CAAC;IACJ,MAAM,WAAW,GAAG,YAAY,CAA0B,OAAO,CAAE,gBAAgB,EAAE,qBAAqB,CAAE,CAAE,CAAC;IAC/G,aAAa,GAAG,EAAC,GAAG,aAAa,EAAE,GAAG,WAAW,EAAC,CAAC;AACpD,CAAC;AAAC,MAAM,CAAC;AACT,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,EAAC,GAAG,aAAa,EAAE,GAAG,aAAa,EAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,IAAI,aAAa,GAA2B,EAAE,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAE,SAAiC;IACrE,aAAa,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,aAAa,GAAG,EAAE,CAAC;AACpB,CAAC"}
@@ -63,6 +63,8 @@ const defaults: Partial<PackageConfig> = {
63
63
  cssEnums: true,
64
64
  cssTsFiles: true,
65
65
  css_folder: './css/dist/',
66
+ dependencies: {},
67
+ devDependencies: {},
66
68
  jsPath: './js',
67
69
  mainCssFileName: 'front-end',
68
70
  packageDirectory: workingDirectory,
@@ -103,6 +105,7 @@ let modifications: Partial<PackageConfig> = {};
103
105
  export function modifyPackageConfig( additions: Partial<PackageConfig> ): void {
104
106
  modifications = additions;
105
107
  }
108
+
106
109
  export function resetPackageConfig(): void {
107
110
  modifications = {};
108
111
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lipemat/js-boilerplate-shared",
3
- "version": "0.2.2",
3
+ "version": "1.0.1",
4
4
  "license": "MIT",
5
5
  "description": "Shared utilities for all @lipemat boilerplate packages",
6
6
  "engines": {