mirror of
https://github.com/zitadel/zitadel.git
synced 2025-12-12 07:02:49 +00:00
initial setup
This commit is contained in:
8
.changeset/README.md
Normal file
8
.changeset/README.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Changesets
|
||||||
|
|
||||||
|
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
|
||||||
|
with multi-package repos, or single-package repos to help you version and publish your code. You can
|
||||||
|
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
|
||||||
|
|
||||||
|
We have a quick list of common questions to get you started engaging with this project in
|
||||||
|
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
|
||||||
10
.changeset/config.json
Normal file
10
.changeset/config.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://unpkg.com/@changesets/config@2.0.0/schema.json",
|
||||||
|
"changelog": "@changesets/cli/changelog",
|
||||||
|
"commit": false,
|
||||||
|
"fixed": [],
|
||||||
|
"linked": [],
|
||||||
|
"access": "public",
|
||||||
|
"updateInternalDependencies": "patch",
|
||||||
|
"ignore": ["@zitadel/docs"]
|
||||||
|
}
|
||||||
10
.eslintrc.js
Normal file
10
.eslintrc.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
// This tells ESLint to load the config from the package `eslint-config-zitadel`
|
||||||
|
extends: ["zitadel"],
|
||||||
|
settings: {
|
||||||
|
next: {
|
||||||
|
rootDir: ["apps/*/"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
44
.github/workflows/release.yml
vendored
Normal file
44
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup pnpm 7
|
||||||
|
uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 7
|
||||||
|
|
||||||
|
- name: Setup Node.js 16.x
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: 16.x
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: pnpm i
|
||||||
|
|
||||||
|
- name: Create Release Pull Request or Publish to npm
|
||||||
|
id: changesets
|
||||||
|
uses: changesets/action@v1
|
||||||
|
with:
|
||||||
|
# This expects you to have a script called release which does a build for your packages and calls changeset publish
|
||||||
|
publish: pnpm release
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
|
- name: Send a Slack notification if a publish happens
|
||||||
|
if: steps.changesets.outputs.published == 'true'
|
||||||
|
# You can do something when a publish happens.
|
||||||
|
run: my-slack-bot send-notification --message "A new version of ${GITHUB_REPOSITORY} was published!"
|
||||||
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.DS_Store
|
||||||
|
node_modules
|
||||||
|
.turbo
|
||||||
|
*.log
|
||||||
|
.next
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
.env
|
||||||
|
.cache
|
||||||
|
server/dist
|
||||||
|
public/dist
|
||||||
|
.turbo
|
||||||
57
README.md
Normal file
57
README.md
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# ZITADEL typescript with Changesets
|
||||||
|
|
||||||
|
This is an monorepo containing all typescript/javascript packages and applications for ZITADEL powered by Turborepo. Versioning and package publishing is handled by [Changesets](https://github.com/changesets/changesets) and fully automated with GitHub Actions.
|
||||||
|
|
||||||
|
## What's inside?
|
||||||
|
|
||||||
|
This Turborepo includes the following:
|
||||||
|
|
||||||
|
### Apps and Packages
|
||||||
|
|
||||||
|
- `login`: The new login UI powered by Next.js
|
||||||
|
- `@zitadel/core`: core node SDK
|
||||||
|
- `@zitadel/react-utils`: shared React utilities
|
||||||
|
- `@zitadel/tsconfig`: shared `tsconfig.json`s used throughout the monorepo
|
||||||
|
- `eslint-config-zitadel`: ESLint preset
|
||||||
|
|
||||||
|
Each package and app is 100% [TypeScript](https://www.typescriptlang.org/).
|
||||||
|
|
||||||
|
### Utilities
|
||||||
|
|
||||||
|
This repo has some additional tools already setup for you:
|
||||||
|
|
||||||
|
- [TypeScript](https://www.typescriptlang.org/) for static type checking
|
||||||
|
- [ESLint](https://eslint.org/) for code linting
|
||||||
|
- [Prettier](https://prettier.io) for code formatting
|
||||||
|
|
||||||
|
### Useful commands
|
||||||
|
|
||||||
|
- `yarn build` - Build all packages and the docs site
|
||||||
|
- `yarn dev` - Develop all packages and the docs site
|
||||||
|
- `yarn lint` - Lint all packages
|
||||||
|
- `yarn changeset` - Generate a changeset
|
||||||
|
- `yarn clean` - Clean up all `node_modules` and `dist` folders (runs each package's clean script)
|
||||||
|
|
||||||
|
## Versioning and Publishing packages
|
||||||
|
|
||||||
|
Package publishing has been configured using [Changesets](https://github.com/changesets/changesets). Please review their [documentation](https://github.com/changesets/changesets#documentation) to familiarize yourself with the workflow.
|
||||||
|
|
||||||
|
This example comes with automated npm releases setup in a [GitHub Action](https://github.com/changesets/action). To get this working, you will need to create an `NPM_TOKEN` and `GITHUB_TOKEN` in your repository settings. You should also install the [Changesets bot](https://github.com/apps/changeset-bot) on your GitHub repository as well.
|
||||||
|
|
||||||
|
For more information about this automation, refer to the official [changesets documentation](https://github.com/changesets/changesets/blob/main/docs/automating-changesets.md)
|
||||||
|
|
||||||
|
### npm
|
||||||
|
|
||||||
|
If you want to publish package to the public npm registry and make them publicly available, this is already setup.
|
||||||
|
|
||||||
|
To publish packages to a private npm organization scope, **remove** the following from each of the `package.json`'s
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- "publishConfig": {
|
||||||
|
- "access": "public"
|
||||||
|
- },
|
||||||
|
```
|
||||||
|
|
||||||
|
### GitHub Package Registry
|
||||||
|
|
||||||
|
See [Working with the npm registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry#publishing-a-package-using-publishconfig-in-the-packagejson-file)
|
||||||
4
apps/docs/.eslintrc.js
Normal file
4
apps/docs/.eslintrc.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["zitadel"],
|
||||||
|
};
|
||||||
5
apps/docs/next-env.d.ts
vendored
Normal file
5
apps/docs/next-env.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
/// <reference types="next" />
|
||||||
|
/// <reference types="next/image-types/global" />
|
||||||
|
|
||||||
|
// NOTE: This file should not be edited
|
||||||
|
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||||
3
apps/docs/next.config.js
Normal file
3
apps/docs/next.config.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = {
|
||||||
|
reactStrictMode: true,
|
||||||
|
};
|
||||||
27
apps/docs/package.json
Normal file
27
apps/docs/package.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "@zitadel/docs",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start ",
|
||||||
|
"dev": "next dev -p 3002",
|
||||||
|
"lint": "next lint",
|
||||||
|
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf .next"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@zitadel/core": "workspace:*",
|
||||||
|
"@zitadel/utils": "workspace:*",
|
||||||
|
"next": "latest",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@zitadel/tsconfig": "workspace:*",
|
||||||
|
"@types/node": "^17.0.12",
|
||||||
|
"@types/react": "^18.0.22",
|
||||||
|
"@types/react-dom": "^18.0.7",
|
||||||
|
"eslint-config-zitadel": "workspace:*",
|
||||||
|
"typescript": "^4.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
14
apps/docs/src/pages/index.tsx
Normal file
14
apps/docs/src/pages/index.tsx
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { Button } from "@zitadel/core";
|
||||||
|
import { useIsomorphicLayoutEffect } from "@zitadel/utils";
|
||||||
|
|
||||||
|
export default function Docs() {
|
||||||
|
useIsomorphicLayoutEffect(() => {
|
||||||
|
console.log("zitadel docs page");
|
||||||
|
}, []);
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1>zitadel Documentation</h1>
|
||||||
|
<Button>Click me</Button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
10
apps/docs/tsconfig.json
Normal file
10
apps/docs/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"exclude": ["node_modules"],
|
||||||
|
"extends": "@zitadel/tsconfig/nextjs.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": "src",
|
||||||
|
"outDir": "dist",
|
||||||
|
"incremental": true
|
||||||
|
},
|
||||||
|
"include": ["src", "next-env.d.ts"]
|
||||||
|
}
|
||||||
4
meta.json
Normal file
4
meta.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"name": "Monorepo with Changesets",
|
||||||
|
"description": "Simple Next.js monorepo preconfigured to publish packages via Changesets"
|
||||||
|
}
|
||||||
21
package.json
Executable file
21
package.json
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "turbo run build",
|
||||||
|
"dev": "turbo run dev --no-cache --continue",
|
||||||
|
"lint": "turbo run lint",
|
||||||
|
"clean": "turbo run clean && rm -rf node_modules",
|
||||||
|
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
|
||||||
|
"changeset": "changeset",
|
||||||
|
"version-packages": "changeset version",
|
||||||
|
"release": "turbo run build --filter=docs^... && changeset publish"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@changesets/cli": "^2.22.0",
|
||||||
|
"eslint": "^7.32.0",
|
||||||
|
"eslint-config-zitadel": "workspace:*",
|
||||||
|
"prettier": "^2.5.1",
|
||||||
|
"turbo": "latest"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@7.15.0"
|
||||||
|
}
|
||||||
11
packages/eslint-config-zitadel/index.js
Normal file
11
packages/eslint-config-zitadel/index.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = {
|
||||||
|
extends: ["next", "turbo", "prettier"],
|
||||||
|
rules: {
|
||||||
|
"@next/next/no-html-link-for-pages": "off",
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
babelOptions: {
|
||||||
|
presets: [require.resolve("next/babel")],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
15
packages/eslint-config-zitadel/package.json
Normal file
15
packages/eslint-config-zitadel/package.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "eslint-config-zitadel",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"eslint-config-next": "latest",
|
||||||
|
"eslint-config-prettier": "^8.3.0",
|
||||||
|
"eslint-plugin-react": "7.28.0",
|
||||||
|
"eslint-config-turbo": "latest"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
||||||
4
packages/zitadel-core/.eslintrc.js
Normal file
4
packages/zitadel-core/.eslintrc.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["zitadel"],
|
||||||
|
};
|
||||||
31
packages/zitadel-core/package.json
Normal file
31
packages/zitadel-core/package.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "@zitadel/core",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"module": "./dist/index.mjs",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"sideEffects": false,
|
||||||
|
"license": "MIT",
|
||||||
|
"files": [
|
||||||
|
"dist/**"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsup src/index.tsx --format esm,cjs --dts --external react",
|
||||||
|
"dev": "tsup src/index.tsx --format esm,cjs --watch --dts --external react",
|
||||||
|
"lint": "eslint \"src/**/*.ts*\"",
|
||||||
|
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@zitadel/tsconfig": "workspace:*",
|
||||||
|
"eslint": "^7.32.0",
|
||||||
|
"eslint-config-zitadel": "workspace:*",
|
||||||
|
"@types/react": "^17.0.13",
|
||||||
|
"@types/react-dom": "^17.0.8",
|
||||||
|
"react": "^17.0.2",
|
||||||
|
"tsup": "^5.10.1",
|
||||||
|
"typescript": "^4.5.3"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
||||||
11
packages/zitadel-core/src/Button.tsx
Normal file
11
packages/zitadel-core/src/Button.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
|
||||||
|
export interface ButtonProps {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Button(props: ButtonProps) {
|
||||||
|
return <button>{props.children}</button>;
|
||||||
|
}
|
||||||
|
|
||||||
|
Button.displayName = "Button";
|
||||||
2
packages/zitadel-core/src/index.tsx
Normal file
2
packages/zitadel-core/src/index.tsx
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
export { Button, type ButtonProps } from "./Button";
|
||||||
5
packages/zitadel-core/tsconfig.json
Normal file
5
packages/zitadel-core/tsconfig.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"extends": "@zitadel/tsconfig/react-library.json",
|
||||||
|
"include": ["."],
|
||||||
|
"exclude": ["dist", "build", "node_modules"]
|
||||||
|
}
|
||||||
20
packages/zitadel-tsconfig/base.json
Normal file
20
packages/zitadel-tsconfig/base.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"display": "Default",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": false,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"inlineSources": false,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"noUnusedLocals": false,
|
||||||
|
"noUnusedParameters": false,
|
||||||
|
"preserveWatchOutput": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
20
packages/zitadel-tsconfig/nextjs.json
Normal file
20
packages/zitadel-tsconfig/nextjs.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"display": "Next.js",
|
||||||
|
"extends": "./base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"allowJs": true,
|
||||||
|
"declaration": false,
|
||||||
|
"declarationMap": false,
|
||||||
|
"incremental": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"module": "esnext",
|
||||||
|
"noEmit": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"rootDir": "src",
|
||||||
|
"target": "es5"
|
||||||
|
},
|
||||||
|
"include": ["src", "next-env.d.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
10
packages/zitadel-tsconfig/node14.json
Normal file
10
packages/zitadel-tsconfig/node14.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"display": "Node 14",
|
||||||
|
"extends": "./base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["ES2020"],
|
||||||
|
"module": "commonjs",
|
||||||
|
"target": "ES2020"
|
||||||
|
}
|
||||||
|
}
|
||||||
9
packages/zitadel-tsconfig/package.json
Normal file
9
packages/zitadel-tsconfig/package.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "@zitadel/tsconfig",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
||||||
11
packages/zitadel-tsconfig/react-library.json
Normal file
11
packages/zitadel-tsconfig/react-library.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"display": "React Library",
|
||||||
|
"extends": "./base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"lib": ["dom", "ES2015"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"target": "es6"
|
||||||
|
}
|
||||||
|
}
|
||||||
4
packages/zitadel-utils/.eslintrc.js
Normal file
4
packages/zitadel-utils/.eslintrc.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: ["zitadel"],
|
||||||
|
};
|
||||||
31
packages/zitadel-utils/package.json
Normal file
31
packages/zitadel-utils/package.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "@zitadel/utils",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"module": "./dist/index.mjs",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"sideEffects": false,
|
||||||
|
"license": "MIT",
|
||||||
|
"files": [
|
||||||
|
"dist/**"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsup src/index.tsx --format esm,cjs --dts --external react",
|
||||||
|
"dev": "tsup src/index.tsx --format esm,cjs --watch --dts --external react",
|
||||||
|
"lint": "eslint \"src/**/*.ts*\"",
|
||||||
|
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@zitadel/tsconfig": "workspace:*",
|
||||||
|
"@types/react": "^17.0.13",
|
||||||
|
"@types/react-dom": "^17.0.8",
|
||||||
|
"eslint": "^7.32.0",
|
||||||
|
"eslint-config-zitadel": "workspace:*",
|
||||||
|
"react": "^17.0.2",
|
||||||
|
"tsup": "^5.10.1",
|
||||||
|
"typescript": "^4.5.3"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
||||||
3
packages/zitadel-utils/src/index.tsx
Normal file
3
packages/zitadel-utils/src/index.tsx
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export { toSlug } from "./toSlug";
|
||||||
|
export { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";
|
||||||
|
export { usePrevious } from "./usePrevious";
|
||||||
18
packages/zitadel-utils/src/toSlug.ts
Normal file
18
packages/zitadel-utils/src/toSlug.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Return a slugified copy of a string.
|
||||||
|
*
|
||||||
|
* @param {string} str The string to be slugified
|
||||||
|
* @return {string} The slugified string.
|
||||||
|
*/
|
||||||
|
export function toSlug(str: string): string {
|
||||||
|
let s = str;
|
||||||
|
if (!s) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
s = s.toLowerCase().trim();
|
||||||
|
s = s.replace(/ & /g, " and ");
|
||||||
|
s = s.replace(/[ ]+/g, "-");
|
||||||
|
s = s.replace(/[-]+/g, "-");
|
||||||
|
s = s.replace(/[^a-z0-9-]+/g, "");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
13
packages/zitadel-utils/src/useIsomorphicLayoutEffect.tsx
Normal file
13
packages/zitadel-utils/src/useIsomorphicLayoutEffect.tsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On the server, React emits a warning when calling `useLayoutEffect`.
|
||||||
|
* This is because neither `useLayoutEffect` nor `useEffect` run on the server.
|
||||||
|
* We use this safe version which suppresses the warning by replacing it with a noop on the server.
|
||||||
|
*
|
||||||
|
* See: https://reactjs.org/docs/hooks-reference.html#uselayouteffect
|
||||||
|
*/
|
||||||
|
const useIsomorphicLayoutEffect =
|
||||||
|
typeof window !== "undefined" ? React.useLayoutEffect : () => {};
|
||||||
|
|
||||||
|
export { useIsomorphicLayoutEffect };
|
||||||
17
packages/zitadel-utils/src/usePrevious.tsx
Normal file
17
packages/zitadel-utils/src/usePrevious.tsx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
|
||||||
|
function usePrevious<T>(value: T) {
|
||||||
|
// The ref object is a generic container whose current property is mutable ...
|
||||||
|
// ... and can hold any value, similar to an instance property on a class
|
||||||
|
const ref = React.useRef<T>(value);
|
||||||
|
|
||||||
|
// Store current value in ref
|
||||||
|
React.useEffect(() => {
|
||||||
|
ref.current = value;
|
||||||
|
}, [value]); // Only re-run if value changes
|
||||||
|
|
||||||
|
// Return previous value (happens before update in useEffect above)
|
||||||
|
return ref.current;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { usePrevious };
|
||||||
5
packages/zitadel-utils/tsconfig.json
Normal file
5
packages/zitadel-utils/tsconfig.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"extends": "@zitadel/tsconfig/react-library.json",
|
||||||
|
"include": ["."],
|
||||||
|
"exclude": ["dist", "build", "node_modules"]
|
||||||
|
}
|
||||||
3839
pnpm-lock.yaml
generated
Normal file
3839
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
3
pnpm-workspace.yaml
Normal file
3
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
packages:
|
||||||
|
- "apps/*"
|
||||||
|
- "packages/*"
|
||||||
22
turbo.json
Normal file
22
turbo.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://turbo.build/schema.json",
|
||||||
|
"globalDependencies": ["**/.env.*local"],
|
||||||
|
"pipeline": {
|
||||||
|
"build": {
|
||||||
|
"outputs": ["dist/**", ".next/**", "!.next/cache/**"],
|
||||||
|
"dependsOn": ["^build"]
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"outputs": ["coverage/**"],
|
||||||
|
"dependsOn": []
|
||||||
|
},
|
||||||
|
"lint": {},
|
||||||
|
"dev": {
|
||||||
|
"cache": false,
|
||||||
|
"persistent": true
|
||||||
|
},
|
||||||
|
"clean": {
|
||||||
|
"cache": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user