Skip to content

Astro setup

Run the Create OutSystems Astro generator:

Terminal window
npx create-outsystems-astro
Terminal window
yarn create outsystems-astro
Terminal window
pnpm dlx create-outsystems-astro
Terminal window
bunx create-outsystems-astro

The Deno DX command is available in Deno 2.6.

Terminal window
dx create-outsystems-astro

Select the framework(s) that you would like to include as part of your project.

This will create the generated files as well as an example component. You can delete the example component resources before starting on your project.

/
├── src/
│ └── framework/
│ └── react/
│ └── Counter.tsx
│ └── vue/
│ └── Counter.vue
│ └── images/
│ └── image.png
│ └── pages/
│ └── react/
│ └── react-counter.astro
│ └── pages/
│ └── vue/
│ └── vue-counter.astro
│ └── styles/
│ └── index.css
└── package.json

It is recommended not to mix different frameworks on a single Astro page (.astro file) page. Having multiple Astro islands on an OutSystems page should be fine.

For Angular, keep the framework/angular structure in place or update the astro.config.mjs file’s transformFilter section. This is the location that Astro will use to modify the Angular files.

Each page inside of the pages file should represent an Island that will be imported into OutSystems. The example has them separated by framework name, but you can name them anything you would like. The output script will flatten the index.html to the root of the output folder with the name of the folder.

The location of the component code.

Any image assets.

Stylesheets that may apply to the component.

All commands are run from the root of the project, from a terminal, based on your package manager:

CommandAction
npm installInstalls dependencies
npm run devStarts local dev server at localhost:4321
npm run buildBuild distribution to ./dist/
npm run outputBuild OutSystems production site to ./output/
npm run previewPreview build locally, before creating output
npm run astro ...Run CLI commands like astro add, astro check
npm run astro -- --helpGet help using the Astro CLI
CommandAction
yarn installInstalls dependencies
yarn run devStarts local dev server at localhost:4321
yarn run buildBuild distribution to ./dist/
yarn run outputBuild OutSystems production site to ./output/
yarn run previewPreview build locally, before creating output
yarn run astro ...Run CLI commands like astro add, astro check
yarn run astro -- --helpGet help using the Astro CLI
CommandAction
pnpm installInstalls dependencies
pnpm run devStarts local dev server at localhost:4321
pnpm run buildBuild distribution to ./dist/
pnpm run outputBuild OutSystems production site to ./output/
pnpm run previewPreview build locally, before creating output
pnpm run astro ...Run CLI commands like astro add, astro check
pnpm run astro -- --helpGet help using the Astro CLI
CommandAction
bun installInstalls dependencies
bun run devStarts local dev server at localhost:4321
bun run buildBuild distribution to ./dist/
bun run output:bunBuild OutSystems production site to ./output/
bun run previewPreview build locally, before creating output
bun run astro ...Run CLI commands like astro add, astro check
bun run astro -- --helpGet help using the Astro CLI
CommandAction
deno install && deno run postinsallInstalls dependencies
deno run devStarts local dev server at localhost:4321
deno run buildBuild distribution to ./dist/
deno run output:denoBuild OutSystems production site to ./output/
deno run previewPreview build locally, before creating output
deno run astro ...Run CLI commands like astro add, astro check
deno run astro -- --helpGet help using the Astro CLI

Since OutSystems does not have a concept of NULL, you may have to code around NULL/undefined in your library.

Slots are an optional HTML that can be passed into a component. They are then able to be picked up and used by the Astro Island component. You can use either default slot or named slots (or both).

The default slot (no name) will go into a React component as the children prop name. A named slot will go in as a parameter with the name.

  • Astro example:
<CounterComponent client:only="react">
<div slot="header">
<p>Slot header</p>
</div>
<div>
<p>Slot content</p>
</div>
</CounterComponent>
  • React example:
export default function Component({
children,
header,
}: {
children: React.ReactNode;
header: React.ReactNode;
}) {
return (
<>
{header}
<div>
{children}
</div>
</>
);
}

The default slot (no name) will go into a React component as the <slot /> name. A named slot will go in as a parameter with the name.

  • Astro example:
<CounterComponent client:only="react">
<div slot="header">
<p>Slot header</p>
</div>
<div>
<p>Slot content</p>
</div>
</CounterComponent>
  • Vue example:
<template>
<slot name="header" />
<div>
<slot />
</div>
</template>

Angular does not support the use of slots.

Since OutSystems cannot pass in a function handler, it has to be bound to the window object. Usually, this is passed in as a name, and that name is a handler for the window function. On the Astro library side, you have to call the following (replace functionName):

window[functionName](value);

To pass back an array or object, you must JSON.stringify it first. The object must then be deserialized on the OutSystems side.

window[onSelectChange](JSON.stringify(newValues));

You cannot send Union types (such as either an array or object) due to OutSystems being strongly typed. For example, if you have instances where you send either 0, 1 or multiple items back to the handler, it is important to have an array for that. If only expecting 0-1 items, an object should be fine.

  • Copy the environment template file to .env.

    Terminal window
    cp .env.template .env
  • Update the .env file and modify the ASSET_PATH value to be the application/library/core widget module name in OutSystems.

  • Once development is complete, run:

    Terminal window
    npm run output

This will create a set of files that will then need to be converted to OutSystems components.

The generator comes with unit, integration and testing built in. You can use the built in ones or replace them with your own testing framework preferences.

  • Vitest The unit tests are placed in the test/unit folder. This is primarily for testing functions and logic.
  • Playwright The end-to-end tests are placed in the test/e2e folder. This tests build the project and then runs a server preview. Playwright will launch a browser and test the page and components. To get started, install the Playwright browsers and necessary dependencies.
CommandAction
npm run testRun unit and integration tests
npm run test:e2e:installInstall Playwright browsers and dependencies
npm run test:e2eRun the end-to-end tests
npm run test:e2e:uiRun the end-to-end tests in UI mode
CommandAction
yarn run testRun unit and integration tests
yarn run test:e2e:installInstall Playwright browsers and dependencies
yarn run test:e2eRun the end-to-end tests
yarn run test:e2e:uiRun the end-to-end tests in UI mode
CommandAction
pnpm run testRun unit and integration tests
pnpm run test:e2e:installInstall Playwright browsers and dependencies
pnpm run test:e2eRun the end-to-end tests
pnpm run test:e2e:uiRun the end-to-end tests in UI mode

For end-to-end tests, the Bun Playwright configuration is currently not working.

CommandAction
bun run testRun unit and integration tests
bun run test:e2e:installInstall Playwright browsers and dependencies
bun run test:e2eRun the end-to-end tests
bun run test:e2e:uiRun the end-to-end tests in UI mode
CommandAction
deno run testRun unit and integration tests
deno run test:e2e:installInstall Playwright browsers and dependencies
deno run test:e2e:denoRun the end-to-end tests
deno run test:e2e:ui:denoRun the end-to-end tests in UI mode
  • Prettier Formatting sets the guidelines for the code styles. The rules are able to be updated in the .prettierrc file.
CommandAction
npm run formatRun format check
npm run format:writeRun format check and fix issues
CommandAction
yarn run formatRun format check
yarn run format:writeRun format check and fix issues
CommandAction
pnpm run formatRun format check
pnpm run format:writeRun format check and fix issues
CommandAction
bun run formatRun format check
bun run format:writeRun format check and fix issues
CommandAction
deno run formatRun format check
deno run format:writeRun format check and fix issues
  • ESLint Linting sets the guidelines and finds errors, bugs and issues. The configuration is set in eslint.config.mjs.
CommandAction
npm run lintRun linter
npm run lint:fixRun linter and fix issues
CommandAction
yarn run lintRun linter
yarn run lint:fixRun linter and fix issues
CommandAction
pnpm run lintRun linter
pnpm run lint:fixRun linter and fix issues
CommandAction
bun run lintRun linter
bun run lint:fixRun linter and fix issues
CommandAction
deno run lintRun linter
deno run lint:fixRun linter and fix issues