@jsenv/runtime-compat 1.0.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.
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@jsenv/runtime-compat",
3
+ "version": "1.0.0",
4
+ "description": "TODO",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/jsenv/core",
9
+ "directory": "packages/internal/runtime-compat"
10
+ },
11
+ "engines": {
12
+ "node": ">=16.13.0"
13
+ },
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "type": "module",
18
+ "main": "./src/main.js",
19
+ "files": [
20
+ "/src/"
21
+ ],
22
+ "dependencies": {
23
+ "@jsenv/utils": "2.0.1"
24
+ }
25
+ }
@@ -0,0 +1,220 @@
1
+ export const featuresCompatMap = {
2
+ script_type_module: {
3
+ edge: "16",
4
+ firefox: "60",
5
+ chrome: "61",
6
+ safari: "10.1",
7
+ opera: "48",
8
+ ios: "10.3",
9
+ android: "61",
10
+ samsung: "8.2",
11
+ },
12
+ document_current_script: {
13
+ edge: "12",
14
+ firefox: "4",
15
+ chrome: "29",
16
+ safari: "8",
17
+ opera: "16",
18
+ android: "4.4",
19
+ samsung: "4",
20
+ },
21
+ // https://caniuse.com/?search=import.meta
22
+ import_meta: {
23
+ android: "9",
24
+ chrome: "64",
25
+ edge: "79",
26
+ firefox: "62",
27
+ ios: "12",
28
+ opera: "51",
29
+ safari: "11.1",
30
+ samsung: "9.2",
31
+ },
32
+ import_meta_resolve: {
33
+ chrome: "107",
34
+ edge: "105",
35
+ firefox: "106",
36
+ },
37
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#browser_compatibility
38
+ import_dynamic: {
39
+ android: "8",
40
+ chrome: "63",
41
+ edge: "79",
42
+ firefox: "67",
43
+ ios: "11.3",
44
+ opera: "50",
45
+ safari: "11.3",
46
+ samsung: "8.0",
47
+ node: "13.2",
48
+ },
49
+ top_level_await: {
50
+ edge: "89",
51
+ chrome: "89",
52
+ firefox: "89",
53
+ opera: "75",
54
+ safari: "15",
55
+ samsung: "15",
56
+ ios: "15",
57
+ node: "14.8",
58
+ },
59
+ // https://caniuse.com/import-maps
60
+ importmap: {
61
+ edge: "89",
62
+ chrome: "89",
63
+ opera: "76",
64
+ samsung: "15",
65
+ firefox: "108",
66
+ safari: "16.4",
67
+ },
68
+ import_type_json: {
69
+ chrome: "91",
70
+ edge: "91",
71
+ },
72
+ import_type_css: {
73
+ chrome: "93",
74
+ edge: "93",
75
+ },
76
+ import_type_text: {},
77
+ // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet#browser_compatibility
78
+ new_stylesheet: {
79
+ chrome: "73",
80
+ edge: "79",
81
+ opera: "53",
82
+ android: "73",
83
+ },
84
+ // https://caniuse.com/?search=worker
85
+ worker: {
86
+ ie: "10",
87
+ edge: "12",
88
+ firefox: "3.5",
89
+ chrome: "4",
90
+ opera: "11.5",
91
+ safari: "4",
92
+ ios: "5",
93
+ android: "4.4",
94
+ },
95
+ // https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker#browser_compatibility
96
+ worker_type_module: {
97
+ chrome: "80",
98
+ edge: "80",
99
+ opera: "67",
100
+ android: "80",
101
+ },
102
+ worker_importmap: {},
103
+ service_worker: {
104
+ edge: "17",
105
+ firefox: "44",
106
+ chrome: "40",
107
+ safari: "11.1",
108
+ opera: "27",
109
+ ios: "11.3",
110
+ android: "12.12",
111
+ },
112
+ service_worker_type_module: {
113
+ chrome: "80",
114
+ edge: "80",
115
+ opera: "67",
116
+ android: "80",
117
+ },
118
+ shared_worker: {
119
+ chrome: "4",
120
+ edge: "79",
121
+ firefox: "29",
122
+ opera: "10.6",
123
+ },
124
+ shared_worker_type_module: {
125
+ chrome: "80",
126
+ edge: "80",
127
+ opera: "67",
128
+ },
129
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis#browser_compatibility
130
+ global_this: {
131
+ edge: "79",
132
+ firefox: "65",
133
+ chrome: "71",
134
+ safari: "12.1",
135
+ opera: "58",
136
+ ios: "12.2",
137
+ android: "94",
138
+ node: "12",
139
+ },
140
+ async_generator_function: {
141
+ chrome: "63",
142
+ opera: "50",
143
+ edge: "79",
144
+ firefox: "57",
145
+ safari: "12",
146
+ node: "10",
147
+ ios: "12",
148
+ samsung: "8",
149
+ electron: "3",
150
+ },
151
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#browser_compatibility
152
+ template_literals: {
153
+ chrome: "41",
154
+ edge: "12",
155
+ firefox: "34",
156
+ opera: "28",
157
+ safari: "9",
158
+ ios: "9",
159
+ android: "4",
160
+ node: "4",
161
+ },
162
+ arrow_function: {
163
+ chrome: "47",
164
+ opera: "34",
165
+ edge: "13",
166
+ firefox: "45",
167
+ safari: "10",
168
+ node: "6",
169
+ ios: "10",
170
+ samsung: "5",
171
+ electron: "0.36",
172
+ },
173
+ const_bindings: {
174
+ chrome: "41",
175
+ opera: "28",
176
+ edge: "12",
177
+ firefox: "46",
178
+ safari: "10",
179
+ node: "4",
180
+ ie: "11",
181
+ ios: "10",
182
+ samsung: "3.4",
183
+ electron: "0.22",
184
+ },
185
+ object_properties_shorthand: {
186
+ chrome: "43",
187
+ opera: "30",
188
+ edge: "12",
189
+ firefox: "33",
190
+ safari: "9",
191
+ node: "4",
192
+ ios: "9",
193
+ samsung: "4",
194
+ electron: "0.28",
195
+ },
196
+ reserved_words: {
197
+ chrome: "13",
198
+ opera: "10.50",
199
+ edge: "12",
200
+ firefox: "2",
201
+ safari: "3.1",
202
+ node: "0.10",
203
+ ie: "9",
204
+ android: "4.4",
205
+ ios: "6",
206
+ phantom: "2",
207
+ samsung: "1",
208
+ electron: "0.20",
209
+ },
210
+ symbols: {
211
+ chrome: "38",
212
+ opera: "25",
213
+ edge: "12",
214
+ firefox: "36",
215
+ safari: "9",
216
+ ios: "9",
217
+ samsung: "4",
218
+ node: "0.12",
219
+ },
220
+ };
package/src/main.js ADDED
@@ -0,0 +1 @@
1
+ export { RUNTIME_COMPAT } from "./runtime_compat.js";
@@ -0,0 +1,56 @@
1
+ import { findHighestVersion } from "@jsenv/utils/src/semantic_versioning/highest_version.js";
2
+
3
+ import { featuresCompatMap } from "./features_compatibility.js";
4
+
5
+ export const RUNTIME_COMPAT = {
6
+ featuresCompatMap,
7
+
8
+ add: (originalRuntimeCompat, feature) => {
9
+ const featureCompat = getFeatureCompat(feature);
10
+ const runtimeCompat = {
11
+ ...originalRuntimeCompat,
12
+ };
13
+ Object.keys(originalRuntimeCompat).forEach((runtimeName) => {
14
+ const secondVersion = featureCompat[runtimeName]; // the version supported by the feature
15
+ if (secondVersion) {
16
+ const firstVersion = originalRuntimeCompat[runtimeName];
17
+ runtimeCompat[runtimeName] = findHighestVersion(
18
+ firstVersion,
19
+ secondVersion,
20
+ );
21
+ }
22
+ });
23
+ return runtimeCompat;
24
+ },
25
+
26
+ isSupported: (runtimeCompat, feature) => {
27
+ const featureCompat = getFeatureCompat(feature);
28
+ const runtimeNames = Object.keys(runtimeCompat);
29
+ const runtimeWithoutCompat = runtimeNames.find((runtimeName) => {
30
+ const runtimeVersion = runtimeCompat[runtimeName];
31
+ const runtimeVersionCompatible = featureCompat[runtimeName] || "Infinity";
32
+ const highestVersion = findHighestVersion(
33
+ runtimeVersion,
34
+ runtimeVersionCompatible,
35
+ );
36
+ return highestVersion !== runtimeVersion;
37
+ });
38
+ return !runtimeWithoutCompat;
39
+ },
40
+ };
41
+
42
+ const getFeatureCompat = (feature) => {
43
+ if (typeof feature === "string") {
44
+ const compat = featuresCompatMap[feature];
45
+ if (!compat) {
46
+ throw new Error(`"${feature}" feature is unknown`);
47
+ }
48
+ return compat;
49
+ }
50
+ if (typeof feature !== "object") {
51
+ throw new TypeError(
52
+ `feature must be a string or an object, got ${feature}`,
53
+ );
54
+ }
55
+ return feature;
56
+ };