Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); zenstack/CONTRIBUTING.md at dev · zenstackhq/zenstack · GitHub
Skip to content

Latest commit

History

History
109 lines (58 loc) · 3.85 KB

File metadata and controls

109 lines (58 loc) · 3.85 KB

Contributing to ZenStack

I want to thank you first for considering contributing to ZenStack 🙏🏻. It's people like you who make ZenStack a better toolkit that benefits more developers!

Before you start working on anything major, please make sure to create a topic in the feature-work discord channel (preferred) or create a GitHub issue to discuss it first. This will help ensure your work aligns with the project's goals and avoid duplication of effort.

Prerequisites

Test cases are run against both SQLite and Postgres. You should have a postgres server (16 or above) running (either natively or via Docker). The default connection is:

postgresql://${TEST_PG_USER}:${TEST_PG_PASSWORD}$@${TEST_PG_HOST}$:${TEST_PG_PORT}

The default values for the environment variables (if not set) are:

  • TEST_PG_HOST: localhost
  • TEST_PG_PORT: 5432
  • TEST_PG_USER: postgres
  • TEST_PG_PASSWORD: postgres

Get started

  1. Install dependencies: pnpm install
  2. Build all packages: pnpm build
  3. Run all tests: pnpm test

Development workflow

ZenStack adopts a very simple development workflow:

  1. Changes should be made in branches created off the "dev" branch.

  2. Non-trivial changes should include test cases. Bug-fixes should include regression tests that refer to GitHub issues if applicable.

  3. After coding and testing, create a PR to merge the changes into the "dev" branch.

  4. After code review is done, maintainer will squash and merge the PR into the "dev" branch.

  5. Periodically, the "dev" branch is merged back to the "main" branch to create a new release.

Project structure

ZenStack is a monorepo consisting of multiple NPM packages managed by pnpm workspace.

Packages

The source and tests of ZenStack npm packages reside in the "packages" folder:

The ZModel language's definition, including its syntax definition and parser/linker implementation. The compiler is implemented with the Langium toolkit.

The zen CLI and built-in plugins.

The runtime representation of ZModel schema.

The ORM runtime built on top of Kysely.

The server package implements the automatic CRUD services and contains two main parts:

  1. Framework-agnostic API handlers: defining input/output format and API routes in a framework-independent way. Currently supports "rpc" and "rest" styles.

  2. Framework-specific adapters: translating framework-dependent request and response formats.

TanStack Query client for consuming the automatic CRUD services.

Utilities for building ZenStack plugins.

The access policy plugin implementation.

VSCode extension for ZModel.

Test utilities.

Tests

End-to-end tests covering essential features (ORM, access policies, etc.).

Regression tests for previously reported issues.

Testing changed packages locally

The samples folder contains sample projects that directly reference the packages in the workspace. Once you make changes to a package and rebuild it, the sample projects will automatically pick up the changes. They are handy for quick manual testing.

If you prefer to test against your own project, simply copy the built bundles (from the dist folder of each package) to your project's node_modules folder to overwrite the installed packages.