@ankhorage/studio 2.0.4 → 2.0.5

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/studio
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v2.0.1](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v2.0.4](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Standalone Studio authoring package for Ankhorage apps.
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/callback.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,UA0L7F"}
1
+ {"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/callback.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,UA+J7F"}
@@ -14,33 +14,6 @@ const SIGN_IN_ROUTE = '${signInTarget}';
14
14
  const POST_SIGN_IN_ROUTE = '${postSignInTarget}';
15
15
  const callbackScreenOptions = { title: 'Completing sign in' };
16
16
 
17
- interface ActiveCallbackCompletion {
18
- callbackUrl: string;
19
- promise: ReturnType<typeof completeOAuthCallback>;
20
- }
21
-
22
- let activeCallbackCompletion: ActiveCallbackCompletion | null = null;
23
-
24
- function completeOAuthCallbackOnce(callbackUrl: string) {
25
- if (activeCallbackCompletion?.callbackUrl !== callbackUrl) {
26
- const completion: ActiveCallbackCompletion = {
27
- callbackUrl,
28
- promise: completeOAuthCallback(callbackUrl),
29
- };
30
- activeCallbackCompletion = completion;
31
- void completion.promise
32
- .finally(() => {
33
- if (activeCallbackCompletion === completion) {
34
- activeCallbackCompletion = null;
35
- }
36
- })
37
- .catch(() => {
38
- // The original promise remains the callback screen's error boundary.
39
- });
40
- }
41
- return activeCallbackCompletion.promise;
42
- }
43
-
44
17
  function useOAuthCallbackOutcome(callbackUrl: string | null) {
45
18
  const router = useRouter();
46
19
  const handledOutcomeRef = useRef(false);
@@ -126,7 +99,7 @@ async function completeCallbackRouteAsync(args: {
126
99
  return;
127
100
  }
128
101
 
129
- const outcome = await completeOAuthCallbackOnce(callbackUrl);
102
+ const outcome = await completeOAuthCallback(callbackUrl);
130
103
  if (signal.aborted || handledOutcomeRef.current) return;
131
104
  handledOutcomeRef.current = true;
132
105
  if (outcome.status === 'authenticated') {
@@ -1 +1 @@
1
- {"version":3,"file":"callback.js","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,UAAU,uBAAuB,CAAC,IAAsD;IAC5F,MAAM,YAAY,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3F,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;IAElG,OAAO;;;;;;;yBAOgB,YAAY;8BACP,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K7C,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"callback.js","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,UAAU,uBAAuB,CAAC,IAAsD;IAC5F,MAAM,YAAY,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3F,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;IAElG,OAAO;;;;;;;yBAOgB,YAAY;8BACP,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJ7C,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"oauthCompletion.d.ts","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/oauthCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAInF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,0BAA0B,CAAC;CAC3C,UA8IA"}
1
+ {"version":3,"file":"oauthCompletion.d.ts","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/oauthCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAInF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,0BAA0B,CAAC;CAC3C,UAoKA"}
@@ -20,6 +20,8 @@ const GENERATED_NATIVE_SCHEMES = {
20
20
 
21
21
  export type OAuthCallbackRouteParams = Readonly<Record<string, string | string[] | undefined>>;
22
22
 
23
+ const activeCallbackCompletions = new Map<string, Promise<GeneratedOAuthTransportOutcome>>();
24
+
23
25
  export function resolveOAuthCallbackUrl(params: OAuthCallbackRouteParams): string {
24
26
  const callbackUrl = new URL(resolveOAuthRedirectUri());
25
27
  for (const [name, value] of Object.entries(params)) {
@@ -33,7 +35,27 @@ export function resolveOAuthCallbackUrl(params: OAuthCallbackRouteParams): strin
33
35
  return callbackUrl.toString();
34
36
  }
35
37
 
36
- export async function completeOAuthCallback(
38
+ export function completeOAuthCallback(
39
+ callbackUrl: string,
40
+ ): Promise<GeneratedOAuthTransportOutcome> {
41
+ const activeCompletion = activeCallbackCompletions.get(callbackUrl);
42
+ if (activeCompletion) return activeCompletion;
43
+
44
+ const completion = completeOAuthCallbackAsync(callbackUrl);
45
+ activeCallbackCompletions.set(callbackUrl, completion);
46
+ void completion
47
+ .finally(() => {
48
+ if (activeCallbackCompletions.get(callbackUrl) === completion) {
49
+ activeCallbackCompletions.delete(callbackUrl);
50
+ }
51
+ })
52
+ .catch(() => {
53
+ // The original promise remains the caller's error boundary.
54
+ });
55
+ return completion;
56
+ }
57
+
58
+ async function completeOAuthCallbackAsync(
37
59
  callbackUrl: string,
38
60
  ): Promise<GeneratedOAuthTransportOutcome> {
39
61
  const { oauth } = authAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"oauthCompletion.js","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/oauthCompletion.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,UAAU,wBAAwB,CAAC,IAGxC;IACC,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAElE,OAAO;;;;;;;;;gCASuB,aAAa;;aAEhC,aAAa;SACjB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HjB,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA0B;IACzD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC;AACjF,CAAC"}
1
+ {"version":3,"file":"oauthCompletion.js","sourceRoot":"","sources":["../../../../../src/host/layout/templates/auth/oauthCompletion.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,UAAU,wBAAwB,CAAC,IAGxC;IACC,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAElE,OAAO;;;;;;;;;gCASuB,aAAa;;aAEhC,aAAa;SACjB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJjB,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA0B;IACzD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC;AACjF,CAAC"}
@@ -5,7 +5,7 @@ const DATA_SOURCES_VERSION = '^2.0.0';
5
5
  const RUNTIME_VERSION = '^2.2.0';
6
6
  const STUDIO_VERSION = '^2.0.2';
7
7
  const UTILITY_VERSION = '^0.2.0';
8
- const SUPABASE_AUTH_VERSION = '^1.2.4';
8
+ const SUPABASE_AUTH_VERSION = '^1.2.5';
9
9
  const SUPABASE_STORAGE_VERSION = '^0.2.0';
10
10
  const ZORA_VERSION = '^3.0.0';
11
11
  const EXPO_RUNTIME_VERSION = '^3.0.4';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/studio",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "Studio authoring package for Ankhorage apps",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ankhorage/studio#readme",
@@ -218,7 +218,7 @@
218
218
  "@ankhorage/orchestrator-module-expo-localization": "^0.6.0",
219
219
  "@ankhorage/react-native-reanimated-dnd-web": "^0.4.0",
220
220
  "@ankhorage/runtime": "^2.2.0",
221
- "@ankhorage/supabase-auth": "^1.2.4",
221
+ "@ankhorage/supabase-auth": "^1.2.5",
222
222
  "@ankhorage/supabase-storage": "^0.2.0",
223
223
  "@ankhorage/supabase-vault": "^0.2.4",
224
224
  "@ankhorage/templates": "^7.0.0",