@lightdash/common 0.1457.8 β 0.1458.1
Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,42 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const slugs_1 = require("./slugs");
|
4
|
+
describe('Slug', () => {
|
5
|
+
test('should generate space slugs', async () => {
|
6
|
+
expect((0, slugs_1.generateSlug)('my space name')).toEqual('my-space-name');
|
7
|
+
expect((0, slugs_1.generateSlug)('my space name')).toEqual('my-space-name');
|
8
|
+
expect((0, slugs_1.generateSlug)('a_SPACE_NAME.with!special?chars/and\\slashes')).toEqual('a-space-name-with-special-chars-and-slashes');
|
9
|
+
expect((0, slugs_1.generateSlug)('!trim_special_chars!')).toEqual('trim-special-chars');
|
10
|
+
});
|
11
|
+
test('should generate chart slugs', async () => {
|
12
|
+
expect((0, slugs_1.generateSlug)('a CHART_NAME.with!special?chars/and\\slashes')).toEqual('a-chart-name-with-special-chars-and-slashes');
|
13
|
+
});
|
14
|
+
test('should generate dashboard slugs', async () => {
|
15
|
+
expect((0, slugs_1.generateSlug)('my dashboard name')).toEqual('my-dashboard-name');
|
16
|
+
expect((0, slugs_1.generateSlug)('a DASHBOARD_NAME.with!special?chars/and\\slashes')).toEqual('a-dashboard-name-with-special-chars-and-slashes');
|
17
|
+
});
|
18
|
+
test('should handle emojis and special characters properly', () => {
|
19
|
+
// Test multiple emojis and special characters
|
20
|
+
expect((0, slugs_1.generateSlug)('π Party π Time! π (Special Event)')).toEqual('party-time-special-event');
|
21
|
+
// Test emoji at the end
|
22
|
+
expect((0, slugs_1.generateSlug)('My Dashboard π')).toEqual('my-dashboard');
|
23
|
+
// Ensure backwards compatibility with existing test cases
|
24
|
+
expect((0, slugs_1.generateSlug)('my dashboard name')).toEqual('my-dashboard-name');
|
25
|
+
expect((0, slugs_1.generateSlug)('!special.chars!')).toEqual('special-chars');
|
26
|
+
// Test Unicode emojis
|
27
|
+
expect((0, slugs_1.generateSlug)('π Analytics Dashboard π¨βπ»')).toEqual('analytics-dashboard');
|
28
|
+
// Handle japanese characters
|
29
|
+
expect((0, slugs_1.generateSlug)('Lightdashγ©γ€γγγγ·γ₯')).toEqual('lightdash');
|
30
|
+
// Return short slug (but not empty) if all characters are special
|
31
|
+
expect((0, slugs_1.generateSlug)('LDγ©γ€γγγγ·γ₯')).toEqual('ld');
|
32
|
+
expect((0, slugs_1.generateSlug)('!"Β·$%&0!"Β·$%')).toEqual('0');
|
33
|
+
expect((0, slugs_1.generateSlug)('x!!!!')).toEqual('x');
|
34
|
+
});
|
35
|
+
test('if all slug are special characters, return a 5 char random string', () => {
|
36
|
+
expect((0, slugs_1.generateSlug)('!!!!').length).toEqual(5);
|
37
|
+
// Test multiple emojis andspecial characters
|
38
|
+
expect((0, slugs_1.generateSlug)('ππ').length).toEqual(5);
|
39
|
+
// Handle japanese characters
|
40
|
+
expect((0, slugs_1.generateSlug)('γ©γ€γγγγ·γ₯').length).toEqual(5);
|
41
|
+
});
|
42
|
+
});
|
package/dist/utils/slugs.js
CHANGED
@@ -3,8 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateSlug = void 0;
|
4
4
|
const sanitizeSlug = (slug) => slug
|
5
5
|
.toLowerCase()
|
6
|
-
|
7
|
-
.replace(
|
8
|
-
|
9
|
-
|
6
|
+
// Then replace remaining non-alphanumeric characters with hyphens
|
7
|
+
.replace(/[^a-z0-9]+/g, '-')
|
8
|
+
// Replace multiple hyphens with a single hyphen
|
9
|
+
.replace(/-+/g, '-')
|
10
|
+
// Trim leading and trailing hyphens
|
11
|
+
.replace(/^-+|-+$/g, '');
|
12
|
+
const generateSlug = (name) => {
|
13
|
+
const sanitizedSlug = sanitizeSlug(name);
|
14
|
+
if (sanitizedSlug.length === 0) {
|
15
|
+
// Return a random 5 character string
|
16
|
+
// Base-36 uses all digits (0-9) and all letters (a-z)
|
17
|
+
return Math.random().toString(36).substring(2, 7);
|
18
|
+
}
|
19
|
+
return sanitizedSlug;
|
20
|
+
};
|
10
21
|
exports.generateSlug = generateSlug;
|
package/package.json
CHANGED
package/dist/slug.test.js
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
const slugs_1 = require("./utils/slugs");
|
4
|
-
describe('Slug', () => {
|
5
|
-
test('should generate space slugs', async () => {
|
6
|
-
expect((0, slugs_1.generateSlug)('my space name')).toEqual('my-space-name');
|
7
|
-
expect((0, slugs_1.generateSlug)('my space name')).toEqual('my-space-name');
|
8
|
-
expect((0, slugs_1.generateSlug)('a_SPACE_NAME.with!special?chars/and\\slashes')).toEqual('a-space-name-with-special-chars-and-slashes');
|
9
|
-
expect((0, slugs_1.generateSlug)('!trim_special_chars!')).toEqual('trim-special-chars');
|
10
|
-
});
|
11
|
-
test('should generate chart slugs', async () => {
|
12
|
-
expect((0, slugs_1.generateSlug)('a CHART_NAME.with!special?chars/and\\slashes')).toEqual('a-chart-name-with-special-chars-and-slashes');
|
13
|
-
});
|
14
|
-
test('should generate dashboard slugs', async () => {
|
15
|
-
expect((0, slugs_1.generateSlug)('my dashboard name')).toEqual('my-dashboard-name');
|
16
|
-
expect((0, slugs_1.generateSlug)('a DASHBOARD_NAME.with!special?chars/and\\slashes')).toEqual('a-dashboard-name-with-special-chars-and-slashes');
|
17
|
-
});
|
18
|
-
});
|
File without changes
|