Skip to content

Commit 03547fb

Browse files
committed
fix: trim leading, trailing, double replacement char
1 parent d85e59f commit 03547fb

File tree

6 files changed

+1458
-47
lines changed

6 files changed

+1458
-47
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module.exports = {
33
env: {
44
browser: true,
55
es2020: true,
6+
jest: true,
67
},
78
extends: ['eslint:recommended', 'plugin:react/recommended', 'prettier'],
89
parserOptions: {

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,7 @@ jobs:
4040
run: yarn lint
4141
- name: check formatting
4242
run: yarn format:ci
43+
- name: run tests
44+
run: yarn test
4345
- name: run build
4446
run: yarn build

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"build": "webpack --env.production",
88
"develop": "webpack-dev-server --env.development",
99
"lint": "eslint 'src/**/*.js'",
10+
"test": "jest",
1011
"format": "prettier --write 'src/**/*.js'",
1112
"format:ci": "prettier --check 'src/**/*.js'",
1213
"semantic-release": "cross-env CI=true HUSKY_SKIP_HOOKS=1 semantic-release",
@@ -34,9 +35,9 @@
3435
"@emotion/core": "^10.0.35",
3536
"@emotion/styled": "^10.0.27",
3637
"netlify-cms-ui-default": "^2.11.1",
37-
"react-select": "^3.1.0",
3838
"react": "^16.8.4",
39-
"react-dom": "^16.8.4"
39+
"react-dom": "^16.8.4",
40+
"react-select": "^3.1.0"
4041
},
4142
"devDependencies": {
4243
"@babel/core": "^7.11.6",
@@ -56,6 +57,7 @@
5657
"eslint-plugin-react": "^7.20.3",
5758
"html-webpack-plugin": "^4.3.0",
5859
"husky": "^4.2.5",
60+
"jest": "^26.4.2",
5961
"npm-run-all": "^4.1.5",
6062
"prettier": "^2.0.5",
6163
"semantic-release": "^17.1.1",

src/ParentWidget.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,23 @@ const Option = (props) => {
4242
);
4343
};
4444

45+
export const sanitizePath = (path) => {
46+
const replacement = '-';
47+
const sanitizedPath = path.replace(/[^a-z0-9]/gi, replacement).toLowerCase();
48+
49+
// Remove any doubled or leading/trailing replacement characters (that were added in the sanitizers).
50+
const doubleReplacement = new RegExp(`(?:${replacement})+`, 'g');
51+
const trailingReplacement = new RegExp(`${replacement}$`);
52+
const leadingReplacement = new RegExp(`^${replacement}`);
53+
54+
const normalizedPath = sanitizedPath
55+
.replace(doubleReplacement, replacement)
56+
.replace(leadingReplacement, '')
57+
.replace(trailingReplacement, '');
58+
59+
return normalizedPath;
60+
};
61+
4562
export class ParentControl extends React.Component {
4663
constructor(props) {
4764
super(props);
@@ -54,7 +71,7 @@ export class ParentControl extends React.Component {
5471
let folder;
5572
if (this.isNewRecord()) {
5673
const title = this.state.title;
57-
folder = title.replace(/[^a-z0-9]/gi, '-').toLowerCase();
74+
folder = sanitizePath(title);
5875
} else {
5976
folder = getFolder(value);
6077
}

src/ParentWidget.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { sanitizePath } from './ParentWidget';
2+
3+
describe('sanitizePath', () => {
4+
it('should lowercase string', () => {
5+
expect(sanitizePath('Who')).toBe('who');
6+
});
7+
8+
it('should replace spaces with dashes', () => {
9+
expect(sanitizePath('Who Are We')).toBe('who-are-we');
10+
});
11+
12+
it('should remove trailing replacer', () => {
13+
expect(sanitizePath('Who Are We?')).toBe('who-are-we');
14+
});
15+
16+
it('should remove leading replacer', () => {
17+
expect(sanitizePath('?Who Are We')).toBe('who-are-we');
18+
});
19+
20+
it('should remove double replacer', () => {
21+
expect(sanitizePath('Who Are We')).toBe('who-are-we');
22+
});
23+
});

0 commit comments

Comments
 (0)