@backstage/plugin-app 0.0.0-nightly-20240828022712
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/CHANGELOG.md +31 -0
- package/README.md +9 -0
- package/dist/defaultApis.esm.js +334 -0
- package/dist/defaultApis.esm.js.map +1 -0
- package/dist/extensions/App.esm.js +39 -0
- package/dist/extensions/App.esm.js.map +1 -0
- package/dist/extensions/AppLanguageApi.esm.js +16 -0
- package/dist/extensions/AppLanguageApi.esm.js.map +1 -0
- package/dist/extensions/AppLayout.esm.js +26 -0
- package/dist/extensions/AppLayout.esm.js.map +1 -0
- package/dist/extensions/AppNav.esm.js +66 -0
- package/dist/extensions/AppNav.esm.js.map +1 -0
- package/dist/extensions/AppRoot.esm.js +153 -0
- package/dist/extensions/AppRoot.esm.js.map +1 -0
- package/dist/extensions/AppRoutes.esm.js +39 -0
- package/dist/extensions/AppRoutes.esm.js.map +1 -0
- package/dist/extensions/AppThemeApi.esm.js +56 -0
- package/dist/extensions/AppThemeApi.esm.js.map +1 -0
- package/dist/extensions/ComponentsApi.esm.js +27 -0
- package/dist/extensions/ComponentsApi.esm.js.map +1 -0
- package/dist/extensions/FeatureFlagsApi.esm.js +17 -0
- package/dist/extensions/FeatureFlagsApi.esm.js.map +1 -0
- package/dist/extensions/IconsApi.esm.js +33 -0
- package/dist/extensions/IconsApi.esm.js.map +1 -0
- package/dist/extensions/TranslationsApi.esm.js +30 -0
- package/dist/extensions/TranslationsApi.esm.js.map +1 -0
- package/dist/extensions/components.esm.js +52 -0
- package/dist/extensions/components.esm.js.map +1 -0
- package/dist/extensions/elements.esm.js +32 -0
- package/dist/extensions/elements.esm.js.map +1 -0
- package/dist/index.d.ts +430 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/packages/app/src/components/Root/LogoFull.esm.js +33 -0
- package/dist/packages/app/src/components/Root/LogoFull.esm.js.map +1 -0
- package/dist/packages/app/src/components/Root/LogoIcon.esm.js +33 -0
- package/dist/packages/app/src/components/Root/LogoIcon.esm.js.map +1 -0
- package/dist/packages/app-defaults/src/defaults/apis.esm.js +219 -0
- package/dist/packages/app-defaults/src/defaults/apis.esm.js.map +1 -0
- package/dist/packages/app-defaults/src/defaults/components.esm.js +46 -0
- package/dist/packages/app-defaults/src/defaults/components.esm.js.map +1 -0
- package/dist/packages/app-defaults/src/defaults/icons.esm.js +51 -0
- package/dist/packages/app-defaults/src/defaults/icons.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/AlertApi/AlertApiForwarder.esm.js +14 -0
- package/dist/packages/core-app-api/src/apis/implementations/AlertApi/AlertApiForwarder.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/AnalyticsApi/NoOpAnalyticsApi.esm.js +7 -0
- package/dist/packages/core-app-api/src/apis/implementations/AnalyticsApi/NoOpAnalyticsApi.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.esm.js +89 -0
- package/dist/packages/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/AppThemeApi/AppThemeSelector.esm.js +48 -0
- package/dist/packages/core-app-api/src/apis/implementations/AppThemeApi/AppThemeSelector.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.esm.js +39 -0
- package/dist/packages/core-app-api/src/apis/implementations/DiscoveryApi/UrlPatternDiscovery.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorAlerter.esm.js +18 -0
- package/dist/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorAlerter.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorApiForwarder.esm.js +14 -0
- package/dist/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorApiForwarder.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/ErrorApi/UnhandledErrorForwarder.esm.js +16 -0
- package/dist/packages/core-app-api/src/apis/implementations/ErrorApi/UnhandledErrorForwarder.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.esm.js +76 -0
- package/dist/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/FetchMiddlewares.esm.js +45 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/FetchMiddlewares.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.esm.js +49 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.esm.js +40 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/createFetchApi.esm.js +13 -0
- package/dist/packages/core-app-api/src/apis/implementations/FetchApi/createFetchApi.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthPendingRequests.esm.js +71 -0
- package/dist/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthPendingRequests.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.esm.js +54 -0
- package/dist/packages/core-app-api/src/apis/implementations/OAuthRequestApi/OAuthRequestManager.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.esm.js +96 -0
- package/dist/packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.esm.js +234 -0
- package/dist/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.esm.js +28 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.esm.js +30 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.esm.js +30 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.esm.js +30 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.esm.js +30 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.esm.js +49 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.esm.js +130 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.esm.js +127 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.esm.js +51 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/okta/OktaAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.esm.js +50 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/onelogin/OneLoginAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/saml/types.esm.js +18 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/saml/types.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/vmwareCloud/VMwareCloudAuth.esm.js +30 -0
- package/dist/packages/core-app-api/src/apis/implementations/auth/vmwareCloud/VMwareCloudAuth.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/system/ApiAggregator.esm.js +18 -0
- package/dist/packages/core-app-api/src/apis/system/ApiAggregator.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/apis/system/ApiProvider.esm.js +25 -0
- package/dist/packages/core-app-api/src/apis/system/ApiProvider.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/app/AppContext.esm.js +5 -0
- package/dist/packages/core-app-api/src/app/AppContext.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/app/AppRouter.esm.js +94 -0
- package/dist/packages/core-app-api/src/app/AppRouter.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/app/AppThemeProvider.esm.js +60 -0
- package/dist/packages/core-app-api/src/app/AppThemeProvider.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/app/InternalAppContext.esm.js +6 -0
- package/dist/packages/core-app-api/src/app/InternalAppContext.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/app/isProtectedApp.esm.js +8 -0
- package/dist/packages/core-app-api/src/app/isProtectedApp.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/app/isReactRouterBeta.esm.js +10 -0
- package/dist/packages/core-app-api/src/app/isReactRouterBeta.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.esm.js +164 -0
- package/dist/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.esm.js +91 -0
- package/dist/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/lib/AuthSessionManager/SessionStateTracker.esm.js +23 -0
- package/dist/packages/core-app-api/src/lib/AuthSessionManager/SessionStateTracker.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/lib/AuthSessionManager/common.esm.js +44 -0
- package/dist/packages/core-app-api/src/lib/AuthSessionManager/common.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/lib/loginPopup.esm.js +62 -0
- package/dist/packages/core-app-api/src/lib/loginPopup.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/lib/subjects.esm.js +124 -0
- package/dist/packages/core-app-api/src/lib/subjects.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/routing/FeatureFlagged.esm.js +13 -0
- package/dist/packages/core-app-api/src/routing/FeatureFlagged.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/routing/FlatRoutes.esm.js +59 -0
- package/dist/packages/core-app-api/src/routing/FlatRoutes.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/routing/RouteTracker.esm.js +77 -0
- package/dist/packages/core-app-api/src/routing/RouteTracker.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/routing/RoutingProvider.esm.js +10 -0
- package/dist/packages/core-app-api/src/routing/RoutingProvider.esm.js.map +1 -0
- package/dist/packages/core-app-api/src/routing/types.esm.js +7 -0
- package/dist/packages/core-app-api/src/routing/types.esm.js.map +1 -0
- package/dist/packages/core-plugin-api/src/translation/TranslationRef.esm.js +13 -0
- package/dist/packages/core-plugin-api/src/translation/TranslationRef.esm.js.map +1 -0
- package/dist/packages/core-plugin-api/src/translation/TranslationResource.esm.js +13 -0
- package/dist/packages/core-plugin-api/src/translation/TranslationResource.esm.js.map +1 -0
- package/dist/packages/frontend-app-api/src/apis/implementations/ComponentsApi/DefaultComponentsApi.esm.js +21 -0
- package/dist/packages/frontend-app-api/src/apis/implementations/ComponentsApi/DefaultComponentsApi.esm.js.map +1 -0
- package/dist/packages/frontend-app-api/src/apis/implementations/IconsApi/DefaultIconsApi.esm.js +15 -0
- package/dist/packages/frontend-app-api/src/apis/implementations/IconsApi/DefaultIconsApi.esm.js.map +1 -0
- package/dist/packages/frontend-app-api/src/routing/RouteTracker.esm.js +69 -0
- package/dist/packages/frontend-app-api/src/routing/RouteTracker.esm.js.map +1 -0
- package/dist/packages/frontend-app-api/src/routing/getBasePath.esm.js +12 -0
- package/dist/packages/frontend-app-api/src/routing/getBasePath.esm.js.map +1 -0
- package/dist/plugin.esm.js +43 -0
- package/dist/plugin.esm.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { createInstance } from 'i18next';
|
|
2
|
+
import ObservableImpl from 'zen-observable';
|
|
3
|
+
import { toInternalTranslationResource } from '../../../../../core-plugin-api/src/translation/TranslationResource.esm.js';
|
|
4
|
+
import { toInternalTranslationRef } from '../../../../../core-plugin-api/src/translation/TranslationRef.esm.js';
|
|
5
|
+
import { DEFAULT_LANGUAGE } from '../AppLanguageApi/AppLanguageSelector.esm.js';
|
|
6
|
+
|
|
7
|
+
function removeNulls(messages) {
|
|
8
|
+
return Object.fromEntries(
|
|
9
|
+
Object.entries(messages).filter(
|
|
10
|
+
(e) => e[1] !== null
|
|
11
|
+
)
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
class ResourceLoader {
|
|
15
|
+
constructor(onLoad) {
|
|
16
|
+
this.onLoad = onLoad;
|
|
17
|
+
}
|
|
18
|
+
/** Loaded resources by loader key */
|
|
19
|
+
#loaded = /* @__PURE__ */ new Set();
|
|
20
|
+
/** Resource loading promises by loader key */
|
|
21
|
+
#loading = /* @__PURE__ */ new Map();
|
|
22
|
+
/** Loaders for each resource language */
|
|
23
|
+
#loaders = /* @__PURE__ */ new Map();
|
|
24
|
+
addTranslationResource(resource) {
|
|
25
|
+
const internalResource = toInternalTranslationResource(resource);
|
|
26
|
+
for (const entry of internalResource.resources) {
|
|
27
|
+
const key = this.#getLoaderKey(entry.language, internalResource.id);
|
|
28
|
+
if (!this.#loaders.has(key)) {
|
|
29
|
+
this.#loaders.set(key, entry.loader);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
#getLoaderKey(language, namespace) {
|
|
34
|
+
return `${language}/${namespace}`;
|
|
35
|
+
}
|
|
36
|
+
needsLoading(language, namespace) {
|
|
37
|
+
const key = this.#getLoaderKey(language, namespace);
|
|
38
|
+
const loader = this.#loaders.get(key);
|
|
39
|
+
if (!loader) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return !this.#loaded.has(key);
|
|
43
|
+
}
|
|
44
|
+
async load(language, namespace) {
|
|
45
|
+
const key = this.#getLoaderKey(language, namespace);
|
|
46
|
+
const loader = this.#loaders.get(key);
|
|
47
|
+
if (!loader) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (this.#loaded.has(key)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const loading = this.#loading.get(key);
|
|
54
|
+
if (loading) {
|
|
55
|
+
await loading;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const load = loader().then(
|
|
59
|
+
(result) => {
|
|
60
|
+
this.onLoad({ language, namespace, messages: result.messages });
|
|
61
|
+
this.#loaded.add(key);
|
|
62
|
+
},
|
|
63
|
+
(error) => {
|
|
64
|
+
this.#loaded.add(key);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
this.#loading.set(key, load);
|
|
69
|
+
await load;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
class I18nextTranslationApi {
|
|
73
|
+
static create(options) {
|
|
74
|
+
const { languages } = options.languageApi.getAvailableLanguages();
|
|
75
|
+
const i18n = createInstance({
|
|
76
|
+
fallbackLng: DEFAULT_LANGUAGE,
|
|
77
|
+
supportedLngs: languages,
|
|
78
|
+
interpolation: {
|
|
79
|
+
escapeValue: false
|
|
80
|
+
},
|
|
81
|
+
ns: [],
|
|
82
|
+
defaultNS: false,
|
|
83
|
+
fallbackNS: false,
|
|
84
|
+
// Disable resource loading on init, meaning i18n will be ready to use immediately
|
|
85
|
+
initImmediate: false
|
|
86
|
+
});
|
|
87
|
+
i18n.init();
|
|
88
|
+
if (!i18n.isInitialized) {
|
|
89
|
+
throw new Error("i18next was unexpectedly not initialized");
|
|
90
|
+
}
|
|
91
|
+
const { language: initialLanguage } = options.languageApi.getLanguage();
|
|
92
|
+
if (initialLanguage !== DEFAULT_LANGUAGE) {
|
|
93
|
+
i18n.changeLanguage(initialLanguage);
|
|
94
|
+
}
|
|
95
|
+
const loader = new ResourceLoader((loaded) => {
|
|
96
|
+
i18n.addResourceBundle(
|
|
97
|
+
loaded.language,
|
|
98
|
+
loaded.namespace,
|
|
99
|
+
removeNulls(loaded.messages),
|
|
100
|
+
false,
|
|
101
|
+
// do not merge with existing translations
|
|
102
|
+
true
|
|
103
|
+
// overwrite translations
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
const resources = options?.resources || [];
|
|
107
|
+
for (let i = resources.length - 1; i >= 0; i--) {
|
|
108
|
+
const resource = resources[i];
|
|
109
|
+
if (resource.$$type === "@backstage/TranslationResource") {
|
|
110
|
+
loader.addTranslationResource(resource);
|
|
111
|
+
} else if (resource.$$type === "@backstage/TranslationMessages") {
|
|
112
|
+
i18n.addResourceBundle(
|
|
113
|
+
DEFAULT_LANGUAGE,
|
|
114
|
+
resource.id,
|
|
115
|
+
removeNulls(resource.messages),
|
|
116
|
+
true,
|
|
117
|
+
// merge with existing translations
|
|
118
|
+
false
|
|
119
|
+
// do not overwrite translations
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const instance = new I18nextTranslationApi(
|
|
124
|
+
i18n,
|
|
125
|
+
loader,
|
|
126
|
+
options.languageApi.getLanguage().language
|
|
127
|
+
);
|
|
128
|
+
options.languageApi.language$().subscribe(({ language }) => {
|
|
129
|
+
instance.#changeLanguage(language);
|
|
130
|
+
});
|
|
131
|
+
return instance;
|
|
132
|
+
}
|
|
133
|
+
#i18n;
|
|
134
|
+
#loader;
|
|
135
|
+
#language;
|
|
136
|
+
/** Keep track of which refs we have registered default resources for */
|
|
137
|
+
#registeredRefs = /* @__PURE__ */ new Set();
|
|
138
|
+
/** Notify observers when language changes */
|
|
139
|
+
#languageChangeListeners = /* @__PURE__ */ new Set();
|
|
140
|
+
constructor(i18n, loader, language) {
|
|
141
|
+
this.#i18n = i18n;
|
|
142
|
+
this.#loader = loader;
|
|
143
|
+
this.#language = language;
|
|
144
|
+
}
|
|
145
|
+
getTranslation(translationRef) {
|
|
146
|
+
const internalRef = toInternalTranslationRef(translationRef);
|
|
147
|
+
this.#registerDefaults(internalRef);
|
|
148
|
+
return this.#createSnapshot(internalRef);
|
|
149
|
+
}
|
|
150
|
+
translation$(translationRef) {
|
|
151
|
+
const internalRef = toInternalTranslationRef(translationRef);
|
|
152
|
+
this.#registerDefaults(internalRef);
|
|
153
|
+
return new ObservableImpl((subscriber) => {
|
|
154
|
+
let loadTicket = {};
|
|
155
|
+
const loadResource = () => {
|
|
156
|
+
loadTicket = {};
|
|
157
|
+
const ticket = loadTicket;
|
|
158
|
+
this.#loader.load(this.#language, internalRef.id).then(
|
|
159
|
+
() => {
|
|
160
|
+
if (ticket === loadTicket) {
|
|
161
|
+
const snapshot = this.#createSnapshot(internalRef);
|
|
162
|
+
if (snapshot.ready) {
|
|
163
|
+
subscriber.next(snapshot);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
(error) => {
|
|
168
|
+
if (ticket === loadTicket) {
|
|
169
|
+
subscriber.error(Array.isArray(error) ? error[0] : error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
const onChange = () => {
|
|
175
|
+
const snapshot = this.#createSnapshot(internalRef);
|
|
176
|
+
if (snapshot.ready) {
|
|
177
|
+
subscriber.next(snapshot);
|
|
178
|
+
} else {
|
|
179
|
+
loadResource();
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
if (this.#loader.needsLoading(this.#language, internalRef.id)) {
|
|
183
|
+
loadResource();
|
|
184
|
+
}
|
|
185
|
+
this.#languageChangeListeners.add(onChange);
|
|
186
|
+
return () => {
|
|
187
|
+
this.#languageChangeListeners.delete(onChange);
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
#changeLanguage(language) {
|
|
192
|
+
if (this.#language !== language) {
|
|
193
|
+
this.#language = language;
|
|
194
|
+
this.#i18n.changeLanguage(language);
|
|
195
|
+
this.#languageChangeListeners.forEach((listener) => listener());
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
#createSnapshot(internalRef) {
|
|
199
|
+
if (this.#loader.needsLoading(this.#language, internalRef.id)) {
|
|
200
|
+
return { ready: false };
|
|
201
|
+
}
|
|
202
|
+
const t = this.#i18n.getFixedT(
|
|
203
|
+
null,
|
|
204
|
+
internalRef.id
|
|
205
|
+
);
|
|
206
|
+
return {
|
|
207
|
+
ready: true,
|
|
208
|
+
t
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
#registerDefaults(internalRef) {
|
|
212
|
+
if (this.#registeredRefs.has(internalRef.id)) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.#registeredRefs.add(internalRef.id);
|
|
216
|
+
const defaultMessages = internalRef.getDefaultMessages();
|
|
217
|
+
this.#i18n.addResourceBundle(
|
|
218
|
+
DEFAULT_LANGUAGE,
|
|
219
|
+
internalRef.id,
|
|
220
|
+
defaultMessages,
|
|
221
|
+
true,
|
|
222
|
+
// merge with existing translations
|
|
223
|
+
false
|
|
224
|
+
// do not overwrite translations
|
|
225
|
+
);
|
|
226
|
+
const defaultResource = internalRef.getDefaultResource();
|
|
227
|
+
if (defaultResource) {
|
|
228
|
+
this.#loader.addTranslationResource(defaultResource);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export { I18nextTranslationApi };
|
|
234
|
+
//# sourceMappingURL=I18nextTranslationApi.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"I18nextTranslationApi.esm.js","sources":["../../../../../../../../../packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AppLanguageApi,\n TranslationApi,\n TranslationFunction,\n TranslationMessages,\n TranslationRef,\n TranslationResource,\n TranslationSnapshot,\n} from '@backstage/core-plugin-api/alpha';\nimport { createInstance as createI18n, type i18n as I18n } from 'i18next';\nimport ObservableImpl from 'zen-observable';\n\n// Internal import to avoid code duplication, this will lead to duplication in build output\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport {\n toInternalTranslationResource,\n InternalTranslationResourceLoader,\n} from '../../../../../core-plugin-api/src/translation/TranslationResource';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport {\n toInternalTranslationRef,\n InternalTranslationRef,\n} from '../../../../../core-plugin-api/src/translation/TranslationRef';\nimport { Observable } from '@backstage/types';\nimport { DEFAULT_LANGUAGE } from '../AppLanguageApi/AppLanguageSelector';\n\n/** @alpha */\nexport interface I18nextTranslationApiOptions {\n languageApi: AppLanguageApi;\n resources?: Array<TranslationMessages | TranslationResource>;\n}\n\nfunction removeNulls(\n messages: Record<string, string | null>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(messages).filter(\n (e): e is [string, string] => e[1] !== null,\n ),\n );\n}\n\n/**\n * The built-in i18next backend loading logic doesn't handle on the fly switches\n * of language very well. It gets a bit confused about whether resources are actually\n * loaded or not, so instead we implement our own resource loader.\n */\nclass ResourceLoader {\n /** Loaded resources by loader key */\n #loaded = new Set<string>();\n /** Resource loading promises by loader key */\n #loading = new Map<string, Promise<void>>();\n /** Loaders for each resource language */\n #loaders = new Map<string, InternalTranslationResourceLoader>();\n\n constructor(\n private readonly onLoad: (loaded: {\n language: string;\n namespace: string;\n messages: Record<string, string | null>;\n }) => void,\n ) {}\n\n addTranslationResource(resource: TranslationResource) {\n const internalResource = toInternalTranslationResource(resource);\n for (const entry of internalResource.resources) {\n const key = this.#getLoaderKey(entry.language, internalResource.id);\n\n // First loader to register wins, this means that resources registered in the app\n // have priority over default resource from translation refs\n if (!this.#loaders.has(key)) {\n this.#loaders.set(key, entry.loader);\n }\n }\n }\n\n #getLoaderKey(language: string, namespace: string) {\n return `${language}/${namespace}`;\n }\n\n needsLoading(language: string, namespace: string) {\n const key = this.#getLoaderKey(language, namespace);\n const loader = this.#loaders.get(key);\n if (!loader) {\n return false;\n }\n\n return !this.#loaded.has(key);\n }\n\n async load(language: string, namespace: string): Promise<void> {\n const key = this.#getLoaderKey(language, namespace);\n\n const loader = this.#loaders.get(key);\n if (!loader) {\n return;\n }\n\n if (this.#loaded.has(key)) {\n return;\n }\n\n const loading = this.#loading.get(key);\n if (loading) {\n await loading;\n return;\n }\n\n const load = loader().then(\n result => {\n this.onLoad({ language, namespace, messages: result.messages });\n this.#loaded.add(key);\n },\n error => {\n this.#loaded.add(key); // Do not try to load failed resources again\n throw error;\n },\n );\n this.#loading.set(key, load);\n await load;\n }\n}\n\n/** @alpha */\nexport class I18nextTranslationApi implements TranslationApi {\n static create(options: I18nextTranslationApiOptions) {\n const { languages } = options.languageApi.getAvailableLanguages();\n\n const i18n = createI18n({\n fallbackLng: DEFAULT_LANGUAGE,\n supportedLngs: languages,\n interpolation: {\n escapeValue: false,\n },\n ns: [],\n defaultNS: false,\n fallbackNS: false,\n\n // Disable resource loading on init, meaning i18n will be ready to use immediately\n initImmediate: false,\n });\n\n i18n.init();\n if (!i18n.isInitialized) {\n throw new Error('i18next was unexpectedly not initialized');\n }\n\n const { language: initialLanguage } = options.languageApi.getLanguage();\n if (initialLanguage !== DEFAULT_LANGUAGE) {\n i18n.changeLanguage(initialLanguage);\n }\n\n const loader = new ResourceLoader(loaded => {\n i18n.addResourceBundle(\n loaded.language,\n loaded.namespace,\n removeNulls(loaded.messages),\n false, // do not merge with existing translations\n true, // overwrite translations\n );\n });\n\n const resources = options?.resources || [];\n // Iterate in reverse, giving higher priority to resources registered later\n for (let i = resources.length - 1; i >= 0; i--) {\n const resource = resources[i];\n if (resource.$$type === '@backstage/TranslationResource') {\n loader.addTranslationResource(resource);\n } else if (resource.$$type === '@backstage/TranslationMessages') {\n // Overrides for default messages, created with createTranslationMessages and installed via app\n i18n.addResourceBundle(\n DEFAULT_LANGUAGE,\n resource.id,\n removeNulls(resource.messages),\n true, // merge with existing translations\n false, // do not overwrite translations\n );\n }\n }\n\n const instance = new I18nextTranslationApi(\n i18n,\n loader,\n options.languageApi.getLanguage().language,\n );\n\n options.languageApi.language$().subscribe(({ language }) => {\n instance.#changeLanguage(language);\n });\n\n return instance;\n }\n\n #i18n: I18n;\n #loader: ResourceLoader;\n #language: string;\n\n /** Keep track of which refs we have registered default resources for */\n #registeredRefs = new Set<string>();\n /** Notify observers when language changes */\n #languageChangeListeners = new Set<() => void>();\n\n private constructor(i18n: I18n, loader: ResourceLoader, language: string) {\n this.#i18n = i18n;\n this.#loader = loader;\n this.#language = language;\n }\n\n getTranslation<TMessages extends { [key in string]: string }>(\n translationRef: TranslationRef<string, TMessages>,\n ): TranslationSnapshot<TMessages> {\n const internalRef = toInternalTranslationRef(translationRef);\n\n this.#registerDefaults(internalRef);\n\n return this.#createSnapshot(internalRef);\n }\n\n translation$<TMessages extends { [key in string]: string }>(\n translationRef: TranslationRef<string, TMessages>,\n ): Observable<TranslationSnapshot<TMessages>> {\n const internalRef = toInternalTranslationRef(translationRef);\n\n this.#registerDefaults(internalRef);\n\n return new ObservableImpl<TranslationSnapshot<TMessages>>(subscriber => {\n let loadTicket = {}; // To check for stale loads\n\n const loadResource = () => {\n loadTicket = {};\n const ticket = loadTicket;\n this.#loader.load(this.#language, internalRef.id).then(\n () => {\n if (ticket === loadTicket) {\n const snapshot = this.#createSnapshot(internalRef);\n if (snapshot.ready) {\n subscriber.next(snapshot);\n }\n }\n },\n error => {\n if (ticket === loadTicket) {\n subscriber.error(Array.isArray(error) ? error[0] : error);\n }\n },\n );\n };\n\n const onChange = () => {\n const snapshot = this.#createSnapshot(internalRef);\n if (snapshot.ready) {\n subscriber.next(snapshot);\n } else {\n loadResource();\n }\n };\n\n if (this.#loader.needsLoading(this.#language, internalRef.id)) {\n loadResource();\n }\n\n this.#languageChangeListeners.add(onChange);\n return () => {\n this.#languageChangeListeners.delete(onChange);\n };\n });\n }\n\n #changeLanguage(language: string): void {\n if (this.#language !== language) {\n this.#language = language;\n this.#i18n.changeLanguage(language);\n this.#languageChangeListeners.forEach(listener => listener());\n }\n }\n\n #createSnapshot<TMessages extends { [key in string]: string }>(\n internalRef: InternalTranslationRef<string, TMessages>,\n ): TranslationSnapshot<TMessages> {\n if (this.#loader.needsLoading(this.#language, internalRef.id)) {\n return { ready: false };\n }\n\n const t = this.#i18n.getFixedT(\n null,\n internalRef.id,\n ) as TranslationFunction<TMessages>;\n\n return {\n ready: true,\n t,\n };\n }\n\n #registerDefaults(internalRef: InternalTranslationRef): void {\n if (this.#registeredRefs.has(internalRef.id)) {\n return;\n }\n this.#registeredRefs.add(internalRef.id);\n\n const defaultMessages = internalRef.getDefaultMessages();\n this.#i18n.addResourceBundle(\n DEFAULT_LANGUAGE,\n internalRef.id,\n defaultMessages,\n true, // merge with existing translations\n false, // do not overwrite translations\n );\n\n const defaultResource = internalRef.getDefaultResource();\n if (defaultResource) {\n this.#loader.addTranslationResource(defaultResource);\n }\n }\n}\n"],"names":["createI18n"],"mappings":"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"}
|
package/dist/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.esm.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "atlassian",
|
|
5
|
+
title: "Atlassian",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
class AtlassianAuth {
|
|
9
|
+
static create(options) {
|
|
10
|
+
const {
|
|
11
|
+
configApi,
|
|
12
|
+
discoveryApi,
|
|
13
|
+
environment = "development",
|
|
14
|
+
provider = DEFAULT_PROVIDER,
|
|
15
|
+
oauthRequestApi
|
|
16
|
+
} = options;
|
|
17
|
+
return OAuth2.create({
|
|
18
|
+
configApi,
|
|
19
|
+
discoveryApi,
|
|
20
|
+
oauthRequestApi,
|
|
21
|
+
provider,
|
|
22
|
+
environment
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { AtlassianAuth as default };
|
|
28
|
+
//# sourceMappingURL=AtlassianAuth.esm.js.map
|
package/dist/packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.esm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AtlassianAuth.esm.js","sources":["../../../../../../../../../../packages/core-app-api/src/apis/implementations/auth/atlassian/AtlassianAuth.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { atlassianAuthApiRef } from '@backstage/core-plugin-api';\nimport { OAuth2 } from '../oauth2';\nimport { OAuthApiCreateOptions } from '../types';\n\nconst DEFAULT_PROVIDER = {\n id: 'atlassian',\n title: 'Atlassian',\n icon: () => null,\n};\n\n/**\n * Implements the OAuth flow to Atlassian products.\n *\n * @public\n */\nexport default class AtlassianAuth {\n static create(options: OAuthApiCreateOptions): typeof atlassianAuthApiRef.T {\n const {\n configApi,\n discoveryApi,\n environment = 'development',\n provider = DEFAULT_PROVIDER,\n oauthRequestApi,\n } = options;\n\n return OAuth2.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n provider,\n environment,\n });\n }\n}\n"],"names":[],"mappings":";;AAoBA,MAAM,gBAAmB,GAAA;AAAA,EACvB,EAAI,EAAA,WAAA;AAAA,EACJ,KAAO,EAAA,WAAA;AAAA,EACP,MAAM,MAAM,IAAA;AACd,CAAA,CAAA;AAOA,MAAqB,aAAc,CAAA;AAAA,EACjC,OAAO,OAAO,OAA8D,EAAA;AAC1E,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAc,GAAA,aAAA;AAAA,MACd,QAAW,GAAA,gBAAA;AAAA,MACX,eAAA;AAAA,KACE,GAAA,OAAA,CAAA;AAEJ,IAAA,OAAO,OAAO,MAAO,CAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
package/dist/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.esm.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "bitbucket",
|
|
5
|
+
title: "Bitbucket",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
class BitbucketAuth {
|
|
9
|
+
static create(options) {
|
|
10
|
+
const {
|
|
11
|
+
configApi,
|
|
12
|
+
discoveryApi,
|
|
13
|
+
environment = "development",
|
|
14
|
+
provider = DEFAULT_PROVIDER,
|
|
15
|
+
oauthRequestApi,
|
|
16
|
+
defaultScopes = ["account"]
|
|
17
|
+
} = options;
|
|
18
|
+
return OAuth2.create({
|
|
19
|
+
configApi,
|
|
20
|
+
discoveryApi,
|
|
21
|
+
oauthRequestApi,
|
|
22
|
+
provider,
|
|
23
|
+
environment,
|
|
24
|
+
defaultScopes
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { BitbucketAuth as default };
|
|
30
|
+
//# sourceMappingURL=BitbucketAuth.esm.js.map
|
package/dist/packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.esm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitbucketAuth.esm.js","sources":["../../../../../../../../../../packages/core-app-api/src/apis/implementations/auth/bitbucket/BitbucketAuth.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackstageIdentityResponse,\n bitbucketAuthApiRef,\n ProfileInfo,\n} from '@backstage/core-plugin-api';\n\nimport { OAuthApiCreateOptions } from '../types';\nimport { OAuth2 } from '../oauth2';\n\nexport type BitbucketAuthResponse = {\n providerInfo: {\n accessToken: string;\n scope: string;\n expiresInSeconds: number;\n };\n profile: ProfileInfo;\n backstageIdentity: BackstageIdentityResponse;\n};\n\nconst DEFAULT_PROVIDER = {\n id: 'bitbucket',\n title: 'Bitbucket',\n icon: () => null,\n};\n\n/**\n * Implements the OAuth flow to Bitbucket products.\n *\n * @public\n */\nexport default class BitbucketAuth {\n static create(options: OAuthApiCreateOptions): typeof bitbucketAuthApiRef.T {\n const {\n configApi,\n discoveryApi,\n environment = 'development',\n provider = DEFAULT_PROVIDER,\n oauthRequestApi,\n defaultScopes = ['account'],\n } = options;\n\n return OAuth2.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n provider,\n environment,\n defaultScopes,\n });\n }\n}\n"],"names":[],"mappings":";;AAmCA,MAAM,gBAAmB,GAAA;AAAA,EACvB,EAAI,EAAA,WAAA;AAAA,EACJ,KAAO,EAAA,WAAA;AAAA,EACP,MAAM,MAAM,IAAA;AACd,CAAA,CAAA;AAOA,MAAqB,aAAc,CAAA;AAAA,EACjC,OAAO,OAAO,OAA8D,EAAA;AAC1E,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAc,GAAA,aAAA;AAAA,MACd,QAAW,GAAA,gBAAA;AAAA,MACX,eAAA;AAAA,MACA,aAAA,GAAgB,CAAC,SAAS,CAAA;AAAA,KACxB,GAAA,OAAA,CAAA;AAEJ,IAAA,OAAO,OAAO,MAAO,CAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "bitbucketServer",
|
|
5
|
+
title: "Bitbucket Server",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
class BitbucketServerAuth {
|
|
9
|
+
static create(options) {
|
|
10
|
+
const {
|
|
11
|
+
configApi,
|
|
12
|
+
discoveryApi,
|
|
13
|
+
environment = "development",
|
|
14
|
+
provider = DEFAULT_PROVIDER,
|
|
15
|
+
oauthRequestApi,
|
|
16
|
+
defaultScopes = ["PROJECT_ADMIN"]
|
|
17
|
+
} = options;
|
|
18
|
+
return OAuth2.create({
|
|
19
|
+
configApi,
|
|
20
|
+
discoveryApi,
|
|
21
|
+
oauthRequestApi,
|
|
22
|
+
provider,
|
|
23
|
+
environment,
|
|
24
|
+
defaultScopes
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { BitbucketServerAuth as default };
|
|
30
|
+
//# sourceMappingURL=BitbucketServerAuth.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitbucketServerAuth.esm.js","sources":["../../../../../../../../../../packages/core-app-api/src/apis/implementations/auth/bitbucketServer/BitbucketServerAuth.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackstageIdentityResponse,\n bitbucketServerAuthApiRef,\n ProfileInfo,\n} from '@backstage/core-plugin-api';\n\nimport { OAuthApiCreateOptions } from '../types';\nimport { OAuth2 } from '../oauth2';\n\nexport type BitbucketServerAuthResponse = {\n providerInfo: {\n accessToken: string;\n scope: string;\n expiresInSeconds: number;\n };\n profile: ProfileInfo;\n backstageIdentity: BackstageIdentityResponse;\n};\n\nconst DEFAULT_PROVIDER = {\n id: 'bitbucketServer',\n title: 'Bitbucket Server',\n icon: () => null,\n};\n\n/**\n * Implements the OAuth flow to Bitbucket Server.\n * @public\n */\nexport default class BitbucketServerAuth {\n static create(\n options: OAuthApiCreateOptions,\n ): typeof bitbucketServerAuthApiRef.T {\n const {\n configApi,\n discoveryApi,\n environment = 'development',\n provider = DEFAULT_PROVIDER,\n oauthRequestApi,\n defaultScopes = ['PROJECT_ADMIN'],\n } = options;\n\n return OAuth2.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n provider,\n environment,\n defaultScopes,\n });\n }\n}\n"],"names":[],"mappings":";;AAmCA,MAAM,gBAAmB,GAAA;AAAA,EACvB,EAAI,EAAA,iBAAA;AAAA,EACJ,KAAO,EAAA,kBAAA;AAAA,EACP,MAAM,MAAM,IAAA;AACd,CAAA,CAAA;AAMA,MAAqB,mBAAoB,CAAA;AAAA,EACvC,OAAO,OACL,OACoC,EAAA;AACpC,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAc,GAAA,aAAA;AAAA,MACd,QAAW,GAAA,gBAAA;AAAA,MACX,eAAA;AAAA,MACA,aAAA,GAAgB,CAAC,eAAe,CAAA;AAAA,KAC9B,GAAA,OAAA,CAAA;AAEJ,IAAA,OAAO,OAAO,MAAO,CAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "github",
|
|
5
|
+
title: "GitHub",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
class GithubAuth {
|
|
9
|
+
static create(options) {
|
|
10
|
+
const {
|
|
11
|
+
configApi,
|
|
12
|
+
discoveryApi,
|
|
13
|
+
environment = "development",
|
|
14
|
+
provider = DEFAULT_PROVIDER,
|
|
15
|
+
oauthRequestApi,
|
|
16
|
+
defaultScopes = ["read:user"]
|
|
17
|
+
} = options;
|
|
18
|
+
return OAuth2.create({
|
|
19
|
+
configApi,
|
|
20
|
+
discoveryApi,
|
|
21
|
+
oauthRequestApi,
|
|
22
|
+
provider,
|
|
23
|
+
environment,
|
|
24
|
+
defaultScopes
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { GithubAuth as default };
|
|
30
|
+
//# sourceMappingURL=GithubAuth.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GithubAuth.esm.js","sources":["../../../../../../../../../../packages/core-app-api/src/apis/implementations/auth/github/GithubAuth.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { githubAuthApiRef } from '@backstage/core-plugin-api';\nimport { OAuth2 } from '../oauth2';\nimport { OAuthApiCreateOptions } from '../types';\n\nconst DEFAULT_PROVIDER = {\n id: 'github',\n title: 'GitHub',\n icon: () => null,\n};\n\n/**\n * Implements the OAuth flow to GitHub products.\n *\n * @public\n */\nexport default class GithubAuth {\n static create(options: OAuthApiCreateOptions): typeof githubAuthApiRef.T {\n const {\n configApi,\n discoveryApi,\n environment = 'development',\n provider = DEFAULT_PROVIDER,\n oauthRequestApi,\n defaultScopes = ['read:user'],\n } = options;\n\n return OAuth2.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n provider,\n environment,\n defaultScopes,\n });\n }\n}\n"],"names":[],"mappings":";;AAoBA,MAAM,gBAAmB,GAAA;AAAA,EACvB,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,MAAM,MAAM,IAAA;AACd,CAAA,CAAA;AAOA,MAAqB,UAAW,CAAA;AAAA,EAC9B,OAAO,OAAO,OAA2D,EAAA;AACvE,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAc,GAAA,aAAA;AAAA,MACd,QAAW,GAAA,gBAAA;AAAA,MACX,eAAA;AAAA,MACA,aAAA,GAAgB,CAAC,WAAW,CAAA;AAAA,KAC1B,GAAA,OAAA,CAAA;AAEJ,IAAA,OAAO,OAAO,MAAO,CAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "gitlab",
|
|
5
|
+
title: "GitLab",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
class GitlabAuth {
|
|
9
|
+
static create(options) {
|
|
10
|
+
const {
|
|
11
|
+
configApi,
|
|
12
|
+
discoveryApi,
|
|
13
|
+
environment = "development",
|
|
14
|
+
provider = DEFAULT_PROVIDER,
|
|
15
|
+
oauthRequestApi,
|
|
16
|
+
defaultScopes = ["read_user"]
|
|
17
|
+
} = options;
|
|
18
|
+
return OAuth2.create({
|
|
19
|
+
configApi,
|
|
20
|
+
discoveryApi,
|
|
21
|
+
oauthRequestApi,
|
|
22
|
+
provider,
|
|
23
|
+
environment,
|
|
24
|
+
defaultScopes
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { GitlabAuth as default };
|
|
30
|
+
//# sourceMappingURL=GitlabAuth.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitlabAuth.esm.js","sources":["../../../../../../../../../../packages/core-app-api/src/apis/implementations/auth/gitlab/GitlabAuth.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { gitlabAuthApiRef } from '@backstage/core-plugin-api';\nimport { OAuth2 } from '../oauth2';\nimport { OAuthApiCreateOptions } from '../types';\n\nconst DEFAULT_PROVIDER = {\n id: 'gitlab',\n title: 'GitLab',\n icon: () => null,\n};\n\n/**\n * Implements the OAuth flow to GitLab products.\n *\n * @public\n */\nexport default class GitlabAuth {\n static create(options: OAuthApiCreateOptions): typeof gitlabAuthApiRef.T {\n const {\n configApi,\n discoveryApi,\n environment = 'development',\n provider = DEFAULT_PROVIDER,\n oauthRequestApi,\n defaultScopes = ['read_user'],\n } = options;\n\n return OAuth2.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n provider,\n environment,\n defaultScopes,\n });\n }\n}\n"],"names":[],"mappings":";;AAoBA,MAAM,gBAAmB,GAAA;AAAA,EACvB,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,MAAM,MAAM,IAAA;AACd,CAAA,CAAA;AAOA,MAAqB,UAAW,CAAA;AAAA,EAC9B,OAAO,OAAO,OAA2D,EAAA;AACvE,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAc,GAAA,aAAA;AAAA,MACd,QAAW,GAAA,gBAAA;AAAA,MACX,eAAA;AAAA,MACA,aAAA,GAAgB,CAAC,WAAW,CAAA;AAAA,KAC1B,GAAA,OAAA,CAAA;AAEJ,IAAA,OAAO,OAAO,MAAO,CAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "google",
|
|
5
|
+
title: "Google",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
const SCOPE_PREFIX = "https://www.googleapis.com/auth/";
|
|
9
|
+
class GoogleAuth {
|
|
10
|
+
static create(options) {
|
|
11
|
+
const {
|
|
12
|
+
configApi,
|
|
13
|
+
discoveryApi,
|
|
14
|
+
oauthRequestApi,
|
|
15
|
+
environment = "development",
|
|
16
|
+
provider = DEFAULT_PROVIDER,
|
|
17
|
+
defaultScopes = [
|
|
18
|
+
"openid",
|
|
19
|
+
`${SCOPE_PREFIX}userinfo.email`,
|
|
20
|
+
`${SCOPE_PREFIX}userinfo.profile`
|
|
21
|
+
]
|
|
22
|
+
} = options;
|
|
23
|
+
return OAuth2.create({
|
|
24
|
+
configApi,
|
|
25
|
+
discoveryApi,
|
|
26
|
+
oauthRequestApi,
|
|
27
|
+
provider,
|
|
28
|
+
environment,
|
|
29
|
+
defaultScopes,
|
|
30
|
+
scopeTransform(scopes) {
|
|
31
|
+
return scopes.map((scope) => {
|
|
32
|
+
if (scope === "openid") {
|
|
33
|
+
return scope;
|
|
34
|
+
}
|
|
35
|
+
if (scope === "profile" || scope === "email") {
|
|
36
|
+
return `${SCOPE_PREFIX}userinfo.${scope}`;
|
|
37
|
+
}
|
|
38
|
+
if (scope.startsWith(SCOPE_PREFIX)) {
|
|
39
|
+
return scope;
|
|
40
|
+
}
|
|
41
|
+
return `${SCOPE_PREFIX}${scope}`;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { GoogleAuth as default };
|
|
49
|
+
//# sourceMappingURL=GoogleAuth.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoogleAuth.esm.js","sources":["../../../../../../../../../../packages/core-app-api/src/apis/implementations/auth/google/GoogleAuth.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { googleAuthApiRef } from '@backstage/core-plugin-api';\nimport { OAuth2 } from '../oauth2';\nimport { OAuthApiCreateOptions } from '../types';\n\nconst DEFAULT_PROVIDER = {\n id: 'google',\n title: 'Google',\n icon: () => null,\n};\n\nconst SCOPE_PREFIX = 'https://www.googleapis.com/auth/';\n\n/**\n * Implements the OAuth flow to Google products.\n *\n * @public\n */\nexport default class GoogleAuth {\n static create(options: OAuthApiCreateOptions): typeof googleAuthApiRef.T {\n const {\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment = 'development',\n provider = DEFAULT_PROVIDER,\n defaultScopes = [\n 'openid',\n `${SCOPE_PREFIX}userinfo.email`,\n `${SCOPE_PREFIX}userinfo.profile`,\n ],\n } = options;\n\n return OAuth2.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n provider,\n environment,\n defaultScopes,\n scopeTransform(scopes: string[]) {\n return scopes.map(scope => {\n if (scope === 'openid') {\n return scope;\n }\n\n if (scope === 'profile' || scope === 'email') {\n return `${SCOPE_PREFIX}userinfo.${scope}`;\n }\n\n if (scope.startsWith(SCOPE_PREFIX)) {\n return scope;\n }\n\n return `${SCOPE_PREFIX}${scope}`;\n });\n },\n });\n }\n}\n"],"names":[],"mappings":";;AAoBA,MAAM,gBAAmB,GAAA;AAAA,EACvB,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,MAAM,MAAM,IAAA;AACd,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,kCAAA,CAAA;AAOrB,MAAqB,UAAW,CAAA;AAAA,EAC9B,OAAO,OAAO,OAA2D,EAAA;AACvE,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAc,GAAA,aAAA;AAAA,MACd,QAAW,GAAA,gBAAA;AAAA,MACX,aAAgB,GAAA;AAAA,QACd,QAAA;AAAA,QACA,GAAG,YAAY,CAAA,cAAA,CAAA;AAAA,QACf,GAAG,YAAY,CAAA,gBAAA,CAAA;AAAA,OACjB;AAAA,KACE,GAAA,OAAA,CAAA;AAEJ,IAAA,OAAO,OAAO,MAAO,CAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAe,MAAkB,EAAA;AAC/B,QAAO,OAAA,MAAA,CAAO,IAAI,CAAS,KAAA,KAAA;AACzB,UAAA,IAAI,UAAU,QAAU,EAAA;AACtB,YAAO,OAAA,KAAA,CAAA;AAAA,WACT;AAEA,UAAI,IAAA,KAAA,KAAU,SAAa,IAAA,KAAA,KAAU,OAAS,EAAA;AAC5C,YAAO,OAAA,CAAA,EAAG,YAAY,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,CAAA;AAAA,WACzC;AAEA,UAAI,IAAA,KAAA,CAAM,UAAW,CAAA,YAAY,CAAG,EAAA;AAClC,YAAO,OAAA,KAAA,CAAA;AAAA,WACT;AAEA,UAAO,OAAA,CAAA,EAAG,YAAY,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAAA,SAC/B,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
|
package/dist/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.esm.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import OAuth2 from '../oauth2/OAuth2.esm.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PROVIDER = {
|
|
4
|
+
id: "microsoft",
|
|
5
|
+
title: "Microsoft",
|
|
6
|
+
icon: () => null
|
|
7
|
+
};
|
|
8
|
+
class MicrosoftAuth {
|
|
9
|
+
oauth2;
|
|
10
|
+
configApi;
|
|
11
|
+
environment;
|
|
12
|
+
provider;
|
|
13
|
+
oauthRequestApi;
|
|
14
|
+
discoveryApi;
|
|
15
|
+
scopeTransform;
|
|
16
|
+
static MicrosoftGraphID = "00000003-0000-0000-c000-000000000000";
|
|
17
|
+
static create(options) {
|
|
18
|
+
return new MicrosoftAuth(options);
|
|
19
|
+
}
|
|
20
|
+
constructor(options) {
|
|
21
|
+
const {
|
|
22
|
+
configApi,
|
|
23
|
+
environment = "development",
|
|
24
|
+
provider = DEFAULT_PROVIDER,
|
|
25
|
+
oauthRequestApi,
|
|
26
|
+
discoveryApi,
|
|
27
|
+
defaultScopes = [
|
|
28
|
+
"openid",
|
|
29
|
+
"offline_access",
|
|
30
|
+
"profile",
|
|
31
|
+
"email",
|
|
32
|
+
"User.Read"
|
|
33
|
+
],
|
|
34
|
+
scopeTransform = (scopes) => scopes.concat("offline_access")
|
|
35
|
+
} = options;
|
|
36
|
+
this.configApi = configApi;
|
|
37
|
+
this.environment = environment;
|
|
38
|
+
this.provider = provider;
|
|
39
|
+
this.oauthRequestApi = oauthRequestApi;
|
|
40
|
+
this.discoveryApi = discoveryApi;
|
|
41
|
+
this.scopeTransform = scopeTransform;
|
|
42
|
+
this.oauth2 = {
|
|
43
|
+
[MicrosoftAuth.MicrosoftGraphID]: OAuth2.create({
|
|
44
|
+
configApi: this.configApi,
|
|
45
|
+
discoveryApi: this.discoveryApi,
|
|
46
|
+
oauthRequestApi: this.oauthRequestApi,
|
|
47
|
+
provider: this.provider,
|
|
48
|
+
environment: this.environment,
|
|
49
|
+
scopeTransform: this.scopeTransform,
|
|
50
|
+
defaultScopes
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
microsoftGraph() {
|
|
55
|
+
return this.oauth2[MicrosoftAuth.MicrosoftGraphID];
|
|
56
|
+
}
|
|
57
|
+
static resourceForScopes(scope) {
|
|
58
|
+
const audiences = [
|
|
59
|
+
...new Set(
|
|
60
|
+
scope.split(" ").map(MicrosoftAuth.resourceForScope).filter((aud) => aud !== "openid")
|
|
61
|
+
)
|
|
62
|
+
];
|
|
63
|
+
if (audiences.length > 1) {
|
|
64
|
+
return Promise.reject(
|
|
65
|
+
new Error(
|
|
66
|
+
`Requested access token with scopes from multiple Azure resources: ${audiences.join(
|
|
67
|
+
", "
|
|
68
|
+
)}. Access tokens can only have a single audience.`
|
|
69
|
+
)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
const audience = audiences[0] ?? MicrosoftAuth.MicrosoftGraphID;
|
|
73
|
+
return Promise.resolve(audience);
|
|
74
|
+
}
|
|
75
|
+
static resourceForScope(scope) {
|
|
76
|
+
const groups = scope.match(/^(?<resourceURI>.*)\/(?<scp>[^\/]*)$/)?.groups;
|
|
77
|
+
if (groups) {
|
|
78
|
+
const { resourceURI } = groups;
|
|
79
|
+
const aud = resourceURI.replace(/^api:\/\//, "");
|
|
80
|
+
return aud;
|
|
81
|
+
}
|
|
82
|
+
switch (scope) {
|
|
83
|
+
case "email":
|
|
84
|
+
case "openid":
|
|
85
|
+
case "offline_access":
|
|
86
|
+
case "profile": {
|
|
87
|
+
return "openid";
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
return MicrosoftAuth.MicrosoftGraphID;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async getAccessToken(scope, options) {
|
|
94
|
+
const aud = scope === void 0 ? MicrosoftAuth.MicrosoftGraphID : await MicrosoftAuth.resourceForScopes(
|
|
95
|
+
Array.isArray(scope) ? scope.join(" ") : scope
|
|
96
|
+
);
|
|
97
|
+
if (!(aud in this.oauth2)) {
|
|
98
|
+
this.oauth2[aud] = OAuth2.create({
|
|
99
|
+
configApi: this.configApi,
|
|
100
|
+
discoveryApi: this.discoveryApi,
|
|
101
|
+
oauthRequestApi: this.oauthRequestApi,
|
|
102
|
+
provider: this.provider,
|
|
103
|
+
environment: this.environment,
|
|
104
|
+
scopeTransform: this.scopeTransform
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return this.oauth2[aud].getAccessToken(scope, options);
|
|
108
|
+
}
|
|
109
|
+
getIdToken(options) {
|
|
110
|
+
return this.microsoftGraph().getIdToken(options);
|
|
111
|
+
}
|
|
112
|
+
getProfile(options) {
|
|
113
|
+
return this.microsoftGraph().getProfile(options);
|
|
114
|
+
}
|
|
115
|
+
getBackstageIdentity(options) {
|
|
116
|
+
return this.microsoftGraph().getBackstageIdentity(options);
|
|
117
|
+
}
|
|
118
|
+
signIn() {
|
|
119
|
+
return this.microsoftGraph().signIn();
|
|
120
|
+
}
|
|
121
|
+
signOut() {
|
|
122
|
+
return this.microsoftGraph().signOut();
|
|
123
|
+
}
|
|
124
|
+
sessionState$() {
|
|
125
|
+
return this.microsoftGraph().sessionState$();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { MicrosoftAuth as default };
|
|
130
|
+
//# sourceMappingURL=MicrosoftAuth.esm.js.map
|