eslint-plugin-cvsdk-rules 19.2.2-tape-mem → 19.2.3-ion-memory

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.
@@ -0,0 +1,8 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ type Options = [{
3
+ checkUserAgent?: boolean;
4
+ }];
5
+ type MessageIds = 'forbiddenPlatformGlobal' | 'forbiddenUserAgent';
6
+ export declare const rule: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
7
+ export {};
8
+ //# sourceMappingURL=no-platform-globals-outside-device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-platform-globals-outside-device.d.ts","sourceRoot":"","sources":["../../src/rules/no-platform-globals-outside-device.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,WAAW,EAAgC,MAAM,0BAA0B,CAAC;AAQrG,KAAK,OAAO,GAAG,CAAC;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC9C,KAAK,UAAU,GAAG,yBAAyB,GAAG,oBAAoB,CAAC;AAsEnE,eAAO,MAAM,IAAI,gFAuCf,CAAC"}
@@ -0,0 +1,102 @@
1
+ // cspell:words OSTV hbbtv
2
+ import { AST_NODE_TYPES, ESLintUtils } from '@typescript-eslint/utils';
3
+ const createRule = ESLintUtils.RuleCreator((name) => name);
4
+ const PLATFORM_GLOBALS = ['tizen', 'webOS', 'webOSTV', 'cast', 'Hisense', 'hbbtv', 'Android', 'ion'];
5
+ const GLOBAL_OBJECTS = ['self', 'globalThis'];
6
+ const PLATFORM_GLOBALS_PATTERN = `/^(${PLATFORM_GLOBALS.join('|')})$/`;
7
+ function isAmbientDefinition(definition) {
8
+ const declaration = definition.parent ?? definition.node;
9
+ return 'declare' in declaration && declaration.declare;
10
+ }
11
+ /** `declare const tizen: ...` still refers to the platform global, so only real declarations count as local. */
12
+ function isDeclaredLocally(scope, name) {
13
+ for (let current = scope; current; current = current.upper) {
14
+ const variable = current.set.get(name);
15
+ if (variable) {
16
+ return variable.defs.some((definition) => !isAmbientDefinition(definition));
17
+ }
18
+ }
19
+ return false;
20
+ }
21
+ function unwrapTypeExpressions(node) {
22
+ let current = node;
23
+ while (current.type === AST_NODE_TYPES.TSAsExpression ||
24
+ current.type === AST_NODE_TYPES.TSNonNullExpression ||
25
+ current.type === AST_NODE_TYPES.TSSatisfiesExpression ||
26
+ current.type === AST_NODE_TYPES.TSTypeAssertion) {
27
+ current = current.expression;
28
+ }
29
+ return current;
30
+ }
31
+ function isGlobalObject(node) {
32
+ const object = unwrapTypeExpressions(node);
33
+ return object.type === AST_NODE_TYPES.Identifier && GLOBAL_OBJECTS.includes(object.name);
34
+ }
35
+ function reportIfGlobal(context, node) {
36
+ if (node.type === AST_NODE_TYPES.Identifier && !isDeclaredLocally(context.sourceCode.getScope(node), node.name)) {
37
+ context.report({ node, messageId: 'forbiddenPlatformGlobal', data: { name: node.name } });
38
+ }
39
+ }
40
+ /** Resolves `obj.name`, `obj['name']` and `` obj[`name`] `` alike so bracket notation cannot bypass the rule. */
41
+ function getStaticPropertyName(node) {
42
+ const { property } = node;
43
+ if (!node.computed && property.type === AST_NODE_TYPES.Identifier) {
44
+ return property.name;
45
+ }
46
+ if (property.type === AST_NODE_TYPES.Literal && typeof property.value === 'string') {
47
+ return property.value;
48
+ }
49
+ if (property.type === AST_NODE_TYPES.TemplateLiteral && property.expressions.length === 0) {
50
+ return property.quasis[0]?.value.cooked ?? undefined;
51
+ }
52
+ return undefined;
53
+ }
54
+ function checkPropertyAccess(context, node, checkUserAgent) {
55
+ const name = getStaticPropertyName(node);
56
+ if (name === undefined) {
57
+ return;
58
+ }
59
+ if (PLATFORM_GLOBALS.includes(name) && isGlobalObject(node.object)) {
60
+ context.report({ node: node.property, messageId: 'forbiddenPlatformGlobal', data: { name } });
61
+ }
62
+ else if (checkUserAgent && name === 'userAgent') {
63
+ context.report({ node: node.property, messageId: 'forbiddenUserAgent' });
64
+ }
65
+ }
66
+ export const rule = createRule({
67
+ create(context, [{ checkUserAgent = false }]) {
68
+ return {
69
+ [`MemberExpression[object.type='Identifier'][object.name=${PLATFORM_GLOBALS_PATTERN}]`]: (node) => {
70
+ reportIfGlobal(context, node.object);
71
+ },
72
+ [`UnaryExpression[operator='typeof'][argument.type='Identifier'][argument.name=${PLATFORM_GLOBALS_PATTERN}]`]: (node) => {
73
+ reportIfGlobal(context, node.argument);
74
+ },
75
+ MemberExpression: (node) => {
76
+ checkPropertyAccess(context, node, checkUserAgent);
77
+ },
78
+ };
79
+ },
80
+ name: 'no-platform-globals-outside-device',
81
+ meta: {
82
+ docs: {
83
+ description: 'Detect device runtime globals and user-agent sniffing in device agnostic parts of the CVSDK',
84
+ },
85
+ messages: {
86
+ forbiddenPlatformGlobal: 'This portion of the CVSDK is device agnostic. Please do not access the `{{name}}` platform global here; keep it in device or proposition code and expose the behaviour through config or capabilities.',
87
+ forbiddenUserAgent: 'This portion of the CVSDK is device agnostic. Please do not read `userAgent` here; use device info, capabilities or config instead of user-agent sniffing.',
88
+ },
89
+ schema: [
90
+ {
91
+ type: 'object',
92
+ properties: {
93
+ checkUserAgent: { type: 'boolean' },
94
+ },
95
+ additionalProperties: false,
96
+ },
97
+ ],
98
+ type: 'problem',
99
+ },
100
+ defaultOptions: [{ checkUserAgent: false }],
101
+ });
102
+ //# sourceMappingURL=no-platform-globals-outside-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-platform-globals-outside-device.js","sourceRoot":"","sources":["../../src/rules/no-platform-globals-outside-device.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-cvsdk-rules",
3
- "version": "19.2.2-tape-mem",
3
+ "version": "19.2.3-ion-memory",
4
4
  "main": "./build/index.js",
5
5
  "type": "module",
6
6
  "dependencies": {