@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 +51 -0
- package/helpers/config.js.map +1 -1
- package/helpers/config.ts +50 -0
- package/helpers/css-classnames.js +20 -3
- package/helpers/css-classnames.js.map +1 -1
- package/helpers/css-classnames.ts +37 -11
- package/helpers/package-config.js +2 -0
- package/helpers/package-config.js.map +1 -1
- package/helpers/package-config.ts +3 -0
- package/package.json +1 -1
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
|
*
|
package/helpers/config.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ];
|
|
@@ -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;
|
|
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
|
}
|