@zeesoft/i18n-verify 2.0.2 → 2.1.0

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.
Files changed (37) hide show
  1. package/dist/driver/adapters/cypress.js +2 -1
  2. package/dist/driver/adapters/nightwatch.js +43 -2
  3. package/dist/driver/baseDriver.js +24 -0
  4. package/dist/index.js +10 -5
  5. package/dist/lib/i18n.js +125 -43
  6. package/dist/{utils → lib}/reports.js +42 -27
  7. package/dist/lib/validator/string.js +2 -2
  8. package/dist/template/report.html +1678 -0
  9. package/dist/utils/cache.js +15 -15
  10. package/dist/utils/constants.js +8 -5
  11. package/dist/utils/file.js +8 -4
  12. package/dist/utils/logs.js +30 -11
  13. package/dist/utils/objects/cacheData.js +14 -33
  14. package/dist/utils/objects/metaData.js +7 -26
  15. package/dist/utils/objects/reportData.js +0 -18
  16. package/dist/utils/objects/statData.js +43 -28
  17. package/dist/utils/objects/stringData.js +4 -7
  18. package/dist/utils/reportFactory/base.js +15 -7
  19. package/dist/utils/reportFactory/html/index.js +13 -9
  20. package/dist/utils/reportFactory/html/template/body.js +110 -0
  21. package/dist/utils/reportFactory/html/template/css.js +446 -409
  22. package/dist/utils/reportFactory/html/template/html.js +15 -112
  23. package/dist/utils/reportFactory/html/template/javascript/data.js +59 -1
  24. package/dist/utils/reportFactory/html/template/javascript/global.js +19 -0
  25. package/dist/utils/reportFactory/html/template/javascript/grid.js +54 -80
  26. package/dist/utils/reportFactory/html/template/javascript/index.js +7 -7
  27. package/dist/utils/reportFactory/html/template/javascript/insight.js +226 -201
  28. package/dist/utils/reportFactory/html/template/javascript/menuBar.js +40 -35
  29. package/dist/utils/reportFactory/html/template/javascript/overview.js +725 -533
  30. package/dist/utils/reportFactory/index.js +4 -6
  31. package/dist/utils/reportFactory/table.js +95 -0
  32. package/dist/utils/resource.js +10 -6
  33. package/dist/utils/runtime.js +23 -3
  34. package/dist/utils/scripts/postinstall.js +3 -2
  35. package/package.json +8 -3
  36. package/types/index.d.ts +46 -0
  37. package/dist/utils/reportsTable.js +0 -71
@@ -3,14 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.renderHtml = exports.getBodyData = void 0;
7
- const renderHtml = ({
6
+ exports.default = renderHtml;
7
+ function renderHtml({
8
8
  appName,
9
9
  reportTime,
10
10
  script,
11
11
  style,
12
- body
13
- }) => `<!DOCTYPE html>
12
+ body,
13
+ dataFilePaths = []
14
+ }) {
15
+ return `<!DOCTYPE html>
14
16
  <html lang="en">
15
17
  <head>
16
18
  <meta charset="UTF-8" />
@@ -23,12 +25,16 @@ const renderHtml = ({
23
25
  name="description"
24
26
  content="I18n verification report"
25
27
  />
26
- <title>I18n Verification Report | ${reportTime}</title>
28
+ <title>${appName} - I18n Verification Report | ${reportTime}</title>
27
29
  <!-- 3rd party dependecies -->
28
30
  <link
29
31
  rel="stylesheet"
30
32
  href="https://cdn.datatables.net/2.0.3/css/dataTables.dataTables.min.css"
31
33
  />
34
+ ${dataFilePaths.map(v => `<script
35
+ src="${v}"
36
+ type="text/javascript" async>
37
+ </script>`).join('')}
32
38
  <script
33
39
  src="https://code.jquery.com/jquery-3.7.1.slim.min.js"
34
40
  integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8="
@@ -43,116 +49,13 @@ const renderHtml = ({
43
49
  <style>
44
50
  ${style}
45
51
  </style>
46
- <script type="text/javascript">
47
- ${script}
48
- </script>
49
52
  </head>
50
53
  <body>
51
54
  ${body}
52
55
  </body>
56
+ <script type="text/javascript" defer>
57
+ ${script}
58
+ </script>
53
59
  </html>
54
60
  `;
55
- exports.renderHtml = renderHtml;
56
- const getBodyData = () => `<header><div class="logo">zI18n-Verify</div></header>
57
- <main>
58
- <div class="sidebar">
59
- <ul class="menu" id="menu">
60
- <li class="menu-item" data-page="overview">
61
- <a href="#">Overview</a>
62
- </li>
63
- <li class="menu-item has-submenu" data-page="insights">
64
- <a href="#" data-page="insights">Insights</a>
65
- <ul class="submenu"></ul>
66
- </li>
67
- </ul>
68
- <div class="footer"></div>
69
- </div>
70
- <div class="content-wrapper">
71
- <div id="overview" class="content">
72
- <div class="overall-quality card">
73
- <span class="title">Overall I18n Coverage</span>
74
- <div class="section">
75
- <div class="block">
76
- <article>
77
- <p class="desc">
78
- zI18n-Verify report provides a comprehensive information
79
- about the I18n and L10n quailty of your application.
80
- </p>
81
- <ul class="items">
82
- <li>
83
- <h4>Reviewed:</h4>
84
- <p class="detail">
85
- Total strings which are captured and processed by
86
- zI18n-Verify.
87
- </p>
88
- </li>
89
- <li>
90
- <h4>Internationlized:</h4>
91
- <p class="detail">
92
- Different types of value like string, number, date-time
93
- which are properly Internationalized.
94
- </p>
95
- </li>
96
- <li>
97
- <h4>Not Internationalized:</h4>
98
- <p class="detail">
99
- Values which are not Internationalized. Also includes
100
- Partially Localized strings and Encoding Issues.
101
- </p>
102
- </li>
103
- <li>
104
- <h4>Skipped:</h4>
105
- <p class="detail">
106
- Values which are skipped from processing because they
107
- are listed in DNT / Ignored lists or contains Auto
108
- Ignored pattern / User input pattern.
109
- </p>
110
- </li>
111
- </ul>
112
- </article>
113
- </div>
114
- <div class="block">
115
- <div class="graph"></div>
116
- </div>
117
- </div>
118
- </div>
119
- <div class="string-quality card">
120
- <span class="title">String Coverage</span>
121
- <div class="graph"></div>
122
- </div>
123
- <div class="skipped-items card">
124
- <span class="title">Skipped Items</span>
125
- <div class="graph"></div>
126
- </div>
127
- <div class="number-quality card">
128
- <span class="title">Number Coverage</span>
129
- <div class="graph"></div>
130
- </div>
131
- <div class="datetime-quality card">
132
- <span class="title">DateTime Coverage</span>
133
- <div class="graph"></div>
134
- </div>
135
- </div>
136
- <div id="insights" class="content">
137
- <div class="cards">
138
- <span class="title">Locale Quality</span>
139
- <div class="holder"></div>
140
- </div>
141
- </div>
142
- <div id="locale" class="content">
143
- <span class="title">Locale Quality</span>
144
- <div class="coverage-info">
145
- <table class="row-border hover order-column stripe"></table>
146
- </div>
147
- <div id="imageViewer" class="image-viewer">
148
- <span class="close-button" onclick="closeImageViewer()"
149
- >&times;</span
150
- >
151
- <div class="image-container">
152
- <img id="imageView" src="" alt="Image" />
153
- </div>
154
- </div>
155
- </div>
156
- </div>
157
- </main>`;
158
- exports.getBodyData = getBodyData;
61
+ }
@@ -4,5 +4,63 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = (locales, stats, statsByLocale) => ``;
7
+ var _default = metaData => `// DataStore
8
+ (() => {
9
+ // prepare appData and set DataStore
10
+ var appData = {
11
+ appName: '${metaData.appName}',
12
+ defaultLocale: '${metaData.defaultLocale}',
13
+ timeStamp: '${metaData.reportTime}',
14
+ metaData: {
15
+ stats: {},
16
+ statsByLocale: {}
17
+ },
18
+ stringsData: {},
19
+ locales: Object.keys(rawData)
20
+ };
21
+
22
+ for (const entry of Object.entries(rawData)) {
23
+ const locale = entry[0];
24
+ const stats = entry[1].metaData.stats;
25
+ const stringsData = entry[1].stringsData;
26
+
27
+ if (Object.keys(appData.metaData.stats).length) {
28
+ for (const prop in stats) {
29
+ appData.metaData.stats[prop] += stats[prop];
30
+ }
31
+ } else {
32
+ appData.metaData.stats = {...stats};
33
+ }
34
+
35
+ appData.metaData.statsByLocale[locale] = stats;
36
+ appData.stringsData[locale] = stringsData;
37
+ }
38
+
39
+ function SimpleDataStore() {
40
+ this._getData = () => appData;
41
+
42
+ this.ranSuccessfully = () => this.getLocales().length > 0;
43
+
44
+ this.getTimestamp = () => this._getData().timeStamp;
45
+
46
+ this.getAppName = () => this._getData().appName;
47
+
48
+ this.isDefaultLocale = (locale) =>
49
+ locale === this._getData().defaultLocale;
50
+
51
+ this.getLocalesData = () => this._getData().stringsData || {};
52
+
53
+ this.getLocales = () => this._getData().locales || [];
54
+
55
+ this.getStatByLocale = (locale) =>
56
+ this._getData().metaData.statsByLocale[locale] || {};
57
+
58
+ this.getOverallStats = () => this._getData().metaData.stats || {};
59
+
60
+ this.getDataByLocale = (locale) =>
61
+ this._getData().stringsData[locale] || {};
62
+ }
63
+
64
+ DataStore = new SimpleDataStore();
65
+ })();`;
8
66
  exports.default = _default;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = () => `var DataStore;
8
+ // global functions
9
+ function openImageViewer(imageSrc) {
10
+ var imageView = document.getElementById('imageView');
11
+ imageView.src = \`\${new URL(document.baseURI).pathname.replace(/\\/[^\\/]+$/g, '')}/\${imageSrc}\`;
12
+ document.getElementById('imageViewer').style.display = 'block';
13
+ }
14
+
15
+ function closeImageViewer() {
16
+ delete document.getElementById('imageView').src;
17
+ document.getElementById('imageViewer').style.display = 'none';
18
+ }`;
19
+ exports.default = _default;
@@ -4,72 +4,68 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = () => `
8
- //grid view
9
- (() => {
10
- document.addEventListener("DOMContentLoaded", function () {
7
+ var _default = () => `// locale grid
8
+ (() => {
9
+ if (!DataStore.ranSuccessfully()) {
10
+ return;
11
+ }
12
+
13
+ document.addEventListener('DOMContentLoaded', function () {
11
14
  let table;
12
- document.querySelectorAll(".sub-menu-item").forEach((menu) => {
13
- menu.addEventListener("click", (e) => {
15
+ document.querySelectorAll('.sub-menu-item').forEach((menu) => {
16
+ menu.addEventListener('click', (e) => {
14
17
  render(e.currentTarget.dataset.locale);
15
18
  });
16
19
  });
17
20
 
18
21
  const updateTitle = (locale) => {
19
22
  document.querySelector(
20
- "#locale .title"
23
+ '#locale .title'
21
24
  ).textContent = \`\${locale} I18n Coverage Details\`;
22
25
  };
23
26
 
24
- const buildGrid = (_locale) => {
25
- const data = DataStore.getDataByLocale(_locale);
26
- $.fn.dataTable.ext.errMode = "none";
27
- const locale = ["en_US", "fr_FR"];
28
- const type = [
29
- "I18n Str",
30
- "Not I18n Str",
31
- "Parially Localized",
32
- "Utranslated",
33
- "Encoding",
34
- "DNT",
35
- "I18n Date",
36
- "I18n Number",
37
- "Not I18n DateTime",
38
- ];
39
- const testPages = [
40
- "Welcome-Page",
41
- "Settings-Page",
42
- "User-Profile-Page",
43
- "Dashboard-Page",
44
- ];
45
-
46
- const dataSet = Array(100)
47
- .fill()
48
- .map((i, v) => [
49
- \`sample text \${v}\`,
50
- locale[Math.floor(Math.random() * 2)],
51
- type[Math.floor(Math.random() * 9)],
52
- testPages[Math.floor(Math.random() * 3)],
53
- \`link-\${v}.png\`,
54
- ]);
55
- table = new DataTable("#locale .coverage-info table", {
27
+ const buildGrid = (locale) => {
28
+ const data = DataStore.getDataByLocale(locale) || {};
29
+ $.fn.dataTable.ext.errMode = 'none';
30
+ const dataSet = [];
31
+ Object.entries(data).map((entry) =>
32
+ entry[1].forEach(
33
+ (v) =>
34
+ v.type !== 'REVIEWED' &&
35
+ dataSet.push([entry[0], v.type, v.description, v.imagePath])
36
+ )
37
+ );
38
+ table = new DataTable('#locale .coverage-info table', {
56
39
  columns: [
57
- { title: "String" },
58
- { title: "Locale" },
59
- { title: "Type" },
60
- { title: "Page" },
61
- { title: "Screenshot" },
40
+ { title: 'String' },
41
+ { title: 'Type' },
42
+ { title: 'Page' },
43
+ { title: 'Screenshot' }
62
44
  ],
63
45
  columnDefs: [
64
46
  {
65
- targets: 4,
47
+ width: '44%',
48
+ targets: 0
49
+ },
50
+ {
51
+ width: '18%',
52
+ targets: 1
53
+ },
54
+ {
55
+ width: '18%',
56
+ targets: 2
57
+ },
58
+ {
59
+ width: '18%',
60
+ targets: 3,
66
61
  orderable: false,
67
62
  searchable: false,
68
63
  data: null,
69
64
  render: function (data) {
70
- return \`<a href="#" class="view-screenshot-btn" onclick="openImageViewer('\${data[4]}')">View Screenshot</a>\`;
65
+ return \`<a href="#" class="view-screenshot-btn" onclick="openImageViewer('\${data[3]}')"><img title="View screenshot for '\${data[2]}'" class="view-screenshot-image"></img></a>\`;
71
66
  },
72
- },
67
+ className: 'dt-head-center dt-body-center'
68
+ }
73
69
  ],
74
70
  data: dataSet,
75
71
  initComplete: function () {
@@ -78,7 +74,7 @@ var _default = () => `
78
74
  .every(function () {
79
75
  const column = this;
80
76
 
81
- if (column[0][0] === 4) {
77
+ if (column[0][0] === 3) {
82
78
  return;
83
79
  }
84
80
 
@@ -86,16 +82,16 @@ var _default = () => `
86
82
  '<select class="filter dt-input"><option value="">Filter By</option></select>'
87
83
  )
88
84
  .appendTo($(column.header()).before())
89
- .on("change", function () {
85
+ .on('change', function () {
90
86
  const val = $.fn.dataTable.util.escapeRegex(
91
87
  $(this).val()
92
88
  );
93
89
 
94
90
  column
95
- .search(val ? "^" + val + "$" : "", true, false)
91
+ .search(val ? '^' + val + '$' : '', true, false)
96
92
  .draw();
97
93
  })
98
- .on("click", function (e) {
94
+ .on('click', function (e) {
99
95
  e.stopPropagation();
100
96
  e.stopImmediatePropagation();
101
97
  });
@@ -106,50 +102,28 @@ var _default = () => `
106
102
  .sort()
107
103
  .each(function (d, j) {
108
104
  select.append(
109
- '<option value="' + d + '">' + d + "</option>"
105
+ '<option value="' + d + '">' + d + '</option>'
110
106
  );
111
107
  });
112
108
  });
113
109
  },
114
110
  sScrollY:
115
111
  document
116
- .querySelector("#locale .coverage-info")
112
+ .querySelector('#locale .coverage-info')
117
113
  .getBoundingClientRect().height - 142,
118
114
  pageLength: 25,
119
- lengthMenu: [10, 25, 50, 100],
115
+ lengthMenu: [10, 25, 50, 100]
120
116
  });
121
-
122
- // Event handler when position select is changed
123
- $(table.columns(1).header())
124
- .find("select")
125
- .on("change", function () {
126
- var nextSelect = $(table.columns(2).header()).find("select");
127
- var nextColumn = table.column(2);
128
- var nextColumnResults = table.column(2, { search: "applied" });
129
- nextColumn.search("").draw();
130
- nextSelect.empty();
131
- nextSelect.append('<option value="">Filter By</option>');
132
- nextColumnResults
133
- .data()
134
- .unique()
135
- .sort()
136
- .each(function (d, j) {
137
- nextSelect.append(
138
- '<option value="' + d + '">' + d + "</option>"
139
- );
140
- });
141
- });
142
117
  };
143
118
 
144
119
  const render = (locale) => {
145
- updateTitle(locale);
146
- buildGrid(locale);
147
120
  if (table) {
148
- $($(table.columns(1).header()).find("select")).val(locale);
149
- table.columns(1).search(locale).draw();
121
+ table.destroy();
150
122
  }
123
+ updateTitle(locale);
124
+ buildGrid(locale);
151
125
  };
152
126
  });
153
- })();
127
+ })();
154
128
  `;
155
129
  exports.default = _default;
@@ -9,12 +9,12 @@ var _overview = _interopRequireDefault(require("./overview.js"));
9
9
  var _insight = _interopRequireDefault(require("./insight.js"));
10
10
  var _grid = _interopRequireDefault(require("./grid.js"));
11
11
  var _data = _interopRequireDefault(require("./data.js"));
12
+ var _global = _interopRequireDefault(require("./global.js"));
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- var _default = metaData => `
14
- ${(0, _data.default)(metaData.locales, metaData.stats, metaData.statsByLocale, metaData.stringData)}
15
- ${(0, _menuBar.default)()}
16
- ${(0, _overview.default)()}
17
- ${(0, _insight.default)()}
18
- ${(0, _grid.default)()}
19
- `;
14
+ var _default = metaData => `${(0, _global.default)()}
15
+ ${(0, _data.default)(metaData)}
16
+ ${(0, _menuBar.default)()}
17
+ ${(0, _overview.default)()}
18
+ ${(0, _insight.default)()}
19
+ ${(0, _grid.default)()}`;
20
20
  exports.default = _default;