@sankei-arc-shared-components/element_general-link 0.1.0 → 0.1.2
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/build/index.js +4 -18
- package/package.json +5 -7
- package/src/index.test.js +42 -109
package/build/index.js
CHANGED
|
@@ -1,57 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports["default"] = void 0;
|
|
9
|
-
|
|
10
8
|
var _react = _interopRequireDefault(require("react"));
|
|
11
|
-
|
|
12
9
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
-
|
|
14
10
|
var _lodash = _interopRequireDefault(require("lodash.endswith"));
|
|
15
|
-
|
|
16
11
|
var extractHost = function extractHost(url) {
|
|
17
12
|
var doubleSlash = '//';
|
|
18
|
-
|
|
19
13
|
if (url.indexOf(doubleSlash) < 0) {
|
|
20
14
|
return null;
|
|
21
15
|
}
|
|
22
|
-
|
|
23
16
|
var excludeProtocol = url.substring(url.indexOf(doubleSlash) + doubleSlash.length);
|
|
24
|
-
|
|
25
17
|
if (excludeProtocol.indexOf('/') > 0) {
|
|
26
18
|
return excludeProtocol.substring(0, excludeProtocol.indexOf('/'));
|
|
27
19
|
}
|
|
28
|
-
|
|
29
20
|
return excludeProtocol;
|
|
30
21
|
};
|
|
31
|
-
|
|
32
22
|
var isExternal = function isExternal(url) {
|
|
33
23
|
var host = extractHost(url);
|
|
34
24
|
return host && !(0, _lodash["default"])(host, 'sankei.com');
|
|
35
25
|
};
|
|
36
|
-
|
|
37
26
|
var GeneralLink = function GeneralLink(_ref) {
|
|
38
27
|
var url = _ref.url,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
28
|
+
content = _ref.content,
|
|
29
|
+
classList = _ref.classList;
|
|
42
30
|
if (!url) {
|
|
43
31
|
return null;
|
|
44
32
|
}
|
|
45
|
-
|
|
46
33
|
var needsNewTab = isExternal(url);
|
|
47
|
-
return _react["default"].createElement("a", {
|
|
34
|
+
return /*#__PURE__*/_react["default"].createElement("a", {
|
|
48
35
|
href: url,
|
|
49
36
|
className: classList,
|
|
50
37
|
target: needsNewTab ? '_blank' : null,
|
|
51
38
|
rel: needsNewTab ? 'nofollow' : null
|
|
52
39
|
}, content);
|
|
53
40
|
};
|
|
54
|
-
|
|
55
41
|
GeneralLink.propTypes = {
|
|
56
42
|
classList: _propTypes["default"].string,
|
|
57
43
|
url: _propTypes["default"].string.isRequired,
|
|
@@ -59,4 +45,4 @@ GeneralLink.propTypes = {
|
|
|
59
45
|
};
|
|
60
46
|
var _default = GeneralLink;
|
|
61
47
|
exports["default"] = _default;
|
|
62
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfbG9kYXNoIiwiZXh0cmFjdEhvc3QiLCJ1cmwiLCJkb3VibGVTbGFzaCIsImluZGV4T2YiLCJleGNsdWRlUHJvdG9jb2wiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJpc0V4dGVybmFsIiwiaG9zdCIsImVuZHN3aXRoIiwiR2VuZXJhbExpbmsiLCJfcmVmIiwiY29udGVudCIsImNsYXNzTGlzdCIsIm5lZWRzTmV3VGFiIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJjbGFzc05hbWUiLCJ0YXJnZXQiLCJyZWwiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJpc1JlcXVpcmVkIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsidW5rbm93biJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuaW1wb3J0IGVuZHN3aXRoIGZyb20gJ2xvZGFzaC5lbmRzd2l0aCc7XG5cbmNvbnN0IGV4dHJhY3RIb3N0ID0gKHVybCkgPT4ge1xuICBjb25zdCBkb3VibGVTbGFzaCA9ICcvLyc7XG4gIGlmICh1cmwuaW5kZXhPZihkb3VibGVTbGFzaCkgPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZXhjbHVkZVByb3RvY29sID0gdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZihkb3VibGVTbGFzaCkgKyBkb3VibGVTbGFzaC5sZW5ndGgpO1xuICBpZiAoZXhjbHVkZVByb3RvY29sLmluZGV4T2YoJy8nKSA+IDApIHtcbiAgICByZXR1cm4gZXhjbHVkZVByb3RvY29sLnN1YnN0cmluZygwLCBleGNsdWRlUHJvdG9jb2wuaW5kZXhPZignLycpKTtcbiAgfVxuICByZXR1cm4gZXhjbHVkZVByb3RvY29sO1xufTtcblxuY29uc3QgaXNFeHRlcm5hbCA9ICh1cmwpID0+IHtcbiAgY29uc3QgaG9zdCA9IGV4dHJhY3RIb3N0KHVybCk7XG4gIHJldHVybiBob3N0ICYmICFlbmRzd2l0aChob3N0LCAnc2Fua2VpLmNvbScpO1xufTtcblxuY29uc3QgR2VuZXJhbExpbmsgPSAoeyB1cmwsIGNvbnRlbnQsIGNsYXNzTGlzdCB9KSA9PiB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbmVlZHNOZXdUYWIgPSBpc0V4dGVybmFsKHVybCk7XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17dXJsfVxuICAgICAgIGNsYXNzTmFtZT17Y2xhc3NMaXN0fVxuICAgICAgIHRhcmdldD17bmVlZHNOZXdUYWIgPyAnX2JsYW5rJyA6IG51bGx9XG4gICAgICAgcmVsPXtuZWVkc05ld1RhYiA/ICdub2ZvbGxvdycgOiBudWxsfT57Y29udGVudH08L2E+XG4gICk7XG59O1xuXG5HZW5lcmFsTGluay5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTGlzdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgdXJsOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGNvbnRlbnQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdlbmVyYWxMaW5rO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsT0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBTUcsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUlDLEdBQUcsRUFBSztFQUMzQixJQUFNQyxXQUFXLEdBQUcsSUFBSTtFQUN4QixJQUFJRCxHQUFHLENBQUNFLE9BQU8sQ0FBQ0QsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ2hDLE9BQU8sSUFBSTtFQUNiO0VBQ0EsSUFBTUUsZUFBZSxHQUFHSCxHQUFHLENBQUNJLFNBQVMsQ0FBQ0osR0FBRyxDQUFDRSxPQUFPLENBQUNELFdBQVcsQ0FBQyxHQUFHQSxXQUFXLENBQUNJLE1BQU0sQ0FBQztFQUNwRixJQUFJRixlQUFlLENBQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDcEMsT0FBT0MsZUFBZSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxFQUFFRCxlQUFlLENBQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuRTtFQUNBLE9BQU9DLGVBQWU7QUFDeEIsQ0FBQztBQUVELElBQU1HLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFJTixHQUFHLEVBQUs7RUFDMUIsSUFBTU8sSUFBSSxHQUFHUixXQUFXLENBQUNDLEdBQUcsQ0FBQztFQUM3QixPQUFPTyxJQUFJLElBQUksQ0FBQyxJQUFBQyxrQkFBUSxFQUFDRCxJQUFJLEVBQUUsWUFBWSxDQUFDO0FBQzlDLENBQUM7QUFFRCxJQUFNRSxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQUMsSUFBQSxFQUFvQztFQUFBLElBQTlCVixHQUFHLEdBQUFVLElBQUEsQ0FBSFYsR0FBRztJQUFFVyxPQUFPLEdBQUFELElBQUEsQ0FBUEMsT0FBTztJQUFFQyxTQUFTLEdBQUFGLElBQUEsQ0FBVEUsU0FBUztFQUM1QyxJQUFJLENBQUNaLEdBQUcsRUFBRTtJQUNSLE9BQU8sSUFBSTtFQUNiO0VBQ0EsSUFBTWEsV0FBVyxHQUFHUCxVQUFVLENBQUNOLEdBQUcsQ0FBQztFQUNuQyxvQkFDRU4sTUFBQSxZQUFBb0IsYUFBQTtJQUFHQyxJQUFJLEVBQUVmLEdBQUk7SUFDVmdCLFNBQVMsRUFBRUosU0FBVTtJQUNyQkssTUFBTSxFQUFFSixXQUFXLEdBQUcsUUFBUSxHQUFHLElBQUs7SUFDdENLLEdBQUcsRUFBRUwsV0FBVyxHQUFHLFVBQVUsR0FBRztFQUFLLEdBQUVGLE9BQVcsQ0FBQztBQUUxRCxDQUFDO0FBRURGLFdBQVcsQ0FBQ1UsU0FBUyxHQUFHO0VBQ3RCUCxTQUFTLEVBQUVRLHFCQUFTLENBQUNDLE1BQU07RUFDM0JyQixHQUFHLEVBQUVvQixxQkFBUyxDQUFDQyxNQUFNLENBQUNDLFVBQVU7RUFDaENYLE9BQU8sRUFBRVMscUJBQVMsQ0FBQ0MsTUFBTSxDQUFDQztBQUM1QixDQUFDO0FBQUMsSUFBQUMsUUFBQSxHQUVhZCxXQUFXO0FBQUFlLE9BQUEsY0FBQUQsUUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sankei-arc-shared-components/element_general-link",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Shared General Link Component",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"repository": {
|
|
@@ -8,12 +8,11 @@
|
|
|
8
8
|
"url": "https://github.com/wapopartners/sankei-shimbun-shared-components/packages/element_general_link"
|
|
9
9
|
},
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"enzyme": "^3.7.0",
|
|
12
11
|
"lodash.endswith": "^4.2.1",
|
|
13
12
|
"lodash.get": "^4.4.2",
|
|
14
|
-
"prop-types": "
|
|
15
|
-
"react": ">=
|
|
16
|
-
"react-dom": "
|
|
13
|
+
"prop-types": ">=15",
|
|
14
|
+
"react": ">=18",
|
|
15
|
+
"react-dom": ">=18"
|
|
17
16
|
},
|
|
18
17
|
"publishConfig": {
|
|
19
18
|
"access": "public"
|
|
@@ -22,6 +21,5 @@
|
|
|
22
21
|
"license": "ISC",
|
|
23
22
|
"dependencies": {
|
|
24
23
|
"@babel/runtime": "^7.4.3"
|
|
25
|
-
}
|
|
26
|
-
"gitHead": "d6346fa9df1b29a98b3e468ad68a82ef89c1bb0c"
|
|
24
|
+
}
|
|
27
25
|
}
|
package/src/index.test.js
CHANGED
|
@@ -1,146 +1,79 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import GeneralLink from './index';
|
|
4
4
|
|
|
5
5
|
describe('<GeneralLink>', () => {
|
|
6
6
|
it('should render an internal link', () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
expect(instance).toBeDefined();
|
|
13
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
14
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
15
|
-
);
|
|
16
|
-
instance.unmount();
|
|
7
|
+
render(<GeneralLink url="https://www.sankei.com" content="dummy" />);
|
|
8
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
9
|
+
expect(link).toHaveAttribute('href', 'https://www.sankei.com');
|
|
10
|
+
expect(link).not.toHaveAttribute('target');
|
|
11
|
+
expect(link).not.toHaveAttribute('rel');
|
|
17
12
|
});
|
|
18
13
|
|
|
19
14
|
it('should render internal link with trailing slash', () => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
};
|
|
24
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
25
|
-
expect(instance).toBeDefined();
|
|
26
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
27
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
28
|
-
);
|
|
29
|
-
instance.unmount();
|
|
15
|
+
render(<GeneralLink url="https://www.sankei.com/" content="dummy" />);
|
|
16
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
17
|
+
expect(link).toHaveAttribute('href', 'https://www.sankei.com/');
|
|
30
18
|
});
|
|
31
19
|
|
|
32
20
|
it('should render internal link when special is present', () => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
38
|
-
expect(instance).toBeDefined();
|
|
39
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
40
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
41
|
-
);
|
|
42
|
-
instance.unmount();
|
|
21
|
+
render(<GeneralLink url="https://special.sankei.com" content="dummy" />);
|
|
22
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
23
|
+
expect(link).toHaveAttribute('href', 'https://special.sankei.com');
|
|
24
|
+
expect(link).not.toHaveAttribute('target');
|
|
43
25
|
});
|
|
44
26
|
|
|
45
27
|
it('should render internal link when double slash starts', () => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
};
|
|
50
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
51
|
-
expect(instance).toBeDefined();
|
|
52
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
53
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
54
|
-
);
|
|
55
|
-
instance.unmount();
|
|
28
|
+
render(<GeneralLink url="//www.sankei.com" content="dummy" />);
|
|
29
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
30
|
+
expect(link).toHaveAttribute('href', '//www.sankei.com');
|
|
56
31
|
});
|
|
57
32
|
|
|
58
33
|
it('should render internal link with double slash and special', () => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
};
|
|
63
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
64
|
-
expect(instance).toBeDefined();
|
|
65
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
66
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
67
|
-
);
|
|
68
|
-
instance.unmount();
|
|
34
|
+
render(<GeneralLink url="//special.sankei.com/test" content="dummy" />);
|
|
35
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
36
|
+
expect(link).toHaveAttribute('href', '//special.sankei.com/test');
|
|
69
37
|
});
|
|
70
38
|
|
|
71
39
|
it('should render internal link since relative link', () => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
};
|
|
76
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
77
|
-
expect(instance).toBeDefined();
|
|
78
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
79
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
80
|
-
);
|
|
81
|
-
instance.unmount();
|
|
40
|
+
render(<GeneralLink url="/sports" content="dummy" />);
|
|
41
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
42
|
+
expect(link).toHaveAttribute('href', '/sports');
|
|
82
43
|
});
|
|
83
44
|
|
|
84
45
|
it('should render internal link since no domain', () => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
};
|
|
89
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
90
|
-
expect(instance).toBeDefined();
|
|
91
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
92
|
-
`<a href="${testProps.url}">${testProps.content}</a>`,
|
|
93
|
-
);
|
|
94
|
-
instance.unmount();
|
|
46
|
+
render(<GeneralLink url="terms.html" content="dummy" />);
|
|
47
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
48
|
+
expect(link).toHaveAttribute('href', 'terms.html');
|
|
95
49
|
});
|
|
96
50
|
|
|
97
|
-
|
|
98
51
|
it('should render external link since youtube', () => {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
expect(instance).toBeDefined();
|
|
105
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
106
|
-
`<a href="${testProps.url}" target="_blank" rel="nofollow">${testProps.content}</a>`,
|
|
107
|
-
);
|
|
108
|
-
instance.unmount();
|
|
52
|
+
render(<GeneralLink url="https://youtube.com/" content="dummy" />);
|
|
53
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
54
|
+
expect(link).toHaveAttribute('href', 'https://youtube.com/');
|
|
55
|
+
expect(link).toHaveAttribute('target', '_blank');
|
|
56
|
+
expect(link).toHaveAttribute('rel', 'nofollow');
|
|
109
57
|
});
|
|
110
58
|
|
|
111
|
-
|
|
112
59
|
it('should render external link since ends with youtube with double slash', () => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
expect(instance).toBeDefined();
|
|
119
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
120
|
-
`<a href="${testProps.url}" target="_blank" rel="nofollow">${testProps.content}</a>`,
|
|
121
|
-
);
|
|
122
|
-
instance.unmount();
|
|
60
|
+
render(<GeneralLink url="//youtube.com/" content="dummy" />);
|
|
61
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
62
|
+
expect(link).toHaveAttribute('href', '//youtube.com/');
|
|
63
|
+
expect(link).toHaveAttribute('target', '_blank');
|
|
64
|
+
expect(link).toHaveAttribute('rel', 'nofollow');
|
|
123
65
|
});
|
|
124
66
|
|
|
125
67
|
it('should render external link since ends with foo', () => {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
expect(instance).toBeDefined();
|
|
132
|
-
expect(instance.find('a').at(0).html()).toBe(
|
|
133
|
-
`<a href="${testProps.url}" target="_blank" rel="nofollow">${testProps.content}</a>`,
|
|
134
|
-
);
|
|
135
|
-
instance.unmount();
|
|
68
|
+
render(<GeneralLink url="//sankei.com.foo.com/" content="dummy" />);
|
|
69
|
+
const link = screen.getByRole('link', { name: 'dummy' });
|
|
70
|
+
expect(link).toHaveAttribute('href', '//sankei.com.foo.com/');
|
|
71
|
+
expect(link).toHaveAttribute('target', '_blank');
|
|
72
|
+
expect(link).toHaveAttribute('rel', 'nofollow');
|
|
136
73
|
});
|
|
137
74
|
|
|
138
75
|
it('should return null', () => {
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
};
|
|
142
|
-
const instance = shallow(<GeneralLink {...testProps} />);
|
|
143
|
-
expect(instance).toBeDefined();
|
|
144
|
-
expect(instance.find('a')).toHaveLength(0);
|
|
76
|
+
const { container } = render(<GeneralLink url={null} />);
|
|
77
|
+
expect(container).toBeEmptyDOMElement();
|
|
145
78
|
});
|
|
146
79
|
});
|