├── blog
├── .gitkeep
├── 2024-08-28-release-notes.md
├── 2024-02-02-luigi-container.md
├── 2024-08-27-luigi-container.md
├── 2024-05-23-release-notes.md
├── 2024-04-19-release-notes.md
├── 2024-11-29-luigi-container.md
└── 2025-04-23-luigi-container.md
├── .prettierignore
├── website
├── docs
│ ├── .nvmrc
│ ├── src
│ │ ├── lib
│ │ │ └── data
│ │ │ │ ├── a
│ │ │ │ └── ab
│ │ ├── routes
│ │ │ ├── +page.server.ts
│ │ │ ├── docs
│ │ │ │ ├── +page.svelte
│ │ │ │ ├── +page.server.ts
│ │ │ │ └── [slug]
│ │ │ │ │ └── +page.svelte
│ │ │ └── +page.svelte
│ │ ├── _redirects
│ │ ├── luigi-config
│ │ │ ├── styles
│ │ │ │ └── fonts
│ │ │ │ │ └── icon-font
│ │ │ │ │ ├── icon-font.eot
│ │ │ │ │ ├── icon-font.ttf
│ │ │ │ │ └── icon-font.woff
│ │ │ └── extended
│ │ │ │ └── communication.js
│ │ ├── index.test.ts
│ │ ├── markdown-conversion
│ │ │ ├── unified-plugins
│ │ │ │ └── helpers.js
│ │ │ └── plugins
│ │ │ │ └── buildDocsContent.js
│ │ └── app.d.ts
│ ├── .npmrc
│ ├── public
│ │ └── .gitignore
│ ├── scripts
│ │ └── mocks
│ │ │ ├── link.md
│ │ │ ├── custom-attributes.md
│ │ │ ├── codeblocks.md
│ │ │ ├── frontmatter-3.md
│ │ │ ├── frontmatter-2.md
│ │ │ ├── frontmatter.md
│ │ │ ├── links.md
│ │ │ ├── plain.md
│ │ │ └── custom-wrappers.md
│ ├── netlify.toml
│ ├── robots.txt
│ ├── static
│ │ ├── favicon.ico
│ │ ├── public
│ │ │ ├── favicon.ico
│ │ │ └── fonts
│ │ │ │ └── icon-font
│ │ │ │ ├── icon-font.eot
│ │ │ │ ├── icon-font.ttf
│ │ │ │ └── icon-font.woff
│ │ ├── images
│ │ │ ├── copy-clipboard-default.svg
│ │ │ ├── icon_info.svg
│ │ │ └── icon_alert.svg
│ │ └── client-js
│ │ │ ├── helpers.js
│ │ │ └── search-tag.js
│ ├── tests
│ │ └── test.spec.ts
│ ├── .prettierignore
│ ├── tsconfig.json
│ ├── .prettierrc
│ ├── playwright.config.ts
│ ├── .gitignore
│ └── vite.config.ts
├── fiddle
│ ├── .nvmrc
│ ├── .node-version
│ ├── public
│ │ ├── img
│ │ │ ├── logos
│ │ │ │ ├── .gitkeep
│ │ │ │ ├── logo.png
│ │ │ │ └── Luigi-logo_rgb.png
│ │ │ ├── luigi.ico
│ │ │ ├── luigi.png
│ │ │ └── luigi_green.png
│ │ ├── _redirects
│ │ ├── examples
│ │ │ └── microfrontends
│ │ │ │ └── ui5qs
│ │ │ │ └── index.js
│ │ ├── secureLeave.html
│ │ └── themeHelper.js
│ ├── .gitignore
│ ├── .npmrc
│ ├── src
│ │ └── main.js
│ ├── patch.js
│ └── README.md
├── landingpage
│ ├── .nvmrc
│ ├── dev
│ │ ├── src
│ │ │ ├── data
│ │ │ │ └── .gitkeep
│ │ │ ├── assets
│ │ │ │ ├── img
│ │ │ │ │ ├── .gitkeep
│ │ │ │ │ ├── favicon.png
│ │ │ │ │ ├── intro_bg.png
│ │ │ │ │ ├── Luigi_Diagramm.png
│ │ │ │ │ ├── running_app_2x.png
│ │ │ │ │ ├── burger_menu.svg
│ │ │ │ │ ├── play_icon.svg
│ │ │ │ │ ├── plus.svg
│ │ │ │ │ ├── link-arrow.svg
│ │ │ │ │ └── burger_menu_close.svg
│ │ │ │ ├── scss
│ │ │ │ │ ├── components
│ │ │ │ │ │ └── .gitkeep
│ │ │ │ │ └── global
│ │ │ │ │ │ └── _typography.scss
│ │ │ │ └── fonts
│ │ │ │ │ └── icon-font
│ │ │ │ │ └── fonts
│ │ │ │ │ ├── icon-font.eot
│ │ │ │ │ ├── icon-font.ttf
│ │ │ │ │ └── icon-font.woff
│ │ │ ├── partials
│ │ │ │ ├── .gitkeep
│ │ │ │ ├── header-for-error-pages.html
│ │ │ │ └── header.html
│ │ │ ├── pages
│ │ │ │ ├── blog
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ └── overview.html
│ │ │ │ ├── 403.html
│ │ │ │ └── 404.html
│ │ │ └── root-assets
│ │ │ │ ├── robots.txt
│ │ │ │ └── sitemap.xml
│ │ ├── .bowerrc
│ │ ├── .babelrc
│ │ ├── CHANGELOG.md
│ │ ├── .browserslistrc
│ │ └── .gitignore
│ ├── public
│ │ ├── blog
│ │ │ ├── .gitkeep
│ │ │ ├── feeds
│ │ │ │ └── .gitkeep
│ │ │ ├── blog-chunks
│ │ │ │ └── .gitkeep
│ │ │ └── .gitignore
│ │ ├── _redirects
│ │ ├── .well-known
│ │ │ └── security.txt
│ │ ├── robots.txt
│ │ ├── assets
│ │ │ ├── img
│ │ │ │ ├── favicon.png
│ │ │ │ ├── intro_bg.png
│ │ │ │ ├── presetui.png
│ │ │ │ ├── eu-support.png
│ │ │ │ ├── form-modal.png
│ │ │ │ ├── from-modal.png
│ │ │ │ ├── notification.png
│ │ │ │ ├── role-based.png
│ │ │ │ ├── securityID.png
│ │ │ │ ├── Luigi_Diagramm.png
│ │ │ │ ├── multi-language.png
│ │ │ │ ├── running_app_2x.png
│ │ │ │ ├── responsivedesign.png
│ │ │ │ ├── burger_menu.svg
│ │ │ │ ├── play_icon.svg
│ │ │ │ ├── plus.svg
│ │ │ │ ├── link-arrow.svg
│ │ │ │ └── burger_menu_close.svg
│ │ │ └── fonts
│ │ │ │ └── icon-font
│ │ │ │ └── fonts
│ │ │ │ ├── icon-font.eot
│ │ │ │ ├── icon-font.ttf
│ │ │ │ └── icon-font.woff
│ │ └── sitemap.xml
│ ├── .gitignore
│ └── build.sh
└── slack
│ └── _redirects
├── core-modular
├── src
│ ├── App.svelte
│ ├── main.ts
│ └── utilities
│ │ └── luigi-config-defaults.ts
├── README.md
├── babel.config.json
├── test
│ └── tsconfig.json
├── tsconfig.json
├── public_root
│ ├── README.md
│ └── package.json
├── jest.config.js
├── .gitignore
├── svelte.config.cjs
└── eslint.config.mjs
├── test
├── e2e-test-application
│ ├── src
│ │ ├── assets
│ │ │ ├── .gitkeep
│ │ │ ├── favicon-sap.ico
│ │ │ ├── github-logo.png
│ │ │ └── tabHeader.js
│ │ ├── app
│ │ │ ├── anonymous
│ │ │ │ ├── anonymous.component.css
│ │ │ │ ├── anonymous.component.html
│ │ │ │ └── anonymous.component.ts
│ │ │ ├── nav-sync
│ │ │ │ └── nav-sync.component.css
│ │ │ ├── project
│ │ │ │ ├── users
│ │ │ │ │ ├── users.component.css
│ │ │ │ │ ├── groups
│ │ │ │ │ │ ├── groups.component.css
│ │ │ │ │ │ └── group-details
│ │ │ │ │ │ │ ├── group-details.component.css
│ │ │ │ │ │ │ └── group-settings
│ │ │ │ │ │ │ └── group-settings.component.css
│ │ │ │ │ ├── usersoverview
│ │ │ │ │ │ ├── usersoverview.component.css
│ │ │ │ │ │ ├── usersoverview.component.html
│ │ │ │ │ │ └── usersoverview.component.ts
│ │ │ │ │ ├── users.component.html
│ │ │ │ │ └── users.component.ts
│ │ │ │ ├── developers
│ │ │ │ │ └── developers.component.css
│ │ │ │ ├── view-group
│ │ │ │ │ ├── view-group.component.css
│ │ │ │ │ └── view-group.component.html
│ │ │ │ ├── miscellaneous
│ │ │ │ │ ├── miscellaneous.component.css
│ │ │ │ │ ├── miscellaneous.component.html
│ │ │ │ │ └── miscellaneous.component.ts
│ │ │ │ ├── miscellaneous2
│ │ │ │ │ ├── miscellaneous2.component.css
│ │ │ │ │ └── miscellaneous2.component.html
│ │ │ │ ├── code-snippet
│ │ │ │ │ ├── code-snippet.component.html
│ │ │ │ │ ├── code-snippet.component.scss
│ │ │ │ │ └── code-snippet.component.ts
│ │ │ │ ├── settings
│ │ │ │ │ └── settings.component.css
│ │ │ │ ├── dynamic
│ │ │ │ │ └── dynamic.component.css
│ │ │ │ ├── default-child
│ │ │ │ │ ├── dps1
│ │ │ │ │ │ ├── child-node-1.component.ts
│ │ │ │ │ │ └── child-node-1.component.html
│ │ │ │ │ └── dps2
│ │ │ │ │ │ └── child-node-2.component.ts
│ │ │ │ ├── drawer
│ │ │ │ │ └── drawer.component.scss
│ │ │ │ ├── modal
│ │ │ │ │ └── modal.component.scss
│ │ │ │ ├── hide-side-nav
│ │ │ │ │ ├── hide-side-nav.component.ts
│ │ │ │ │ └── hide-side-nav.component.html
│ │ │ │ ├── navigation
│ │ │ │ │ ├── navigation.component.html
│ │ │ │ │ └── navigation.component.ts
│ │ │ │ └── project.component.scss
│ │ │ ├── restricted
│ │ │ │ ├── restricted.component.css
│ │ │ │ ├── restricted.component.html
│ │ │ │ └── restricted.component.ts
│ │ │ ├── onNodeActivation
│ │ │ │ ├── onNodeActivation.component.css
│ │ │ │ └── onNodeActivation.component.ts
│ │ │ ├── overview
│ │ │ │ └── overview.component.css
│ │ │ ├── app.component.html
│ │ │ ├── preload
│ │ │ │ └── preload.component.ts
│ │ │ ├── services
│ │ │ │ └── helpers.ts
│ │ │ └── app.component.scss
│ │ ├── environments
│ │ │ ├── environment.prod.ts
│ │ │ └── environment.ts
│ │ ├── typings.d.ts
│ │ ├── tsconfig.app.json
│ │ ├── sampleapp.html
│ │ ├── tsconfig.spec.json
│ │ └── main.ts
│ ├── .npmrc
│ ├── cypress
│ │ ├── e2e
│ │ │ ├── support
│ │ │ │ ├── index.js
│ │ │ │ └── events.js
│ │ │ ├── test3
│ │ │ │ └── 0-setuptests
│ │ │ │ │ └── setup-test.cy.js
│ │ │ └── tests
│ │ │ │ └── 1-angular
│ │ │ │ └── client-support-angular.cy.js
│ │ └── config
│ │ │ ├── externalmf.config.js
│ │ │ ├── e2e-angular-app.config.js
│ │ │ └── e2e-js-app.config.js
│ ├── .babelrc
│ ├── webpack-extra.config.js
│ ├── externalMf
│ │ ├── package.json
│ │ └── index.css
│ └── .editorconfig
├── e2e-client-api-test-app
│ ├── public
│ │ ├── logo.png
│ │ ├── favicon.ico
│ │ ├── views
│ │ │ ├── intro.html
│ │ │ ├── core
│ │ │ │ └── index.html
│ │ │ └── container
│ │ │ │ └── index.html
│ │ └── index.html
│ ├── .gitignore
│ ├── cypress.config.js
│ └── README.md
├── e2e-js-test-application
│ ├── .npmrc
│ ├── .gitignore
│ ├── public
│ │ └── secureLeave.html
│ └── package.json
└── e2e-client-api.sh
├── client
├── .npmignore
├── .gitignore
├── .npmrc
├── babel.config.js
├── metadata.yaml
├── src
│ └── baseClass.js
└── public
│ ├── package.json
│ └── README.md
├── core
├── examples
│ ├── luigi-example-next
│ │ ├── .eslintignore
│ │ ├── public
│ │ │ └── favicon.ico
│ │ ├── pages
│ │ │ ├── index.js
│ │ │ ├── LuigiCoreApp.js
│ │ │ ├── _app.js
│ │ │ ├── home.js
│ │ │ ├── sample1.js
│ │ │ └── sample2.js
│ │ ├── .eslintrc
│ │ └── .gitignore
│ ├── luigi-example-vue
│ │ ├── src
│ │ │ ├── app.vue
│ │ │ ├── main.js
│ │ │ ├── views
│ │ │ │ ├── home.vue
│ │ │ │ ├── sample1.vue
│ │ │ │ └── sample2.vue
│ │ │ └── router
│ │ │ │ └── index.js
│ │ ├── public
│ │ │ ├── logo.png
│ │ │ ├── favicon.ico
│ │ │ ├── sampleapp.html
│ │ │ └── index.html
│ │ ├── .gitignore
│ │ ├── jsconfig.json
│ │ ├── package.json
│ │ ├── sampleapp.html
│ │ └── index.html
│ ├── luigi-example-angular
│ │ ├── src
│ │ │ ├── app
│ │ │ │ ├── app.html
│ │ │ │ ├── app.css
│ │ │ │ ├── app.ts
│ │ │ │ ├── app.routes.ts
│ │ │ │ └── app.config.ts
│ │ │ ├── styles.css
│ │ │ ├── environments
│ │ │ │ ├── environment.prod.ts
│ │ │ │ └── environment.ts
│ │ │ ├── favicon.ico
│ │ │ ├── typings.d.ts
│ │ │ ├── tsconfig.app.json
│ │ │ ├── tsconfig.spec.json
│ │ │ ├── main.ts
│ │ │ └── sampleapp.html
│ │ ├── webpack-extra.config.js
│ │ ├── .editorconfig
│ │ ├── tsconfig.json
│ │ └── .gitignore
│ ├── luigi-example-js
│ │ ├── public
│ │ │ ├── logo.png
│ │ │ ├── favicon.ico
│ │ │ └── views
│ │ │ │ └── sample1.html
│ │ ├── .gitignore
│ │ ├── package.json
│ │ └── README.md
│ ├── luigi-sample-angular
│ │ └── README.md
│ ├── luigi-example-react
│ │ ├── public
│ │ │ ├── logo.png
│ │ │ ├── favicon.ico
│ │ │ └── sampleapp.html
│ │ ├── src
│ │ │ └── views
│ │ │ │ ├── sample2.js
│ │ │ │ └── sample1.js
│ │ └── .gitignore
│ ├── luigi-example-svelte
│ │ ├── src
│ │ │ ├── logo.png
│ │ │ ├── favicon.ico
│ │ │ ├── routes
│ │ │ │ ├── Sample2.svelte
│ │ │ │ ├── Sample1.svelte
│ │ │ │ └── Home.svelte
│ │ │ ├── main.js
│ │ │ ├── mf.html
│ │ │ ├── index.html
│ │ │ └── App.svelte
│ │ ├── .gitignore
│ │ ├── webpack-common-rules.js
│ │ └── README.md
│ └── luigi-example-openui5
│ │ ├── webapp
│ │ ├── logo.png
│ │ ├── favicon.ico
│ │ ├── sample1
│ │ │ ├── Sample1.controller.js
│ │ │ └── index.js
│ │ ├── sample2
│ │ │ ├── Sample2.controller.js
│ │ │ └── index.js
│ │ ├── Component.js
│ │ ├── i18n
│ │ │ ├── i18n.properties
│ │ │ └── i18n_en.properties
│ │ ├── index.html
│ │ └── home
│ │ │ └── Home.view.xml
│ │ ├── .gitignore
│ │ └── package.json
├── .npmrc
├── src
│ ├── variables.scss
│ ├── styles
│ │ ├── fd_fiori.scss
│ │ ├── fd_horizon.scss
│ │ ├── _variables.scss
│ │ └── _mixins.scss
│ ├── utilities
│ │ ├── keycode.js
│ │ ├── helpers
│ │ │ └── index.js
│ │ ├── luigi-config-defaults.js
│ │ ├── third-party-cookies-check.js
│ │ └── constants.js
│ ├── services
│ │ ├── index.js
│ │ ├── messages-listeners.js
│ │ └── lifecycle-hooks.js
│ ├── core-api
│ │ └── baseClass.js
│ └── navigation
│ │ └── StatusBadge.svelte
├── babel.config.json
├── .editorconfig
├── metadata.yaml
├── jest.config.js
├── dev-tools
│ └── templates
│ │ └── simple
│ │ ├── luigi-config.js
│ │ ├── microfrontend.html
│ │ └── index.html
├── public
│ ├── package.json
│ └── README.md
├── public_root
│ ├── package.json
│ └── README.md
└── .gitignore
├── plugins
├── .npmignore
├── auth
│ ├── public
│ │ ├── auth-oidc
│ │ │ ├── .gitignore
│ │ │ ├── silent-callback.html
│ │ │ └── package.json
│ │ ├── auth-oidc-pkce
│ │ │ ├── .gitignore
│ │ │ ├── silent-callback.html
│ │ │ └── package.json
│ │ └── auth-oauth2
│ │ │ └── package.json
│ └── src
│ │ ├── auth-oidc
│ │ └── webpack-extra.config.js
│ │ ├── auth-oidc-pkce
│ │ └── webpack-extra.config.js
│ │ └── third-party-cookies-check.js
├── .npmrc
├── .gitignore
└── .babelrc
├── logo.png
├── container
├── cypress
│ ├── support
│ │ └── e2e.js
│ └── e2e
│ │ ├── examples
│ │ ├── README.md
│ │ ├── simple-wc-setup.cy.js
│ │ ├── simple-iframe-setup.cy.js
│ │ └── simple-compound-wc-setup.cy.js
│ │ └── test-app
│ │ ├── compound
│ │ └── README.md
│ │ ├── iframe
│ │ └── README.md
│ │ └── wc
│ │ └── README.md
├── public
│ ├── LuigiContainer.js
│ ├── LuigiCompoundContainer.js
│ └── package.json
├── test-app
│ ├── favicon.ico
│ ├── iframe
│ │ ├── microfrontend-allow-rules.html
│ │ ├── microfrontend-defer-init.html
│ │ ├── microfrontend-sandbox-rules.html
│ │ └── README.md
│ ├── compound
│ │ ├── README.md
│ │ ├── dynamic.html
│ │ └── defer-init-wc
│ │ │ └── compoundWCDeferInit2.js
│ └── wc
│ │ └── README.md
├── .npmrc
├── .prettierignore
├── src
│ ├── events.ts
│ ├── global.d.ts
│ ├── constants
│ │ └── core-api.ts
│ └── services
│ │ └── iframe-helpers.ts
├── test
│ └── README.md
├── typings
│ └── index.d.ts
├── examples
│ ├── container-iframe
│ │ ├── microfrontend.html
│ │ └── index.html
│ ├── compound-container
│ │ ├── myCompoundWebComponent2.js
│ │ ├── myCompoundWebComponent3.js
│ │ ├── myCompoundWebComponent4.js
│ │ └── myCompoundWebComponent1.js
│ └── container-wc
│ │ └── index.html
├── metadata.yaml
├── babel.config.js
├── tsconfig.json
├── jest.config.js
├── cypress.config.js
└── .gitignore
├── scripts
├── hooks
│ └── prefix-patterns.txt
├── docs
│ ├── summary.hbs
│ ├── examples.hbs
│ ├── deprecated.hbs
│ ├── since.hbs
│ ├── mdHelpers.js
│ └── header.hbs
├── .babelrc
└── .npmrc
├── docs
├── assets
│ ├── profile.jpg
│ ├── tabnav.jpg
│ ├── app-switcher.jpg
│ ├── architecture.png
│ ├── globalsearch.jpg
│ ├── component_events.png
│ ├── context-switcher.jpg
│ ├── product-switcher.jpg
│ ├── usersettingsdialog.png
│ ├── component_injections.png
│ ├── navigation-structure.jpg
│ ├── luigi-overview-diagram.jpg
│ └── usersettings-in-profile.png
├── metadata.yaml
└── luigi-architecture.md
├── .npmrc
├── cra-template
├── template
│ ├── public
│ │ ├── logo.png
│ │ ├── favicon.ico
│ │ └── sampleapp.html
│ ├── src
│ │ └── views
│ │ │ ├── sample2.js
│ │ │ └── sample1.js
│ └── gitignore
├── .npmrc
├── package.json
└── README.md
├── client-frameworks-support
├── client-support-ui5
│ ├── .gitignore
│ ├── rollup.config.js
│ └── README.md
├── client-support-angular
│ ├── projects
│ │ ├── client-support-angular
│ │ │ ├── src
│ │ │ │ ├── lib
│ │ │ │ │ ├── component
│ │ │ │ │ │ ├── luigi.preload.component.html
│ │ │ │ │ │ └── luigi.preload.component.ts
│ │ │ │ │ ├── route
│ │ │ │ │ │ ├── luigi-activated-route-snapshot-helper.spec.ts
│ │ │ │ │ │ ├── luigi-activated-route-snapshot-helper.ts
│ │ │ │ │ │ └── luigi-route-strategy.ts
│ │ │ │ │ └── service
│ │ │ │ │ │ └── luigi-context.service.impl.spec.ts
│ │ │ │ ├── public-api.ts
│ │ │ │ └── test.ts
│ │ │ ├── ng-package.json
│ │ │ ├── tsconfig.lib.prod.json
│ │ │ ├── tslint.json
│ │ │ ├── tsconfig.spec.json
│ │ │ └── tsconfig.lib.json
│ │ └── metadata.yaml
│ ├── .npmrc
│ ├── .editorconfig
│ └── README.md
└── testing-utilities
│ ├── .npmrc
│ ├── src
│ └── index.ts
│ ├── test
│ ├── cypress
│ │ └── config
│ │ │ └── e2emockengine.json
│ ├── cypress.config.js
│ └── package.json
│ ├── tsconfig.json
│ ├── metadata.yaml
│ └── dist
│ └── package.json
├── .github
├── workflows
│ ├── update-deps
│ │ └── action.yml
│ ├── publish_cra.yml
│ └── code_checks.yml
├── pull-request-template.md
├── stale.yml
└── ISSUE_TEMPLATE
│ └── feature-request.md
├── REUSE.toml
├── .gitignore
├── CODEOWNERS
└── eslint.config.mjs
/blog/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | website
--------------------------------------------------------------------------------
/website/docs/.nvmrc:
--------------------------------------------------------------------------------
1 | 20
--------------------------------------------------------------------------------
/core-modular/src/App.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/docs/src/lib/data/a:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/docs/src/lib/data/ab:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/fiddle/.nvmrc:
--------------------------------------------------------------------------------
1 | 18
2 |
--------------------------------------------------------------------------------
/website/fiddle/.node-version:
--------------------------------------------------------------------------------
1 | 16
--------------------------------------------------------------------------------
/website/landingpage/.nvmrc:
--------------------------------------------------------------------------------
1 | 20
2 |
--------------------------------------------------------------------------------
/website/docs/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 |
--------------------------------------------------------------------------------
/website/docs/src/routes/+page.server.ts:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/docs/src/routes/docs/+page.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/fiddle/public/img/logos/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/data/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/public/blog/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/assets/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/docs/public/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
--------------------------------------------------------------------------------
/website/docs/src/routes/docs/+page.server.ts:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/partials/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/public/blog/feeds/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/.npmignore:
--------------------------------------------------------------------------------
1 | src/
2 | webpack*
3 | .babelrc
4 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/.eslintignore:
--------------------------------------------------------------------------------
1 | **/*.js
--------------------------------------------------------------------------------
/plugins/.npmignore:
--------------------------------------------------------------------------------
1 | src/
2 | webpack*
3 | .babelrc
4 |
--------------------------------------------------------------------------------
/website/docs/src/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
2 |
--------------------------------------------------------------------------------
/website/landingpage/public/blog/blog-chunks/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/link.md:
--------------------------------------------------------------------------------
1 | [Anchor Link](#noframework)
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/scss/components/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/scss/global/_typography.scss:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | public*/luigi-client*
2 | public*/luigi-element*
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/anonymous/anonymous.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/nav-sync/nav-sync.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/users.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/public/_redirects:
--------------------------------------------------------------------------------
1 | /blog /blog/overview
2 |
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/logo.png
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oidc/.gitignore:
--------------------------------------------------------------------------------
1 | # vendor
2 | oidc-client.min.js
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/restricted/restricted.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/container/cypress/support/e2e.js:
--------------------------------------------------------------------------------
1 | import '@cypress/code-coverage/support';
2 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/developers/developers.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/groups/groups.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/view-group/view-group.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/pages/blog/.gitignore:
--------------------------------------------------------------------------------
1 | *.html
2 | !overview.html
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oidc-pkce/.gitignore:
--------------------------------------------------------------------------------
1 | # vendor
2 | oidc-client-ts.min.js
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/onNodeActivation/onNodeActivation.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/miscellaneous/miscellaneous.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/dev/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components"
3 | }
4 |
--------------------------------------------------------------------------------
/scripts/hooks/prefix-patterns.txt:
--------------------------------------------------------------------------------
1 | fdescribe(
2 | fit(
3 | describe.only(
4 | it.only(
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/miscellaneous2/miscellaneous2.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/scripts/docs/summary.hbs:
--------------------------------------------------------------------------------
1 | {{#if summary}}
2 |
3 | {{{inlineLinks summary}}}
4 | {{/if~}}
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/usersoverview/usersoverview.component.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/fiddle/public/_redirects:
--------------------------------------------------------------------------------
1 | /luigi-cdn/* https://www.unpkg.com/@luigi-project/:splat 200
--------------------------------------------------------------------------------
/container/public/LuigiContainer.js:
--------------------------------------------------------------------------------
1 | export { LuigiContainer as default } from './bundle.js';
2 |
--------------------------------------------------------------------------------
/website/landingpage/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # compiled files
3 | app.js*
4 | app.css
5 | public/**/*.html
--------------------------------------------------------------------------------
/website/landingpage/public/blog/.gitignore:
--------------------------------------------------------------------------------
1 | # feeds
2 | *.xml
3 | *.json
4 |
5 | # files
6 | *.html
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/src/app.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/docs/assets/profile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/profile.jpg
--------------------------------------------------------------------------------
/docs/assets/tabnav.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/tabnav.jpg
--------------------------------------------------------------------------------
/scripts/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "@babel/preset-env"
5 | ]
6 | ]
7 | }
--------------------------------------------------------------------------------
/website/docs/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | command = "npm run build"
3 | publish = "website/docs/public"
--------------------------------------------------------------------------------
/core-modular/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Modular Core
2 |
3 | ## Overview
4 |
5 | Luigi Core, headless, modular. WIP
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/overview/overview.component.css:
--------------------------------------------------------------------------------
1 | .clickable {
2 | cursor: pointer;
3 | }
--------------------------------------------------------------------------------
/website/fiddle/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | public/bundle.*
4 | public/vendor
5 | yarn.lock
6 |
--------------------------------------------------------------------------------
/container/public/LuigiCompoundContainer.js:
--------------------------------------------------------------------------------
1 | export { LuigiCompoundContainer as default } from './bundle.js';
2 |
--------------------------------------------------------------------------------
/docs/assets/app-switcher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/app-switcher.jpg
--------------------------------------------------------------------------------
/docs/assets/architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/architecture.png
--------------------------------------------------------------------------------
/docs/assets/globalsearch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/globalsearch.jpg
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/code-snippet/code-snippet.component.html:
--------------------------------------------------------------------------------
1 | {{ data }}
2 |
--------------------------------------------------------------------------------
/website/docs/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Allow: /
3 | Sitemap: https://docs.luigi-project.io/sitemap.xml
4 |
--------------------------------------------------------------------------------
/website/landingpage/dev/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [ "@babel/preset-env" ],
3 | "compact": false
4 | }
5 |
--------------------------------------------------------------------------------
/container/test-app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/container/test-app/favicon.ico
--------------------------------------------------------------------------------
/website/docs/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/favicon.ico
--------------------------------------------------------------------------------
/website/landingpage/dev/src/pages/403.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: error-pages
3 | ---
4 |
5 | {{> error-page-content}}
6 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/pages/404.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: error-pages
3 | ---
4 |
5 | {{> error-page-content}}
6 |
--------------------------------------------------------------------------------
/docs/assets/component_events.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/component_events.png
--------------------------------------------------------------------------------
/docs/assets/context-switcher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/context-switcher.jpg
--------------------------------------------------------------------------------
/docs/assets/product-switcher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/product-switcher.jpg
--------------------------------------------------------------------------------
/docs/assets/usersettingsdialog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/usersettingsdialog.png
--------------------------------------------------------------------------------
/website/landingpage/dev/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## Version 1.0 (November 19, 2015)
4 |
5 | Initial release.
6 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/partials/header-for-error-pages.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/app/app.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/docs/assets/component_injections.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/component_injections.png
--------------------------------------------------------------------------------
/docs/assets/navigation-structure.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/navigation-structure.jpg
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | export const environment = {
2 | production: true
3 | };
4 |
--------------------------------------------------------------------------------
/website/fiddle/public/img/luigi.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/luigi.ico
--------------------------------------------------------------------------------
/website/fiddle/public/img/luigi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/luigi.png
--------------------------------------------------------------------------------
/core/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 0;
3 | }
4 |
5 | .fd-panel {
6 | padding: 15px;
7 | }
8 |
--------------------------------------------------------------------------------
/cra-template/template/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/cra-template/template/public/logo.png
--------------------------------------------------------------------------------
/docs/assets/luigi-overview-diagram.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/luigi-overview-diagram.jpg
--------------------------------------------------------------------------------
/docs/assets/usersettings-in-profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/usersettings-in-profile.png
--------------------------------------------------------------------------------
/plugins/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/scripts/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/website/docs/static/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/favicon.ico
--------------------------------------------------------------------------------
/client/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
3 |
--------------------------------------------------------------------------------
/container/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | export const environment = {
2 | production: true
3 | };
4 |
--------------------------------------------------------------------------------
/cra-template/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/cra-template/template/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/cra-template/template/public/favicon.ico
--------------------------------------------------------------------------------
/website/fiddle/public/img/logos/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/logos/logo.png
--------------------------------------------------------------------------------
/website/fiddle/public/img/luigi_green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/luigi_green.png
--------------------------------------------------------------------------------
/website/landingpage/dev/.browserslistrc:
--------------------------------------------------------------------------------
1 | # Browsers that we support
2 | last 2 versions
3 | ie >= 9
4 | ios >= 7
5 | android >= 4.4
6 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-ui5/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
3 | vulsCount.txt
4 |
5 | dist/README.md
6 | dist/ui5-support-lib.js
--------------------------------------------------------------------------------
/container/.prettierignore:
--------------------------------------------------------------------------------
1 | typings/constants/events.d.ts
2 | typings/LuigiContainer.svelte.d.ts
3 | typings/LuigiCompoundContainer.svelte.d.ts
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-client-api-test-app/public/logo.png
--------------------------------------------------------------------------------
/website/fiddle/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/website/landingpage/dev/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | npm-debug.log
4 | bower_components
5 | dist
6 | *.swp
7 | .cache
8 | .idea
--------------------------------------------------------------------------------
/website/landingpage/public/.well-known/security.txt:
--------------------------------------------------------------------------------
1 | Contact: https://www.sap.com/report-a-vulnerability
2 | Expires: 2026-01-30T18:29:00.000Z
--------------------------------------------------------------------------------
/website/landingpage/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Allow: /
3 | Allow: /sitemap.htm
4 | Sitemap: https://luigi-project.io/sitemap.xml
5 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-js/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-js/public/logo.png
--------------------------------------------------------------------------------
/core/examples/luigi-sample-angular/README.md:
--------------------------------------------------------------------------------
1 | We moved and renamed the luigi-sample-angular to [e2e-test-application](/test/e2e-test-application)
2 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/settings/settings.component.css:
--------------------------------------------------------------------------------
1 | .testSection {
2 | border: 2px dashed #fff;
3 | padding: 10px;
4 | }
--------------------------------------------------------------------------------
/website/landingpage/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # netlify is using this file for deployment
4 |
5 | cd dev
6 | npm install
7 | npm run build
8 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-js/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-js/public/favicon.ico
--------------------------------------------------------------------------------
/core/examples/luigi-example-react/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-react/public/logo.png
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-svelte/src/logo.png
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-vue/public/logo.png
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-client-api-test-app/public/favicon.ico
--------------------------------------------------------------------------------
/test/e2e-test-application/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/favicon.png
--------------------------------------------------------------------------------
/container/src/events.ts:
--------------------------------------------------------------------------------
1 | export { Events as LuigiEvents } from './constants/communication';
2 | export { LuigiEvent } from './constants/communication';
3 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-angular/src/favicon.ico
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-next/public/favicon.ico
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-openui5/webapp/logo.png
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-svelte/src/favicon.ico
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-vue/public/favicon.ico
--------------------------------------------------------------------------------
/test/e2e-js-test-application/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/website/fiddle/public/img/logos/Luigi-logo_rgb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/logos/Luigi-logo_rgb.png
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/favicon.png
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/intro_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/intro_bg.png
--------------------------------------------------------------------------------
/website/landingpage/dev/src/root-assets/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Allow: /
3 | Allow: /sitemap.htm
4 | Sitemap: https://luigi-project.io/sitemap.xml
5 |
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/intro_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/intro_bg.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/presetui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/presetui.png
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-openui5/webapp/favicon.ico
--------------------------------------------------------------------------------
/core/examples/luigi-example-react/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-react/public/favicon.ico
--------------------------------------------------------------------------------
/scripts/docs/examples.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{#examples}}
3 | **Example**{{#if caption}} *({{caption}})* {{else}} {{/if}}
4 | {{{inlineLinks example}}}
5 | {{/examples}}
--------------------------------------------------------------------------------
/test/e2e-test-application/src/assets/favicon-sap.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-test-application/src/assets/favicon-sap.ico
--------------------------------------------------------------------------------
/test/e2e-test-application/src/assets/github-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-test-application/src/assets/github-logo.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/eu-support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/eu-support.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/form-modal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/form-modal.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/from-modal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/from-modal.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/notification.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/role-based.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/role-based.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/securityID.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/securityID.png
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/component/luigi.preload.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/container/src/global.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | // This file is needed to avoid Typescript warnings about Svelte Components being imported to main.ts
3 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/groups/group-details/group-details.component.css:
--------------------------------------------------------------------------------
1 | .sap-icon--navigation-left-arrow::before {
2 | font-size: 11px;
3 | }
--------------------------------------------------------------------------------
/website/docs/src/routes/+page.svelte:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/website/docs/static/public/fonts/icon-font/icon-font.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/fonts/icon-font/icon-font.eot
--------------------------------------------------------------------------------
/website/docs/static/public/fonts/icon-font/icon-font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/fonts/icon-font/icon-font.ttf
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/Luigi_Diagramm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/Luigi_Diagramm.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/multi-language.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/multi-language.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/running_app_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/running_app_2x.png
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
--------------------------------------------------------------------------------
/container/cypress/e2e/examples/README.md:
--------------------------------------------------------------------------------
1 | ### Test Suite: `/examples`
2 |
3 | Tests to validate and verify our simple examples in the **/container/examples** application.
--------------------------------------------------------------------------------
/website/docs/static/public/fonts/icon-font/icon-font.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/fonts/icon-font/icon-font.woff
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/Luigi_Diagramm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/Luigi_Diagramm.png
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/running_app_2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/running_app_2x.png
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/responsivedesign.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/responsivedesign.png
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/src/index.ts:
--------------------------------------------------------------------------------
1 | export { LuigiMockUtil } from './luigi-mock-util.js';
2 | export { LuigiMockEngine } from './luigi-mock-engine.js';
3 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/pages/index.js:
--------------------------------------------------------------------------------
1 | import LuigiCoreApp from './LuigiCoreApp.js';
2 |
3 | export default function Index() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/e2e/support/index.js:
--------------------------------------------------------------------------------
1 | // This file is processed and loaded automatically before test files.
2 | import './events';
3 | import './commands';
4 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/.npmrc:
--------------------------------------------------------------------------------
1 | # Force quit on installing packages with local node version lower than specified in package.json
2 | engine-strict=true
3 |
--------------------------------------------------------------------------------
/scripts/docs/deprecated.hbs:
--------------------------------------------------------------------------------
1 | {{#if deprecated}}
2 | {{#if since}}
3 |
4 | {{else}}
5 |
6 | **Meta**:
7 | * **deprecated:** {{{inlineLinks deprecated}}}
8 | {{/if~}}
9 | {{/if~}}
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/code-snippet/code-snippet.component.scss:
--------------------------------------------------------------------------------
1 | code {
2 | display: block;
3 | font-family: monospace;
4 | word-break: break-all;
5 | }
6 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/groups/group-details/group-settings/group-settings.component.css:
--------------------------------------------------------------------------------
1 | .sap-icon--navigation-left-arrow::before {
2 | font-size: 11px;
3 | }
--------------------------------------------------------------------------------
/core/examples/luigi-example-js/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /public/fonts
--------------------------------------------------------------------------------
/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.eot
--------------------------------------------------------------------------------
/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.ttf
--------------------------------------------------------------------------------
/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.woff
--------------------------------------------------------------------------------
/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.eot
--------------------------------------------------------------------------------
/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.ttf
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.eot
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.ttf
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.woff
--------------------------------------------------------------------------------
/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.woff
--------------------------------------------------------------------------------
/website/slack/_redirects:
--------------------------------------------------------------------------------
1 | / https://join.slack.com/t/luigi-project/shared_invite/enQtODA2Nzc3ODk2NzI0LTg2YWY5YTI4MzNlOGUyMmI0MGFmMGNjY2NmMmUxMDYwODgyNTRiODc0N2QxMGZiYzNiMWY2OTMwMWZkOTUyZTY 301
2 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | /* SystemJS module definition */
2 | // eslint-disable-next-line
3 | declare var module: NodeModule;
4 | interface NodeModule {
5 | id: string;
6 | }
7 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | #production
7 | /dist
--------------------------------------------------------------------------------
/scripts/docs/since.hbs:
--------------------------------------------------------------------------------
1 | {{#if since}}
2 |
3 | **Meta**:
4 | * **since:** {{{inlineLinks since}}}
5 | {{#if deprecated}}
6 | * **deprecated:** {{{inlineLinks deprecated}}}
7 | {{/if~}}
8 | {{/if~}}
9 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | /* SystemJS module definition */
2 | // eslint-disable-next-line no-var
3 | declare var module: NodeModule;
4 | interface NodeModule {
5 | id: string;
6 | }
7 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/custom-attributes.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | > Test
5 | > Line2
6 |
7 |
8 | > Directly
--------------------------------------------------------------------------------
/core-modular/src/main.ts:
--------------------------------------------------------------------------------
1 | // import './app.scss';
2 | import { Luigi } from './core-api/luigi';
3 | import { LuigiEngine } from './luigi-engine';
4 |
5 | (window as any).Luigi = new Luigi(new LuigiEngine());
6 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue';
2 | import App from './app.vue';
3 | import router from './router';
4 |
5 | createApp(App)
6 | .use(router)
7 | .mount('#app');
8 |
--------------------------------------------------------------------------------
/website/docs/src/index.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, it, expect } from 'vitest';
2 |
3 | describe('sum test', () => {
4 | it('adds 1 + 2 to equal 3', () => {
5 | expect(1 + 2).toBe(3);
6 | });
7 | });
8 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /cypress/screenshots
6 | /public/assets/*
7 |
--------------------------------------------------------------------------------
/test/e2e-test-application/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"],
3 | "plugins": [
4 | "@babel/plugin-proposal-class-properties",
5 | "@babel/plugin-proposal-optional-chaining"
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/.gitignore:
--------------------------------------------------------------------------------
1 | public/*/plugin.js
2 |
3 | # Ignore files generated by build
4 | auth/public/auth-oidc-pkce/*.LICENSE.txt
5 | auth/public/auth-oidc/*.LICENSE.txt
6 | auth/public/auth-oidc/oidc-client.min.js.LICENSE.txt
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/app/app.css:
--------------------------------------------------------------------------------
1 | $fd-scss-font-path: '~fiori-fundamentals/scss/fonts/';
2 | $fd-icons-path: '~fiori-fundamentals/scss/icons/';
3 |
4 | .fd-page__header {
5 | padding-left: 1.5rem;
6 | }
7 |
--------------------------------------------------------------------------------
/core/src/variables.scss:
--------------------------------------------------------------------------------
1 | /* Variables and mixins declared here will be available in all other SCSS files */
2 | /* Variables and mixins declared here will be available in all other SCSS files */
3 | $bg1: #f4f4f4;
4 | $bg2: black;
5 |
--------------------------------------------------------------------------------
/test/e2e-test-application/webpack-extra.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | devServer: {
3 | // because of 404 issue, which redirected us to sampleapp.html instead of index.html
4 | historyApiFallback: true
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/client/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = function(api) {
2 | api.cache(true);
3 | const presets = ['@babel/preset-env'];
4 | const plugins = ['@babel/plugin-proposal-optional-chaining'];
5 | return { presets, plugins };
6 | };
7 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/codeblocks.md:
--------------------------------------------------------------------------------
1 | ```javascript
2 | const something = () => {}
3 | ```
4 |
5 | ```
6 | some other plain code
7 | ```
8 |
9 | ```bash
10 | bash code
11 | ```
12 |
13 | `inline code` should not be copied
--------------------------------------------------------------------------------
/website/landingpage/dev/src/partials/header.html:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/webpack-extra.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | devServer: {
3 | // because of 404 issue, which redirected us to sampleapp.html instead of index.html
4 | historyApiFallback: true
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/routes/Sample2.svelte:
--------------------------------------------------------------------------------
1 | Sample 2
2 |
3 | Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo
4 | consequat.
5 |
6 |
--------------------------------------------------------------------------------
/plugins/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "@babel/preset-env"
5 | ]
6 | ],
7 | "plugins": [
8 | "@babel/plugin-proposal-optional-chaining",
9 | "@babel/plugin-transform-runtime"
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/core/babel.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "@babel/preset-env",
5 | {
6 | "targets": {
7 | "node": "current"
8 | },
9 | "loose": true
10 | }
11 | ]
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/preload/preload.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-preload',
5 | template: '',
6 | standalone: false
7 | })
8 | export class PreloadComponent {}
9 |
--------------------------------------------------------------------------------
/website/docs/tests/test.spec.ts:
--------------------------------------------------------------------------------
1 | import { expect, test } from '@playwright/test';
2 |
3 | test('index page has expected title', async ({ page }) => {
4 | await page.goto('/');
5 | await expect(page).toHaveTitle(/Documentation - Luigi/);
6 | });
7 |
--------------------------------------------------------------------------------
/website/fiddle/src/main.js:
--------------------------------------------------------------------------------
1 | import App from './App.svelte';
2 |
3 | const app = new App({
4 | target: document.body,
5 | props: {
6 | name: 'Luigi Fiddle'
7 | }
8 | });
9 |
10 | window.app = app;
11 |
12 | export default app;
13 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/services/helpers.ts:
--------------------------------------------------------------------------------
1 | export const toTitleCase = (str: string = ''): string => {
2 | return str.replace(/\w\S*/g, function(txt) {
3 | return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
4 | });
5 | };
6 |
--------------------------------------------------------------------------------
/website/docs/.prettierignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | .env.*
8 | !.env.example
9 |
10 | # Ignore files for PNPM, NPM and YARN
11 | pnpm-lock.yaml
12 | package-lock.json
13 | yarn.lock
14 |
--------------------------------------------------------------------------------
/website/docs/src/markdown-conversion/unified-plugins/helpers.js:
--------------------------------------------------------------------------------
1 | export function prependForExport() {
2 | if (process.env.NODE_ENV == 'production') {
3 | return '/docu-microfrontend';
4 | } else {
5 | return '';
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/container/src/constants/core-api.ts:
--------------------------------------------------------------------------------
1 | export namespace LuigiCoreApi {
2 | /**
3 | * A message emmitted from the Microfrontend when a custom message is sent
4 | */
5 | export const SEND_CONTEXT_TO_MICROFRONTEND = 'sendContextToMicrofrontend';
6 | }
7 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/main.js:
--------------------------------------------------------------------------------
1 | import { mount } from 'svelte';
2 |
3 | import App from './App.svelte';
4 |
5 | const app = mount(App, {
6 | target: document.body
7 | });
8 |
9 | window.app = app;
10 |
11 | export default app;
12 |
--------------------------------------------------------------------------------
/container/test/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Container Unit-Tests
2 |
3 | These are the unit tests for the Luigi Container package.
4 |
5 | All these files are from the **container/src** folder.
6 |
7 | Please try to maintain test coverage when adding new files/functionality.
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/routes/Sample1.svelte:
--------------------------------------------------------------------------------
1 | Sample 1
2 |
3 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore
4 | magna aliquyam erat, sed diam voluptua.
5 |
6 |
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oidc/silent-callback.html:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/app",
5 | "baseUrl": "./",
6 | "module": "es2015",
7 | "types": ["node"]
8 | },
9 | "exclude": []
10 | }
11 |
--------------------------------------------------------------------------------
/website/fiddle/public/examples/microfrontends/ui5qs/index.js:
--------------------------------------------------------------------------------
1 | sap.ui.define([
2 | "sap/ui/core/mvc/XMLView"
3 | ], function (XMLView) {
4 | "use strict";
5 |
6 | XMLView.create({viewName: "Quickstart.App"}).then(function (oView) {
7 | oView.placeAt("content");
8 | });
9 | });
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/app",
5 | "baseUrl": "./",
6 | "module": "es2015",
7 | "types": ["node"]
8 | },
9 | "exclude": []
10 | }
11 |
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oidc-pkce/silent-callback.html:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/frontmatter-3.md:
--------------------------------------------------------------------------------
1 |
10 | # Frontmatter Testing
11 |
12 | [Link](some-file.md)
--------------------------------------------------------------------------------
/website/docs/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./.svelte-kit/tsconfig.json",
3 | "compilerOptions": {
4 | "esModuleInterop": true,
5 | "resolveJsonModule": true,
6 | "skipLibCheck": true,
7 | "sourceMap": true,
8 | "allowSyntheticDefaultImports": true
9 | },
10 | }
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/burger_menu.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/ng-package.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3 | "dest": "../../dist/client-support-angular",
4 | "lib": {
5 | "entryFile": "src/public-api.ts"
6 | }
7 | }
--------------------------------------------------------------------------------
/core-modular/babel.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "@babel/preset-env",
5 | {
6 | "targets": {
7 | "node": "current"
8 | },
9 | "loose": true
10 | }
11 | ],
12 | "@babel/preset-typescript"
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "parser": "@babel/eslint-parser",
3 | "parserOptions": {
4 | "sourceType": "module",
5 | "ecmaFeatures": {
6 | "jsx": true,
7 | "modules": true
8 | }
9 | },
10 | "extends": ["eslint:recommended"]
11 | }
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/frontmatter-2.md:
--------------------------------------------------------------------------------
1 |
10 | # Frontmatter Testing
11 |
12 | [Link](some-file.md)
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/burger_menu.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/frontmatter.md:
--------------------------------------------------------------------------------
1 |
10 |
11 | # Frontmatter Testing
12 |
13 | [Link](some-file.md)
--------------------------------------------------------------------------------
/test/e2e-test-application/src/sampleapp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | small web app
5 |
6 |
7 |
8 | You need to enable JavaScript to run this app.
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/website/docs/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": true,
3 | "singleQuote": true,
4 | "trailingComma": "none",
5 | "printWidth": 100,
6 | "plugins": ["prettier-plugin-svelte"],
7 | "pluginSearchDirs": ["."],
8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
9 | }
10 |
--------------------------------------------------------------------------------
/website/docs/src/routes/docs/[slug]/+page.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 | {@html data.content}
14 |
15 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/play_icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/play_icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/sample1/Sample1.controller.js:
--------------------------------------------------------------------------------
1 | sap.ui.define(
2 | ['sap/ui/core/mvc/Controller', 'luigi/demo/libs/luigi-client/luigi-client'],
3 | (Controller) => {
4 | 'use strict';
5 |
6 | return Controller.extend('luigi.demo.sample1.Sample1', {});
7 | }
8 | );
9 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/sample2/Sample2.controller.js:
--------------------------------------------------------------------------------
1 | sap.ui.define(
2 | ['sap/ui/core/mvc/Controller', 'luigi/demo/libs/luigi-client/luigi-client'],
3 | (Controller) => {
4 | 'use strict';
5 |
6 | return Controller.extend('luigi.demo.sample2.Sample2', {});
7 | }
8 | );
9 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/pages/LuigiCoreApp.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 |
3 | export default function LuigiApp() {
4 | useEffect(() => {
5 | require('@luigi-project/core/luigi.js');
6 | require('../public/luigi-config.js');
7 | }, []);
8 |
9 | return null;
10 | }
11 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/sample1/index.js:
--------------------------------------------------------------------------------
1 | sap.ui.require(['sap/ui/core/mvc/XMLView'], (XMLView) => {
2 | 'use strict';
3 |
4 | XMLView.create({ viewName: 'luigi.demo.sample1.Sample1' }).then(function(
5 | oView
6 | ) {
7 | oView.placeAt('content');
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/sample2/index.js:
--------------------------------------------------------------------------------
1 | sap.ui.require(['sap/ui/core/mvc/XMLView'], (XMLView) => {
2 | 'use strict';
3 |
4 | XMLView.create({ viewName: 'luigi.demo.sample2.Sample2' }).then(function(
5 | oView
6 | ) {
7 | oView.placeAt('content');
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/miscellaneous/miscellaneous.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | Misc content.
7 |
8 |
9 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/links.md:
--------------------------------------------------------------------------------
1 | # Links
2 |
3 | [Internal Link](some-file.md)
4 | [Internal Full Link](https://github.com/luigi-project/luigi/blob/main/docs/application-setup.md)
5 | [External Link](https://luigi-project.io)
6 | [Anchor Link](#noframework)
7 |
8 |
--------------------------------------------------------------------------------
/core/src/styles/fd_fiori.scss:
--------------------------------------------------------------------------------
1 | @use '@sap-theming/theming-base-content/content/Base/baseLib/sap_fiori_3/css_variables.css';
2 | @use 'fundamental-styles/dist/theming/sap_fiori_3.css';
3 |
4 | // TODO: remove later, not supported in fiori_3
5 | @use './btp_tool_layout.scss';
6 |
7 | @use './fd_base.scss';
8 |
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/plus.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/src/utilities/keycode.js:
--------------------------------------------------------------------------------
1 | /* istanbul ignore file */
2 | export const KEYCODE_ARROW_UP = 38;
3 | export const KEYCODE_ARROW_DOWN = 40;
4 | export const KEYCODE_ENTER = 13;
5 | export const KEYCODE_ESC = 27;
6 | export const KEYCODE_SPACE = 32;
7 | export const KEYCODE_HOME = 36;
8 | export const KEYCODE_END = 35;
9 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/plus.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/test/e2e-test-application/externalMf/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luigi-external-mf",
3 | "version": "0.1.0",
4 | "description": "",
5 | "main": "index.html",
6 | "license": "MIT",
7 | "dependencies": {
8 | "@luigi-project/client": "^1.1.0",
9 | "fundamental-styles": "^0.17.0"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/container/typings/index.d.ts:
--------------------------------------------------------------------------------
1 | export { default as LuigiContainer } from './LuigiContainer.svelte';
2 | export { default as LuigiCompoundContainer } from './LuigiCompoundContainer.svelte';
3 | import { Events } from './constants/events';
4 | export default Events;
5 | export type { PathExistsEvent } from './constants/event-type';
6 |
--------------------------------------------------------------------------------
/core/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/e2e/support/events.js:
--------------------------------------------------------------------------------
1 | Cypress.on('uncaught:exception', (err, runnable) => {
2 | // https://docs.cypress.io/api/events/catalog-of-events.html#To-turn-off-all-uncaught-exception-handling
3 | // returning false here prevents Cypress from
4 | // failing the test
5 | return false;
6 | });
7 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/spec",
5 | "baseUrl": "./",
6 | "target": "es2020",
7 | "types": ["jasmine", "node"]
8 | },
9 | "files": ["polyfills.ts"],
10 | "include": ["**/*.d.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/website/docs/src/app.d.ts:
--------------------------------------------------------------------------------
1 | // See https://kit.svelte.dev/docs/types#app
2 | // for information about these interfaces
3 | declare global {
4 | namespace App {
5 | // interface Error {}
6 | // interface Locals {}
7 | // interface PageData {}
8 | // interface Platform {}
9 | }
10 | }
11 |
12 | export {};
13 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/dynamic/dynamic.component.css:
--------------------------------------------------------------------------------
1 | .clickable {
2 | cursor: pointer;
3 | }
4 | .sap-icon--navigation-right-arrow::before,
5 | .sap-icon--navigation-left-arrow::before {
6 | font-size: 11px;
7 | }
8 | .dynamic-component .fd-layout-panel + .fd-layout-panel {
9 | margin-top: 20px;
10 | }
11 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/link-arrow.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/link-arrow.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/test/cypress/config/e2emockengine.json:
--------------------------------------------------------------------------------
1 | {
2 | "integrationFolder": "e2e/0-luigimockengine",
3 | "experimentalSourceRewriting": true,
4 | "pluginsFile": false,
5 | "chromeWebSecurity": false,
6 | "viewportWidth": 1250,
7 | "viewportHeight": 790,
8 | "baseUrl": "http://localhost:8181/"
9 | }
--------------------------------------------------------------------------------
/client/metadata.yaml:
--------------------------------------------------------------------------------
1 |
2 | # DXP component metadata file
3 |
4 | kind: Component
5 | metadata:
6 | displayName: Luigi Client
7 | description: Library for building Luigi micro frontends
8 | labels:
9 | language: javascript
10 | tags:
11 | - luigi
12 | spec:
13 | type:
14 | name: ui
15 | lifecycle: production
16 |
--------------------------------------------------------------------------------
/core-modular/test/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "include": [
4 | "./**/*",
5 | ],
6 | "exclude": [
7 | "node_modules/*",
8 | "__sapper__/*",
9 | "public/*"
10 | ],
11 | "compilerOptions": {
12 | "module": "ESNext",
13 | "forceConsistentCasingInFileNames": true
14 | },
15 | }
--------------------------------------------------------------------------------
/core/src/styles/fd_horizon.scss:
--------------------------------------------------------------------------------
1 | @use '@sap-theming/theming-base-content/content/Base/baseLib/sap_horizon/css_variables.css';
2 | @use 'fundamental-styles/dist/theming/sap_horizon.css';
3 |
4 | @use './btp_tool_layout.scss';
5 |
6 | @use './fd_base.scss';
7 |
8 | :root {
9 | --luigi__shellbar--height: 3.5rem;
10 | }
11 |
--------------------------------------------------------------------------------
/test/e2e-test-application/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/core/metadata.yaml:
--------------------------------------------------------------------------------
1 |
2 | # DXP component metadata file
3 |
4 | kind: Component
5 | metadata:
6 | displayName: Luigi Core
7 | description: Core library for Luigi applications
8 | labels:
9 | language: javascript
10 | tags:
11 | - luigi
12 | - svelte
13 | spec:
14 | type:
15 | name: ui
16 | lifecycle: production
17 |
--------------------------------------------------------------------------------
/core/src/services/index.js:
--------------------------------------------------------------------------------
1 | export * from './messages-listeners';
2 | export * from './iframe';
3 | export * from './preloading';
4 | export * from './routing';
5 | export * from './split-view';
6 | export * from './lifecycle-hooks';
7 | export * from './auth-store';
8 | export * from './auth-layer';
9 | export * from './viewurl-decorator';
10 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/cypress.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress');
2 |
3 | module.exports = defineConfig({
4 | projectId: 'czq7qc',
5 | includeShadowDom: true,
6 | e2e: {
7 | viewportWidth: 1250,
8 | viewportHeight: 790,
9 | chromeWebSecurity: false,
10 | supportFile: false
11 | }
12 | });
13 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/test/cypress.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress');
2 |
3 | module.exports = defineConfig({
4 | e2e: {
5 | testIsolation: false,
6 | experimentalSourceRewriting: true,
7 | setupNodeEvents(on, config) {
8 | // implement node event listeners here
9 | }
10 | }
11 | });
12 |
--------------------------------------------------------------------------------
/container/cypress/e2e/test-app/compound/README.md:
--------------------------------------------------------------------------------
1 | ### Test Suite: `test-app/compound`
2 |
3 | This test suite is used to add tests for all scenarios built and served from **container/test-app/compound** application.
4 |
5 | Please add all **Luigi Compound** related tests here.
6 |
7 | Categorize tests into separate files if needed, so that it is easy to read.
--------------------------------------------------------------------------------
/container/examples/container-iframe/microfrontend.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
This is an iframe based microfrontend container
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/container/metadata.yaml:
--------------------------------------------------------------------------------
1 | # DXP component metadata file
2 |
3 | kind: Component
4 | metadata:
5 | displayName: Luigi Container
6 | description: Library for lightweight integration of Luigi micro frontends
7 | labels:
8 | language: typescript
9 | tags:
10 | - luigi
11 | spec:
12 | type:
13 | name: ui
14 | lifecycle: production
15 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/default-child/dps1/child-node-1.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | templateUrl: './child-node-1.component.html',
5 | standalone: false
6 | })
7 | export class ChildNode1Component implements OnInit {
8 | constructor() {}
9 |
10 | ngOnInit() {}
11 | }
12 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/default-child/dps2/child-node-2.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | templateUrl: './child-node-2.component.html',
5 | standalone: false
6 | })
7 | export class ChildNode2Component implements OnInit {
8 | constructor() {}
9 |
10 | ngOnInit() {}
11 | }
12 |
--------------------------------------------------------------------------------
/website/landingpage/public/assets/img/burger_menu_close.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/spec",
5 | "baseUrl": "./",
6 | "module": "commonjs",
7 | "target": "es2020",
8 | "types": ["jasmine", "node"]
9 | },
10 | "files": ["polyfills.ts"],
11 | "include": ["**/*.d.ts"]
12 | }
13 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /public
4 | yarn.lock
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 |
15 | # Editor directories and files
16 | .idea
17 | .vscode
18 | *.suo
19 | *.ntvs*
20 | *.njsproj
21 | *.sln
22 | *.sw*
--------------------------------------------------------------------------------
/cra-template/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/cra-template-luigi-microfrontend",
3 | "license": "Apache-2.0",
4 | "version": "1.0.3",
5 | "keywords": [
6 | "cra-template-luigi",
7 | "microfrontend",
8 | "luigi",
9 | "luigi-microfrontend"
10 | ],
11 | "scripts": {},
12 | "dependencies": {},
13 | "devDependencies": {}
14 | }
--------------------------------------------------------------------------------
/website/docs/playwright.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from '@playwright/test';
2 |
3 | export default defineConfig({
4 | webServer: {
5 | command: 'npm run build && npm run core',
6 | timeout: 120 * 1000,
7 | url: 'http://localhost:4000'
8 | },
9 | use: {
10 | baseURL: 'http://localhost:4000'
11 | },
12 | testDir: 'tests'
13 | });
14 |
--------------------------------------------------------------------------------
/website/docs/static/images/copy-clipboard-default.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/assets/img/burger_menu_close.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/tsconfig.lib.prod.json:
--------------------------------------------------------------------------------
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */
2 | {
3 | "extends": "./tsconfig.lib.json",
4 | "compilerOptions": {
5 | "declarationMap": false
6 | },
7 | "angularCompilerOptions": {
8 | "compilationMode": "partial"
9 | }
10 | }
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "es6",
4 | "target": "es2017",
5 | "declaration": true,
6 | "baseUrl": ".",
7 | "outDir": "./dist",
8 | "rootDir": "./src",
9 | "moduleResolution": "node",
10 | },
11 | "exclude": [
12 | "node_modules",
13 | "./dist/**/*"
14 | ],
15 | }
--------------------------------------------------------------------------------
/container/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = function(api) {
2 | api.cache(true);
3 | const presets = [
4 | [
5 | '@babel/preset-env',
6 | {
7 | targets: {
8 | node: 'current'
9 | },
10 | loose: true
11 | }
12 | ],
13 | '@babel/preset-typescript'
14 | ];
15 | return {
16 | presets
17 | };
18 | };
19 |
--------------------------------------------------------------------------------
/core-modular/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/svelte/tsconfig.json",
3 | "include": [
4 | "src/**/*",
5 | "src/node_modules",
6 | ],
7 | "exclude": [
8 | "node_modules/*",
9 | "__sapper__/*",
10 | "public/*"
11 | ],
12 | "compilerOptions": {
13 | "module": "ESNext",
14 | "forceConsistentCasingInFileNames": true,
15 | },
16 | }
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/e2e/test3/0-setuptests/setup-test.cy.js:
--------------------------------------------------------------------------------
1 | describe('Navigation', () => {
2 | beforeEach(() => {
3 | cy.visit(Cypress.env('url'));
4 | });
5 | describe('iFrame check', () => {
6 | it('Check if iFrame exists in running application.', () => {
7 | cy.wait(5000);
8 | cy.get('iframe');
9 | });
10 | });
11 | });
12 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/users.component.html:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/container/cypress/e2e/test-app/iframe/README.md:
--------------------------------------------------------------------------------
1 | ### Test Suite: `test-app/iframe`
2 |
3 | This is the test suite of the **container/test-app/iframe** application. The test suite is for the iframe based Luigi Container scenarios.
4 |
5 | Please add all iframe based **Luigi Container** related tests here.
6 |
7 | Categorize tests into separate files if needed, so that it is easy to read.
--------------------------------------------------------------------------------
/container/cypress/e2e/test-app/wc/README.md:
--------------------------------------------------------------------------------
1 | ### Test Suite: `test-app/wc`
2 |
3 | This is the test suite of the **container/test-app/wc** application. The test suite is for the Web Component based Luigi Container scenarios.
4 |
5 | Please add all web component based **Luigi Container** related tests here.
6 |
7 | Categorize tests into separate files if needed, so that it is easy to read.
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 | pnpm-debug.log*
15 |
16 | # Editor directories and files
17 | .idea
18 | .vscode
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
--------------------------------------------------------------------------------
/cra-template/template/src/views/sample2.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const Sample2 = () => {
4 | return (
5 |
6 |
Sample 2
7 | Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea
8 | commodo consequat.
9 |
10 | );
11 | };
12 |
13 | export default Sample2;
14 |
--------------------------------------------------------------------------------
/test/e2e-js-test-application/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 |
9 | node_modules
10 | dist
11 | dist-ssr
12 | *.local
13 |
14 | # Editor directories and files
15 | .vscode/*
16 | !.vscode/extensions.json
17 | .idea
18 | .DS_Store
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
--------------------------------------------------------------------------------
/test/e2e-test-application/externalMf/index.css:
--------------------------------------------------------------------------------
1 | .green {
2 | color: green;
3 | }
4 |
5 | .red {
6 | color: red;
7 | }
8 |
9 | .yellow {
10 | color: yellow;
11 | }
12 |
13 | .active {
14 | font-size: 30px;
15 | }
16 |
17 | .mobileBack {
18 | display: none;
19 | }
20 |
21 | @media (max-width: 600px) {
22 | .mobileBack {
23 | display: block;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/app/app.ts:
--------------------------------------------------------------------------------
1 | import { Component, ViewEncapsulation } from '@angular/core';
2 | import { RouterOutlet } from '@angular/router';
3 |
4 | @Component({
5 | selector: 'app-root',
6 | imports: [RouterOutlet],
7 | templateUrl: './app.html',
8 | styleUrl: './app.css',
9 | encapsulation: ViewEncapsulation.None
10 | })
11 | export class App {}
12 |
--------------------------------------------------------------------------------
/website/docs/static/images/icon_info.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-react/src/views/sample2.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const Sample2 = () => {
4 | return (
5 |
6 |
Sample 2
7 | Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea
8 | commodo consequat.
9 |
10 | );
11 | };
12 |
13 | export default Sample2;
14 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/drawer/drawer.component.scss:
--------------------------------------------------------------------------------
1 | @media (max-width: 599px) {
2 | :host .fd-dialog__content:not(.fd-dialog__content--mobile) {
3 | max-width: 90%;
4 | min-width: 90%;
5 | }
6 | }
7 |
8 | @media (min-width: 600px) {
9 | .fd-dialog__content {
10 | max-width: 460px;
11 | }
12 | }
13 |
14 | .fd-dialog {
15 | z-index: 1000;
16 | }
17 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/modal/modal.component.scss:
--------------------------------------------------------------------------------
1 | @media (max-width: 599px) {
2 | :host .fd-dialog__content:not(.fd-dialog__content--mobile) {
3 | max-width: 90%;
4 | min-width: 90%;
5 | }
6 | }
7 |
8 | @media (min-width: 600px) {
9 | .fd-dialog__content {
10 | max-width: 460px;
11 | }
12 | }
13 |
14 | .fd-dialog {
15 | z-index: 1000;
16 | }
17 |
--------------------------------------------------------------------------------
/website/docs/src/luigi-config/extended/communication.js:
--------------------------------------------------------------------------------
1 | class Communication {
2 | customMessagesListeners = {
3 | 'search.tag.keyword': (customMessage, mfObject, mfNodeObj) => {
4 | Luigi.globalSearch().openSearchField();
5 | Luigi.globalSearch().setSearchString(customMessage.keyword);
6 | }
7 | }
8 | }
9 |
10 | export const communication = new Communication();
11 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-ui5/rollup.config.js:
--------------------------------------------------------------------------------
1 | import copy from 'rollup-plugin-copy';
2 | export default {
3 | input: 'src/ui5-support-lib.js',
4 | output: {
5 | file: 'dist/ui5-support-lib.js',
6 | format: 'es',
7 | compact: true
8 | },
9 | plugins: [
10 | copy({
11 | targets: [{ src: 'src/README.md', dest: 'dist' }]
12 | })
13 | ]
14 | };
15 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/hide-side-nav/hide-side-nav.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-hide-side-nav',
5 | templateUrl: './hide-side-nav.component.html',
6 | standalone: false
7 | })
8 | export class HideSideNavComponent implements OnInit {
9 | constructor() {}
10 |
11 | ngOnInit() {}
12 | }
13 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/usersoverview/usersoverview.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
Users overview works.
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/restricted/restricted.component.html:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/pages/_app.js:
--------------------------------------------------------------------------------
1 | import Head from 'next/head';
2 |
3 | function MyApp({ Component, pageProps }) {
4 | return (
5 | <>
6 |
7 |
8 |
9 |
10 |
11 | >
12 | );
13 | }
14 |
15 | export default MyApp;
16 |
--------------------------------------------------------------------------------
/.github/workflows/update-deps/action.yml:
--------------------------------------------------------------------------------
1 | name: Dependency update
2 | inputs:
3 | list-of-deps:
4 | required: true
5 | default: ''
6 |
7 | runs:
8 | using: 'composite'
9 | steps:
10 | - name: Update deps
11 | run: sudo apt-get update
12 | shell: bash
13 | - name: Install deps
14 | run: sudo apt-get -y install ${{ inputs.list-of-deps }}
15 | shell: bash
16 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see https://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.ts]
12 | quote_type = single
13 |
14 | [*.md]
15 | max_line_length = off
16 | trim_trailing_whitespace = false
17 |
--------------------------------------------------------------------------------
/cra-template/template/src/views/sample1.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const Sample1 = () => {
4 | return (
5 |
6 |
Sample 1
7 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et
8 | dolore magna aliquyam erat, sed diam voluptua.
9 |
10 | );
11 | };
12 |
13 | export default Sample1;
14 |
--------------------------------------------------------------------------------
/website/docs/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /.netlify
6 | /package
7 | .env
8 | .env.*
9 | !.env.example
10 | vite.config.js.timestamp-*
11 | vite.config.ts.timestamp-*
12 | /static/core
13 | /static/assets
14 | /static/luigi-client
15 | /src/core
16 | /src/luigi-client
17 | /src/assets
18 | /src/images
19 | /src/lib/data/docs.json
20 | /test-results
21 | sitemap.xml
--------------------------------------------------------------------------------
/REUSE.toml:
--------------------------------------------------------------------------------
1 | version = 1
2 | SPDX-PackageName = "Luigi"
3 | SPDX-PackageSupplier = "Philipp Pracht "
4 | SPDX-PackageDownloadLocation = "https://github.com/luigi-project/luigi"
5 |
6 | [[annotations]]
7 | path = "**"
8 | precedence = "aggregate"
9 | SPDX-FileCopyrightText = "2020 SAP SE or an SAP affiliate company and Luigi contributors"
10 | SPDX-License-Identifier = "Apache-2.0"
11 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "module": "esnext",
5 | "baseUrl": "./",
6 | "moduleResolution": "node",
7 | "paths": {
8 | "@/*": [
9 | "src/*"
10 | ]
11 | },
12 | "lib": [
13 | "esnext",
14 | "dom",
15 | "dom.iterable",
16 | "scripthost"
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/code-snippet/code-snippet.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-code-snippet',
5 | templateUrl: './code-snippet.component.html',
6 | styleUrls: ['./code-snippet.component.scss'],
7 | standalone: false
8 | })
9 | export class CodeSnippetComponent {
10 | @Input() public data: string;
11 | }
12 |
--------------------------------------------------------------------------------
/website/docs/static/images/icon_alert.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tslint.json",
3 | "rules": {
4 | "directive-selector": [
5 | true,
6 | "attribute",
7 | "lib",
8 | "camelCase"
9 | ],
10 | "component-selector": [
11 | true,
12 | "element",
13 | "lib",
14 | "kebab-case"
15 | ]
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/blog/2024-08-28-release-notes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi v2.15
3 | seoMetaDescription: Release notes for Luigi v2.15
4 | author:
5 | - Johannes Doberer
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi v2.15 in the release notes below.
10 |
11 |
12 |
13 | #### Client Support Angular library
14 |
15 | The client-support-angular library now additionally supports Angular 18.
--------------------------------------------------------------------------------
/container/test-app/iframe/microfrontend-allow-rules.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
allow rules test for iframes
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/container/test-app/iframe/microfrontend-defer-init.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
defer-init test for iframes
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/container/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/svelte/tsconfig.json",
3 | "include": [
4 | "instrumented/**/*",
5 | "src/**/*",
6 | "src/node_modules",
7 | "test/**/*"
8 | ],
9 | "exclude": [
10 | "node_modules/*",
11 | "__sapper__/*",
12 | "public/*"
13 | ],
14 | "compilerOptions": {
15 | "module": "ESNext",
16 | "target": "ES2021"
17 | },
18 | }
--------------------------------------------------------------------------------
/core/examples/luigi-example-js/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luigi-example-js",
3 | "version": "0.1.0",
4 | "description": "",
5 | "main": "public/index.html",
6 | "scripts": {
7 | "start": "serve public",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "license": "ISC",
11 | "dependencies": {
12 | "cross-spawn": "^7.0.6",
13 | "serve": "^14.2.5"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-react/src/views/sample1.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const Sample1 = () => {
4 | return (
5 |
6 |
Sample 1
7 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et
8 | dolore magna aliquyam erat, sed diam voluptua.
9 |
10 | );
11 | };
12 |
13 | export default Sample1;
14 |
--------------------------------------------------------------------------------
/docs/metadata.yaml:
--------------------------------------------------------------------------------
1 |
2 | # DXP component metadata file
3 |
4 | kind: Component
5 | metadata:
6 | displayName: Luigi Documentation
7 | description: Contains documentation for Luigi Core and Client libraries
8 | labels:
9 | language: markdown
10 | tags:
11 | - luigi
12 | - documentation
13 | - dxp-project-documentation
14 | spec:
15 | type:
16 | name: ui
17 | lifecycle: production
18 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/default-child/dps1/child-node-1.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 | This is Child 1 component
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/route/luigi-activated-route-snapshot-helper.spec.ts:
--------------------------------------------------------------------------------
1 | import { LuigiActivatedRouteSnapshotHelper } from './luigi-activated-route-snapshot-helper';
2 |
3 | describe('NgLuigiActivatedRouteSnapshotService', () => {
4 | it('should create an instance', () => {
5 | expect(new LuigiActivatedRouteSnapshotHelper()).toBeTruthy();
6 | });
7 | });
8 |
--------------------------------------------------------------------------------
/core/src/styles/_variables.scss:
--------------------------------------------------------------------------------
1 | $mobileMinWidth: 375px;
2 | $desktopMinWidth: 600px;
3 | $desktopMaxWidth: 900px;
4 | $topNavHeight: var(--luigi__shellbar--height);
5 | $combinedLayoutGap: 1rem;
6 | $leftNavWidthCollapsed: var(--luigi__leftnav_collapsed--width, 2.75rem);
7 | $zindex-dialog-box: 1000;
8 | $globalNavWidth: 69px;
9 | $navHeaderHeight: var(--luigi__navheader--height, 3.25rem);
10 | $spinnerOpacity: opacity 0.25s;
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/restricted/restricted.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-restricted',
5 | templateUrl: './restricted.component.html',
6 | styleUrls: ['./restricted.component.css'],
7 | standalone: false
8 | })
9 | export class RestrictedComponent implements OnInit {
10 | constructor() {}
11 |
12 | ngOnInit() {}
13 | }
14 |
--------------------------------------------------------------------------------
/container/test-app/iframe/microfrontend-sandbox-rules.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
sandbox rules test for iframes
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/app/app.routes.ts:
--------------------------------------------------------------------------------
1 | import { Routes } from '@angular/router';
2 |
3 | import { Home } from './home/home';
4 | import { Sample1 } from './sample1/sample1';
5 | import { Sample2 } from './sample2/sample2';
6 |
7 | export const routes: Routes = [
8 | { path: 'home', component: Home },
9 | { path: 'sample1', component: Sample1 },
10 | { path: 'sample2', component: Sample2 }
11 | ];
12 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/README.md:
--------------------------------------------------------------------------------
1 | # ClientSupportAngular
2 |
3 | ClientSupportAngular is a library that provides several features to run your Angular application inside the Luigi micro frontend framework.
4 |
5 | You can find more information in the [main README file](https://github.com/luigi-project/luigi/tree/main/client-frameworks-support/client-support-angular/projects/client-support-angular#readme).
6 |
7 |
--------------------------------------------------------------------------------
/container/cypress/e2e/examples/simple-wc-setup.cy.js:
--------------------------------------------------------------------------------
1 | describe('Simple Examples Iframe Container Test', () => {
2 | beforeEach(() => {
3 | cy.visit('http://localhost:2222/container-wc/index.html');
4 | });
5 |
6 | it('wc contains text', () => {
7 | cy.get('[data-test-id="luigi-client-api-test-01"]')
8 | .shadow()
9 | .contains('This is a webcomponent based microfrontend container');
10 | });
11 | });
12 |
--------------------------------------------------------------------------------
/core/src/services/messages-listeners.js:
--------------------------------------------------------------------------------
1 | /*istanbul ignore file */
2 | class MessagesListenersClass {
3 | convertCustomMessageInternalToUser(internalMessage) {
4 | return internalMessage.data;
5 | }
6 |
7 | convertCustomMessageUserToInternal(message) {
8 | return {
9 | msg: 'custom',
10 | data: message
11 | };
12 | }
13 | }
14 |
15 | export const MessagesListeners = new MessagesListenersClass();
16 |
--------------------------------------------------------------------------------
/website/docs/static/client-js/helpers.js:
--------------------------------------------------------------------------------
1 | // set to true so all accordions and other data is expanded to allow for better SEO. If not search bot its minimized by default
2 | let predicate = true;
3 |
4 | if (typeof window !== 'undefined') {
5 | // client-only code here
6 | predicate = /docsearch|algolia|bot|googlebot|crawler|spider|robot|crawling/i.test(navigator.userAgent);
7 | }
8 |
9 | export const isSearchBot = predicate;
10 |
--------------------------------------------------------------------------------
/website/docs/static/client-js/search-tag.js:
--------------------------------------------------------------------------------
1 | // import * as LuigiClient from '../luigi-client/luigi-client.js';
2 |
3 | export class SearchTagHandler {
4 | init(LuigiClient) {
5 | if (typeof window !== 'undefined' && typeof self !== 'undefined') {
6 | window.searchTag = (evt, keyword) => {
7 | LuigiClient.sendCustomMessage({ id: 'search.tag.keyword', keyword: keyword });
8 | };
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/component/luigi.preload.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'lib-client-support-angular',
5 | templateUrl: './luigi.preload.component.html',
6 | styles: []
7 | })
8 | export class LuigiPreloadComponent implements OnInit {
9 | constructor() {}
10 | ngOnInit(): void {}
11 | }
12 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-ui5/README.md:
--------------------------------------------------------------------------------
1 | ## Luigi Client UI5 Support Library
2 | The Luigi Client UI5 support library provides several useful features to run your UI5 application inside the Luigi micro frontend framework.
3 | You can find more information in the [main README file](https://github.com/luigi-project/luigi/tree/main/client-frameworks-support/client-support-ui5/src/README.md).
4 |
5 | ## How to build
6 | npm run bundle
--------------------------------------------------------------------------------
/container/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = async () => {
2 | return {
3 | verbose: true,
4 | testEnvironment: 'jsdom',
5 | roots: ['test'],
6 | collectCoverage: true,
7 | collectCoverageFrom: ['src/**/*.{js,mjs,ts,svelte}', '!**/node_modules/**', '!**/vendor/**', '!**/*.spec.{js,ts}'],
8 | coverageReporters: ['clover', 'json', 'json-summary', 'lcov', 'text'],
9 | coverageDirectory: 'coverage'
10 | };
11 | };
12 |
--------------------------------------------------------------------------------
/cra-template/template/gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/miscellaneous/miscellaneous.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-miscellaneous',
5 | templateUrl: './miscellaneous.component.html',
6 | styleUrls: ['./miscellaneous.component.css'],
7 | standalone: false
8 | })
9 | export class MiscellaneousComponent implements OnInit {
10 | constructor() {}
11 |
12 | ngOnInit() {}
13 | }
14 |
--------------------------------------------------------------------------------
/container/examples/container-iframe/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Luigi iFrame Container
6 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/usersoverview/usersoverview.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-usersoverview',
5 | templateUrl: './usersoverview.component.html',
6 | styleUrls: ['./usersoverview.component.css'],
7 | standalone: false
8 | })
9 | export class UsersoverviewComponent implements OnInit {
10 | constructor() {}
11 |
12 | ngOnInit() {}
13 | }
14 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // The file contents for the current environment will overwrite these during build.
2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do
3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead.
4 | // The list of which env maps to which file can be found in `.angular-cli.json`.
5 |
6 | export const environment = {
7 | production: false
8 | };
9 |
--------------------------------------------------------------------------------
/container/test-app/compound/README.md:
--------------------------------------------------------------------------------
1 | # luigi-compound-container Based e2e Test App
2 |
3 | This folder contains simple HTML files that use **luigi-compound-container** in different scenarios.
4 |
5 | They serve as a testing environment for our Cypress tests, which reside in the `container/cypress/e2e` folder.
6 |
7 | We try to keep the examples simple and apply separation of concerns. We use plain JS and HTML files to avoid maintaining yet another framework example.
8 |
9 |
--------------------------------------------------------------------------------
/container/test-app/iframe/README.md:
--------------------------------------------------------------------------------
1 | # Iframe Based Luigi Container e2e Test App
2 |
3 | This folder contains simple HTML files that use **iframe** based luigi-container in different scenarios.
4 |
5 | They serve as a testing environment for our Cypress tests, which reside in the container/cypress/e2e folder.
6 |
7 | We try to keep our examples simple and apply separation of concerns. We use plain JS and HTML files to avoid maintaining yet another framework example.
8 |
9 |
--------------------------------------------------------------------------------
/plugins/auth/src/auth-oidc/webpack-extra.config.js:
--------------------------------------------------------------------------------
1 | const CopyWebpackPlugin = require('copy-webpack-plugin');
2 |
3 | const pluginRoot = __dirname + '/../../../';
4 | module.exports = {
5 | plugins: [
6 | new CopyWebpackPlugin({
7 | patterns: [
8 | {
9 | from: pluginRoot + 'node_modules/oidc-client/dist/oidc-client.min.js',
10 | to: pluginRoot + 'auth/public/auth-oidc'
11 | }
12 | ]
13 | })
14 | ]
15 | };
16 |
--------------------------------------------------------------------------------
/container/test-app/compound/dynamic.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 | This page is used to test Compound-Container dynamic creation
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // The file contents for the current environment will overwrite these during build.
2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do
3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead.
4 | // The list of which env maps to which file can be found in `.angular-cli.json`.
5 |
6 | export const environment = {
7 | production: false
8 | };
9 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/main.ts:
--------------------------------------------------------------------------------
1 | import { enableProdMode } from '@angular/core';
2 | import { bootstrapApplication } from '@angular/platform-browser';
3 |
4 | import { App } from './app/app';
5 | import { appConfig } from './app/app.config';
6 | import { environment } from './environments/environment';
7 |
8 | if (environment.production) {
9 | enableProdMode();
10 | }
11 |
12 | bootstrapApplication(App, appConfig).catch((err) => console.error(err));
13 |
--------------------------------------------------------------------------------
/container/test-app/wc/README.md:
--------------------------------------------------------------------------------
1 | # Web Component Based luigi-container e2e Test App
2 |
3 | This folder contains simple HTML files that use **Web Component** based luigi-container in different scenarios.
4 |
5 | They serve as a testing environment for our Cypress tests, which reside in the container/cypress/e2e folder.
6 |
7 | We try to keep our examples simple and apply separation of concerns. We use plain JS and HTML files to avoid maintaining yet another framework example.
8 |
9 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/sampleapp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | small web app
5 |
9 |
10 |
11 | You need to enable JavaScript to run this app.
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/Component.js:
--------------------------------------------------------------------------------
1 | sap.ui.define(['sap/ui/core/UIComponent'], (UIComponent) => {
2 | 'use strict';
3 |
4 | return UIComponent.extend('luigi.demo.Component', {
5 | metadata: {
6 | interfaces: ['sap.ui.core.IAsyncContentCreation'],
7 | manifest: 'json',
8 | },
9 |
10 | init() {
11 | UIComponent.prototype.init.apply(this, arguments);
12 | this.getRouter().initialize();
13 | }
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/core/jest.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('jest').Config} */
2 | const config = {
3 | collectCoverage: true,
4 | collectCoverageFrom: ['src/**/*.{js,mjs,ts,svelte}', '!**/node_modules/**', '!**/vendor/**', '!**/*.spec.{js,ts}'],
5 | roots: ['test'],
6 | testEnvironment: 'jsdom',
7 | transform: {
8 | '\\.[jt]sx?$': 'babel-jest'
9 | },
10 | transformIgnorePatterns: ['/node_modules/(?!(svelte)/)'],
11 | verbose: true
12 | };
13 |
14 | module.exports = config;
15 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */
2 | {
3 | "extends": "../../tsconfig.json",
4 | "compilerOptions": {
5 | "outDir": "../../out-tsc/spec",
6 | "types": [
7 | "jasmine"
8 | ]
9 | },
10 | "files": [
11 | "src/test.ts",
12 | ],
13 | "include": [
14 | "**/*.spec.ts",
15 | "**/*.d.ts"
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/onNodeActivation/onNodeActivation.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { linkManager } from '@luigi-project/client';
3 |
4 | @Component({
5 | selector: 'app-on-node-activation',
6 | templateUrl: './onNodeActivation.component.html',
7 | styleUrls: ['./onNodeActivation.component.css'],
8 | standalone: false
9 | })
10 | export class OnNodeActivationComponent {
11 | public linkManager = linkManager;
12 | }
13 |
--------------------------------------------------------------------------------
/website/fiddle/patch.js:
--------------------------------------------------------------------------------
1 | console.log('Patching luigi core js');
2 |
3 | const replace = require('replace-in-file');
4 | const options = {
5 | files: 'node_modules/@luigi-project/core/luigi.js',
6 | from: 'import(e)',
7 | to: 'import(/* webpackIgnore: true */ e)'
8 | };
9 |
10 | try {
11 | const results = replace.sync(options);
12 | console.log('Replacement results:', results);
13 | } catch (error) {
14 | console.error('Error occurred:', error);
15 | }
16 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/metadata.yaml:
--------------------------------------------------------------------------------
1 | # DXP component metadata file
2 |
3 | kind: Component
4 | metadata:
5 | displayName: Luigi Client Support for angular
6 | description: This library contains angular services and components for easier integration with Luigi micro frontend framework
7 | labels:
8 | language: typescript
9 | tags:
10 | - luigi
11 | - angular
12 | spec:
13 | type:
14 | name: ui
15 | lifecycle: production
16 |
--------------------------------------------------------------------------------
/container/cypress.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress');
2 |
3 | module.exports = defineConfig({
4 | projectId: 'czq7qc',
5 | includeShadowDom: true,
6 | e2e: {
7 | viewportWidth: 1250,
8 | viewportHeight: 790,
9 | chromeWebSecurity: false,
10 | supportFile: 'cypress/support/e2e.js',
11 | setupNodeEvents(on, config) {
12 | require('@cypress/code-coverage/task')(on, config);
13 |
14 | return config;
15 | }
16 | }
17 | });
18 |
--------------------------------------------------------------------------------
/website/docs/src/markdown-conversion/plugins/buildDocsContent.js:
--------------------------------------------------------------------------------
1 | import { writeFileSync } from 'fs';
2 | import path from 'path';
3 | import { getParsedDocs } from './parser.js';
4 |
5 | getParsedDocs().then(function(a) {
6 | var __dirname = path.resolve();
7 | var dataFolder = __dirname + '/src/lib/data';
8 | var docsFilePath = dataFolder + '/docs.json';
9 | writeFileSync(docsFilePath, JSON.stringify(a));
10 | });
11 | console.log('Generating docs.json file to save to ');
12 |
--------------------------------------------------------------------------------
/container/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 |
3 | /examples/bundle.js
4 | /examples/bundle.js.map
5 | /public/bundle.js
6 | /public/bundle.js.map
7 | /public/bundle.d.ts
8 | /public/bundle.d.ts.map
9 | /test-app/bundle.js
10 | /test-app/bundle.js.map
11 | /test-app/compound/luigi-element.js
12 | /test-app/iframe/luigi-client.js
13 | /public/**/*.ts
14 | /public/constants/events.js
15 |
16 | /coverage
17 | /e2e-coverage
18 | /instrumented
19 | /.nyc_output
20 | /coverage-summary/index.html
21 | .DS_Store
22 |
--------------------------------------------------------------------------------
/scripts/docs/mdHelpers.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Returns simplified name without prefixes.
3 | *
4 | * @param {string} name - orgiginal name
5 | * @returns {string} parsed name
6 | */
7 | function parseName(name) {
8 | if (!name) {
9 | return '';
10 | }
11 |
12 | if (name.includes('#')) {
13 | name = name.substring(name.indexOf('#') + 1);
14 | }
15 |
16 | return name.replace('\\_this.', '').replace('\\_proto.', '').replace('exports.', '');
17 | }
18 |
19 | module.exports = { parseName };
20 |
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/metadata.yaml:
--------------------------------------------------------------------------------
1 | # DXP component metadata file
2 | # For more information, please see:
3 | # https://sap.live.dxp.k8s.ondemand.com/projects/dxp/documentation/Using-DXP/Add-an-existing-component
4 |
5 | kind: Component
6 | metadata:
7 | displayName: Luigi Testing Utilities
8 | description: Micro frontend framework
9 | labels:
10 | language: # javascript
11 | tags:
12 | - Testing
13 | spec:
14 | type:
15 | name: ui
16 | lifecycle: production
17 |
--------------------------------------------------------------------------------
/client/src/baseClass.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @private
3 | * @abstract
4 | */
5 | export class LuigiClientBase {
6 | /**
7 | * @private
8 | */
9 | constructor() {
10 | this.promises = {};
11 | }
12 | /**
13 | * Returns the promises object
14 | * @private
15 | */
16 | setPromise(name, value) {
17 | this.promises[name] = value;
18 | }
19 | /**
20 | * Sets the promises object
21 | * @private
22 | */
23 | getPromise(name) {
24 | return this.promises[name];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/pages/home.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import Head from 'next/head';
3 |
4 | export default function Home() {
5 | useEffect(() => {
6 | const LuigiClient = window['LuigiClient'];
7 | LuigiClient.addInitListener(() => {
8 | console.log('Luigi Initialized');
9 | });
10 | }, []);
11 |
12 | return (
13 | <>
14 |
15 |
16 |
Welcome to Luigi with Next.js
17 |
18 | >
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/public-api.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * Public API Surface of client-support-angular
3 | */
4 |
5 | export * from './lib/component/luigi.preload.component';
6 | export * from './lib/luigi.angular.support.module';
7 | export * from './lib/service/luigi-context-service';
8 | export * from './lib/service/luigi-context.service.impl';
9 | export * from './lib/service/luigi-auto-routing.service';
10 | export * from './lib/luigi-mock/luigi-mock.module';
11 |
--------------------------------------------------------------------------------
/core/src/utilities/helpers/index.js:
--------------------------------------------------------------------------------
1 | export * from './async-helpers';
2 | export * from './auth-helpers';
3 | export * from './escaping-helpers';
4 | export * from './generic-helpers';
5 | export * from './iframe-helpers';
6 | export * from './navigation-helpers';
7 | export * from './routing-helpers';
8 | export * from './state-helpers';
9 | export * from './event-listener-helpers';
10 | export * from './storage-helper';
11 | export * from './usersetting-dialog-helpers';
12 | export * from './global-search-helpers';
13 |
--------------------------------------------------------------------------------
/blog/2024-02-02-luigi-container.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi Container v1.1
3 | seoMetaDescription: Release notes for Luigi Container v1.1
4 | author:
5 | - Johannes Doberer
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi Container v1.1 in the release notes below.
10 |
11 |
12 |
13 | #### Bugfixes
14 |
15 | With this release, we prevent browser history changes from Luigi client on context update. [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.1.0).
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/hide-side-nav/hide-side-nav.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 | But you should notice there's no left navigation
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/core-modular/public_root/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Modular Core
2 |
3 | ## Overview
4 |
5 | Luigi Core, headless, modular.
6 |
7 | This is an early version and not yet recommended for production use.
8 |
9 | For details on Luigi Core, see [this](https://github.com/luigi-project/luigi/tree/main/core) document.
10 |
11 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples).
12 |
13 | For documentation on Luigi Core, see [Luigi documentation](https://docs.luigi-project.io).
14 |
--------------------------------------------------------------------------------
/core/dev-tools/templates/simple/luigi-config.js:
--------------------------------------------------------------------------------
1 | Luigi.setConfig({
2 | navigation: {
3 | nodes: [{
4 | pathSegment: 'home',
5 | hideFromNav: true,
6 | hideSideNav: true,
7 | loadingIndicator: {
8 | enabled: false
9 | },
10 | viewUrl: '/microfrontend.html'
11 | }],
12 | },
13 | settings: {
14 | responsiveNavigation: 'Fiori3',
15 | header: {
16 | title: 'Luigi Simple Dev'
17 | }
18 | }
19 | });
20 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/mf.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Svelte Micro Frontend
6 |
7 |
11 |
12 |
13 |
14 | You need to enable JavaScript to run this app.
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/src/app/app.config.ts:
--------------------------------------------------------------------------------
1 | import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core';
2 | import { provideRouter, withHashLocation } from '@angular/router';
3 |
4 | import { routes } from './app.routes';
5 |
6 | export const appConfig: ApplicationConfig = {
7 | providers: [
8 | provideBrowserGlobalErrorListeners(),
9 | provideZoneChangeDetection({ eventCoalescing: true }),
10 | provideRouter(routes, withHashLocation())
11 | ]
12 | };
13 |
--------------------------------------------------------------------------------
/plugins/auth/src/auth-oidc-pkce/webpack-extra.config.js:
--------------------------------------------------------------------------------
1 | const CopyWebpackPlugin = require('copy-webpack-plugin');
2 | const path = require('path');
3 |
4 | const pluginRoot = path.join(__dirname, '/../../../');
5 |
6 | module.exports = {
7 | plugins: [
8 | new CopyWebpackPlugin({
9 | patterns: [
10 | {
11 | from: pluginRoot + 'node_modules/oidc-client-ts/dist/browser/oidc-client-ts.min.js',
12 | to: pluginRoot + 'auth/public/auth-oidc-pkce'
13 | }
14 | ]
15 | })
16 | ]
17 | };
18 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-js/public/views/sample1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
Sample 1
13 |
14 |
15 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
16 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # npm
2 | node_modules
3 |
4 |
5 | # IDEs
6 | .idea
7 | .angulardoc.json
8 | .vscode/diff
9 | .vscode/settings.json
10 | .vs
11 |
12 | .changelog
13 |
14 | # temporary files and folders
15 | tmp-*
16 | container/cypress/videos
17 | container/cypress/screenshots
18 |
19 | # WhiteSource
20 | whitesource.config.json
21 | plugin*.js
22 | core/dev-tools/latest_build.log
23 | core/dev-tools/simple-app*
24 | core-modular/dev-tools/simple-app*
25 | /full_eslint_report.html
26 | test/e2e-test-application/cypress/screenshots
27 | **/.DS_Store
28 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env*
29 |
30 | # vercel
31 | .vercel
32 |
33 | public/core
34 | public/luigi-client.js
--------------------------------------------------------------------------------
/website/fiddle/README.md:
--------------------------------------------------------------------------------
1 | [](https://app.netlify.com/sites/relaxed-kowalevski-49f468/deploys)
2 |
3 | Luigi Fiddle, deployed via Netlify and accessible at https://fiddle.luigi-project.io.
4 | The Fiddle allows you to see Luigi in action and configure a sample application.
5 |
6 | ### Install Luigi Fiddle on your machine
7 |
8 | Run the `npm install` command in the root folder to install it.
9 |
10 | ### Run fiddle locally
11 | `npm run dev`
12 |
--------------------------------------------------------------------------------
/website/fiddle/public/secureLeave.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Luigi Fiddle
8 |
9 |
10 |
11 |
12 |
13 |
18 |
19 |
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/e2e/tests/1-angular/client-support-angular.cy.js:
--------------------------------------------------------------------------------
1 | describe('Client-support-angular-lib', () => {
2 | describe('context', () => {
3 | it('getContextAsync', () => {
4 | cy.visitLoggedIn('/projects/pr1/developers');
5 | cy.getIframeBody().then($iframeBody => {
6 | cy.wrap($iframeBody)
7 | .find('.contextAsyncBtn')
8 | .click();
9 | cy.wrap($iframeBody)
10 | .find('.contextAsync')
11 | .contains('pr1');
12 | });
13 | });
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/website/docs/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite';
2 | import { defineConfig } from 'vitest/config';
3 |
4 | export default defineConfig({
5 | plugins: [sveltekit()],
6 | css: {
7 | preprocessorOptions: {
8 | scss: {
9 | api: 'modern-compiler'
10 | }
11 | }
12 | },
13 | test: {
14 | include: ['src/**/*.{test,spec}.{js,ts}']
15 | },
16 | build: {
17 | chunkSizeWarningLimit: 900000
18 | },
19 | server: {
20 | watch: {
21 | usePolling: true
22 | }
23 | }
24 | });
25 |
--------------------------------------------------------------------------------
/core-modular/src/utilities/luigi-config-defaults.ts:
--------------------------------------------------------------------------------
1 | export const TOP_NAV_DEFAULTS = {
2 | logout: {
3 | label: 'Sign Out',
4 | icon: 'log'
5 | },
6 | userSettingsProfileMenuEntry: {
7 | label: 'Settings',
8 | icon: 'settings'
9 | },
10 | userSettingsDialog: {
11 | dialogHeader: 'User Settings',
12 | saveBtn: 'Save',
13 | dismissBtn: 'Cancel'
14 | },
15 | globalSearchCenteredCancelButton: 'Cancel'
16 | };
17 |
18 | export const NAVIGATION_DEFAULTS = {
19 | externalLink: {
20 | sameWindow: false
21 | }
22 | };
23 |
--------------------------------------------------------------------------------
/core/dev-tools/templates/simple/microfrontend.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
16 |
17 |
18 |
19 |
20 |
Luigi Simple Development Template
21 |
Some content
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/routes/Home.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 | Home
18 |
19 | {message}
20 |
21 |
--------------------------------------------------------------------------------
/core/src/core-api/baseClass.js:
--------------------------------------------------------------------------------
1 | /* istanbul ignore file */
2 |
3 | /**
4 | * @private
5 | * @abstract
6 | */
7 | export class LuigiCoreAPIBase {
8 | /**
9 | * @private
10 | */
11 | constructor() {
12 | this.promises = {};
13 | }
14 | /**
15 | * Returns the promises object
16 | * @private
17 | */
18 | setPromise(name, value) {
19 | this.promises[name] = value;
20 | }
21 | /**
22 | * Sets the promises object
23 | * @private
24 | */
25 | getPromise(name) {
26 | return this.promises[name];
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/blog/2024-08-27-luigi-container.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi Container v1.3
3 | seoMetaDescription: Release notes for Luigi Container v1.3
4 | author:
5 | - Johannes Doberer
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi Container v1.3 in the release notes below.
10 |
11 |
12 |
13 | #### Improving context updating method
14 |
15 | With this release we improved the context updating method in compound container.
16 |
17 | See our [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.3.0).
18 |
--------------------------------------------------------------------------------
/client/public/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/client",
3 | "description": "Javascript library supporting consumers of the Luigi framework",
4 | "license": "Apache-2.0",
5 | "main": "luigi-client.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "ssh://github.com/luigi-project/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi-client"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "UI",
16 | "extensibility",
17 | "micro-frontends",
18 | "microfrontends"
19 | ],
20 | "version": "2.26.0"
21 | }
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/i18n/i18n.properties:
--------------------------------------------------------------------------------
1 | # App Descriptor
2 | appTitle=Luigi OpenUI5
3 | appDescription=A simple app that showcases Luigi Framework applied to OpenUI5
4 |
5 | homeTitle=Home
6 | sample1Title=Sample 1
7 | sample1Text=Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
8 | sample2Title=Sample 2
9 | sample2Text=Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/i18n/i18n_en.properties:
--------------------------------------------------------------------------------
1 | # App Descriptor
2 | appTitle=Luigi OpenUI5
3 | appDescription=A simple app that showcases Luigi Framework applied to OpenUI5
4 |
5 | homeTitle=Home
6 | sample1Title=Sample 1
7 | sample1Text=Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
8 | sample2Title=Sample 2
9 | sample2Text=Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
--------------------------------------------------------------------------------
/core/public/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/core",
3 | "description": "Javascript library supporting consumers of the Luigi framework",
4 | "license": "Apache-2.0",
5 | "main": "luigi.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "ssh://github.com/luigi-project/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "core",
16 | "UI",
17 | "extensibility",
18 | "micro-frontends",
19 | "microfrontends"
20 | ],
21 | "version": "2.26.0"
22 | }
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oauth2/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/plugin-auth-oauth2",
3 | "description": "OAuth2 implicit grant provider plugin for @luigi-project/core",
4 | "license": "Apache-2.0",
5 | "main": "plugin.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "ssh://github.com/luigi-project/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi-plugin-auth-oauth2"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "core",
16 | "oauth2",
17 | "provider"
18 | ],
19 | "version": "2.26.0"
20 | }
--------------------------------------------------------------------------------
/test/e2e-client-api.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e # exit on errors
4 | BASE_DIR="$( cd "$(dirname "$0")" ; pwd -P )"
5 |
6 | source $BASE_DIR/../scripts/shared/bashHelpers.sh
7 |
8 | echo ""
9 | echo "Client API Test App"
10 | cd "$BASE_DIR/e2e-client-api-test-app"
11 | killWebserver 3000
12 | npm run start &
13 | WS_FID_PID=$!
14 |
15 | NG_EXAMPLE="$BASE_DIR/../test/e2e-client-api-test-app"
16 |
17 | cd $NG_EXAMPLE
18 | echo "Running tests without parallelization"
19 | npm run cypress-headless
20 |
21 | RV=$?
22 | kill $WS_FID_PID
23 | exit $RV
24 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/pages/blog/overview.html:
--------------------------------------------------------------------------------
1 | ---
2 | title: Overview
3 | seoMetaDescription: This is the Luigi blog.
4 | layout: blog
5 | ---
6 |
7 | {{{ blogentries }}}
8 |
9 |
10 |
11 |
12 |
18 |
--------------------------------------------------------------------------------
/core/public_root/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/core",
3 | "description": "Javascript library supporting consumers of the Luigi framework",
4 | "license": "Apache-2.0",
5 | "main": "luigi.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "ssh://github.com/luigi-project/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "core",
16 | "UI",
17 | "extensibility",
18 | "micro-frontends",
19 | "microfrontends"
20 | ],
21 | "version": "2.26.0"
22 | }
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oidc/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/plugin-auth-oidc",
3 | "description": "OpenID Connect provider plugin for @luigi-project/core",
4 | "license": "Apache-2.0",
5 | "main": "plugin.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "ssh://github.com/luigi-project/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi-plugin-auth-oidc"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "core",
16 | "oidc",
17 | "openid connect",
18 | "provider"
19 | ],
20 | "version": "2.26.0"
21 | }
--------------------------------------------------------------------------------
/.github/workflows/publish_cra.yml:
--------------------------------------------------------------------------------
1 | on: workflow_dispatch
2 | name: Publish Create React App (CRA) template
3 | env:
4 | NPM_LUI_AUTH_TOKEN: ${{ secrets.NPM_LUI_AUTH_TOKEN }}
5 |
6 | jobs:
7 | publish:
8 | runs-on: ubuntu-latest
9 | if: github.ref_name == 'main'
10 | steps:
11 | - uses: actions/checkout@v4
12 | - uses: actions/setup-node@v4
13 | with:
14 | node-version: '20.19.0'
15 | - run: echo "//registry.npmjs.org/:_authToken=$NPM_LUI_AUTH_TOKEN" > ~/.npmrc
16 | - run: bash ./scripts/npmPublish.sh cra-release
--------------------------------------------------------------------------------
/core-modular/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = async () => {
2 | return {
3 | verbose: true,
4 | testEnvironment: 'jsdom',
5 | roots: ['test'],
6 | collectCoverage: true,
7 | transform: {
8 | '\\.[jt]sx?$': 'babel-jest'
9 | },
10 | transformIgnorePatterns: ['/node_modules/(?!(svelte)/)'],
11 | collectCoverageFrom: ['src/**/*.{js,mjs,ts,svelte}', '!**/node_modules/**', '!**/vendor/**', '!**/*.spec.{js,ts}'],
12 | moduleNameMapper: {
13 | '^@luigi-project/container$': '/test/mocks/container.ts'
14 | }
15 | };
16 | };
17 |
--------------------------------------------------------------------------------
/cra-template/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Project Create React App Microfrontend Template
2 |
3 | The [SAP Luigi](https://luigi-project.io/) template for [Create React App](https://github.com/facebook/create-react-app)
4 |
5 | ## Usage
6 |
7 | To use this template within your project, add `--template @luigi-project/luigi-microfrontend` when creating a new app.
8 |
9 | For example:
10 |
11 | ```sh
12 | npx create-react-app my-app --template @luigi-project/luigi-microfrontend
13 |
14 | # or
15 |
16 | yarn create react-app my-app --template @luigi-project/luigi-microfrontend
17 | ```
18 |
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/config/externalmf.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress');
2 |
3 | module.exports = defineConfig({
4 | projectId: 'czq7qc',
5 | e2e: {
6 | fixturesFolder: 'cypress/e2e/fixtures',
7 | specPattern: 'cypress/e2e/test2',
8 | supportFile: 'cypress/e2e/support/index.js',
9 | videosFolder: 'cypress/e2e/videos',
10 | screenshotsFolder: 'cypress/screenshots',
11 | chromeWebSecurity: true,
12 | viewportWidth: 1250,
13 | viewportHeight: 790,
14 | baseUrl: 'http://localhost:4200/'
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/core-modular/public_root/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/core-modular",
3 | "description": "Javascript library supporting consumers of the Luigi framework",
4 | "license": "Apache-2.0",
5 | "main": "luigi.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "git+ssh://git@github.com/SAP/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "core",
16 | "UI",
17 | "extensibility",
18 | "micro-frontends",
19 | "microfrontends"
20 | ],
21 | "version": "0.0.1"
22 | }
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "outDir": "./dist/out-tsc",
5 | "sourceMap": true,
6 | "declaration": false,
7 | "moduleResolution": "bundler",
8 | "esModuleInterop": true,
9 | "emitDecoratorMetadata": true,
10 | "experimentalDecorators": true,
11 | "target": "ES2022",
12 | "typeRoots": [
13 | "node_modules/@types"
14 | ],
15 | "lib": [
16 | "es2017",
17 | "dom"
18 | ],
19 | "module": "es2015",
20 | "baseUrl": "./"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/scripts/docs/header.hbs:
--------------------------------------------------------------------------------
1 | {{#if @prefix}}
2 | {{else}}
3 | {{>heading-indent}}
4 | {{#if virtual}}*{{/if}}{{#with (parentObject)}}{{#if virtual}}*{{/if~}}{{/with~}}
5 | {{#if name}}{{#sig~}}
6 | {{{@depOpen}~}}
7 | {{{@codeOpen}~}}
8 | {{#if (equal defaultvalue undefined)}}
9 | {{#if (isEvent)}}"{{parseName name}}"{{else}}{{parseName (escape name)}}{{/if~}}
10 | {{else}}
11 | {{>defaultvalue}}
12 | {{/if~}}
13 | {{{@codeClose}~}}
14 | {{{@depClose}~}}
15 | {{~/sig}}{{/if~}}
16 | {{#if virtual}}*{{/if}}{{#with (parentObject)}}{{#if virtual}}*{{/if~}}{{/with~}}
17 |
18 | {{/if~}}
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/navigation/navigation.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | {{ nav.name }}
9 |
10 |
11 |
12 |
13 |
14 |
19 | {{ nav.name }}
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/navigation/navigation.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-navigation',
5 | templateUrl: './navigation.component.html',
6 | styleUrls: ['./navigation.component.scss'],
7 | standalone: false
8 | })
9 | export class NavigationComponent implements OnInit {
10 | constructor() {}
11 | @Input() topNavConfig;
12 | @Input() leftNavConfig;
13 |
14 | ngOnInit() {}
15 |
16 | handleClick(route) {
17 | parent.window.location.hash = route;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # This file provides an overview of code owners in the `luigi` repository.
2 |
3 | # Each line is a file pattern followed by one or more owners.
4 | # The last matching pattern has the most precedence.
5 | # For more details, read the following article on GitHub: https://help.github.com/articles/about-codeowners/.
6 | # These are the default owners for the whole content of the `luigi` repository. The default owners are automatically added as reviewers when you open a pull request, unless different owners are specified in the file.
7 | * @hardl @johannesdoberer @vincentullal @walmazacn
8 |
--------------------------------------------------------------------------------
/plugins/auth/public/auth-oidc-pkce/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/plugin-auth-oidc-pkce",
3 | "description": "OpenID Connect provider plugin for @luigi-project/core",
4 | "license": "Apache-2.0",
5 | "main": "plugin.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "ssh://github.com/luigi-project/luigi.git"
9 | },
10 | "publishConfig": {
11 | "tag": "luigi-plugin-auth-oidc-pkce"
12 | },
13 | "keywords": [
14 | "luigi",
15 | "core",
16 | "oidc",
17 | "openid connect",
18 | "provider"
19 | ],
20 | "version": "0.42.0"
21 | }
--------------------------------------------------------------------------------
/plugins/auth/src/third-party-cookies-check.js:
--------------------------------------------------------------------------------
1 | /* istanbul ignore file */
2 | let status = 'not_checked';
3 |
4 | window.addEventListener(
5 | 'message',
6 | function(e) {
7 | if (e.data === 'luigi.tpcDisabled') {
8 | console.warn(
9 | 'Third party cookies are not supported! Silent token renewal might not work!'
10 | );
11 | status = 'disabled';
12 | } else if (e.data === 'luigi.tpcEnabled') {
13 | status = 'enabled';
14 | }
15 | },
16 | false
17 | );
18 |
19 | export function thirdPartyCookiesStatus() {
20 | return status;
21 | }
22 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/service/luigi-context.service.impl.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed } from '@angular/core/testing';
2 | import { LuigiContextServiceImpl } from './luigi-context.service.impl';
3 |
4 | describe('LuigiContextService', () => {
5 | let service: LuigiContextServiceImpl;
6 |
7 | beforeEach(() => {
8 | TestBed.configureTestingModule({});
9 | service = TestBed.inject(LuigiContextServiceImpl);
10 | });
11 |
12 | it('should be created', () => {
13 | expect(service).toBeTruthy();
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/core/src/utilities/luigi-config-defaults.js:
--------------------------------------------------------------------------------
1 | export const TOP_NAV_DEFAULTS = {
2 | logout: {
3 | label: 'Sign Out',
4 | icon: 'log'
5 | },
6 | userSettingsProfileMenuEntry: {
7 | label: 'Settings',
8 | icon: 'settings'
9 | },
10 | userSettingsDialog: {
11 | dialogHeader: 'User Settings',
12 | saveBtn: 'Save',
13 | dismissBtn: 'Cancel'
14 | },
15 | globalSearchSubmitButton: 'Search',
16 | globalSearchCenteredCancelButton: 'Cancel'
17 | };
18 |
19 | export const NAVIGATION_DEFAULTS = {
20 | externalLink: {
21 | sameWindow: false
22 | }
23 | };
24 |
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/config/e2e-angular-app.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress');
2 |
3 | module.exports = defineConfig({
4 | projectId: 'czq7qc',
5 | e2e: {
6 | fixturesFolder: 'cypress/e2e/fixtures',
7 | specPattern: 'cypress/e2e/tests/1-angular',
8 | supportFile: 'cypress/e2e/support/index.js',
9 | videosFolder: 'cypress/e2e/videos',
10 | screenshotsFolder: 'cypress/screenshots',
11 | chromeWebSecurity: false,
12 | viewportWidth: 1250,
13 | viewportHeight: 790,
14 | baseUrl: 'http://localhost:4200/'
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/test/e2e-test-application/cypress/config/e2e-js-app.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('cypress');
2 |
3 | module.exports = defineConfig({
4 | projectId: 'czq7qc',
5 | e2e: {
6 | fixturesFolder: 'cypress/e2e/fixtures',
7 | specPattern: 'cypress/e2e/tests/0-js-test-app',
8 | supportFile: 'cypress/e2e/support/index.js',
9 | videosFolder: 'cypress/e2e/videos',
10 | screenshotsFolder: 'cypress/screenshots',
11 | chromeWebSecurity: false,
12 | viewportWidth: 1250,
13 | viewportHeight: 790,
14 | baseUrl: 'http://localhost:4500/'
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/core/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 | /.nyc_output
9 |
10 | # production
11 | /build
12 | /public
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | .idea
22 |
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | .vscode/
28 | /public*/luigi*.css
29 | /public*/luigi*.js
30 | /public*/*.woff
31 | /public*/*.woff2
32 | /public*/*.ttf
33 |
34 | # maps
35 | *.map
36 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Luigi
5 |
9 |
10 |
11 |
12 |
13 | You need to enable JavaScript to run this app.
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/view-group/view-group.component.html:
--------------------------------------------------------------------------------
1 |
2 |
View Group Component: {{ vg }}
3 |
4 |
Luigi Iframe ID: {{ id }}
5 |
6 |
Last Loaded time: {{ time }}
7 |
8 |
9 | Luigi Navigation ViewGroup config:
10 |
11 |
12 | {{ config }}
13 |
14 |
15 |
16 |
17 | Luigi Microfront iframes:
18 |
19 |
20 | {{ code }}
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/blog/2024-05-23-release-notes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi v2.13
3 | seoMetaDescription: Release notes for Luigi v2.13
4 | author:
5 | - Mahati Shankar
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi v2.13 in the release notes below.
10 |
11 |
12 |
13 |
14 | #### Accessibility for Left Nav in BTP Layout
15 |
16 | The Left Nav is now keyboard accessible when the BTP Layout is active.
17 |
18 |
19 |
20 | #### Bugfixes
21 |
22 | For a full list of bugfixes in this release, see our [changelog](https://github.com/luigi-project/luigi/blob/main/CHANGELOG.md).
--------------------------------------------------------------------------------
/container/cypress/e2e/examples/simple-iframe-setup.cy.js:
--------------------------------------------------------------------------------
1 | describe('Simple Examples Iframe Container Test', () => {
2 | beforeEach(() => {
3 | cy.visit('http://localhost:2222');
4 | });
5 |
6 | it('Iframe Container Test', () => {
7 | cy.visit('http://localhost:2222/container-iframe/index.html');
8 |
9 | cy.get('luigi-container')
10 | .shadow()
11 | .get('iframe')
12 | .then(iframe => {
13 | const $body = iframe.contents().find('body');
14 | cy.wrap($body).contains('This is an iframe based microfrontend container');
15 | });
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/anonymous/anonymous.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 | This page is visible only for users that are not logged in.
9 |
10 |
11 | This page is visible for all users, also those that are not logged in.
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.github/workflows/code_checks.yml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | branches:
4 | - '**'
5 | paths:
6 | - 'container/**'
7 | pull_request:
8 | branches:
9 | - 'main'
10 | name: Code Analysis
11 |
12 | jobs:
13 | container_linting:
14 | name: Container Linting
15 | runs-on: ubuntu-latest
16 | steps:
17 | - uses: actions/checkout@v4
18 | - uses: actions/setup-node@v4
19 | with:
20 | node-version: '20.19.0'
21 | - name: Install and lint
22 | working-directory: ./container
23 | run: npm i && npm run lint || exit 1
24 |
25 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/test.ts:
--------------------------------------------------------------------------------
1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files
2 |
3 | import 'zone.js/dist/zone';
4 | import 'zone.js/dist/zone-testing';
5 | import { getTestBed } from '@angular/core/testing';
6 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
7 |
8 | // First, initialize the Angular testing environment.
9 | getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
10 |
--------------------------------------------------------------------------------
/docs/luigi-architecture.md:
--------------------------------------------------------------------------------
1 |
16 |
17 | # Luigi Architecture
18 |
19 | This diagram represents an overview of Luigi's architecture. It shows the relationship between the Luigi framework, the web application, and the external micro frontends and authorization providers:
20 |
21 | 
22 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/public/views/intro.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
14 |
15 |
Intro
16 |
17 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
18 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/webapp/home/Home.view.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luigi-example-view",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "serve": "vite preview"
9 | },
10 | "dependencies": {
11 | "@luigi-project/client": "^2.25.0",
12 | "vue": "^3.5.22",
13 | "vue-router": "^4.6.3"
14 | },
15 | "devDependencies": {
16 | "@vitejs/plugin-vue": "^6.0.1",
17 | "vite": "^7.1.11"
18 | },
19 | "browserslist": [
20 | "> 1%",
21 | "last 2 versions",
22 | "not dead",
23 | "not ie 11"
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/sampleapp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | luigi-example-vue
7 |
8 |
9 |
10 | We're sorry but luigi-example-vue doesn't work properly without JavaScript
12 | enabled. Please enable it to continue.
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/core/public/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Core
2 |
3 | ## Overview
4 |
5 | Luigi is a micro frontend orchestration framework written in Svelte. Use Luigi Core to implement the core application, and Luigi Client to ensure communication between the application and the micro frontend it hosts.
6 |
7 | For details on Luigi Core, see [this](https://github.com/luigi-project/luigi/tree/main/core) document.
8 |
9 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples).
10 |
11 | For documentation on Luigi Core, see [Luigi documentation](https://docs.luigi-project.io).
12 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/route/luigi-activated-route-snapshot-helper.ts:
--------------------------------------------------------------------------------
1 | import { ActivatedRouteSnapshot } from '@angular/router';
2 |
3 | export class LuigiActivatedRouteSnapshotHelper {
4 | private static _current: ActivatedRouteSnapshot = null as unknown as ActivatedRouteSnapshot;
5 |
6 | static getCurrent(): ActivatedRouteSnapshot {
7 | return LuigiActivatedRouteSnapshotHelper._current;
8 | }
9 |
10 | static setCurrent(current: ActivatedRouteSnapshot): void {
11 | LuigiActivatedRouteSnapshotHelper._current = current;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/route/luigi-route-strategy.ts:
--------------------------------------------------------------------------------
1 | import { BaseRouteReuseStrategy } from '@angular/router';
2 | import { ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';
3 | import { LuigiActivatedRouteSnapshotHelper } from './luigi-activated-route-snapshot-helper';
4 |
5 | export class LuigiRouteStrategy extends BaseRouteReuseStrategy {
6 | retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {
7 | LuigiActivatedRouteSnapshotHelper.setCurrent(route);
8 | return super.retrieve(route);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Luigi Core
6 |
10 |
11 |
12 |
13 |
14 | You need to enable JavaScript to run this app.
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/public/sampleapp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | luigi-example-vue
7 |
8 |
9 |
10 | We're sorry but luigi-example-vue doesn't work properly without JavaScript
12 | enabled. Please enable it to continue.
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/core/public_root/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Core
2 |
3 | ## Overview
4 |
5 | Luigi is a micro frontend orchestration framework written in Svelte. Use Luigi Core to implement the core application, and Luigi Client to ensure communication between the application and the micro frontend it hosts.
6 |
7 | For details on Luigi Core, see [this](https://github.com/luigi-project/luigi/tree/main/core) document.
8 |
9 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples).
10 |
11 | For documentation on Luigi Core, see [Luigi documentation](https://docs.luigi-project.io).
12 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Luigi App
5 |
6 |
7 |
8 |
9 |
10 |
11 | You need to enable JavaScript to run this app
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/public/views/core/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
14 |
15 |
Core app
16 |
17 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
18 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/website/fiddle/public/themeHelper.js:
--------------------------------------------------------------------------------
1 | export default function setTheme() {
2 | let theme = LuigiClient.uxManager().getCurrentTheme() || 'sap_fiori_3';
3 | const themeUrl = `https://cdn.jsdelivr.net/npm/@sap-theming/theming-base-content@11.1.48/content/Base/baseLib/${theme}/css_variables.css`;
4 | const themeTag = document.querySelector('#_theme');
5 | if (themeTag) {
6 | document.head.removeChild(themeTag);
7 | }
8 |
9 | const link = document.createElement('link');
10 | link.id = '_theme';
11 | link.href = themeUrl;
12 | link.rel = 'stylesheet';
13 | document.head.appendChild(link);
14 | }
15 |
--------------------------------------------------------------------------------
/test/e2e-js-test-application/public/secureLeave.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 | Luigi Fiddle
11 |
12 |
13 |
14 |
15 |
16 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/main.ts:
--------------------------------------------------------------------------------
1 | import { enableProdMode } from '@angular/core';
2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
3 | // This is used for simpler testing inside dev console
4 | import * as LuigiClient from '@luigi-project/client';
5 | window['LuigiClient'] = LuigiClient;
6 |
7 | import { AppModule } from './app/app.module';
8 | import { environment } from './environments/environment';
9 |
10 | if (environment.production) {
11 | enableProdMode();
12 | }
13 |
14 | platformBrowserDynamic()
15 | .bootstrapModule(AppModule)
16 | .catch(err => console.error(err));
17 |
--------------------------------------------------------------------------------
/client/public/README.md:
--------------------------------------------------------------------------------
1 | # Luigi Client
2 |
3 | ## Overview
4 |
5 | Luigi is a micro frontend orchestration framework written in Svelte. Use Luigi Client to implement micro frontends and ensure communication between the application and the micro frontend it hosts.
6 |
7 | For details on Luigi Client, see [this](https://github.com/luigi-project/luigi/tree/main/client) document.
8 |
9 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples).
10 |
11 | For documentation on Luigi Client, see [Luigi documentation](https://docs.luigi-project.io/docs/luigi-client-setup).
12 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/public/views/container/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
14 |
15 |
Container app
16 |
17 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
18 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/app.component.scss:
--------------------------------------------------------------------------------
1 | .fd-form-item {
2 | margin-bottom: 10px;
3 | }
4 |
5 | .fd-list__item {
6 | display: block;
7 | border-bottom: none;
8 | height: auto; //override the 2,75rem from FD Styles, otherwise the content doesn#t fit
9 | padding: 10px;
10 | }
11 |
12 | //Add margin bottom to panels
13 | .luigi__margin-bottom--small {
14 | margin-bottom: 15px;
15 | }
16 | //align input field and actionn button next to it on one line
17 | .fd-container {
18 | .luigi__input-button--margin {
19 | margin-top: 4px;
20 | }
21 | }
22 | .luigi__inner-padding {
23 | padding: 8px;
24 | }
25 |
--------------------------------------------------------------------------------
/website/landingpage/public/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | https://luigi-project.io/
5 | monthly
6 | 1.0
7 |
8 |
9 | https://luigi-project.io/about.html
10 | monthly
11 | 1.0
12 |
13 |
14 |
--------------------------------------------------------------------------------
/core-modular/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 | /.nyc_output
9 |
10 | # production
11 | /build
12 | /public
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | .idea
22 |
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | .vscode/
28 | /public*/luigi*.css
29 | /public*/luigi*.js
30 | /public*/*.woff
31 | /public*/*.woff2
32 | /public*/*.ttf
33 |
34 | # maps
35 | *.map
36 |
37 | /dev-tools/simple-app
--------------------------------------------------------------------------------
/core/src/utilities/third-party-cookies-check.js:
--------------------------------------------------------------------------------
1 | /* istanbul ignore file */
2 | import { EventListenerHelpers } from './helpers';
3 | let status = 'not_checked';
4 |
5 | EventListenerHelpers.addEventListener(
6 | 'message',
7 | function(e) {
8 | if (e.data === 'luigi.tpcDisabled') {
9 | console.warn('Third party cookies are not supported! Silent token renewal might not work!');
10 | status = 'disabled';
11 | } else if (e.data === 'luigi.tpcEnabled') {
12 | status = 'enabled';
13 | }
14 | },
15 | false
16 | );
17 |
18 | export function thirdPartyCookiesStatus() {
19 | return status;
20 | }
21 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/plain.md:
--------------------------------------------------------------------------------
1 | # Lorem ipsum dolor
2 |
3 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
4 |
5 | [Loreim ipsum](#noframework)
6 | [Ipsum Dolor](#angular6)
7 |
8 | Lorem ipsum dolor sit amet:
9 |
10 | 1. At vero eos et accusam et justo duo dolores et ea rebum.
11 | 2. At vero eos et accusam et justo duo dolores et ea rebum.
12 |
13 | ````
14 | npm install --save @luigi-project/core
15 | npm install --save @luigi-project/client
16 | ````
--------------------------------------------------------------------------------
/core/dev-tools/templates/simple/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Luigi Simple Dev
5 |
6 |
7 |
11 |
12 |
13 |
14 | You need to enable JavaScript to run this app.
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-openui5/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luigi-example-openui5",
3 | "private": true,
4 | "version": "0.2.0",
5 | "author": "SAP SE",
6 | "description": "Luigi with OpenUI5 Demo App",
7 | "scripts": {
8 | "build": "ui5 build --all",
9 | "start": "ui5 serve --open index.html",
10 | "serve": "ws --compress -d dist"
11 | },
12 | "dependencies": {
13 | "@luigi-project/client": "^2.22.1",
14 | "@luigi-project/core": "^2.22.1"
15 | },
16 | "devDependencies": {
17 | "@ui5/cli": "^4.0.36",
18 | "cross-spawn": "^7.0.6",
19 | "local-web-server": "^5.4.0"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/website/landingpage/dev/src/root-assets/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | https://luigi-project.io/
5 | monthly
6 | 1.0
7 |
8 |
9 | https://luigi-project.io/about.html
10 | monthly
11 | 1.0
12 |
13 |
14 |
--------------------------------------------------------------------------------
/container/examples/compound-container/myCompoundWebComponent2.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This class is used to test LuigiClient webcomponent based functionality
3 | */
4 | export default class extends HTMLElement {
5 | constructor() {
6 | super();
7 | const shadowRoot = this.attachShadow({ mode: 'open' });
8 | const template = document.createElement('template');
9 | template.innerHTML = ` Hello From Web Component 2 `;
10 | shadowRoot.appendChild(template.content.cloneNode(true));
11 | this.$paragraph = shadowRoot.getElementById('paragraph');
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/container/examples/compound-container/myCompoundWebComponent3.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This class is used to test LuigiClient webcomponent based functionality
3 | */
4 | export default class extends HTMLElement {
5 | constructor() {
6 | super();
7 | const shadowRoot = this.attachShadow({ mode: 'open' });
8 | const template = document.createElement('template');
9 | template.innerHTML = ` Hello From Web Component 3 `;
10 | shadowRoot.appendChild(template.content.cloneNode(true));
11 | this.$paragraph = shadowRoot.getElementById('paragraph');
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/container/examples/compound-container/myCompoundWebComponent4.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This class is used to test LuigiClient webcomponent based functionality
3 | */
4 | export default class extends HTMLElement {
5 | constructor() {
6 | super();
7 | const shadowRoot = this.attachShadow({ mode: 'open' });
8 | const template = document.createElement('template');
9 | template.innerHTML = ` Hello From Web Component 4 `;
10 | shadowRoot.appendChild(template.content.cloneNode(true));
11 | this.$paragraph = shadowRoot.getElementById('paragraph');
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/container/test-app/compound/defer-init-wc/compoundWCDeferInit2.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This class is used to test Compound Container defer-init functionality
3 | */
4 | export default class extends HTMLElement {
5 | constructor() {
6 | super();
7 | const shadowRoot = this.attachShadow({ mode: 'open' });
8 | const template = document.createElement('template');
9 | template.innerHTML = ` Hello From Web Component 2 `;
10 | shadowRoot.appendChild(template.content.cloneNode(true));
11 | this.$paragraph = shadowRoot.getElementById('paragraph');
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-js/README.md:
--------------------------------------------------------------------------------
1 | # Sample Luigi application written in plain Javascript
2 |
3 | ## Overview
4 |
5 | This is the JS-based sample application which runs with the Luigi framework.
6 |
7 |
8 | ## Development
9 |
10 | To run this application, follow these steps:
11 |
12 |
13 | 1. First, install the dependency `server` to serve your application locally by running the following:
14 | ```bash
15 | npm install
16 | ```
17 |
18 | 2. Start the application .
19 | ```bash
20 | npm run start
21 | ```
22 |
23 | 5. Open it in your browser by going to [http://127.0.0.1:3000/](http://127.0.0.1:3000/).
24 |
--------------------------------------------------------------------------------
/.github/pull-request-template.md:
--------------------------------------------------------------------------------
1 |
7 |
8 | **Description**
9 |
10 | Changes proposed in this pull request:
11 |
12 | - ...
13 | - ...
14 | - ...
15 |
16 | **Related issue(s)**
17 |
18 |
--------------------------------------------------------------------------------
/core/src/services/lifecycle-hooks.js:
--------------------------------------------------------------------------------
1 | import { LuigiUX, LuigiConfig } from './../core-api';
2 |
3 | class LuigiLifecycleHooks {
4 | luigiAfterInit() {
5 | const shouldHideAppLoadingIndicator = LuigiConfig.getConfigBooleanValue(
6 | 'settings.appLoadingIndicator.hideAutomatically'
7 | );
8 | if (shouldHideAppLoadingIndicator) {
9 | // Settimeout needed, otherwise app loading indicator might not present yet and when displayed will not be hidden
10 | setTimeout(() => {
11 | LuigiUX.hideAppLoadingIndicator();
12 | }, 0);
13 | }
14 | }
15 | }
16 |
17 | export const LifecycleHooks = new LuigiLifecycleHooks();
18 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/users/users.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { ActivatedRoute, Params } from '@angular/router';
3 |
4 | @Component({
5 | selector: 'app-users',
6 | templateUrl: './users.component.html',
7 | styleUrls: ['./users.component.css'],
8 | standalone: false
9 | })
10 | export class UsersComponent implements OnInit {
11 | projectId: string;
12 | constructor(private activatedRoute: ActivatedRoute) {}
13 |
14 | ngOnInit() {
15 | this.activatedRoute.params.subscribe((params: Params) => {
16 | this.projectId = params['projectId'];
17 | });
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/blog/2024-04-19-release-notes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi v2.11
3 | seoMetaDescription: Release notes for Luigi v2.11
4 | author:
5 | - Mahati Shankar
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi v2.11 in the release notes below.
10 |
11 |
12 |
13 |
14 | #### Added onClick Navigation for Categories in the TabNav Bar
15 |
16 | With Luigi v2.11, clicking the category in the TabNav bar can be configured to navigate to a node in the same category.
17 |
18 |
19 | #### Bugfixes
20 |
21 | For a full list of bugfixes in this release, see our [changelog](https://github.com/luigi-project/luigi/blob/main/CHANGELOG.md).
--------------------------------------------------------------------------------
/core/src/navigation/StatusBadge.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 | {#if node.statusBadge && node.statusBadge.label}
9 |
10 | {node.statusBadge.label}
11 |
12 | {/if}
13 |
14 |
19 |
--------------------------------------------------------------------------------
/test/e2e-js-test-application/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "e2e-js-test-application",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "live-server --port=4500 --mount=\"/node_modules\":\"./node_modules\" ./public --no-browser"
8 | },
9 | "devDependencies": {
10 | "@luigi-project/core": "^2.22.1",
11 | "@luigi-project/client": "^2.22.1",
12 | "@luigi-project/plugin-auth-oauth2": "^2.22.1",
13 | "@sap-theming/theming-base-content": "~11.1.35",
14 | "fundamental-styles": "0.23.0",
15 | "live-server": "^1.2.2"
16 | },
17 | "engines": {
18 | "node": ">=20.19.0"
19 | }
20 | }
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/miscellaneous2/miscellaneous2.component.html:
--------------------------------------------------------------------------------
1 |
20 |
--------------------------------------------------------------------------------
/container/cypress/e2e/examples/simple-compound-wc-setup.cy.js:
--------------------------------------------------------------------------------
1 | describe('Simple Examples Compound Container Test', () => {
2 | beforeEach(() => {
3 | cy.visit('http://localhost:2222');
4 | });
5 |
6 | it('Compound WebComponent Container loading inner text', () => {
7 | cy.visit('http://localhost:2222/compound-container/index.html');
8 |
9 | cy.get('luigi-compound-container')
10 | .shadow()
11 | .find('h2')
12 | .should(
13 | 'contain.text',
14 | ' Hello From Web Component 1 -- some content -- Hello From Web Component 2 Hello From Web Component 3 Hello From Web Component 4 '
15 | );
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/test/e2e-client-api-test-app/README.md:
--------------------------------------------------------------------------------
1 | # Luigi JS application for checking if Core and Container WC clientAPI are the same
2 |
3 | ## Overview
4 |
5 | This is the JS-based sample application which runs with the Luigi framework
6 |
7 | ## Development
8 |
9 | To run this application, follow these steps:
10 |
11 | 1. First, install all dependencies to serve your application locally by running the following:
12 | ```bash
13 | npm install
14 | ```
15 |
16 | 2. Then start the application with the command below:
17 | ```bash
18 | npm start
19 | ```
20 |
21 | 3. Open it in your browser by going to [http://localhost:3000](http://localhost:3000)
22 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/webpack-common-rules.js:
--------------------------------------------------------------------------------
1 | const mode = process.env.NODE_ENV || 'development';
2 | const prod = mode === 'production';
3 |
4 | module.exports = {
5 | svelte: {
6 | test: /\.(html|svelte|svelte\.js)$/,
7 | use: {
8 | loader: 'svelte-loader',
9 | options: {
10 | emitCss: true,
11 | hotReload: true
12 | }
13 | }
14 | },
15 | // css: {
16 | // test: /\.(sa|sc|c)ss$/,
17 | // use: ['css-loader']
18 | // },
19 | urls: {
20 | test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
21 | loader: 'url-loader',
22 | options: {
23 | limit: 50000
24 | }
25 | }
26 | };
27 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/assets/tabHeader.js:
--------------------------------------------------------------------------------
1 | export default class extends HTMLElement {
2 | constructor() {
3 | super();
4 | const template = document.createElement('template');
5 | template.innerHTML = `Hello World from a TabNav Header microfrontend!
`;
6 |
7 | const empty = document.createElement('template');
8 | empty.innerHTML = ``;
9 |
10 | this._shadowRoot = this.attachShadow({
11 | mode: 'open',
12 | delegatesFocus: false
13 | });
14 | this._shadowRoot.appendChild(template.content.cloneNode(true));
15 | }
16 |
17 | set context(ctx) {}
18 | }
19 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/src/views/home.vue:
--------------------------------------------------------------------------------
1 |
2 | Home
3 |
4 | {{ message }}
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/client-frameworks-support/client-support-angular/projects/client-support-angular/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */
2 | {
3 | "extends": "../../tsconfig.json",
4 | "compilerOptions": {
5 | "outDir": "../../out-tsc/lib",
6 | "declaration": true,
7 | "declarationMap": true,
8 | "inlineSources": true,
9 | "types": []
10 | },
11 | "angularCompilerOptions": {
12 | "skipTemplateCodegen": true,
13 | "strictMetadataEmit": true,
14 | "enableResourceInlining": true,
15 | "compilationMode": "partial"
16 | },
17 | "exclude": [
18 | "src/test.ts",
19 | "**/*.spec.ts"
20 | ]
21 | }
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/README.md:
--------------------------------------------------------------------------------
1 | # Sample Luigi application written in Svelte
2 |
3 | ## Overview
4 |
5 | This is the Svelte-based sample application which runs with the Luigi framework.
6 |
7 |
8 | ## Development
9 |
10 | 1. Install dependencies:
11 |
12 | ```bash
13 | cd luigi-example-svelte
14 | npm install
15 | ```
16 |
17 | 2. Build and run this application in development mode:
18 |
19 | ```bash
20 | npm run build
21 | npm run dev
22 | ```
23 |
24 | Open it in your browser by going to [localhost:5100](http://localhost:5100).
25 |
26 | Note that this example serves as a starting point and is not to be used directly in production without necessary adjustments.
--------------------------------------------------------------------------------
/container/src/services/iframe-helpers.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Retrieves the allow rules for iframes and modifies them according to w3c standard conditions.
3 | * @param {string[]} allowRules - qn array of allow rules
4 | * @returns {string|undefined} the modified allow rules joined as a single string, or undefined if allowRules is falsy
5 | */
6 | export const getAllowRules = (allowRules: string[]) => {
7 | if (!allowRules) return undefined;
8 | const rules = allowRules;
9 | rules.forEach((rule, index) => {
10 | rules[index] = rule + (rule.indexOf(';') != -1 ? '' : ';');
11 | rules[index] = allowRules[index].replaceAll('"', "'");
12 | });
13 | return rules.join(' ');
14 | };
15 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-react/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 |
9 | # Compiled binary addons (http://nodejs.org/api/addons.html)
10 | build/Release
11 |
12 | # Dependency directories
13 | node_modules/
14 | jspm_packages/
15 |
16 | # Distribution directories
17 | dist/
18 | #build files
19 | dist
20 |
21 | # Typescript v1 declaration files
22 | typings/
23 |
24 | # Optional npm cache directory
25 | .npm
26 |
27 | # Optional eslint cache
28 | .eslintcache
29 |
30 | # Optional REPL history
31 | .node_repl_history
32 |
33 | # Output of 'npm pack'
34 | *.tgz
35 |
36 | # Yarn Integrity file
37 | .yarn-integrity
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Luigi
5 |
9 |
13 |
14 |
15 | You need to enable JavaScript to run this app.
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/blog/2024-11-29-luigi-container.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi Container v1.5
3 | seoMetaDescription: Release notes for Luigi Container v1.5
4 | author:
5 | - Johannes Doberer
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi Container v1.5 in the release notes below.
10 |
11 |
12 |
13 | #### Possibility to update viewUrl for Luigi Container
14 |
15 | With this release we added the possibility for Luigi Container to [updateViewUrl](https://docs.luigi-project.io/docs/luigi-container-api?section=updateviewurl) for iframe based micro frontends.
16 |
17 | See our [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.5.0).
18 |
--------------------------------------------------------------------------------
/core-modular/svelte.config.cjs:
--------------------------------------------------------------------------------
1 | // const { resolve } = require('node:path');
2 | // const { pathToFileURL } = require('node:url');
3 | const preprocess = require('svelte-preprocess');
4 |
5 | // const variablePath = resolve(__dirname, 'src/styles', 'variables');
6 | // const mixinPath = resolve(__dirname, 'src/styles', 'mixins');
7 |
8 | const config = {
9 | extensions: ['.svelte'],
10 | compilerOptions: {
11 | },
12 | name: 'Luigi',
13 | preprocess: [
14 | preprocess({
15 | // scss: {
16 | // prependData: `@import "${pathToFileURL(variablePath)}", "${pathToFileURL(mixinPath)}";`
17 | // }
18 | })
19 | ]
20 | };
21 |
22 | module.exports = config;
23 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Luigi
5 |
9 |
13 |
14 |
15 | You need to enable JavaScript to run this app.
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/container/examples/container-wc/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Luigi Webcomponent Container
6 |
7 |
8 |
9 |
13 |
14 |
15 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-svelte/src/App.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/src/views/sample1.vue:
--------------------------------------------------------------------------------
1 |
2 | Welcome to Sample 1 Page
3 |
4 | {{ message }}
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/src/views/sample2.vue:
--------------------------------------------------------------------------------
1 |
2 | Welcome to Sample 2 Page
3 |
4 | {{ message }}
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/core/src/styles/_mixins.scss:
--------------------------------------------------------------------------------
1 | @mixin transition($args...) {
2 | transition: $args;
3 | }
4 |
5 | @mixin box-shadow($shadow...) {
6 | box-shadow: $shadow;
7 | }
8 |
9 | @mixin border-radius($radius) {
10 | border-radius: $radius;
11 | }
12 |
13 | @mixin luigi-menu__link--border-radius($position) {
14 | :global(.fd-menu__link) {
15 | border-#{$position}-left-radius: 0.25rem;
16 | border-#{$position}-left-radius: var(
17 | --sapElement_BorderCornerRadius,
18 | 0.25rem
19 | );
20 | border-#{$position}-right-radius: 0.25rem;
21 | border-#{$position}-right-radius: var(
22 | --sapElement_BorderCornerRadius,
23 | 0.25rem
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/core/src/utilities/constants.js:
--------------------------------------------------------------------------------
1 | export const CSS_BREAKPOINTS = {
2 | desktopMinWidth: 600
3 | };
4 |
5 | export const MICROFRONTEND_TYPES = [
6 | { type: 'main', selector: '.iframeContainer iframe' },
7 | { type: 'split-view', selector: '.iframeSplitViewCnt iframe' },
8 | { type: 'modal', selector: '.iframeModalCtn._modal iframe' },
9 | { type: 'drawer', selector: '.iframeModalCtn._drawer iframe' },
10 | { type: 'user-settings', selector: '.iframeUserSettingsCtn iframe' }
11 | ];
12 |
13 | export const CUSTOM_LUIGI_CONTAINER = {
14 | cssSelector: '[luigi-app-root]'
15 | };
16 |
17 | export const APP_LOADING_INDICATOR = {
18 | cssSelector: '[luigi-app-loading-indicator]'
19 | };
20 |
--------------------------------------------------------------------------------
/cra-template/template/public/sampleapp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Luigi Simple React App
7 |
8 |
9 |
10 | You need to enable JavaScript to run this app.
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import neostandard from 'neostandard';
2 | import pluginCypress from 'eslint-plugin-cypress/flat';
3 | import stylistic from '@stylistic/eslint-plugin';
4 |
5 | /** @type {import('eslint').Linter.Config[]} */
6 | export default [
7 | ...neostandard(),
8 | pluginCypress.configs.recommended,
9 | stylistic.configs['recommended-flat'],
10 | {
11 | files: ['**/*.js', '**/*.ts'],
12 | plugins: {
13 | cypress: pluginCypress,
14 | '@stylistic': stylistic
15 | },
16 | rules: {
17 | 'no-ex-assign': 'warn',
18 | '@stylistic/indent': 'off',
19 | '@stylistic/no-tabs': 'off',
20 | '@stylistic/semi': 'error'
21 | }
22 | }
23 | ];
24 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-vue/src/router/index.js:
--------------------------------------------------------------------------------
1 | import { createRouter, createWebHashHistory } from 'vue-router';
2 | import Home from '../views/home.vue';
3 | import Sample1 from '../views/sample1.vue';
4 | import Sample2 from '../views/sample2.vue';
5 |
6 | const routes = [
7 | {
8 | path: '/home',
9 | name: 'home',
10 | component: Home
11 | },
12 | {
13 | path: '/sample1',
14 | name: 'sample1',
15 | component: Sample1
16 | },
17 | {
18 | path: '/sample2',
19 | name: 'sample2',
20 | component: Sample2
21 | }
22 | ];
23 |
24 | const router = createRouter({
25 | history: createWebHashHistory(),
26 | routes
27 | });
28 |
29 | export default router;
30 |
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/anonymous/anonymous.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { Router, ActivatedRoute } from '@angular/router';
3 |
4 | @Component({
5 | selector: 'app-anonymous',
6 | templateUrl: './anonymous.component.html',
7 | styleUrls: ['./anonymous.component.css'],
8 | standalone: false
9 | })
10 | export class AnonymousComponent implements OnInit {
11 | exclusive: false;
12 |
13 | constructor(private route: ActivatedRoute) {
14 | this.route.queryParams.subscribe(
15 | (params) => {
16 | this.exclusive = params.exclusive;
17 | },
18 | (err) => {}
19 | );
20 | }
21 |
22 | ngOnInit() {}
23 | }
24 |
--------------------------------------------------------------------------------
/blog/2025-04-23-luigi-container.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Luigi Container v1.7
3 | seoMetaDescription: Release notes for Luigi Container v1.7
4 | author:
5 | - Johannes Doberer
6 | layout: blog
7 | ---
8 |
9 | You can read about the new features in Luigi Container v1.7 in the release notes below.
10 |
11 |
12 |
13 |
14 | #### Adds missing functions to webcomponent client api
15 |
16 | With this release we added missing functions like `addCoreSearchParams`, `updateModalPathInternalNavigation`, `setDirtyStatus`, `setCurrentLocale` and `updateModalSettings` to the webcomponent client api.
17 |
18 |
19 | See our [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.7.0).
20 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Label to use when marking an issue as stale
6 | staleLabel: stale
7 | # Comment to post when marking an issue as stale. Set to `false` to disable
8 | markComment: >
9 | This issue has been automatically marked as stale due to the lack of recent activity. It will soon be closed if no further activity occurs. Thank you for your contributions.
10 | # Comment to post when closing a stale issue. Set to `false` to disable
11 | closeComment: >
12 | This issue has been automatically closed due to the lack of recent activity.
13 |
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/dist/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/testing-utilities",
3 | "description": "Luigi testing utilities for standalone testing of microfrontends",
4 | "license": "Apache-2.0",
5 | "main": "index.js",
6 | "types": "index.d.ts",
7 | "publishConfig": {
8 | "tag": "testing-utilities"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "ssh://github.com/luigi-project/luigi.git"
13 | },
14 | "keywords": [
15 | "luigi",
16 | "UI",
17 | "extensibility",
18 | "micro-frontends",
19 | "microfrontends",
20 | "testing"
21 | ],
22 | "version": "2.26.0",
23 | "engines": {
24 | "node": ">=20.19.0"
25 | }
26 | }
--------------------------------------------------------------------------------
/client-frameworks-support/testing-utilities/test/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luigi-mock-module-test-mf",
3 | "version": "0.1.0",
4 | "description": "",
5 | "license": "MIT",
6 | "scripts": {
7 | "test": "cypress open --env configFile=e2emockengine",
8 | "e2e:run": "cypress run --env configFile=e2emockengine --browser chrome -c video=false",
9 | "start": "live-server --port=8181 --entry-file=index.html --mount=./node_modules:/node_modules"
10 | },
11 | "dependencies": {
12 | "@luigi-project/client": "^2.23.1",
13 | "@luigi-project/testing-utilities": "^2.23.1",
14 | "cross-spawn": "^7.0.6",
15 | "cypress": "^14.5.3",
16 | "fundamental-styles": "^0.26.5"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-angular/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | /dist
5 | /tmp
6 | /out-tsc
7 |
8 | # dependencies
9 | /node_modules
10 |
11 | # IDEs and editors
12 | /.idea
13 | .project
14 | .classpath
15 | .c9/
16 | *.launch
17 | .settings/
18 | *.sublime-workspace
19 |
20 | # IDE - VSCode
21 | .vscode/*
22 | !.vscode/settings.json
23 | !.vscode/tasks.json
24 | !.vscode/launch.json
25 | !.vscode/extensions.json
26 |
27 | # misc
28 | /.angular/cache
29 | /.sass-cache
30 | /connect.lock
31 | /libpeerconnection.log
32 | npm-debug.log
33 | testem.log
34 | /typings
35 |
36 |
37 | # System Files
38 | .DS_Store
39 | Thumbs.db
40 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/pages/sample1.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import Head from 'next/head';
3 |
4 | export default function Sample1() {
5 | useEffect(() => {
6 | const LuigiClient = window['LuigiClient'];
7 | LuigiClient.addInitListener(() => {
8 | console.log('Sample 1 Initialized');
9 | });
10 | }, []);
11 |
12 | return (
13 | <>
14 |
15 |
16 |
Sample 1
17 |
18 |
19 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et
20 | dolore magna aliquyam erat, sed diam voluptua.
21 |
22 | >
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-next/pages/sample2.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import Head from 'next/head';
3 |
4 | export default function Sample2() {
5 | useEffect(() => {
6 | const LuigiClient = window['LuigiClient'];
7 | LuigiClient.addInitListener(() => {
8 | console.log('Sample 2 Initialized');
9 | });
10 | }, []);
11 |
12 | return (
13 | <>
14 |
10 | You need to enable JavaScript to run this app.
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/container/public/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@luigi-project/container",
3 | "description": "Javascript library enabling creation of microfrontends",
4 | "license": "Apache-2.0",
5 | "main": "bundle.js",
6 | "types": "index.d.ts",
7 | "repository": {
8 | "type": "git",
9 | "url": "ssh://github.com/luigi-project/luigi.git"
10 | },
11 | "customElements": "./dist/custom-elements.json",
12 | "publishConfig": {
13 | "tag": "luigi-container"
14 | },
15 | "keywords": [
16 | "luigi",
17 | "core",
18 | "UI",
19 | "extensibility",
20 | "micro-frontends",
21 | "microfrontends"
22 | ],
23 | "version": "1.7.6"
24 | }
--------------------------------------------------------------------------------
/core-modular/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import eslint from '@eslint/js';
2 | import tseslint from 'typescript-eslint';
3 |
4 | export default tseslint.config(
5 | eslint.configs.recommended,
6 | tseslint.configs.recommended,
7 | {
8 | files: ['src/**/*.ts'],
9 | rules: {
10 | 'no-useless-escape': 'off',
11 | 'prefer-const': 'warn',
12 | '@typescript-eslint/no-empty-object-type': 'warn',
13 | '@typescript-eslint/no-explicit-any': 'off',
14 | '@typescript-eslint/no-namespace': 'off',
15 | '@typescript-eslint/no-unused-expressions': 'off',
16 | '@typescript-eslint/no-unsafe-function-type': 'warn',
17 | '@typescript-eslint/no-unused-vars': 'off'
18 | }
19 | }
20 | );
--------------------------------------------------------------------------------
/test/e2e-test-application/src/app/project/project.component.scss:
--------------------------------------------------------------------------------
1 | section {
2 | button {
3 | margin-bottom: 0.75rem;
4 | &:focus {
5 | border-color: #085caf;
6 | box-shadow: 0 0 0 1px #0a6ed1;
7 | }
8 | }
9 | & > * {
10 | line-height: 1.75em;
11 | }
12 | li {
13 | display: block;
14 | }
15 | li:not(:last-of-type) {
16 | padding-bottom: 20px;
17 | }
18 | .link-manager {
19 | input {
20 | display: inline;
21 | max-width: 25em;
22 | }
23 | button {
24 | margin-bottom: 1px;
25 | padding-top: 1px;
26 | padding-bottom: 1px;
27 | margin-left: 4px;
28 | }
29 | }
30 | button.w100per {
31 | width: 100%;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/website/docs/scripts/mocks/custom-wrappers.md:
--------------------------------------------------------------------------------
1 | # Frequently asked questions
2 |
3 | Here we have some answers to your questions
4 |
5 |
6 |
7 | ### This is the Accordion Headline
8 |
9 | This is the text
10 | This is the text
11 | This is the text
12 | This is the text
13 |
14 | ```
15 | Sample code
16 | ```
17 | ### Whats next?
18 |
19 | Everything fine!
20 |
21 |
22 |
23 | And now an accordion with all items openend
24 |
25 |
26 |
27 |
28 | ### Another Section
29 |
30 | This is the text
31 | This is the text
32 |
33 | ### Another Section
34 |
35 | This is the text
36 | This is the text
37 |
38 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature-request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an improvement to the project
4 | ---
5 |
6 |
10 |
11 | **Description**
12 |
13 |
14 |
15 | **Reasons**
16 |
17 |
18 |
19 | **Attachments**
20 |
21 |
22 |
--------------------------------------------------------------------------------
/container/examples/compound-container/myCompoundWebComponent1.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This class is used to test LuigiClient webcomponent based functionality
3 | */
4 | export default class extends HTMLElement {
5 | constructor() {
6 | super();
7 | const shadowRoot = this.attachShadow({ mode: 'open' });
8 | const template = document.createElement('template');
9 | template.innerHTML = ` Hello From Web Component 1 `;
10 | shadowRoot.appendChild(template.content.cloneNode(true));
11 | this.$paragraph = shadowRoot.getElementById('paragraph');
12 | }
13 |
14 | set context(ctx) {
15 | this.$paragraph.innerHTML += ctx.content;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
19 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et
20 | dolore magna aliquyam erat, sed diam voluptua.
21 |
22 | >
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/core/examples/luigi-example-react/public/sampleapp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |