Skip to content

Commit 9879067

Browse files
Merge branch '0.10' into feat/session-grants
2 parents 5eac706 + 0d8f991 commit 9879067

File tree

289 files changed

+2329
-342
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

289 files changed

+2329
-342
lines changed

CHANGELOG.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [unreleased]
88

9+
## [0.10.4] - 2022-08-30
10+
## Features:
11+
- Add support for User ID Mapping using `create_user_id_mapping`, `get_user_id_mapping`, `delete_user_id_mapping`, `update_or_delete_user_id_mapping` functions
12+
13+
## [0.10.3] - 2022-08-29
14+
15+
### Bug fix
16+
- Send FORM_FIELD error with 200 status code instead of 500 on invalid request body or when user passes non-string values as email ID for `/auth/signin`
17+
18+
### Changes
19+
- Add to test to ensure that overrides are applying correctly in methods called on SessionContainer instances
20+
21+
## [0.10.2] - 2022-07-14
22+
### Bug fix
23+
- Make `user_context` optional in userroles recipe syncio functions.
24+
925
## [0.10.1] - 2022-07-11
1026

1127
### Documentation:
1228
- Added `pdoc` template files to project inside `docs-templates` directory
1329
- Updated `build-docs` in Makefile to use `docs-templates` as the template directory while generating docs using `pdoc`
14-
- Updated `html.mako` template to have a single `h1` tag
30+
- Updated `html.mako` template to have a single `h1` tag and have a default meta description tag
1531

1632
### Changes
1733
- Relax version requirements for `httpx`, `cryptography`, and `asgiref` to fix https://github.com/supertokens/supertokens-python/issues/207

coreDriverInterfaceSupported.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"2.11",
77
"2.12",
88
"2.13",
9-
"2.14"
9+
"2.14",
10+
"2.15"
1011
]
1112
}

docs-templates/html.mako

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,11 @@
377377
<meta name="description" content="A list of documented Python modules." />
378378
% else:
379379
<title>${module.name} API documentation</title>
380-
<meta name="description" content="${module.docstring | glimpse, trim, h}" />
380+
% if module.docstring:
381+
<meta name="description" content="${module.docstring | glimpse, trim, h}" />
382+
% else:
383+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
384+
% endif
381385
% endif
382386

383387
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>

html/supertokens_python/async_to_sync_wrapper.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.async_to_sync_wrapper API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>

html/supertokens_python/asyncio/index.html

Lines changed: 137 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.asyncio API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
@@ -39,9 +39,19 @@ <h1 class="title">Module <code>supertokens_python.asyncio</code></h1>
3939
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
4040
# License for the specific language governing permissions and limitations
4141
# under the License.
42-
from typing import List, Union
42+
from typing import List, Union, Optional
4343

4444
from supertokens_python import Supertokens
45+
from supertokens_python.interfaces import (
46+
CreateUserIdMappingOkResult,
47+
UnknownSupertokensUserIDError,
48+
UserIdMappingAlreadyExistsError,
49+
UserIDTypes,
50+
UnknownMappingError,
51+
GetUserIdMappingOkResult,
52+
DeleteUserIdMappingOkResult,
53+
UpdateOrDeleteUserIdMappingInfoOkResult,
54+
)
4555
from supertokens_python.types import UsersResponse
4656

4757

@@ -70,7 +80,49 @@ <h1 class="title">Module <code>supertokens_python.asyncio</code></h1>
7080

7181

7282
async def delete_user(user_id: str) -&gt; None:
73-
return await Supertokens.get_instance().delete_user(user_id)</code></pre>
83+
return await Supertokens.get_instance().delete_user(user_id)
84+
85+
86+
async def create_user_id_mapping(
87+
supertokens_user_id: str,
88+
external_user_id: str,
89+
external_user_id_info: Optional[str] = None,
90+
force: Optional[bool] = None,
91+
) -&gt; Union[
92+
CreateUserIdMappingOkResult,
93+
UnknownSupertokensUserIDError,
94+
UserIdMappingAlreadyExistsError,
95+
]:
96+
return await Supertokens.get_instance().create_user_id_mapping(
97+
supertokens_user_id, external_user_id, external_user_id_info, force
98+
)
99+
100+
101+
async def get_user_id_mapping(
102+
user_id: str,
103+
user_id_type: Optional[UserIDTypes] = None,
104+
) -&gt; Union[GetUserIdMappingOkResult, UnknownMappingError]:
105+
return await Supertokens.get_instance().get_user_id_mapping(user_id, user_id_type)
106+
107+
108+
async def delete_user_id_mapping(
109+
user_id: str,
110+
user_id_type: Optional[UserIDTypes] = None,
111+
force: Optional[bool] = None,
112+
) -&gt; DeleteUserIdMappingOkResult:
113+
return await Supertokens.get_instance().delete_user_id_mapping(
114+
user_id, user_id_type, force
115+
)
116+
117+
118+
async def update_or_delete_user_id_mapping_info(
119+
user_id: str,
120+
user_id_type: Optional[UserIDTypes] = None,
121+
external_user_id_info: Optional[str] = None,
122+
) -&gt; Union[UpdateOrDeleteUserIdMappingInfoOkResult, UnknownMappingError]:
123+
return await Supertokens.get_instance().update_or_delete_user_id_mapping_info(
124+
user_id, user_id_type, external_user_id_info
125+
)</code></pre>
74126
</details>
75127
</section>
76128
<section>
@@ -80,6 +132,30 @@ <h1 class="title">Module <code>supertokens_python.asyncio</code></h1>
80132
<section>
81133
<h2 class="section-title" id="header-functions">Functions</h2>
82134
<dl>
135+
<dt id="supertokens_python.asyncio.create_user_id_mapping"><code class="name flex">
136+
<span>async def <span class="ident">create_user_id_mapping</span></span>(<span>supertokens_user_id: str, external_user_id: str, external_user_id_info: Optional[str] = None, force: Optional[bool] = None) ‑> Union[<a title="supertokens_python.interfaces.CreateUserIdMappingOkResult" href="../interfaces.html#supertokens_python.interfaces.CreateUserIdMappingOkResult">CreateUserIdMappingOkResult</a><a title="supertokens_python.interfaces.UnknownSupertokensUserIDError" href="../interfaces.html#supertokens_python.interfaces.UnknownSupertokensUserIDError">UnknownSupertokensUserIDError</a><a title="supertokens_python.interfaces.UserIdMappingAlreadyExistsError" href="../interfaces.html#supertokens_python.interfaces.UserIdMappingAlreadyExistsError">UserIdMappingAlreadyExistsError</a>]</span>
137+
</code></dt>
138+
<dd>
139+
<div class="desc"></div>
140+
<details class="source">
141+
<summary>
142+
<span>Expand source code</span>
143+
</summary>
144+
<pre><code class="python">async def create_user_id_mapping(
145+
supertokens_user_id: str,
146+
external_user_id: str,
147+
external_user_id_info: Optional[str] = None,
148+
force: Optional[bool] = None,
149+
) -&gt; Union[
150+
CreateUserIdMappingOkResult,
151+
UnknownSupertokensUserIDError,
152+
UserIdMappingAlreadyExistsError,
153+
]:
154+
return await Supertokens.get_instance().create_user_id_mapping(
155+
supertokens_user_id, external_user_id, external_user_id_info, force
156+
)</code></pre>
157+
</details>
158+
</dd>
83159
<dt id="supertokens_python.asyncio.delete_user"><code class="name flex">
84160
<span>async def <span class="ident">delete_user</span></span>(<span>user_id: str) ‑> None</span>
85161
</code></dt>
@@ -93,6 +169,25 @@ <h2 class="section-title" id="header-functions">Functions</h2>
93169
return await Supertokens.get_instance().delete_user(user_id)</code></pre>
94170
</details>
95171
</dd>
172+
<dt id="supertokens_python.asyncio.delete_user_id_mapping"><code class="name flex">
173+
<span>async def <span class="ident">delete_user_id_mapping</span></span>(<span>user_id: str, user_id_type: Optional[Literal['SUPERTOKENS', 'EXTERNAL', 'ANY']] = None, force: Optional[bool] = None) ‑> <a title="supertokens_python.interfaces.DeleteUserIdMappingOkResult" href="../interfaces.html#supertokens_python.interfaces.DeleteUserIdMappingOkResult">DeleteUserIdMappingOkResult</a></span>
174+
</code></dt>
175+
<dd>
176+
<div class="desc"></div>
177+
<details class="source">
178+
<summary>
179+
<span>Expand source code</span>
180+
</summary>
181+
<pre><code class="python">async def delete_user_id_mapping(
182+
user_id: str,
183+
user_id_type: Optional[UserIDTypes] = None,
184+
force: Optional[bool] = None,
185+
) -&gt; DeleteUserIdMappingOkResult:
186+
return await Supertokens.get_instance().delete_user_id_mapping(
187+
user_id, user_id_type, force
188+
)</code></pre>
189+
</details>
190+
</dd>
96191
<dt id="supertokens_python.asyncio.get_user_count"><code class="name flex">
97192
<span>async def <span class="ident">get_user_count</span></span>(<span>include_recipe_ids: Optional[None] = None) ‑> int</span>
98193
</code></dt>
@@ -106,6 +201,22 @@ <h2 class="section-title" id="header-functions">Functions</h2>
106201
return await Supertokens.get_instance().get_user_count(include_recipe_ids)</code></pre>
107202
</details>
108203
</dd>
204+
<dt id="supertokens_python.asyncio.get_user_id_mapping"><code class="name flex">
205+
<span>async def <span class="ident">get_user_id_mapping</span></span>(<span>user_id: str, user_id_type: Optional[Literal['SUPERTOKENS', 'EXTERNAL', 'ANY']] = None) ‑> Union[<a title="supertokens_python.interfaces.GetUserIdMappingOkResult" href="../interfaces.html#supertokens_python.interfaces.GetUserIdMappingOkResult">GetUserIdMappingOkResult</a><a title="supertokens_python.interfaces.UnknownMappingError" href="../interfaces.html#supertokens_python.interfaces.UnknownMappingError">UnknownMappingError</a>]</span>
206+
</code></dt>
207+
<dd>
208+
<div class="desc"></div>
209+
<details class="source">
210+
<summary>
211+
<span>Expand source code</span>
212+
</summary>
213+
<pre><code class="python">async def get_user_id_mapping(
214+
user_id: str,
215+
user_id_type: Optional[UserIDTypes] = None,
216+
) -&gt; Union[GetUserIdMappingOkResult, UnknownMappingError]:
217+
return await Supertokens.get_instance().get_user_id_mapping(user_id, user_id_type)</code></pre>
218+
</details>
219+
</dd>
109220
<dt id="supertokens_python.asyncio.get_users_newest_first"><code class="name flex">
110221
<span>async def <span class="ident">get_users_newest_first</span></span>(<span>limit: Optional[int] = None, pagination_token: Optional[str] = None, include_recipe_ids: Optional[None] = None) ‑> <a title="supertokens_python.types.UsersResponse" href="../types.html#supertokens_python.types.UsersResponse">UsersResponse</a></span>
111222
</code></dt>
@@ -144,6 +255,25 @@ <h2 class="section-title" id="header-functions">Functions</h2>
144255
)</code></pre>
145256
</details>
146257
</dd>
258+
<dt id="supertokens_python.asyncio.update_or_delete_user_id_mapping_info"><code class="name flex">
259+
<span>async def <span class="ident">update_or_delete_user_id_mapping_info</span></span>(<span>user_id: str, user_id_type: Optional[Literal['SUPERTOKENS', 'EXTERNAL', 'ANY']] = None, external_user_id_info: Optional[str] = None) ‑> Union[<a title="supertokens_python.interfaces.UpdateOrDeleteUserIdMappingInfoOkResult" href="../interfaces.html#supertokens_python.interfaces.UpdateOrDeleteUserIdMappingInfoOkResult">UpdateOrDeleteUserIdMappingInfoOkResult</a><a title="supertokens_python.interfaces.UnknownMappingError" href="../interfaces.html#supertokens_python.interfaces.UnknownMappingError">UnknownMappingError</a>]</span>
260+
</code></dt>
261+
<dd>
262+
<div class="desc"></div>
263+
<details class="source">
264+
<summary>
265+
<span>Expand source code</span>
266+
</summary>
267+
<pre><code class="python">async def update_or_delete_user_id_mapping_info(
268+
user_id: str,
269+
user_id_type: Optional[UserIDTypes] = None,
270+
external_user_id_info: Optional[str] = None,
271+
) -&gt; Union[UpdateOrDeleteUserIdMappingInfoOkResult, UnknownMappingError]:
272+
return await Supertokens.get_instance().update_or_delete_user_id_mapping_info(
273+
user_id, user_id_type, external_user_id_info
274+
)</code></pre>
275+
</details>
276+
</dd>
147277
</dl>
148278
</section>
149279
<section>
@@ -162,10 +292,14 @@ <h2>Index</h2>
162292
</li>
163293
<li><h3><a href="#header-functions">Functions</a></h3>
164294
<ul class="">
295+
<li><code><a title="supertokens_python.asyncio.create_user_id_mapping" href="#supertokens_python.asyncio.create_user_id_mapping">create_user_id_mapping</a></code></li>
165296
<li><code><a title="supertokens_python.asyncio.delete_user" href="#supertokens_python.asyncio.delete_user">delete_user</a></code></li>
297+
<li><code><a title="supertokens_python.asyncio.delete_user_id_mapping" href="#supertokens_python.asyncio.delete_user_id_mapping">delete_user_id_mapping</a></code></li>
166298
<li><code><a title="supertokens_python.asyncio.get_user_count" href="#supertokens_python.asyncio.get_user_count">get_user_count</a></code></li>
299+
<li><code><a title="supertokens_python.asyncio.get_user_id_mapping" href="#supertokens_python.asyncio.get_user_id_mapping">get_user_id_mapping</a></code></li>
167300
<li><code><a title="supertokens_python.asyncio.get_users_newest_first" href="#supertokens_python.asyncio.get_users_newest_first">get_users_newest_first</a></code></li>
168301
<li><code><a title="supertokens_python.asyncio.get_users_oldest_first" href="#supertokens_python.asyncio.get_users_oldest_first">get_users_oldest_first</a></code></li>
302+
<li><code><a title="supertokens_python.asyncio.update_or_delete_user_id_mapping_info" href="#supertokens_python.asyncio.update_or_delete_user_id_mapping_info">update_or_delete_user_id_mapping_info</a></code></li>
169303
</ul>
170304
</li>
171305
</ul>

html/supertokens_python/constants.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.constants API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
@@ -39,8 +39,8 @@ <h1 class="title">Module <code>supertokens_python.constants</code></h1>
3939
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
4040
# License for the specific language governing permissions and limitations
4141
# under the License.
42-
SUPPORTED_CDI_VERSIONS = [&#34;2.9&#34;, &#34;2.10&#34;, &#34;2.11&#34;, &#34;2.12&#34;, &#34;2.13&#34;, &#34;2.14&#34;]
43-
VERSION = &#34;0.10.1&#34;
42+
SUPPORTED_CDI_VERSIONS = [&#34;2.9&#34;, &#34;2.10&#34;, &#34;2.11&#34;, &#34;2.12&#34;, &#34;2.13&#34;, &#34;2.14&#34;, &#34;2.15&#34;]
43+
VERSION = &#34;0.10.4&#34;
4444
TELEMETRY = &#34;/telemetry&#34;
4545
USER_COUNT = &#34;/users/count&#34;
4646
USER_DELETE = &#34;/user/remove&#34;

html/supertokens_python/exceptions.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.exceptions API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>

html/supertokens_python/framework/django/django_middleware.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.framework.django.django_middleware API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>

html/supertokens_python/framework/django/django_request.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.framework.django.django_request API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>

html/supertokens_python/framework/django/django_response.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
66
<meta name="generator" content="pdoc 0.10.0" />
77
<title>supertokens_python.framework.django.django_response API documentation</title>
8-
<meta name="description" content="" />
8+
<meta name="description" content="Documentation for supertokens_python - SuperTokens Python SDK" />
99
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
1010
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
1111
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>

0 commit comments

Comments
 (0)