@agilebot/eslint-plugin 0.1.1 → 0.1.3

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.
@@ -1,71 +1,71 @@
1
- const path = require('path');
2
- const jiti = require('jiti');
3
- const { transform } = require('sucrase');
4
- const { getTsconfig } = require('get-tsconfig');
5
-
6
- /**
7
- * import ts module, like require, but support ts
8
- * @param {*} modulePath - module path
9
- */
10
- function tsImport(modulePath) {
11
- if (!modulePath) {
12
- return;
13
- }
14
- /** try to delete cache first */
15
- try {
16
- if (require.cache[modulePath]) {
17
- delete require.cache[modulePath];
18
- }
19
- } catch (err) {
20
- /* empty */
21
- }
22
-
23
- try {
24
- return require(modulePath);
25
- } catch (err) {
26
- const tsconfig = getTsconfig(modulePath);
27
- const { paths, baseUrl } = tsconfig.config.compilerOptions;
28
- let basePath = path.dirname(tsconfig.path);
29
- basePath = path.resolve(basePath, baseUrl);
30
-
31
- const alias = resolveTsconfigPathsToAlias(paths, basePath);
32
-
33
- return jiti(__filename, {
34
- interopDefault: true,
35
- cache: false,
36
- debug: !!process.env.DEBUG,
37
- transform: options => {
38
- return transform(options.source, {
39
- transforms: ['imports', 'typescript']
40
- });
41
- },
42
- alias
43
- })(modulePath);
44
- }
45
- }
46
-
47
- /**
48
- * Resolve tsconfig.json paths to Webpack aliases
49
- * @param {string} paths - tsconfig.json paths
50
- * @param {string} basePath - Path from tsconfig to Webpack config to create absolute aliases
51
- * @return {object} - Webpack alias config
52
- */
53
- function resolveTsconfigPathsToAlias(paths, basePath = __dirname) {
54
- const aliases = {};
55
-
56
- Object.keys(paths).forEach(item => {
57
- const key = item.replace('/*', '');
58
- const value = path.resolve(
59
- basePath,
60
- paths[item][0].replace('/*', '').replace('*', '')
61
- );
62
-
63
- aliases[key] = value;
64
- });
65
-
66
- return aliases;
67
- }
68
-
69
- module.exports = {
70
- tsImport
71
- };
1
+ const path = require('node:path');
2
+ const jiti = require('jiti');
3
+ const { transform } = require('sucrase');
4
+ const { getTsconfig } = require('get-tsconfig');
5
+
6
+ /**
7
+ * import ts module, like require, but support ts
8
+ * @param {*} modulePath - module path
9
+ */
10
+ function tsImport(modulePath) {
11
+ if (!modulePath) {
12
+ return;
13
+ }
14
+ /** try to delete cache first */
15
+ try {
16
+ if (require.cache[modulePath]) {
17
+ delete require.cache[modulePath];
18
+ }
19
+ } catch (err) {
20
+ /* empty */
21
+ }
22
+
23
+ try {
24
+ return require(modulePath);
25
+ } catch (err) {
26
+ const tsconfig = getTsconfig(modulePath);
27
+ const { paths, baseUrl } = tsconfig.config.compilerOptions;
28
+ let basePath = path.dirname(tsconfig.path);
29
+ basePath = path.resolve(basePath, baseUrl);
30
+
31
+ const alias = resolveTsconfigPathsToAlias(paths, basePath);
32
+
33
+ return jiti(__filename, {
34
+ interopDefault: true,
35
+ cache: false,
36
+ debug: !!process.env.DEBUG,
37
+ transform: options => {
38
+ return transform(options.source, {
39
+ transforms: ['imports', 'typescript']
40
+ });
41
+ },
42
+ alias
43
+ })(modulePath);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Resolve tsconfig.json paths to Webpack aliases
49
+ * @param {string} paths - tsconfig.json paths
50
+ * @param {string} basePath - Path from tsconfig to Webpack config to create absolute aliases
51
+ * @return {object} - Webpack alias config
52
+ */
53
+ function resolveTsconfigPathsToAlias(paths, basePath = __dirname) {
54
+ const aliases = {};
55
+
56
+ Object.keys(paths).forEach(item => {
57
+ const key = item.replace('/*', '');
58
+ const value = path.resolve(
59
+ basePath,
60
+ paths[item][0].replace('/*', '').replace('*', '')
61
+ );
62
+
63
+ aliases[key] = value;
64
+ });
65
+
66
+ return aliases;
67
+ }
68
+
69
+ module.exports = {
70
+ tsImport
71
+ };
package/lib/util/intl.js CHANGED
@@ -1,127 +1,127 @@
1
- /**
2
- * Finds an attribute in formatMessage using attribute name.
3
- *
4
- * @param {Object} node - parent formatMessage node
5
- * @param {string} attrName - attribute name.
6
- * @returns {Object} node - returns node if it finds the attribute.
7
- */
8
- function findFormatMessageAttrNode(node, attrName) {
9
- // Find formatMessage usages
10
- if (
11
- node.type === 'CallExpression' &&
12
- (node.callee.name === 'formatMessage' || node.callee.name === '$t')
13
- ) {
14
- if (node.arguments.length && node.arguments[0].properties) {
15
- return node.arguments[0].properties.find(
16
- a => a.key && a.key.name === attrName
17
- );
18
- }
19
- }
20
-
21
- // Find intl.formatMessage usages
22
- if (
23
- node.type === 'CallExpression' &&
24
- node.callee.type === 'MemberExpression' &&
25
- (node.callee.object.name === 'intl' ||
26
- (node.callee.object.name && node.callee.object.name.endsWith('Intl'))) &&
27
- (node.callee.property.name === 'formatMessage' ||
28
- node.callee.property.name === '$t')
29
- ) {
30
- return node.arguments[0].properties.find(
31
- a => a.key && a.key.name === attrName
32
- );
33
- }
34
- }
35
-
36
- /**
37
- * Finds an attribute in FormattedMessage using attribute name.
38
- *
39
- * @param {Object} node - parent FormattedMessage node
40
- * @param {string} attrName - attribute name.
41
- * @returns {Object} node - returns node if it finds the attribute.
42
- */
43
- function findFormattedMessageAttrNode(node, attrName) {
44
- if (
45
- node.type === 'JSXIdentifier' &&
46
- node.name === 'FormattedMessage' &&
47
- node.parent &&
48
- node.parent.type === 'JSXOpeningElement'
49
- ) {
50
- return node.parent.attributes.find(a => a.name && a.name.name === attrName);
51
- }
52
- }
53
-
54
- /**
55
- * Finds an attribute in defineMessages using attribute name.
56
- *
57
- * @param {Object} node - parent defineMessages node
58
- * @param {string} attrName - attribute name.
59
- * @returns {Object} node - returns node if it finds the attribute.
60
- */
61
- function findAttrNodeInDefineMessages(node, attrName) {
62
- if (
63
- node.type === 'Property' &&
64
- node.key.name === attrName &&
65
- node.parent &&
66
- node.parent.parent &&
67
- node.parent.parent.parent &&
68
- node.parent.parent.parent.parent &&
69
- node.parent.parent.parent.parent.type === 'CallExpression' &&
70
- node.parent.parent.parent.parent.callee.name === 'defineMessages'
71
- ) {
72
- return node;
73
- }
74
- }
75
-
76
- /**
77
- * Finds an attribute in defineMessages using attribute name.
78
- *
79
- * @param {Object} node - parent defineMessages node
80
- * @param {string} attrName - attribute name.
81
- * @returns {Object} node - returns node if it finds the attribute.
82
- */
83
- function findAttrNodeInDefineMessage(node, attrName) {
84
- if (
85
- node.type === 'Property' &&
86
- node.key.name === attrName &&
87
- node.parent &&
88
- node.parent.parent &&
89
- node.parent.parent.type === 'CallExpression' &&
90
- node.parent.parent.callee.name === 'defineMessage'
91
- ) {
92
- return node;
93
- }
94
- }
95
-
96
- /**
97
- * Returns a sorted array of nodes, based on their starting posting in the locale id.
98
- *
99
- * @param {Object} node - parent node containing the locale id.
100
- * @returns {Array} child nodes - sorted list.
101
- */
102
- function sortedTemplateElements(node) {
103
- return [...node.quasis, ...node.expressions].sort(
104
- (a, b) => a.range[0] - b.range[0]
105
- );
106
- }
107
-
108
- /**
109
- * Replaces place holders with asterisk and returns the resulting id.
110
- *
111
- * @param {Object} node - parent node containing the locale id.
112
- * @returns {string} id - fixed id.
113
- */
114
- function templateLiteralDisplayStr(node) {
115
- return sortedTemplateElements(node)
116
- .map(e => (!e.value ? '*' : e.value.raw))
117
- .join('');
118
- }
119
-
120
- module.exports = {
121
- findFormatMessageAttrNode,
122
- findFormattedMessageAttrNode,
123
- findAttrNodeInDefineMessages,
124
- findAttrNodeInDefineMessage,
125
- sortedTemplateElements,
126
- templateLiteralDisplayStr
127
- };
1
+ /**
2
+ * Finds an attribute in formatMessage using attribute name.
3
+ *
4
+ * @param {Object} node - parent formatMessage node
5
+ * @param {string} attrName - attribute name.
6
+ * @returns {Object} node - returns node if it finds the attribute.
7
+ */
8
+ function findFormatMessageAttrNode(node, attrName) {
9
+ // Find formatMessage usages
10
+ if (
11
+ node.type === 'CallExpression' &&
12
+ (node.callee.name === 'formatMessage' || node.callee.name === '$t') &&
13
+ node.arguments.length > 0 &&
14
+ node.arguments[0].properties
15
+ ) {
16
+ return node.arguments[0].properties.find(
17
+ a => a.key && a.key.name === attrName
18
+ );
19
+ }
20
+
21
+ // Find intl.formatMessage usages
22
+ if (
23
+ node.type === 'CallExpression' &&
24
+ node.callee.type === 'MemberExpression' &&
25
+ (node.callee.object.name === 'intl' ||
26
+ (node.callee.object.name && node.callee.object.name.endsWith('Intl'))) &&
27
+ (node.callee.property.name === 'formatMessage' ||
28
+ node.callee.property.name === '$t')
29
+ ) {
30
+ return node.arguments[0].properties.find(
31
+ a => a.key && a.key.name === attrName
32
+ );
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Finds an attribute in FormattedMessage using attribute name.
38
+ *
39
+ * @param {Object} node - parent FormattedMessage node
40
+ * @param {string} attrName - attribute name.
41
+ * @returns {Object} node - returns node if it finds the attribute.
42
+ */
43
+ function findFormattedMessageAttrNode(node, attrName) {
44
+ if (
45
+ node.type === 'JSXIdentifier' &&
46
+ node.name === 'FormattedMessage' &&
47
+ node.parent &&
48
+ node.parent.type === 'JSXOpeningElement'
49
+ ) {
50
+ return node.parent.attributes.find(a => a.name && a.name.name === attrName);
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Finds an attribute in defineMessages using attribute name.
56
+ *
57
+ * @param {Object} node - parent defineMessages node
58
+ * @param {string} attrName - attribute name.
59
+ * @returns {Object} node - returns node if it finds the attribute.
60
+ */
61
+ function findAttrNodeInDefineMessages(node, attrName) {
62
+ if (
63
+ node.type === 'Property' &&
64
+ node.key.name === attrName &&
65
+ node.parent &&
66
+ node.parent.parent &&
67
+ node.parent.parent.parent &&
68
+ node.parent.parent.parent.parent &&
69
+ node.parent.parent.parent.parent.type === 'CallExpression' &&
70
+ node.parent.parent.parent.parent.callee.name === 'defineMessages'
71
+ ) {
72
+ return node;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Finds an attribute in defineMessages using attribute name.
78
+ *
79
+ * @param {Object} node - parent defineMessages node
80
+ * @param {string} attrName - attribute name.
81
+ * @returns {Object} node - returns node if it finds the attribute.
82
+ */
83
+ function findAttrNodeInDefineMessage(node, attrName) {
84
+ if (
85
+ node.type === 'Property' &&
86
+ node.key.name === attrName &&
87
+ node.parent &&
88
+ node.parent.parent &&
89
+ node.parent.parent.type === 'CallExpression' &&
90
+ node.parent.parent.callee.name === 'defineMessage'
91
+ ) {
92
+ return node;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Returns a sorted array of nodes, based on their starting posting in the locale id.
98
+ *
99
+ * @param {Object} node - parent node containing the locale id.
100
+ * @returns {Array} child nodes - sorted list.
101
+ */
102
+ function sortedTemplateElements(node) {
103
+ return [...node.quasis, ...node.expressions].sort(
104
+ (a, b) => a.range[0] - b.range[0]
105
+ );
106
+ }
107
+
108
+ /**
109
+ * Replaces place holders with asterisk and returns the resulting id.
110
+ *
111
+ * @param {Object} node - parent node containing the locale id.
112
+ * @returns {string} id - fixed id.
113
+ */
114
+ function templateLiteralDisplayStr(node) {
115
+ return sortedTemplateElements(node)
116
+ .map(e => (!e.value ? '*' : e.value.raw))
117
+ .join('');
118
+ }
119
+
120
+ module.exports = {
121
+ findFormatMessageAttrNode,
122
+ findFormattedMessageAttrNode,
123
+ findAttrNodeInDefineMessages,
124
+ findAttrNodeInDefineMessage,
125
+ sortedTemplateElements,
126
+ templateLiteralDisplayStr
127
+ };
@@ -1,67 +1,66 @@
1
- /* eslint-disable no-sync */
2
- const fs = require('fs');
3
- const path = require('path');
4
- const { tsImport } = require('./import');
5
- const { getSetting } = require('./settings');
6
-
7
- /**
8
- * Map of locale file paths to keys and modified time
9
- *
10
- * @type {{string: {keys: Array, mtime: number}}}
11
- */
12
- const localeFilesKeys = {};
13
-
14
- /**
15
- * Get a list of ids keys from reading locale files
16
- * Keeps track of modified times and reloads if changed,; useful for realtime eslint in-editor
17
- *
18
- * @param {object} context - Context
19
- * @returns {string[]} results - Array of ids
20
- */
21
- function getIntlIds(context) {
22
- const projectRoot = getSetting(context, 'project-root');
23
- const localeFiles = getSetting(context, 'locale-files');
24
-
25
- if (!localeFiles) {
26
- throw new Error('localeFiles not in settings');
27
- }
28
-
29
- const results = [];
30
- localeFiles.forEach(f => {
31
- const fullPath = projectRoot ? path.join(projectRoot, f) : f;
32
- const mtime = fs.lstatSync(fullPath).mtime.getTime();
33
- if (
34
- !localeFilesKeys[fullPath] ||
35
- mtime !== localeFilesKeys[fullPath].mtime
36
- ) {
37
- let json;
38
- if (fullPath.endsWith('.json')) {
39
- json = JSON.parse(fs.readFileSync(fullPath));
40
- } else if (fullPath.endsWith('.ts')) {
41
- json = tsImport(fullPath);
42
- if (typeof json === 'object' && json.default) {
43
- json = json.default;
44
- }
45
- } else if (fullPath.endsWith('.js')) {
46
- json = require(fullPath);
47
- if (typeof json === 'object' && json.default) {
48
- json = json.default;
49
- }
50
- } else {
51
- throw new Error('unsupported file extension');
52
- }
53
-
54
- localeFilesKeys[fullPath] = {
55
- keys: Object.keys(json),
56
- mtime: mtime
57
- };
58
- }
59
- results.push(...localeFilesKeys[fullPath].keys);
60
- });
61
-
62
- return results;
63
- }
64
-
65
- module.exports = {
66
- getIntlIds
67
- };
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
3
+ const { tsImport } = require('./import');
4
+ const { getSetting } = require('./settings');
5
+
6
+ /**
7
+ * Map of locale file paths to keys and modified time
8
+ *
9
+ * @type {{string: {keys: Array, mtime: number}}}
10
+ */
11
+ const localeFilesKeys = {};
12
+
13
+ /**
14
+ * Get a list of ids keys from reading locale files
15
+ * Keeps track of modified times and reloads if changed,; useful for realtime eslint in-editor
16
+ *
17
+ * @param {object} context - Context
18
+ * @returns {string[]} results - Array of ids
19
+ */
20
+ function getIntlIds(context) {
21
+ const projectRoot = getSetting(context, 'project-root');
22
+ const localeFiles = getSetting(context, 'locale-files');
23
+
24
+ if (!localeFiles) {
25
+ throw new Error('localeFiles not in settings');
26
+ }
27
+
28
+ const results = [];
29
+ localeFiles.forEach(f => {
30
+ const fullPath = projectRoot ? path.join(projectRoot, f) : f;
31
+ const mtime = fs.lstatSync(fullPath).mtime.getTime();
32
+ if (
33
+ !localeFilesKeys[fullPath] ||
34
+ mtime !== localeFilesKeys[fullPath].mtime
35
+ ) {
36
+ let json;
37
+ if (fullPath.endsWith('.json')) {
38
+ json = JSON.parse(fs.readFileSync(fullPath));
39
+ } else if (fullPath.endsWith('.ts')) {
40
+ json = tsImport(fullPath);
41
+ if (typeof json === 'object' && json.default) {
42
+ json = json.default;
43
+ }
44
+ } else if (fullPath.endsWith('.js')) {
45
+ json = require(fullPath);
46
+ if (typeof json === 'object' && json.default) {
47
+ json = json.default;
48
+ }
49
+ } else {
50
+ throw new Error('unsupported file extension');
51
+ }
52
+
53
+ localeFilesKeys[fullPath] = {
54
+ keys: Object.keys(json),
55
+ mtime: mtime
56
+ };
57
+ }
58
+ results.push(...localeFilesKeys[fullPath].keys);
59
+ });
60
+
61
+ return results;
62
+ }
63
+
64
+ module.exports = {
65
+ getIntlIds
66
+ };