@mdn/fred 1.6.2 → 1.8.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/.env-dist +4 -0
- package/CHANGELOG.md +66 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +31 -2
- package/build/eslint-fred.js +6 -4
- package/build/plugins/generate-element-map.js +3 -2
- package/build/utils.js +0 -23
- package/components/breadcrumbs-bar/server.css +12 -0
- package/components/color-theme/element.js +1 -0
- package/components/content-feedback/element.js +58 -22
- package/components/content-section/server.css +15 -2
- package/components/curriculum/module.css +1 -0
- package/components/curriculum-module/server.css +1 -0
- package/components/env/index.js +6 -0
- package/components/footer/server.js +1 -1
- package/components/heading-anchor/server.js +0 -2
- package/components/issues-table/element.js +6 -4
- package/components/language-switcher/element.js +1 -0
- package/components/live-sample-result/element.js +1 -0
- package/components/menu/base.css +2 -1
- package/components/menu/constants.js +438 -147
- package/components/menu/missing-docs.json +133 -0
- package/components/menu/server.js +78 -657
- package/components/menu/types.d.ts +50 -0
- package/components/menu/update-missing-docs.js +66 -0
- package/components/modal/element.js +3 -2
- package/components/navigation/server.js +1 -1
- package/components/observatory-tests-and-scores/element.js +13 -7
- package/components/outer-layout/utils.js +2 -2
- package/components/play-runner/element.js +14 -6
- package/components/playground/element.js +11 -5
- package/components/recently-visited/element.js +4 -2
- package/components/scrim-inline/element.js +11 -5
- package/components/search-modal/element.js +1 -0
- package/components/writer-reload/element.js +10 -2
- package/entry.client.js +1 -0
- package/hooks/ga-init.js +31 -0
- package/hooks/glean-init.js +2 -6
- package/l10n/en-US.ftl +6 -0
- package/l10n/fr.ftl +145 -1
- package/out/service-worker.js +1 -1
- package/out/service-worker.js.map +1 -1
- package/out/static/client/{1231.84c230e0fa92f2d4.js → 1231.6a66b96b566b2cca.js} +14 -10
- package/out/static/client/1231.6a66b96b566b2cca.js.map +1 -0
- package/out/static/client/{2190.7995f19655987265.js → 2190.a21d8b0d7b75a20d.js} +5 -5
- package/out/static/client/2190.a21d8b0d7b75a20d.js.map +1 -0
- package/out/static/client/{2319.2034183eaacce69a.js → 2319.a419f6d93c814f50.js} +12 -8
- package/out/static/client/2319.a419f6d93c814f50.js.map +1 -0
- package/out/static/client/{3092.94a3edc866458ab7.js → 3092.54b703ff89ccdaf7.js} +6 -6
- package/out/static/client/3092.54b703ff89ccdaf7.js.map +1 -0
- package/out/static/client/{3200.024a6b1d06d80026.js → 3200.dc89d9709a81e853.js} +2 -1
- package/out/static/client/{3200.024a6b1d06d80026.js.map → 3200.dc89d9709a81e853.js.map} +1 -1
- package/out/static/client/{486.bb14d2f437221509.js → 486.b6950b0a4cfb9116.js} +2 -2
- package/out/static/client/{486.bb14d2f437221509.js.map → 486.b6950b0a4cfb9116.js.map} +1 -1
- package/out/static/client/{5446.3e0ac5aa93616c6f.js → 5446.2e663885069b1680.js} +4 -2
- package/out/static/client/5446.2e663885069b1680.js.map +1 -0
- package/out/static/client/{603.775311ee1356e86f.js → 603.45bf3e185d1b890d.js} +7 -7
- package/out/static/client/603.45bf3e185d1b890d.js.map +1 -0
- package/out/static/client/{6465.08012ddcd4597c76.js → 6465.2dc41017ae6abc34.js} +2 -1
- package/out/static/client/6465.2dc41017ae6abc34.js.map +1 -0
- package/out/static/client/{6480.09f744cd2fb69ed8.js → 6480.c839ead24f125a7e.js} +3 -2
- package/out/static/client/{6480.09f744cd2fb69ed8.js.map → 6480.c839ead24f125a7e.js.map} +1 -1
- package/out/static/client/7185.278701dcd05fcd30.js +2 -0
- package/out/static/client/7185.278701dcd05fcd30.js.map +1 -0
- package/out/static/client/9379.edc05ee9f550804e.js +2 -0
- package/out/static/client/9379.edc05ee9f550804e.js.map +1 -0
- package/out/static/client/{9784.3c73a0debfcca553.js → 9784.1c8d6e465137fd58.js} +13 -9
- package/out/static/client/{9784.3c73a0debfcca553.js.map → 9784.1c8d6e465137fd58.js.map} +1 -1
- package/out/static/client/{9804.d9ffbe6b7c44eab3.js → 9804.ba52ea55253eca7b.js} +2 -2
- package/out/static/client/{9804.d9ffbe6b7c44eab3.js.map → 9804.ba52ea55253eca7b.js.map} +1 -1
- package/out/static/client/9914.021220acc0d3e777.js +11 -0
- package/out/static/client/9914.021220acc0d3e777.js.map +1 -0
- package/out/static/client/index.0f05d4ac6b3b88a1.js +419 -0
- package/out/static/client/index.0f05d4ac6b3b88a1.js.map +1 -0
- package/out/static/client/{runtime.b178b9749f31202a.js → runtime.c323b9d2153b4ebf.js} +2 -2
- package/out/static/client/{runtime.b178b9749f31202a.js.map → runtime.c323b9d2153b4ebf.js.map} +1 -1
- package/out/static/client/stats.json +200 -200
- package/out/static/client/styles-breadcrumbs-bar.02910e49bb8b2372.css +2 -0
- package/out/static/client/styles-breadcrumbs-bar.02910e49bb8b2372.css.map +1 -0
- package/out/static/client/{styles-content-section.d18f07ab3d79a1d2.css → styles-content-section.6dc04fb9b3f3d595.css} +2 -2
- package/out/static/client/{styles-content-section.d18f07ab3d79a1d2.css.map → styles-content-section.6dc04fb9b3f3d595.css.map} +1 -1
- package/out/static/client/styles-curriculum-landing.cbaf6ff367369a26.css.map +1 -1
- package/out/static/client/styles-curriculum-module.c7ec78d3e724cf64.css.map +1 -1
- package/out/static/client/{styles-global.fb7afecd89ca2dff.js → styles-global.01d60465c4584631.js} +1 -1
- package/out/static/client/styles-global.4031cdde644ed6ce.css +2 -0
- package/out/static/client/{styles-global.684fd2c5254c94b8.css.map → styles-global.4031cdde644ed6ce.css.map} +1 -1
- package/out/static/client/styles-menu.c41c14be9597dcd9.css +2 -0
- package/out/static/client/styles-menu.c41c14be9597dcd9.css.map +1 -0
- package/out/static/client/watify_bg.c5a182c47876cd2b.wasm +0 -0
- package/out/static/legacy/{1539.ad5e9bc68ca36ebd.js → 1539.f16c6732d55f64b7.js} +3 -3
- package/out/static/legacy/{1539.ad5e9bc68ca36ebd.js.map → 1539.f16c6732d55f64b7.js.map} +1 -1
- package/out/static/legacy/7185.278701dcd05fcd30.js +2 -0
- package/out/static/legacy/7185.278701dcd05fcd30.js.map +1 -0
- package/out/static/legacy/asset-manifest.json +9 -9
- package/out/static/legacy/{index.ad3600b01e18974e.html → index.19cded28f6c1e506.html} +1 -1
- package/out/static/legacy/{index.5592b02d966df8ba.js → index.e979e65eb8758f6f.js} +3 -3
- package/out/static/legacy/{index.5592b02d966df8ba.js.map → index.e979e65eb8758f6f.js.map} +1 -1
- package/out/static/legacy/stats.json +13 -13
- package/out/static/legacy/watify_bg.c5a182c47876cd2b.wasm +0 -0
- package/out/static/legacy/{yari.8ce0be252d1ae155.js → yari.7f26dc58679ef833.js} +3 -3
- package/out/static/legacy/{yari.8ce0be252d1ae155.js.map → yari.7f26dc58679ef833.js.map} +1 -1
- package/out/static/ssr/7185.js +1 -1
- package/out/static/ssr/7185.js.map +1 -1
- package/out/static/ssr/index.js +369 -620
- package/out/static/ssr/index.js.map +1 -1
- package/out/static/ssr/stats.json +4 -4
- package/out/static/ssr/watify_bg.c5a182c47876cd2b.wasm +0 -0
- package/package.json +20 -20
- package/scripts/npm-test.js +22 -0
- package/server.js +22 -4
- package/utils/dnt-helper.js +59 -0
- package/utils/name-transformation.js +40 -0
- package/utils/telemetry-opt-out.js +12 -0
- package/wdio.conf.js +4 -2
- package/components/menu/check-missing-docs.js +0 -44
- package/out/static/client/1231.84c230e0fa92f2d4.js.map +0 -1
- package/out/static/client/2190.7995f19655987265.js.map +0 -1
- package/out/static/client/2319.2034183eaacce69a.js.map +0 -1
- package/out/static/client/3092.94a3edc866458ab7.js.map +0 -1
- package/out/static/client/5446.3e0ac5aa93616c6f.js.map +0 -1
- package/out/static/client/603.775311ee1356e86f.js.map +0 -1
- package/out/static/client/6465.08012ddcd4597c76.js.map +0 -1
- package/out/static/client/7185.a014a928e9a39779.js +0 -2
- package/out/static/client/7185.a014a928e9a39779.js.map +0 -1
- package/out/static/client/9379.7cdf58b4fb5efa66.js +0 -2
- package/out/static/client/9379.7cdf58b4fb5efa66.js.map +0 -1
- package/out/static/client/9914.251fe19f0038e97b.js +0 -11
- package/out/static/client/9914.251fe19f0038e97b.js.map +0 -1
- package/out/static/client/index.26176fe4ab13dce5.js +0 -268
- package/out/static/client/index.26176fe4ab13dce5.js.map +0 -1
- package/out/static/client/styles-breadcrumbs-bar.e2fa6dfb04a38166.css +0 -2
- package/out/static/client/styles-breadcrumbs-bar.e2fa6dfb04a38166.css.map +0 -1
- package/out/static/client/styles-global.684fd2c5254c94b8.css +0 -2
- package/out/static/client/styles-menu.5193bf2642ae7d64.css +0 -2
- package/out/static/client/styles-menu.5193bf2642ae7d64.css.map +0 -1
- package/out/static/client/watify_bg.9877982a693ec402.wasm +0 -0
- package/out/static/legacy/7185.a014a928e9a39779.js +0 -2
- package/out/static/legacy/7185.a014a928e9a39779.js.map +0 -1
- package/out/static/legacy/watify_bg.9877982a693ec402.wasm +0 -0
- package/out/static/ssr/watify_bg.9877982a693ec402.wasm +0 -0
- /package/out/static/client/{2190.7995f19655987265.js.LICENSE.txt → 2190.a21d8b0d7b75a20d.js.LICENSE.txt} +0 -0
- /package/out/static/client/{2319.2034183eaacce69a.js.LICENSE.txt → 2319.a419f6d93c814f50.js.LICENSE.txt} +0 -0
- /package/out/static/client/{603.775311ee1356e86f.js.LICENSE.txt → 603.45bf3e185d1b890d.js.LICENSE.txt} +0 -0
- /package/out/static/client/{6480.09f744cd2fb69ed8.js.LICENSE.txt → 6480.c839ead24f125a7e.js.LICENSE.txt} +0 -0
- /package/out/static/client/{9784.3c73a0debfcca553.js.LICENSE.txt → 9784.1c8d6e465137fd58.js.LICENSE.txt} +0 -0
- /package/out/static/client/{index.26176fe4ab13dce5.js.LICENSE.txt → index.0f05d4ac6b3b88a1.js.LICENSE.txt} +0 -0
- /package/out/static/legacy/{1539.ad5e9bc68ca36ebd.js.LICENSE.txt → 1539.f16c6732d55f64b7.js.LICENSE.txt} +0 -0
- /package/out/static/legacy/{index.5592b02d966df8ba.js.LICENSE.txt → index.e979e65eb8758f6f.js.LICENSE.txt} +0 -0
- /package/out/static/legacy/{yari.8ce0be252d1ae155.js.LICENSE.txt → yari.7f26dc58679ef833.js.LICENSE.txt} +0 -0
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
"assets": [
|
|
10
10
|
{
|
|
11
11
|
"name": "index.js",
|
|
12
|
-
"size":
|
|
12
|
+
"size": 1422651
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
15
|
"filteredAssets": 0,
|
|
16
|
-
"assetsSize":
|
|
16
|
+
"assetsSize": 1422651,
|
|
17
17
|
"auxiliaryAssets": [
|
|
18
18
|
{
|
|
19
19
|
"name": "desktop-saving-page.bbb8eedefb3e848f.png",
|
|
@@ -317,7 +317,7 @@
|
|
|
317
317
|
},
|
|
318
318
|
{
|
|
319
319
|
"name": "index.js.map",
|
|
320
|
-
"size":
|
|
320
|
+
"size": 4231417
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
323
|
"name": "deno.aed70d20abbf1067.svg",
|
|
@@ -512,7 +512,7 @@
|
|
|
512
512
|
"size": 135602
|
|
513
513
|
}
|
|
514
514
|
],
|
|
515
|
-
"auxiliaryAssetsSize":
|
|
515
|
+
"auxiliaryAssetsSize": 8694404,
|
|
516
516
|
"children": {},
|
|
517
517
|
"childAssets": {}
|
|
518
518
|
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mdn/fred",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"repository": "https://github.com/mdn/fred",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"author": "MDN Web Docs",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"@lit-labs/ssr": "^3.3.1",
|
|
45
45
|
"@lit-labs/ssr-client": "^1.1.7",
|
|
46
46
|
"@lit/task": "^1.0.3",
|
|
47
|
-
"@mdn/rari": "0.1.
|
|
48
|
-
"@mdn/watify": "^1.1.
|
|
47
|
+
"@mdn/rari": "0.1.54",
|
|
48
|
+
"@mdn/watify": "^1.1.5",
|
|
49
49
|
"@mozilla/glean": "^5.0.6",
|
|
50
50
|
"codemirror": "^6.0.1",
|
|
51
51
|
"compression": "^1.8.1",
|
|
@@ -64,52 +64,51 @@
|
|
|
64
64
|
"source-map-support": "^0.5.21"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@codemirror/autocomplete": "^6.19.
|
|
68
|
-
"@codemirror/commands": "^6.
|
|
67
|
+
"@codemirror/autocomplete": "^6.19.1",
|
|
68
|
+
"@codemirror/commands": "^6.10.0",
|
|
69
69
|
"@codemirror/language": "^6.11.3",
|
|
70
|
-
"@codemirror/lint": "^6.9.
|
|
70
|
+
"@codemirror/lint": "^6.9.1",
|
|
71
71
|
"@codemirror/view": "^6.38.6",
|
|
72
72
|
"@csstools/postcss-global-data": "^3.1.0",
|
|
73
73
|
"@eslint/compat": "^1.4.0",
|
|
74
|
-
"@eslint/js": "^9.
|
|
74
|
+
"@eslint/js": "^9.38.0",
|
|
75
75
|
"@jackolope/lit-analyzer": "^3.2.0",
|
|
76
76
|
"@jackolope/ts-lit-plugin": "^3.1.6",
|
|
77
|
-
"@mdn/browser-compat-data": "^7.1.
|
|
77
|
+
"@mdn/browser-compat-data": "^7.1.17",
|
|
78
78
|
"@mdn/yari": "^5.1.2",
|
|
79
79
|
"@rsdoctor/rspack-plugin": "^1.2.3",
|
|
80
80
|
"@rspack/cli": "^1.5.8",
|
|
81
81
|
"@rspack/core": "^1.5.8",
|
|
82
82
|
"@svgr/webpack": "^8.1.0",
|
|
83
83
|
"@types/compression": "^1.8.1",
|
|
84
|
-
"@types/cookie-parser": "^1.4.
|
|
85
|
-
"@types/express": "^5.0.
|
|
84
|
+
"@types/cookie-parser": "^1.4.10",
|
|
85
|
+
"@types/express": "^5.0.5",
|
|
86
86
|
"@types/he": "^1.2.3",
|
|
87
87
|
"@types/insane": "^1.0.0",
|
|
88
88
|
"@types/mocha": "^10.0.10",
|
|
89
|
-
"@types/node": "^22.18.
|
|
89
|
+
"@types/node": "^22.18.12",
|
|
90
90
|
"@types/prismjs": "^1.26.5",
|
|
91
|
-
"@types/webpack-hot-middleware": "^2.25.
|
|
92
|
-
"@typescript-eslint/eslint-plugin": "^8.46.1",
|
|
91
|
+
"@types/webpack-hot-middleware": "^2.25.12",
|
|
93
92
|
"@wdio/cli": "^9.20.0",
|
|
94
93
|
"@wdio/globals": "^9.17.0",
|
|
95
94
|
"@wdio/local-runner": "^9.20.0",
|
|
96
95
|
"@wdio/mocha-framework": "^9.20.0",
|
|
97
96
|
"@wdio/spec-reporter": "^9.20.0",
|
|
98
|
-
"@zip.js/zip.js": "^2.8.
|
|
97
|
+
"@zip.js/zip.js": "^2.8.8",
|
|
99
98
|
"css-loader": "^7.1.2",
|
|
100
99
|
"css-minimizer-webpack-plugin": "^7.0.2",
|
|
101
100
|
"dexie": "^4.2.1",
|
|
102
101
|
"downshift": "^9.0.10",
|
|
103
|
-
"eslint": "^9.
|
|
102
|
+
"eslint": "^9.38.0",
|
|
104
103
|
"eslint-config-prettier": "^10.1.8",
|
|
105
104
|
"eslint-plugin-import": "^2.31.0",
|
|
106
|
-
"eslint-plugin-jsdoc": "^
|
|
105
|
+
"eslint-plugin-jsdoc": "^61.1.9",
|
|
107
106
|
"eslint-plugin-lit": "^2.0.0",
|
|
108
107
|
"eslint-plugin-n": "^17.23.1",
|
|
109
|
-
"eslint-plugin-unicorn": "^
|
|
108
|
+
"eslint-plugin-unicorn": "^62.0.0",
|
|
110
109
|
"eslint-plugin-wc": "^3.0.2",
|
|
111
110
|
"globals": "^16.4.0",
|
|
112
|
-
"lefthook": "^
|
|
111
|
+
"lefthook": "^2.0.1",
|
|
113
112
|
"postcss": "^8.5.3",
|
|
114
113
|
"postcss-custom-media": "^11.0.5",
|
|
115
114
|
"postcss-loader": "^8.2.0",
|
|
@@ -119,13 +118,14 @@
|
|
|
119
118
|
"resolve-url-loader": "^5.0.0",
|
|
120
119
|
"rspack-manifest-plugin": "^5.1.0",
|
|
121
120
|
"sass-embedded": "^1.93.2",
|
|
122
|
-
"sass-loader": "^16.0.
|
|
121
|
+
"sass-loader": "^16.0.6",
|
|
123
122
|
"spdy": "^4.0.2",
|
|
124
123
|
"stylelint": "^16.25.0",
|
|
125
|
-
"stylelint-config-recess-order": "^7.
|
|
124
|
+
"stylelint-config-recess-order": "^7.4.0",
|
|
126
125
|
"stylelint-config-standard": "^39.0.1",
|
|
127
126
|
"svgo-loader": "^4.0.0",
|
|
128
127
|
"typescript": "^5.9.3",
|
|
128
|
+
"typescript-eslint": "^8.46.2",
|
|
129
129
|
"webpack-dev-middleware": "^7.4.5",
|
|
130
130
|
"webpack-hot-middleware": "^2.26.1",
|
|
131
131
|
"webpack-merge": "^6.0.1",
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { concurrently } from "concurrently";
|
|
2
|
+
|
|
3
|
+
concurrently(
|
|
4
|
+
[
|
|
5
|
+
{
|
|
6
|
+
command: `npm run wdio`,
|
|
7
|
+
name: "wdio",
|
|
8
|
+
prefixColor: "green",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
cwd: process.env.CONTENT_REPO_ROOT,
|
|
12
|
+
command: `yarn start`,
|
|
13
|
+
name: "content",
|
|
14
|
+
prefixColor: "blue",
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
{
|
|
18
|
+
killOthersOn: ["failure", "success"],
|
|
19
|
+
restartTries: 0,
|
|
20
|
+
successCondition: "first",
|
|
21
|
+
},
|
|
22
|
+
);
|
package/server.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
1
2
|
import { readFile } from "node:fs/promises";
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import { Worker } from "node:worker_threads";
|
|
@@ -8,7 +9,12 @@ import { createProxyMiddleware } from "http-proxy-middleware";
|
|
|
8
9
|
import openEditor from "open-editor";
|
|
9
10
|
|
|
10
11
|
import { FRED_BUILD_ROOT } from "./build/env.js";
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
OPEN_BROWSER_ON_START,
|
|
14
|
+
PLAYGROUND_PORT,
|
|
15
|
+
PORT,
|
|
16
|
+
WRITER_MODE,
|
|
17
|
+
} from "./components/env/index.js";
|
|
12
18
|
import { handleRunner } from "./vendor/yari/libs/play/index.js";
|
|
13
19
|
|
|
14
20
|
import "source-map-support/register.js";
|
|
@@ -323,9 +329,21 @@ export async function startServer() {
|
|
|
323
329
|
}
|
|
324
330
|
|
|
325
331
|
const httpServer = app.listen(PORT, () => {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
);
|
|
332
|
+
const scheme = http2 ? "https" : "http";
|
|
333
|
+
const url = `${scheme}://localhost:${PORT}`;
|
|
334
|
+
console.log(`Server started at ${url}`);
|
|
335
|
+
// Auto open browser
|
|
336
|
+
if (OPEN_BROWSER_ON_START) {
|
|
337
|
+
const platform = process.platform;
|
|
338
|
+
|
|
339
|
+
const command =
|
|
340
|
+
platform === "win32"
|
|
341
|
+
? "start"
|
|
342
|
+
: platform === "darwin"
|
|
343
|
+
? "open"
|
|
344
|
+
: "xdg-open";
|
|
345
|
+
spawn(command, [url]);
|
|
346
|
+
}
|
|
329
347
|
});
|
|
330
348
|
|
|
331
349
|
const playServer = play.listen(PLAYGROUND_PORT, () => {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true or false based on whether doNotTrack is enabled. It also takes into account the
|
|
3
|
+
* anomalies, such as !bugzilla 887703, which effect versions of Fx 31 and lower. It also handles
|
|
4
|
+
* IE versions on Windows 7, 8 and 8.1, where the DNT implementation does not honor the spec.
|
|
5
|
+
* Based on https://github.com/mozmeao/dnt-helper/blob/main/src/mozilla-dnt-helper.js
|
|
6
|
+
* @see https://bugzilla.mozilla.org/show_bug.cgi?id=1217896 for more details
|
|
7
|
+
* @param {string} [dnt] - An optional mock doNotTrack string to ease unit testing.
|
|
8
|
+
* @param {string} [ua] - An optional mock userAgent string to ease unit testing.
|
|
9
|
+
* @returns {boolean} true if enabled else false
|
|
10
|
+
*/
|
|
11
|
+
export function dntEnabled(dnt, ua) {
|
|
12
|
+
// for old version of IE we need to use the msDoNotTrack property of navigator
|
|
13
|
+
// on newer versions, and newer platforms, this is doNotTrack but, on the window object
|
|
14
|
+
// Safari also exposes the property on the window object.
|
|
15
|
+
let dntStatus =
|
|
16
|
+
dnt ||
|
|
17
|
+
navigator.doNotTrack ||
|
|
18
|
+
// @ts-expect-error - non-standard property
|
|
19
|
+
globalThis.doNotTrack ||
|
|
20
|
+
// @ts-expect-error - non-standard property
|
|
21
|
+
navigator.msDoNotTrack;
|
|
22
|
+
const userAgent = ua || navigator.userAgent;
|
|
23
|
+
|
|
24
|
+
// List of Windows versions known to not implement DNT according to the standard.
|
|
25
|
+
const anomalousWinVersions = [
|
|
26
|
+
"Windows NT 6.1",
|
|
27
|
+
"Windows NT 6.2",
|
|
28
|
+
"Windows NT 6.3",
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const fxMatch = userAgent.match(/Firefox\/(\d+)/);
|
|
32
|
+
const ieRegEx = /MSIE|Trident/i;
|
|
33
|
+
const isIE = ieRegEx.test(userAgent);
|
|
34
|
+
// Matches from Windows up to the first occurance of ; un-greedily
|
|
35
|
+
// http://www.regexr.com/3c2el
|
|
36
|
+
const platform = userAgent.match(/Windows.+?(?=;)/g);
|
|
37
|
+
|
|
38
|
+
// With old versions of IE, DNT did not exist so we simply return false;
|
|
39
|
+
if (isIE && typeof Array.prototype.indexOf !== "function") {
|
|
40
|
+
return false;
|
|
41
|
+
} else if (fxMatch && Number.parseInt(fxMatch[1] || "0", 10) < 32) {
|
|
42
|
+
// Can't say for sure if it is 1 or 0, due to Fx bug 887703
|
|
43
|
+
dntStatus = "Unspecified";
|
|
44
|
+
} else if (
|
|
45
|
+
isIE &&
|
|
46
|
+
platform &&
|
|
47
|
+
anomalousWinVersions.includes(platform.toString())
|
|
48
|
+
) {
|
|
49
|
+
// default is on, which does not honor the specification
|
|
50
|
+
dntStatus = "Unspecified";
|
|
51
|
+
} else {
|
|
52
|
+
// sets dntStatus to Disabled or Enabled based on the value returned by the browser.
|
|
53
|
+
// If dntStatus is undefined, it will be set to Unspecified
|
|
54
|
+
// @ts-expect-error - DNT status can be various types
|
|
55
|
+
dntStatus = { 0: "Disabled", 1: "Enabled" }[dntStatus] || "Unspecified";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return dntStatus === "Enabled";
|
|
59
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const ACRONYMS = new Set(["MDN", "IX"]);
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Converts a kebab-case string to PascalCase,
|
|
5
|
+
* useful for converting a web component tag name to its
|
|
6
|
+
* associated class name.
|
|
7
|
+
*
|
|
8
|
+
* e.g. `mdn-custom-element` -> `MDNCustomElement`
|
|
9
|
+
*
|
|
10
|
+
* @param {string} name kebab-case string
|
|
11
|
+
* @returns {string} PascalCase string
|
|
12
|
+
*/
|
|
13
|
+
export function kebabToPascalCase(name) {
|
|
14
|
+
return name
|
|
15
|
+
.split("-")
|
|
16
|
+
.map((word) => {
|
|
17
|
+
if (ACRONYMS.has(word.toUpperCase())) {
|
|
18
|
+
return word.toUpperCase();
|
|
19
|
+
}
|
|
20
|
+
return word.charAt(0).toUpperCase() + word.slice(1);
|
|
21
|
+
})
|
|
22
|
+
.join("");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Converts a camelCase or PascalCase string to kebab-case,
|
|
27
|
+
* useful for converting a web component class name to its
|
|
28
|
+
* associated tag name.
|
|
29
|
+
*
|
|
30
|
+
* e.g. `MDNCustomElement` -> `mdn-custom-element`
|
|
31
|
+
*
|
|
32
|
+
* @param {string} name camelCase or PascalCase string
|
|
33
|
+
* @returns {string} kebab-case string
|
|
34
|
+
*/
|
|
35
|
+
export function camelToKebabCase(name) {
|
|
36
|
+
return name
|
|
37
|
+
.replaceAll(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
38
|
+
.replaceAll(/([A-Z])([A-Z][a-z])/g, "$1-$2")
|
|
39
|
+
.toLowerCase();
|
|
40
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME = "moz-1st-party-data-opt-out";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Checks if user has opted out of first-party data collection.
|
|
5
|
+
* @param {string} [cookie] - An optional mock cookie string to ease unit testing.
|
|
6
|
+
* @returns {boolean} True if user has opted out, false otherwise
|
|
7
|
+
*/
|
|
8
|
+
export function userIsOptedOut(cookie) {
|
|
9
|
+
return (cookie || document.cookie)
|
|
10
|
+
.split("; ")
|
|
11
|
+
.includes(`${FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME}=true`);
|
|
12
|
+
}
|
package/wdio.conf.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const FRED_PORT = process.env.FRED_PORT || "3000";
|
|
2
|
+
|
|
1
3
|
/** @type {WebdriverIO.Config} */
|
|
2
4
|
export const config = {
|
|
3
5
|
runner: "local",
|
|
@@ -18,13 +20,13 @@ export const config = {
|
|
|
18
20
|
ui: "bdd",
|
|
19
21
|
timeout: 60_000,
|
|
20
22
|
},
|
|
21
|
-
baseUrl:
|
|
23
|
+
baseUrl: `http://localhost:${FRED_PORT}/`,
|
|
22
24
|
async before(_, __, browser) {
|
|
23
25
|
console.log("waiting for servers to start");
|
|
24
26
|
await browser.waitUntil(
|
|
25
27
|
async () => {
|
|
26
28
|
try {
|
|
27
|
-
await browser.url(
|
|
29
|
+
await browser.url(`http://localhost:${FRED_PORT}`);
|
|
28
30
|
await browser.url("http://localhost:8083");
|
|
29
31
|
return true;
|
|
30
32
|
} catch {
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { MISSING_DOCS } from "./constants.js";
|
|
2
|
-
|
|
3
|
-
for (const [locale, slugs] of Object.entries(MISSING_DOCS)) {
|
|
4
|
-
console.log(`\n=== ${locale} ===`);
|
|
5
|
-
|
|
6
|
-
const found = [];
|
|
7
|
-
let checkedCount = 0;
|
|
8
|
-
|
|
9
|
-
for (const slug of slugs) {
|
|
10
|
-
const url = `https://developer.mozilla.org/${locale}/docs/${slug}`;
|
|
11
|
-
process.stdout.write(`- ${slug} … `);
|
|
12
|
-
checkedCount++;
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
const res = await fetch(url, { method: "HEAD" });
|
|
16
|
-
|
|
17
|
-
if (res.status === 200) {
|
|
18
|
-
console.log(`✅ (${res.status})`);
|
|
19
|
-
found.push(slug);
|
|
20
|
-
} else if (res.status === 404) {
|
|
21
|
-
console.log(`❌ (${res.status})`);
|
|
22
|
-
} else {
|
|
23
|
-
console.log(`⚠️ (${res.status})`);
|
|
24
|
-
}
|
|
25
|
-
} catch (error) {
|
|
26
|
-
console.log(`ERROR: ${error}`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (found.length > 0) {
|
|
31
|
-
console.log(
|
|
32
|
-
`\n ${found.length} of ${checkedCount} slugs exist and can be removed from MISSING_DOCS:`,
|
|
33
|
-
);
|
|
34
|
-
for (const slug of found) {
|
|
35
|
-
console.log(` - ${slug}`);
|
|
36
|
-
}
|
|
37
|
-
} else {
|
|
38
|
-
console.log(
|
|
39
|
-
`\n All ${checkedCount} slugs are still missing for ${locale}`,
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
console.log(`\n=== Scan complete ===`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"1231.84c230e0fa92f2d4.js","sources":["webpack://@mdn/fred/./components/observatory-tests-and-scores/element.css","webpack://@mdn/fred/./components/global/global.css?1b68","webpack://@mdn/fred/./components/observatory-tests-and-scores/element.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../global/global.css\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block}.error{background-color:var(--error-bg,#fee);border-radius:.25rem;color:var(--error-color,#d33);margin:1rem 0;padding:1rem}section{margin-bottom:3rem}h3{font-size:var(--font-size-large);font-weight:var(--font-weight-normal);line-height:var(--font-line-content);margin-bottom:1rem;margin-top:2rem}.table-container{margin:1rem 0;overflow-x:auto}table{border-collapse:collapse;min-width:600px;width:100%}td,th{border:1px solid var(--color-border-primary);padding:.5rem .75rem;text-align:left}th{background-color:var(--color-background-secondary,#f5f5f5);font-weight:700}th[align=center]{text-align:center}tr:nth-child(2n){background-color:var(--color-background-secondary)}td:last-child{text-align:center}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `*,:after,:before{box-sizing:border-box}button,input,select,textarea{font:inherit}button{color:inherit;cursor:pointer}img{height:auto;max-width:100%}a{color:var(--color-link-normal)}[hidden]{display:none!important}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import { Task } from \"@lit/task\";\nimport { LitElement, html } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport { OBSERVATORY_API_URL } from \"../env/index.js\";\n\nimport styles from \"./element.css?lit\";\n\nexport class MDNObservatoryTestsAndScores extends LitElement {\n static styles = styles;\n static ssr = false;\n\n _fetchMatrixTask = new Task(this, {\n task: async () => {\n const response = await fetch(\n `${OBSERVATORY_API_URL}/api/v2/recommendation_matrix`,\n );\n\n if (!response.ok) {\n return [];\n }\n\n /**\n * @type {import(\"@observatory\").ScoringResponse}\n */\n const data = await response.json();\n\n const ret = data.map((entry) => ({\n ...entry,\n results: entry.results.map((result) => ({\n ...result,\n description_html: result.description,\n })),\n }));\n return ret;\n },\n args: () => [],\n });\n\n render() {\n return this._fetchMatrixTask.render({\n pending: () =>\n html`<div class=\"loading\">Loading tests and scoring data...</div>`,\n complete: (data) =>\n data.map(\n (entry) => html`\n <section>\n <h3 id=${entry.name}>${entry.title}</h3>\n <p>\n See <a href=${entry.mdnLink}>${entry.title}</a> for guidance.\n </p>\n <figure class=\"table-container\">\n <table>\n <thead>\n <tr>\n <th>Test result</th>\n <th>Description</th>\n <th align=\"center\">Modifier</th>\n </tr>\n </thead>\n <tbody>\n ${entry.results.map(\n (result) => html`\n <tr>\n <td>${result.name}</td>\n <td>${unsafeHTML(result.description_html)}</td>\n <td>${result.scoreModifier}</td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n </figure>\n </section>\n `,\n ),\n error: (error) => html`\n <div class=\"error\">\n Failed to load tests and scoring data. Please try again later.\n ${console.error(\"Observatory matrix fetch error:\", error)}\n </div>\n `,\n });\n }\n}\n\ncustomElements.define(\n \"mdn-observatory-tests-and-scores\",\n MDNObservatoryTestsAndScores,\n);\n"],"names":["MDNObservatoryTestsAndScores","s","fetch","console","customElements"],"mappings":"oNAKI,EAA0B,IAA4B,KAC1D,EAAwB,CAAC,CAAC,GAAiC,EAE3D,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,qtBAAstB,GAAG,EAElwB,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,C,4ECPnD,EAA0B,A,SAA4B,KAE1D,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,wNAAyN,GAAG,EAErQ,MAAe,EAAwB,QAAQ,E,iKCCxC,IAAMA,6BAAN,MAAMA,qCAAqC,IAAU,CAC1D,OAAO,OAASC,EAAA,CAAM,AAAC,AACvB,QAAO,IAAM,EAAM,AAEnB,kBAAmB,IAAI,IAAI,CAAC,IAAI,CAAE,CAChC,KAAM,UACJ,IAAM,EAAW,MAAMC,MACrB,CAAC,EAAE,GAAmB,CAAC,6BAA6B,CAAC,SAGvD,AAAK,EAAS,EAAE,CASJ,AAFC,OAAM,EAAS,IAAI,EAAC,EAEhB,GAAG,CAAC,AAAC,GAAW,EAC/B,GAAG,CAAK,CACR,QAAS,EAAM,OAAO,CAAC,GAAG,CAAC,AAAC,GAAY,EACtC,GAAG,CAAM,CACT,iBAAkB,EAAO,WAAW,AACtC,GACF,IAdS,EAAE,AAgBb,EACA,KAAM,IAAM,EAAE,AAChB,EAAG,AAEH,SAAS,CACP,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAClC,QAAS,IACP,QAAI,CAAC,4DAA4D,CAAC,CACpE,SAAU,AAAC,GACT,EAAK,GAAG,CACN,AAAC,GAAU,QAAI,CAAC;;qBAEL,EAAE,EAAM,IAAI,CAAC,CAAC,EAAE,EAAM,KAAK,CAAC;;4BAErB,EAAE,EAAM,OAAO,CAAC,CAAC,EAAE,EAAM,KAAK,CAAC;;;;;;;;;;;;oBAYvC,EAAE,EAAM,OAAO,CAAC,GAAG,CACjB,AAAC,GAAW,QAAI,CAAC;;8BAET,EAAE,EAAO,IAAI,CAAC;8BACd,EAAE,QAAW,EAAO,gBAAgB,EAAE;8BACtC,EAAE,EAAO,aAAa,CAAC;;sBAE/B,CAAC,EACD;;;;;UAKZ,CAAC,EAEL,MAAO,AAAC,GAAU,QAAI,CAAC;;;UAGnB,EAAEC,QAAQ,KAAK,CAAC,kCAAmC,GAAO;;MAE9D,CAAC,AACH,EACF,CACF,EAEAC,eAAe,MAAM,CACnB,mCACAJ,6B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"2190.7995f19655987265.js","sources":["webpack://@mdn/fred/./components/modal/element.css","webpack://@mdn/fred/./components/modal/element.js","webpack://@mdn/fred/./node_modules/lit-html/directives/if-defined.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `dialog{border:1px solid var(--color-border-primary);border-radius:.25rem;padding:0}header{display:flex;padding:.5rem}header h2{margin:0}header mdn-button{margin-left:auto}slot{display:block;padding:0 1rem 1rem}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { LitElement, html, nothing } from \"lit\";\n\nimport exitIcon from \"../icon/cancel.svg?lit\";\n\nimport \"../button/element.js\";\nimport styles from \"./element.css?lit\";\n\nexport class MDNModal extends LitElement {\n static styles = styles;\n\n static properties = {\n modalTitle: { type: String, attribute: \"modal-title\" },\n };\n\n constructor() {\n super();\n this.modalTitle = \"\";\n }\n\n showModal() {\n this.shadowRoot?.querySelector(\"dialog\")?.showModal();\n }\n\n close() {\n this.shadowRoot?.querySelector(\"dialog\")?.close();\n }\n\n render() {\n return html`\n <dialog closedby=\"any\">\n <header>\n ${this.modalTitle ? html`<h2>${this.modalTitle}</h2>` : nothing}\n <mdn-button\n variant=\"plain\"\n icon-only\n .icon=${exitIcon}\n @click=${this.close}\n >Exit modal</mdn-button\n >\n </header>\n <slot></slot>\n </dialog>\n `;\n }\n}\n\ncustomElements.define(\"mdn-modal\", MDNModal);\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n"],"names":["MDNModal","String","customElements","o"],"mappings":";gMAII,EAA0B,SAA4B,KAE1D,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,qNAAsN,GAAG,EAElQ,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,iHCDhD,IAAMA,SAAN,MAAMA,iBAAiB,IAAU,CACtC,OAAO,OAAS,GAAM,AAAC,AAEvB,QAAO,WAAa,CAClB,WAAY,CAAE,KAAMC,OAAQ,UAAW,aAAc,CACvD,CAAE,AAEF,cAAc,CACZ,KAAK,GACL,IAAI,CAAC,UAAU,CAAG,EACpB,CAEA,WAAY,CACV,IAAI,CAAC,UAAU,EAAE,cAAc,WAAW,WAC5C,CAEA,OAAQ,CACN,IAAI,CAAC,UAAU,EAAE,cAAc,WAAW,OAC5C,CAEA,QAAS,CACP,MAAO,QAAI,CAAC;;;UAGN,EAAE,IAAI,CAAC,UAAU,CAAG,QAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAG,IAAO,CAAC;;;;kBAIxD,EAAE,GAAQ,CAAC;mBACV,EAAE,IAAI,CAAC,KAAK,CAAC;;;;;;IAM5B,CAAC,AACH,CACF,EAEAC,eAAe,MAAM,CAAC,YAAaF,iECzChC,IAAM,EAAEG,GAAGA,GAAG,IAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"2319.2034183eaacce69a.js","sources":["webpack://@mdn/fred/./components/scrim-inline/element.css","webpack://@mdn/fred/./components/visually-hidden/global.css?228a","webpack://@mdn/fred/./components/scrim-inline/assets/scrim-play.svg","webpack://@mdn/fred/./components/scrim-inline/element.js","webpack://@mdn/fred/./node_modules/lit-html/directives/if-defined.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../visually-hidden/global.css\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../icon/fullscreen-enter.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"../icon/cancel.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_2___ = new URL(\"../icon/external-link.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_3___ = new URL(\"assets/scrimba-logo.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_4___ = new URL(\"assets/scrim-hexagons.svg\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_5___ = new URL(\"assets/scrim-bg.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{aspect-ratio:1.5;display:block;margin:.5rem auto;max-width:36rem;overflow:hidden;width:100%}*{box-sizing:border-box}button{appearance:none;background:none;border:none;padding:0}dialog{display:contents}dialog[open]{background-color:#0009;height:90vh;width:90vw}.inner{background-color:#000;border:1px solid #000;container-type:size;flex-direction:column;height:100%}.header,.inner{display:flex;width:100%}.header{align-items:center;background:#000;gap:.25rem;margin:0;min-height:1.75rem;padding:0 .5rem}.header span{color:#fff;font-size:var(--font-size-small);margin-right:auto}.scrim-fullscreen,.scrim-link{background-color:#fff;cursor:pointer;height:1rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1rem}:is(.scrim-fullscreen,.scrim-link):hover{background-color:var(--curriculum-color)}.enter:is(.scrim-fullscreen,.scrim-link){-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___})}.exit:is(.scrim-fullscreen,.scrim-link){-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_1___})}.scrim-link:is(.scrim-fullscreen,.scrim-link){-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_2___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_2___});-webkit-mask-size:75%;mask-size:75%}.body{flex:1;font-size:4cqmin;position:relative}.background{background-color:#453c78;background-image:url(${___CSS_LOADER_URL_REPLACEMENT_3___}),url(${___CSS_LOADER_URL_REPLACEMENT_4___}),url(${___CSS_LOADER_URL_REPLACEMENT_5___});background-position:1.5em 1.5em,100%,50%;background-repeat:no-repeat;background-size:auto .6em,contain,cover;inset:0;position:absolute}.background h1{bottom:0;color:var(--color-white);font-family:BarlowCondensed-SemiBold,Inter,sans-serif;font-size:3em;font-weight:var(--font-weight-bold);left:0;line-height:var(--font-line-ui);margin:.5em;position:absolute;text-transform:uppercase;text-wrap:balance;width:60%}.background-noise{filter:url(#noise);inset:0;mix-blend-mode:soft-light;position:absolute}.open,iframe{border:none;height:100%;position:absolute;width:100%}.open{--color:#8cb4ffcc;background-image:var(--scrim-img);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;font-size:inherit}.open:hover{--color:#8cb4ffe5}.open svg{height:9em;width:auto;stroke-width:2px}:is(.open svg) circle{fill:var(--color)}:is(.open svg) path{fill:#fff}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.visually-hidden{border:0!important;clip-path:inset(50%)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"#000\" viewBox=\"0 0 112 112\"><circle cx=\"55.764\" cy=\"55.764\" r=\"41.823\"/><path d=\"M69.011 57.428a2 2 0 0 0 0-3.328L50.903 42.027c-1.33-.886-3.11.067-3.11 1.664v24.145c0 1.598 1.78 2.55 3.11 1.664z\"/></svg>`;","import { LitElement, html, nothing } from \"lit\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport playSvg from \"./assets/scrim-play.svg?lit\";\nimport styles from \"./element.css?lit\";\n\nexport class MDNScrimInline extends LitElement {\n static styles = styles;\n\n static ssr = false;\n\n static properties = {\n url: { type: String },\n img: { type: String },\n scrimTitle: { type: String, attribute: \"scrimtitle\" },\n _fullscreen: { state: true },\n _scrimLoaded: { state: true },\n };\n\n constructor() {\n super();\n /** @type {string | undefined} */\n this.url = undefined;\n /** @type {string | undefined} */\n this._fullUrl = undefined;\n /** @type {string | undefined} */\n this._scrimId = undefined;\n\n /** @type {string | undefined} */\n this.img = undefined;\n /** @type {import(\"lit/directives/style-map.js\").StyleInfo} */\n this._imgStyle = {};\n\n /** @type {string | undefined} */\n this.scrimTitle = undefined;\n\n /** @type {boolean} */\n this._fullscreen = false;\n /** @type {boolean} */\n this._scrimLoaded = false;\n }\n\n /**\n * @param {import(\"lit\").PropertyValues<this>} changedProperties\n */\n willUpdate(changedProperties) {\n if (changedProperties.has(\"url\")) {\n if (this.url) {\n const url = new URL(this.url);\n url.searchParams.set(\"via\", \"mdn\");\n url.searchParams.set(\"embed\", \"\");\n this._fullUrl = url.toString();\n\n this._scrimId = url.pathname.slice(1);\n } else {\n this._fullUrl = undefined;\n this._scrimId = undefined;\n }\n }\n\n if (changedProperties.has(\"img\")) {\n this._imgStyle = this.img\n ? {\n \"--scrim-img\": `url(${this.img})`,\n }\n : {};\n }\n }\n\n render() {\n if (!this.url || !this._fullUrl) {\n return nothing;\n }\n\n return html`\n <dialog @close=${this.#dialogClosed} style=${styleMap(this._imgStyle)}>\n <div class=\"inner\">\n <div class=\"header\">\n <span>Clicking will load content from scrimba.com</span>\n <button tabindex=\"0\" @click=${this.#toggle} class=\"toggle\">\n <div\n class=\"scrim-fullscreen ${this._fullscreen ? \"exit\" : \"enter\"}\"\n ></div>\n <span class=\"visually-hidden\">Toggle fullscreen</span>\n </button>\n <a\n href=${this._fullUrl}\n target=\"_blank\"\n rel=\"origin noreferrer\"\n class=\"external\"\n data-glean-id=\"curriculum: scrim link id:${this._scrimId}\"\n >\n <div class=\"scrim-link\"></div>\n <span class=\"visually-hidden\">Open on Scrimba</span>\n </a>\n </div>\n <div class=\"body\">\n ${this._scrimLoaded\n ? html`\n <iframe\n src=${this._fullUrl}\n title=${ifDefined(this.scrimTitle)}\n ></iframe>\n `\n : html`\n ${this.scrimTitle && !this.img\n ? html`<div class=\"background\">\n <div class=\"background-noise\">\n <svg width=\"0\" height=\"0\">\n <filter id=\"noise\">\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.7\"\n numOctaves=\"4\"\n />\n </filter>\n </svg>\n </div>\n <h1>${this.scrimTitle}</h1>\n </div>`\n : null}\n <button\n @click=${this.#open}\n class=\"open\"\n data-glean-id=${`curriculum: scrim engage id:${this._scrimId}`}\n >\n ${playSvg}\n <span class=\"visually-hidden\">\n \"Load scrim and open dialog.\"\n </span>\n </button>\n `}\n </div>\n </div>\n </dialog>\n `;\n }\n\n /**\n * @param {MouseEvent} e\n */\n #toggle(e) {\n if (e.target instanceof HTMLElement) {\n e.target.dataset.gleanId = `curriculum: scrim fullscreen -> ${this._fullscreen ? 0 : 1} id:${this._scrimId}`;\n }\n if (this._fullscreen) {\n this.#close();\n } else {\n this.#open();\n }\n }\n\n #open() {\n const dialog = this.renderRoot.querySelector(\"dialog\");\n if (dialog) {\n dialog.showModal();\n this._scrimLoaded = true;\n this._fullscreen = true;\n }\n }\n\n #close() {\n const dialog = this.renderRoot.querySelector(\"dialog\");\n dialog?.close();\n }\n\n #dialogClosed() {\n this._fullscreen = false;\n }\n}\n\ncustomElements.define(\"mdn-scrim-inline\", MDNScrimInline);\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n"],"names":["_","s","MDNScrimInline","String","URL","HTMLElement","customElements"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"3092.94a3edc866458ab7.js","sources":["webpack://@mdn/fred/./components/issues-table/element.css","webpack://@mdn/fred/./components/issues-table/element.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block;margin-left:auto;margin-right:auto;margin-top:1rem;max-width:var(--max-width);padding-left:var(--gutter);padding-right:var(--gutter);width:100%}table{background:var(--community-card-bg);border:1px solid var(--community-table-border);border-collapse:initial;border-radius:.5rem;border-spacing:0;color:var(--community-text-primary);width:100%}td,th{border:none;padding:1.5rem}@media (width <= 769px){:is(th,td):last-of-type{display:none}}th{background:none;font-size:var(--font-size-large);font-weight:var(--font-weight-bold);text-align:left}@media (width <= 769px){th{display:none}}tbody tr:nth-child(odd){background:var(--community-table-row)}td>div{align-items:baseline;display:flex;flex-wrap:wrap;gap:1rem 1.5rem}a{color:var(--color-link-normal)}a:visited{color:var(--color-link-visited)}.label{background:var(--community-label-bg);border-radius:.25rem;color:var(--community-text-success);font-weight:500;padding:.5rem 1rem}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { LitElement, html, nothing } from \"lit\";\n\nimport styles from \"./element.css?lit\";\n\nexport class MDNIssuesTable extends LitElement {\n static styles = styles;\n\n static properties = {\n _issues: { state: true },\n _isLoading: { state: true },\n _error: { state: true },\n };\n\n constructor() {\n super();\n /** @type {import(\"@github\").Issues} */\n this._issues = [];\n /** @type {boolean} */\n this._isLoading = true; // Start in loading state\n /** @type {string | null} */\n this._error = null;\n /** @constant {string[]} */\n this.LABELS = [\"good first issue\", \"accepting PR\"];\n }\n\n connectedCallback() {\n super.connectedCallback();\n // Fetch issues when component is connected to the DOM.\n // static ssr = false ensures this runs client-side.\n this._fetchIssues();\n }\n\n async _fetchIssues() {\n this._isLoading = true;\n this._error = null;\n const query =\n 'is:open is:issue repo:mdn/content repo:mdn/translated-content repo:mdn/yari label:\"good first issue\",\"accepting PR\" sort:created-desc no:assignee is:public';\n const url = new URL(\"https://api.github.com/search/issues\");\n url.searchParams.append(\"per_page\", \"5\");\n url.searchParams.append(\"q\", query);\n\n try {\n const res = await fetch(url.toString());\n if (!res.ok) {\n throw new Error(`GitHub API Error: ${res.status} ${res.statusText}`);\n }\n const data = await res.json();\n this._issues = data.items;\n } catch (error) {\n console.error(\"Failed to fetch GitHub issues:\", error);\n // @ts-expect-error\n this._error = error.toString();\n this._issues = []; // Set to empty array on error to prevent issues with map\n } finally {\n this._isLoading = false;\n }\n }\n\n render() {\n if (this._isLoading) {\n return html`loading issues…`;\n }\n if (this._error) {\n return html`${this._error}`;\n }\n if (this._issues.length === 0) {\n return nothing;\n }\n\n return html`\n <table>\n <thead>\n <tr>\n <th>Title</th>\n <th>Repository</th>\n </tr>\n </thead>\n <tbody>\n ${this._issues.map(\n (issue) => html`\n <tr>\n <td>\n <div>\n <a href=${issue.html_url} target=\"_blank\" rel=\"noreferrer\">\n ${issue.title}\n </a>\n ${issue.labels.map((label) => {\n const labelName =\n typeof label === \"object\" && label !== null\n ? label.name\n : label;\n this.LABELS.includes(labelName)\n ? html`<span class=\"label\">${labelName}</span>`\n : null;\n })}\n </div>\n </td>\n <td>\n <a\n href=${issue.repository_url.replace(\n \"https://api.github.com/repos/\",\n \"https://github.com/\",\n )}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n ${issue.repository_url.replace(\n \"https://api.github.com/repos/\",\n \"\",\n )}\n </a>\n </td>\n </tr>\n `,\n )}\n </tbody>\n </table>\n `;\n }\n}\n\ncustomElements.define(\"mdn-issues-table\", MDNIssuesTable);\n"],"names":["MDNIssuesTable","URL","fetch","Error","console","customElements"],"mappings":"+LAII,EAA0B,A,SAA4B,KAE1D,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,q7BAAs7B,GAAG,EAEl+B,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,C,mGCJhD,IAAMA,eAAN,MAAMA,uBAAuB,IAAU,CAC5C,OAAO,OAAS,GAAM,AAAC,AAEvB,QAAO,WAAa,CAClB,QAAS,CAAE,MAAO,EAAK,EACvB,WAAY,CAAE,MAAO,EAAK,EAC1B,OAAQ,CAAE,MAAO,EAAK,CACxB,CAAE,AAEF,cAAc,CACZ,KAAK,GAEL,IAAI,CAAC,OAAO,CAAG,EAAE,CAEjB,IAAI,CAAC,UAAU,CAAG,GAElB,IAAI,CAAC,MAAM,CAAG,KAEd,IAAI,CAAC,MAAM,CAAG,CAAC,mBAAoB,eAAe,AACpD,CAEA,mBAAoB,CAClB,KAAK,CAAC,oBAGN,IAAI,CAAC,YAAY,EACnB,CAEA,MAAM,cAAe,CACnB,IAAI,CAAC,UAAU,CAAG,GAClB,IAAI,CAAC,MAAM,CAAG,KAGd,IAAM,EAAM,IAAIC,IAAI,wCACpB,EAAI,YAAY,CAAC,MAAM,CAAC,WAAY,KACpC,EAAI,YAAY,CAAC,MAAM,CAAC,IAHtB,+JAKF,GAAI,CACF,IAAM,EAAM,MAAMC,MAAM,EAAI,QAAQ,IACpC,GAAI,CAAC,EAAI,EAAE,CACT,MAAM,AAAIC,MAAM,CAAC,kBAAkB,EAAE,EAAI,MAAM,CAAC,CAAC,EAAE,EAAI,UAAU,CAAC,CAAC,EAErE,IAAM,EAAO,MAAM,EAAI,IAAI,EAC3B,KAAI,CAAC,OAAO,CAAG,EAAK,KAAK,AAC3B,CAAE,MAAO,EAAO,CACdC,QAAQ,KAAK,CAAC,iCAAkC,GAEhD,IAAI,CAAC,MAAM,CAAG,EAAM,QAAQ,GAC5B,IAAI,CAAC,OAAO,CAAG,EAAE,AACnB,QAAU,CACR,IAAI,CAAC,UAAU,CAAG,EACpB,CACF,CAEA,QAAS,QACP,AAAI,IAAI,CAAC,UAAU,CACV,QAAI,CAAC,eAAe,CAAC,CAE1B,IAAI,CAAC,MAAM,CACN,QAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAEzB,AAAwB,IAAxB,IAAI,CAAC,OAAO,CAAC,MAAM,CACd,IAAO,CAGT,QAAI,CAAC;;;;;;;;;UASN,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAChB,AAAC,GAAU,QAAI,CAAC;;;;4BAIA,EAAE,EAAM,QAAQ,CAAC;sBACvB,EAAE,EAAM,KAAK,CAAC;;oBAEhB,EAAE,EAAM,MAAM,CAAC,GAAG,CAAC,AAAC,IAClB,IAAM,EACJ,AAAiB,UAAjB,OAAO,GAAsB,AAAU,OAAV,EACzB,EAAM,IAAI,CACV,CACN,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IACjB,QAAI,CAAC,oBAAoB,EAAE,EAAU,OAAO,CAAC,AAEnD,GAAG;;;;;yBAKE,EAAE,EAAM,cAAc,CAAC,OAAO,CACjC,gCACA,uBACA;;;;oBAIF,EAAE,EAAM,cAAc,CAAC,OAAO,CAC5B,gCACA,IACA;;;;YAIV,CAAC,EACD;;;IAGR,CAAC,AACH,CACF,EAEAC,eAAe,MAAM,CAAC,mBAAoBL,e"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"5446.3e0ac5aa93616c6f.js","sources":["webpack://@mdn/fred/./components/writer-reload/element.css","webpack://@mdn/fred/./components/writer-reload/element.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `div{align-items:center;display:flex;height:100%;padding-inline:.5em}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { LitElement, html } from \"lit\";\n\nimport styles from \"./element.css?lit\";\n\n/**\n * Custom element which reloads the page when the document has changed.\n */\nexport default class MDNWriterReload extends LitElement {\n static ssr = false;\n static styles = styles;\n\n constructor() {\n super();\n this._state = \"\";\n this._comparisons = 0;\n }\n\n get _interval() {\n return Number(sessionStorage.getItem(\"writer-reload-interval\") || 1000);\n }\n\n /** @param {number} interval */\n set _interval(interval) {\n sessionStorage.setItem(\"writer-reload-interval\", interval.toString());\n if (!this._reloading) {\n this.requestUpdate();\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._pollForChanges();\n }\n\n render() {\n return html`<div>Polling every ${this._interval / 1000}s</div>`;\n }\n\n async _reloadIfChanged() {\n const url = new URL(\n \"index.json\",\n new URL(location.pathname + \"/\", location.origin),\n );\n const res = await fetch(url);\n if (res.ok) {\n const state = await res.text();\n // eslint-disable-next-line unicorn/no-negated-condition\n if (!this._state) {\n this._state = state;\n } else {\n this._comparisons++;\n // eslint-disable-next-line unicorn/no-negated-condition\n if (this._state !== state) {\n if (this._comparisons <= 1) {\n this._interval = this._interval * 2;\n }\n location.reload();\n this._reloading = true;\n } else {\n this._interval = this._interval <= 2000 ? 1000 : this._interval / 2;\n }\n }\n } else {\n console.error(\"Failed to fetch document\", res.status, res.statusText);\n }\n }\n\n async _pollForChanges() {\n while (!this._reloading) {\n if (document.visibilityState === \"visible\") {\n await this._reloadIfChanged();\n }\n await timeout(this._interval);\n }\n }\n}\n\n/**\n * @param {number} ms\n */\nasync function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ncustomElements.define(\"mdn-writer-reload\", MDNWriterReload);\n"],"names":["MDNWriterReload","Number","sessionStorage","URL","location","fetch","console","document","Promise","setTimeout","customElements"],"mappings":"gMAII,EAA0B,A,SAA4B,KAE1D,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,uEAAwE,GAAG,EAEpH,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,C,6FCDxC,IAAMA,gBAAN,MAAMA,wBAAwB,IAAU,CACrD,OAAO,IAAM,EAAM,AACnB,QAAO,OAAS,GAAM,AAAC,AAEvB,cAAc,CACZ,KAAK,GACL,IAAI,CAAC,MAAM,CAAG,GACd,IAAI,CAAC,YAAY,CAAG,CACtB,CAEA,IAAI,WAAY,CACd,OAAOC,OAAOC,eAAe,OAAO,CAAC,2BAA6B,IACpE,CAGA,IAAI,UAAU,CAAQ,CAAE,CACtBA,eAAe,OAAO,CAAC,yBAA0B,EAAS,QAAQ,IAC9D,AAAC,IAAI,CAAC,UAAU,EAClB,IAAI,CAAC,aAAa,EAEtB,CAEA,mBAAoB,CAClB,KAAK,CAAC,oBACN,IAAI,CAAC,eAAe,EACtB,CAEA,QAAS,CACP,MAAO,QAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAG,IAAK,OAAO,CAAC,AACjE,CAEA,MAAM,kBAAmB,CACvB,IAAM,EAAM,IAAIC,IACd,aACA,IAAIA,IAAIC,SAAS,QAAQ,CAAG,IAAKA,SAAS,MAAM,GAE5C,EAAM,MAAMC,MAAM,GACxB,GAAI,EAAI,EAAE,CAAE,CACV,IAAM,EAAQ,MAAM,EAAI,IAAI,EAEvB,KAAI,CAAC,MAAM,EAGd,IAAI,CAAC,YAAY,GAEb,IAAI,CAAC,MAAM,GAAK,GACd,IAAI,CAAC,YAAY,EAAI,GACvB,KAAI,CAAC,SAAS,CAAG,AAAiB,EAAjB,IAAI,CAAC,SAAS,AAAG,EAEpCD,SAAS,MAAM,GACf,IAAI,CAAC,UAAU,CAAG,IAElB,IAAI,CAAC,SAAS,CAAG,IAAI,CAAC,SAAS,EAAI,IAAO,IAAO,IAAI,CAAC,SAAS,CAAG,GAXpE,IAAI,CAAC,MAAM,CAAG,CAclB,MACEE,QAAQ,KAAK,CAAC,2BAA4B,EAAI,MAAM,CAAE,EAAI,UAAU,CAExE,CAEA,MAAM,iBAAkB,CACtB,KAAO,CAAC,IAAI,CAAC,UAAU,EACjBC,AAA6B,YAA7BA,SAAS,eAAe,EAC1B,MAAM,IAAI,CAAC,gBAAgB,GAE7B,MAAM,EAAQ,IAAI,CAAC,SAAS,CAEhC,CACF,EAKA,eAAe,EAAQ,CAAE,EACvB,OAAO,IAAIC,QAAQ,AAAC,GAAYC,WAAW,EAAS,GACtD,CAEAC,eAAe,MAAM,CAAC,oBAAqBV,gB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"603.775311ee1356e86f.js","sources":["webpack://@mdn/fred/./components/content-feedback/element.css","webpack://@mdn/fred/./components/icon/thumbs-down.svg","webpack://@mdn/fred/./components/icon/thumbs-up.svg","webpack://@mdn/fred/./components/content-feedback/element.js","webpack://@mdn/fred/./node_modules/lit-html/directives/if-defined.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.content-feedback{border:none;margin:0 0 .25rem;padding:0}.content-feedback>label{display:block;margin-bottom:.25rem}.content-feedback .thank-you{display:block;margin-bottom:calc(2.75rem + 2px)}.content-feedback mdn-button{flex:1;min-width:0}.content-feedback--buttons{display:inline-flex;gap:.75rem;margin:.25rem 0}.content-feedback--radios{align-items:center;display:flex;gap:.25rem;margin:.25rem 0}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M17 14V2M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88\"/></svg>`;","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M7 10v12m8-16.12L14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88\"/></svg>`;","import \"../button/element.js\";\n\nimport { LitElement, html } from \"lit\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\n\nimport { gleanClick } from \"../../utils/glean.js\";\nimport thumbsDown from \"../icon/thumbs-down.svg?lit\";\nimport thumbsUp from \"../icon/thumbs-up.svg?lit\";\n\nimport styles from \"./element.css?lit\";\n\n/**\n * @typedef {\"outdated\"|\"incomplete\"|\"code_examples\"|\"technical\"|\"consistency\"|\"incomprehensible\"|\"linguistic\"|\"other\"} FeedbackReason\n */\n\n/** @type {Partial<Record<FeedbackReason, string>>} */\nconst FEEDBACK_REASONS = {\n outdated: \"Content is out of date\",\n incomplete: \"Missing information\",\n code_examples: \"Code examples not working as expected\",\n other: \"Other\",\n};\n\n/** @type {Partial<Record<FeedbackReason, string>>} */\nconst FEEDBACK_REASONS_DE = {\n technical: \"Übersetzung enthält fachliche Fehler\",\n consistency: \"Begriffe sind inkonsistent übersetzt\",\n incomprehensible: \"Übersetzung ist nicht verständlich\",\n linguistic: \"Übersetzung enthält sprachliche Fehler\",\n code_examples: \"Code-Beispiele funktionieren nicht\",\n other: \"Sonstige\",\n};\n\nexport class MDNContentFeedback extends L10nMixin(LitElement) {\n static styles = styles;\n\n static properties = {\n locale: { type: String },\n _reason: { state: true },\n _view: { state: true },\n };\n\n constructor() {\n super();\n this.locale = \"\";\n this._reason = \"\";\n /** @type {'vote'|'feedback'|'thanks'} */\n this._view = \"vote\";\n }\n\n /**\n * @param {MouseEvent} event\n */\n _handleVote({ target }) {\n if (target instanceof HTMLElement) {\n const vote = target.dataset.vote;\n if (vote === \"yes\") {\n this._view = \"thanks\";\n } else if (vote === \"no\") {\n this._view = \"feedback\";\n }\n // Reusing Thumbs' key to be able to reuse queries.\n gleanClick(`thumbs: article-footer -> ${vote === \"yes\" ? \"1\" : \"0\"}`);\n }\n }\n\n _handleFeedback() {\n this._view = \"thanks\";\n gleanClick(`article_footer: feedback -> ${this._reason}`);\n }\n\n _renderVote() {\n return html`<label\n >${this.l10n(\n \"content-feedback-question\",\n )`Was this page helpful to you?`}\n </label>\n <div class=\"content-feedback--buttons\">\n <mdn-button\n data-vote=\"yes\"\n @click=${this._handleVote}\n .icon=${thumbsUp}\n variant=\"secondary\"\n action=\"positive\"\n >\n ${this.l10n`Yes`}\n </mdn-button>\n <mdn-button\n data-vote=\"no\"\n @click=${this._handleVote}\n .icon=${thumbsDown}\n variant=\"secondary\"\n action=\"negative\"\n >\n ${this.l10n`No`}\n </mdn-button>\n </div>`;\n }\n\n _renderFeedback() {\n const setReason =\n /** @param {Event} event */\n ({ target }) => {\n if (target instanceof HTMLInputElement) {\n this._reason = target.value;\n }\n };\n\n return html`<label\n >${this.l10n(\n \"content-feedback-reason\",\n )`Why was this page not helpful to you?`}</label\n >\n ${Object.entries(\n this.locale === \"de\" ? FEEDBACK_REASONS_DE : FEEDBACK_REASONS,\n ).map(\n ([key, label]) =>\n html`<div class=\"content-feedback--radios\">\n <input\n type=\"radio\"\n id=${`reason_${key}`}\n name=\"reason\"\n .value=${key}\n ?checked=${this._reason === key}\n @change=${setReason}\n />\n <label for=${`reason_${key}`}>${label}</label>\n </div>`,\n )}\n <div class=\"button-container\">\n <mdn-button @click=${this._handleFeedback} ?disabled=${!this._reason}>\n ${this.l10n`Submit`}\n </mdn-button>\n </div>`;\n }\n\n _renderThanks() {\n return html`<span class=\"thank-you\">\n ${this.l10n(\"content-feedback-thanks\")`Thank you for your feedback!`}\n <span class=\"emoji\">❤️</span>\n </span>`;\n }\n\n /**\n * @param {'vote'|'feedback'|'thanks'} view\n */\n _renderInner(view) {\n switch (view) {\n case \"vote\":\n return this._renderVote();\n case \"feedback\":\n return this._renderFeedback();\n case \"thanks\":\n return this._renderThanks();\n }\n }\n\n render() {\n return html`<fieldset class=\"content-feedback\">\n ${this._renderInner(this._view)}\n </fieldset>`;\n }\n}\n\ncustomElements.define(\"mdn-content-feedback\", MDNContentFeedback);\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n"],"names":["MDNContentFeedback","String","HTMLElement","HTMLInputElement","Object","customElements","o"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"6465.08012ddcd4597c76.js","sources":["webpack://@mdn/fred/./components/language-switcher/element.css","webpack://@mdn/fred/./components/icon/info.svg","webpack://@mdn/fred/./components/language-switcher/element.js","webpack://@mdn/fred/./components/utils/index.js"],"sourcesContent":["import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].use[1]!../../build/loaders/fix-light-dark.js!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[4].use[3]!../global/global.css\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../icon/languages.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.language-switcher{position:relative}.language-switcher__button{align-items:center;background-color:initial;border:none;color:inherit;column-gap:.25rem;cursor:pointer;display:flex;font:inherit;margin:0;padding:0 .5rem}.language-switcher__button:is(:hover,:focus,[aria-expanded=true]){background-color:var(--color-background-secondary)}@media screen and (width <= 480px){.language-switcher__button>span{display:none}}.language-switcher__button:before{background-color:currentcolor;content:\"\";height:1.25rem;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});-webkit-mask-size:cover;mask-size:cover;width:1.25rem}.language-switcher__dropdown{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);margin:0;padding:.75rem;position:absolute;right:0;width:max-content;z-index:1}.language_switcher__remember{border-bottom:1px solid var(--color-border-primary);display:flex;font-size:var(--font-size-small);place-items:center;width:100%}.language_switcher__remember mdn-switch{padding:.25rem}:is(.language_switcher__remember mdn-switch):hover{background-color:var(--color-background-secondary)}.language-switcher__list{background-color:var(--color-background-primary);list-style:none;margin:0;padding:0;width:100%}.language-switcher__option{align-items:center;background-color:initial;border:none;color:var(--color-text-primary);column-gap:.25rem;display:flex;font:inherit;margin:0;padding:.25rem;-webkit-text-decoration:none;text-decoration:none;width:100%}.language-switcher__option:hover,.language-switcher__option[data-current]{background-color:var(--color-background-secondary)}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n","import { svg } from \"lit\"; export default svg`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4m0-4h.01\"/></svg>`;","import { Task } from \"@lit/task\";\nimport { LitElement, html, nothing } from \"lit\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\n\nimport infoIcon from \"../icon/info.svg?lit\";\nimport { getEnglishDoc } from \"../not-found/utils.js\";\nimport {\n getPreferredLocale,\n resetPreferredLocale,\n setPreferredLocale,\n} from \"../preferred-locale/utils.js\";\n\nimport styles from \"./element.css?lit\";\n\nimport \"../dropdown/element.js\";\nimport \"../switch/element.js\";\n\nexport class MDNLanguageSwitcher extends L10nMixin(LitElement) {\n static styles = styles;\n\n static properties = {\n locale: { type: String },\n native: { type: String },\n translations: { type: Array },\n url: { type: String },\n notFound: { type: Boolean, attribute: \"not-found\" },\n _preferredLocale: { state: true },\n };\n\n constructor() {\n super();\n /** @type {import(\"@rari\").Translation[]} */\n this.translations = [];\n this.native = \"\";\n this.locale = \"en-US\";\n this.url = \"/\";\n this.notFound = false;\n /** @type {string|undefined} */\n this._preferredLocale = undefined;\n }\n\n _notFoundFallback = new Task(this, {\n args: () => [this.notFound],\n task: async ([notFound]) => {\n if (notFound) {\n return await getEnglishDoc(location.pathname);\n }\n return;\n },\n });\n\n firstUpdated() {\n this._preferredLocale = getPreferredLocale();\n if (location.search) {\n this.url += location.search;\n }\n }\n\n get _isLocalePreferred() {\n return this._preferredLocale == this.locale;\n }\n\n _togglePreferredLocale() {\n if (this.notFound) return;\n if (this._isLocalePreferred) {\n resetPreferredLocale();\n this._preferredLocale = undefined;\n } else {\n setPreferredLocale(this.locale);\n this._preferredLocale = this.locale;\n }\n }\n\n render() {\n const { translations, native, locale, url, notFound } = this;\n\n if (translations.length === 0) {\n return nothing;\n }\n\n return html`<div class=\"language-switcher\">\n <mdn-dropdown>\n <button\n slot=\"button\"\n class=\"language-switcher__button\"\n type=\"button\"\n aria-labelledby=\"current-locale\"\n >\n <span id=\"current-locale\">${native ?? locale}</span>\n </button>\n <div\n slot=\"dropdown\"\n class=\"language-switcher__dropdown\"\n id=\"language-switcher__dropdown\"\n >\n <div class=\"language_switcher__remember\">\n <mdn-switch\n @toggle=${this._togglePreferredLocale}\n ?checked=${this._isLocalePreferred}\n >${this.l10n`Remember language`}</mdn-switch\n >\n <mdn-button\n variant=\"plain\"\n .icon=${infoIcon}\n icon-only\n href=\"https://github.com/orgs/mdn/discussions/739\"\n target=\"_blank\"\n title=${this\n .l10n`Enable this setting to always switch to the current language when available. (Click to learn more.)`}\n >${this.l10n`Learn more`}</mdn-button\n >\n </div>\n <ul class=\"language-switcher__list\">\n ${notFound\n ? this._notFoundFallback.render({\n initial: () => this._renderCurrentLocale(),\n pending: () => this._renderCurrentLocale(),\n error: () => this._renderCurrentLocale(),\n complete: (doc) =>\n doc?.other_translations\n ? this._renderDropdownItems(\n doc.other_translations,\n locale,\n doc.mdn_url,\n notFound,\n )\n : this._renderCurrentLocale(),\n })\n : this._renderDropdownItems(translations, locale, url)}\n </ul>\n </div>\n </mdn-dropdown>\n </div>`;\n }\n\n /**\n * @param {import(\"@rari\").Translation[]} translations\n * @param {string} locale\n * @param {string} url\n * @param {boolean} notFound\n */\n _renderDropdownItems(translations, locale, url, notFound = false) {\n return translations\n .sort((a, b) => a.locale.localeCompare(b.locale))\n .map(\n (translation) => html`\n <li>\n <a\n class=\"language-switcher__option\"\n ?data-current=${locale === translation.locale}\n @click=${resetPreferredLocale}\n href=${url.replace(\n `/${notFound ? \"en-US\" : locale}/`,\n `/${translation.locale}/`,\n )}\n >${translation.native}</a\n >\n </li>\n `,\n );\n }\n\n _renderCurrentLocale() {\n return html`\n <li>\n <a\n class=\"language-switcher__option\"\n ?data-current=${true}\n href=${this.url}\n >${this.native}</a\n >\n </li>\n `;\n }\n}\n\ncustomElements.define(\"mdn-language-switcher\", MDNLanguageSwitcher);\n","/**\n * Used to generate a random element id by combining a prefix with a random string.\n *\n * @param {string} prefix\n * @returns {string}\n */\nexport function randomIdString(prefix = \"id-\") {\n return Math.random().toString(36).replace(\"0.\", prefix);\n}\n"],"names":["MDNLanguageSwitcher","String","Array","Boolean","location","s","i","n","customElements","Math"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const __webpack_id__="7185";export const __webpack_ids__=["7185"];export const __webpack_modules__={41083:function(e,t,n){e.exports=n.p+"watify_bg.9877982a693ec402.wasm"},12456:function(e,t,n){let i;n.d(t,{default:()=>u,watify:()=>f});let r="undefined"!=typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};"undefined"!=typeof TextDecoder&&r.decode();let o=null;function a(){return(null===o||0===o.byteLength)&&(o=new Uint8Array(i.memory.buffer)),o}let s=0,l="undefined"!=typeof TextEncoder?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},c="function"==typeof l.encodeInto?function(e,t){return l.encodeInto(e,t)}:function(e,t){let n=l.encode(e);return t.set(n),{read:e.length,written:n.length}};function f(e){let t=function(e,t,n){if(void 0===n){let n=l.encode(e),i=t(n.length,1)>>>0;return a().subarray(i,i+n.length).set(n),s=n.length,i}let i=e.length,r=t(i,1)>>>0,o=a(),f=0;for(;f<i;f++){let t=e.charCodeAt(f);if(t>127)break;o[r+f]=t}if(f!==i){0!==f&&(e=e.slice(f)),r=n(r,i,i=f+3*e.length,1)>>>0;let t=c(e,a().subarray(r+f,r+i));f+=t.written,r=n(r,i,f,1)>>>0}return s=f,r}(e,i.__wbindgen_malloc,i.__wbindgen_realloc),n=s,r=i.watify(t,n);if(r[3]){let e;throw o=r[2],e=i.__wbindgen_export_0.get(o),i.__externref_table_dealloc(o),e}var o,f,d,_=(f=r[0],d=r[1],f>>>=0,a().subarray(f/1,f/1+d)).slice();return i.__wbindgen_free(r[0],+r[1],1),_}async function d(e,t){if("function"==typeof Response&&e instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(e,t)}catch(t){if("application/wasm"!=e.headers.get("Content-Type"))console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",t);else throw t}let n=await e.arrayBuffer();return await WebAssembly.instantiate(n,t)}{let n=await WebAssembly.instantiate(e,t);return n instanceof WebAssembly.Instance?{instance:n,module:e}:n}}async function _(e){let t;if(void 0!==i)return i;void 0!==e&&(Object.getPrototypeOf(e)===Object.prototype?{module_or_path:e}=e:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),void 0===e&&(e=new n.U(n(41083)));let s=((t={}).wbg={},t.wbg.__wbindgen_init_externref_table=function(){let e=i.__wbindgen_export_0,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)},t.wbg.__wbindgen_string_new=function(e,t){var n;return n=e>>>0,r.decode(a().subarray(n,n+t))},t);("string"==typeof e||"function"==typeof Request&&e instanceof Request||"function"==typeof URL&&e instanceof URL)&&(e=fetch(e));let{instance:l,module:c}=await d(await e,s);return i=l.exports,_.__wbindgen_wasm_module=c,o=null,i.__wbindgen_start(),i}let u=_}};
|
|
2
|
-
//# sourceMappingURL=7185.a014a928e9a39779.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"7185.a014a928e9a39779.js","sources":["webpack://@mdn/fred/./node_modules/@mdn/watify/watify.js"],"sourcesContent":["let wasm;\n\nconst cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\nif (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_export_0.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n/**\n * Parses the given WAT text and returns a vector of bytes on success or a JavaScript error on failure.\n *\n * # Arguments\n *\n * * `text` - A string slice containing the WAT text to be parsed.\n *\n * # Returns\n *\n * * `Ok(Vec<u8>)` containing the parsed byte code if parsing is successful.\n * * `Err(JsValue)` if parsing fails, with the error message converted into a JavaScript error value.\n * @param {string} text\n * @returns {Uint8Array}\n */\nexport function watify(text) {\n const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.watify(ptr0, len0);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v2;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_0;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('watify_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n"],"names":["TextDecoder","Error","Uint8Array","TextEncoder","r","Response","WebAssembly","console","_","Object","n","Request","URL","fetch"],"mappings":"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"}
|