diff --git a/Makefile b/Makefile index 484687e..587ad40 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: install test test-django test-react test-integration docker-up docker-down clean -DJANGO = packages/mizan-rpc/adapters/django -REACT = packages/mizan-csr/adapters/react +DJANGO = packages/mizan-django +REACT = packages/mizan-react # ─── Setup ─────────────────────────────────────────────────────────────────── diff --git a/README.md b/README.md index ad1e1af..496d250 100644 --- a/README.md +++ b/README.md @@ -269,10 +269,10 @@ chat.send({ text: 'hello' }) ```bash # Django unit tests -cd packages/mizan-rpc/adapters/django && uv sync --extra dev --extra channels && uv run pytest +cd packages/mizan-django && uv sync --extra dev --extra channels && uv run pytest # React unit tests -cd packages/mizan-csr/adapters/react && npm test +cd packages/mizan-react && npm test # E2E integration tests (real browser, real backend) docker compose -f examples/django-react-site/docker-compose.test.yml up -d @@ -288,14 +288,9 @@ make test-all ``` mizan/ packages/ - mizan-ast/ Language layer (source → KDL schema) - mizan-schema/ IR layer (KDL schema definition) - mizan-rpc/ Protocol layer (client generation + server adapters) - adapters/django/ Django server adapter - generator/ Codegen CLI - mizan-csr/ State layer (client state engine + frontend adapters) - adapters/react/ React adapter - mizan-ssr/ Rendering layer (server-side rendering) + mizan-runtime/ Client state engine (~150 lines, framework-agnostic) + mizan-django/ Django server adapter (decorators, dispatch, contexts, SSR) + mizan-react/ React adapter (thin wrapper around runtime) examples/ django-react-site/ E2E tests + Django backend django-react-desktop-app/ PyWebView desktop app diff --git a/examples/django-react-site/Dockerfile.test b/examples/django-react-site/Dockerfile.test index 3e2ea2b..32e75e0 100644 --- a/examples/django-react-site/Dockerfile.test +++ b/examples/django-react-site/Dockerfile.test @@ -8,7 +8,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Install mizan from local source with channels support -COPY packages/mizan-rpc/adapters/django/ /app/django/ +COPY packages/mizan-django/ /app/django/ RUN pip install --no-cache-dir /app/django[channels] daphne # Copy example app diff --git a/examples/django-react-site/harness/django.config.mjs b/examples/django-react-site/harness/django.config.mjs index 95e6afc..23a63cc 100644 --- a/examples/django-react-site/harness/django.config.mjs +++ b/examples/django-react-site/harness/django.config.mjs @@ -10,9 +10,9 @@ export default { source: { django: { managePath: path.join(root, 'examples/django-react-site/backend/manage.py'), - command: [path.join(root, 'packages/mizan-rpc/adapters/django/.venv/bin/python')], + command: [path.join(root, 'packages/mizan-django/.venv/bin/python')], env: { - PYTHONPATH: `${path.join(root, 'packages/mizan-rpc/adapters/django/src')}:${path.join(root, 'examples/django-react-site/backend')}`, + PYTHONPATH: `${path.join(root, 'packages/mizan-django/src')}:${path.join(root, 'examples/django-react-site/backend')}`, DJANGO_SETTINGS_MODULE: 'testapp.settings', }, }, diff --git a/packages/mizan-rpc/adapters/django/.gitignore b/packages/mizan-django/.gitignore similarity index 100% rename from packages/mizan-rpc/adapters/django/.gitignore rename to packages/mizan-django/.gitignore diff --git a/packages/mizan-rpc/adapters/django/README.md b/packages/mizan-django/README.md similarity index 100% rename from packages/mizan-rpc/adapters/django/README.md rename to packages/mizan-django/README.md diff --git a/packages/mizan-rpc/generator/generator/cli.mjs b/packages/mizan-django/generate/generator/cli.mjs similarity index 100% rename from packages/mizan-rpc/generator/generator/cli.mjs rename to packages/mizan-django/generate/generator/cli.mjs diff --git a/packages/mizan-rpc/generator/generator/lib/channels.mjs b/packages/mizan-django/generate/generator/lib/channels.mjs similarity index 100% rename from packages/mizan-rpc/generator/generator/lib/channels.mjs rename to packages/mizan-django/generate/generator/lib/channels.mjs diff --git a/packages/mizan-rpc/generator/generator/lib/fetch.mjs b/packages/mizan-django/generate/generator/lib/fetch.mjs similarity index 100% rename from packages/mizan-rpc/generator/generator/lib/fetch.mjs rename to packages/mizan-django/generate/generator/lib/fetch.mjs diff --git a/packages/mizan-rpc/generator/generator/lib/index.mjs b/packages/mizan-django/generate/generator/lib/index.mjs similarity index 100% rename from packages/mizan-rpc/generator/generator/lib/index.mjs rename to packages/mizan-django/generate/generator/lib/index.mjs diff --git a/packages/mizan-rpc/generator/generator/lib/mizan.mjs b/packages/mizan-django/generate/generator/lib/mizan.mjs similarity index 100% rename from packages/mizan-rpc/generator/generator/lib/mizan.mjs rename to packages/mizan-django/generate/generator/lib/mizan.mjs diff --git a/packages/mizan-rpc/adapters/django/pyproject.toml b/packages/mizan-django/pyproject.toml similarity index 100% rename from packages/mizan-rpc/adapters/django/pyproject.toml rename to packages/mizan-django/pyproject.toml diff --git a/packages/mizan-rpc/adapters/django/src/mizan/__init__.py b/packages/mizan-django/src/mizan/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/__init__.py rename to packages/mizan-django/src/mizan/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/_vendor/__init__.py b/packages/mizan-django/src/mizan/_vendor/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/_vendor/__init__.py rename to packages/mizan-django/src/mizan/_vendor/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/_vendor/app_visitor.py b/packages/mizan-django/src/mizan/_vendor/app_visitor.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/_vendor/app_visitor.py rename to packages/mizan-django/src/mizan/_vendor/app_visitor.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/channels/__init__.py b/packages/mizan-django/src/mizan/channels/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/channels/__init__.py rename to packages/mizan-django/src/mizan/channels/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/channels/connection.py b/packages/mizan-django/src/mizan/channels/connection.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/channels/connection.py rename to packages/mizan-django/src/mizan/channels/connection.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/channels/push.py b/packages/mizan-django/src/mizan/channels/push.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/channels/push.py rename to packages/mizan-django/src/mizan/channels/push.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/client/__init__.py b/packages/mizan-django/src/mizan/client/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/client/__init__.py rename to packages/mizan-django/src/mizan/client/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/client/executor.py b/packages/mizan-django/src/mizan/client/executor.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/client/executor.py rename to packages/mizan-django/src/mizan/client/executor.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/client/function.py b/packages/mizan-django/src/mizan/client/function.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/client/function.py rename to packages/mizan-django/src/mizan/client/function.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/client/jwt.py b/packages/mizan-django/src/mizan/client/jwt.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/client/jwt.py rename to packages/mizan-django/src/mizan/client/jwt.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/export/__init__.py b/packages/mizan-django/src/mizan/export/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/export/__init__.py rename to packages/mizan-django/src/mizan/export/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/forms/__init__.py b/packages/mizan-django/src/mizan/forms/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/forms/__init__.py rename to packages/mizan-django/src/mizan/forms/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/forms/formset_utils.py b/packages/mizan-django/src/mizan/forms/formset_utils.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/forms/formset_utils.py rename to packages/mizan-django/src/mizan/forms/formset_utils.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/forms/schema_utils.py b/packages/mizan-django/src/mizan/forms/schema_utils.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/forms/schema_utils.py rename to packages/mizan-django/src/mizan/forms/schema_utils.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/forms/schemas.py b/packages/mizan-django/src/mizan/forms/schemas.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/forms/schemas.py rename to packages/mizan-django/src/mizan/forms/schemas.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/forms/validation_utils.py b/packages/mizan-django/src/mizan/forms/validation_utils.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/forms/validation_utils.py rename to packages/mizan-django/src/mizan/forms/validation_utils.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/integrations/allauth/__init__.py b/packages/mizan-django/src/mizan/integrations/allauth/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/integrations/allauth/__init__.py rename to packages/mizan-django/src/mizan/integrations/allauth/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/integrations/allauth/contexts.py b/packages/mizan-django/src/mizan/integrations/allauth/contexts.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/integrations/allauth/contexts.py rename to packages/mizan-django/src/mizan/integrations/allauth/contexts.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/integrations/allauth/forms.py b/packages/mizan-django/src/mizan/integrations/allauth/forms.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/integrations/allauth/forms.py rename to packages/mizan-django/src/mizan/integrations/allauth/forms.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/jwt/__init__.py b/packages/mizan-django/src/mizan/jwt/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/jwt/__init__.py rename to packages/mizan-django/src/mizan/jwt/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/jwt/functions.py b/packages/mizan-django/src/mizan/jwt/functions.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/jwt/functions.py rename to packages/mizan-django/src/mizan/jwt/functions.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/jwt/security.py b/packages/mizan-django/src/mizan/jwt/security.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/jwt/security.py rename to packages/mizan-django/src/mizan/jwt/security.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/jwt/settings.py b/packages/mizan-django/src/mizan/jwt/settings.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/jwt/settings.py rename to packages/mizan-django/src/mizan/jwt/settings.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/jwt/tokens.py b/packages/mizan-django/src/mizan/jwt/tokens.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/jwt/tokens.py rename to packages/mizan-django/src/mizan/jwt/tokens.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/management/__init__.py b/packages/mizan-django/src/mizan/management/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/management/__init__.py rename to packages/mizan-django/src/mizan/management/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/management/commands/__init__.py b/packages/mizan-django/src/mizan/management/commands/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/management/commands/__init__.py rename to packages/mizan-django/src/mizan/management/commands/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/management/commands/export_channels_schema.py b/packages/mizan-django/src/mizan/management/commands/export_channels_schema.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/management/commands/export_channels_schema.py rename to packages/mizan-django/src/mizan/management/commands/export_channels_schema.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/management/commands/export_djarea_schema.py b/packages/mizan-django/src/mizan/management/commands/export_djarea_schema.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/management/commands/export_djarea_schema.py rename to packages/mizan-django/src/mizan/management/commands/export_djarea_schema.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/setup/__init__.py b/packages/mizan-django/src/mizan/setup/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/setup/__init__.py rename to packages/mizan-django/src/mizan/setup/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/setup/discovery.py b/packages/mizan-django/src/mizan/setup/discovery.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/setup/discovery.py rename to packages/mizan-django/src/mizan/setup/discovery.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/setup/registry.py b/packages/mizan-django/src/mizan/setup/registry.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/setup/registry.py rename to packages/mizan-django/src/mizan/setup/registry.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/setup/settings.py b/packages/mizan-django/src/mizan/setup/settings.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/setup/settings.py rename to packages/mizan-django/src/mizan/setup/settings.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/shapes/__init__.py b/packages/mizan-django/src/mizan/shapes/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/shapes/__init__.py rename to packages/mizan-django/src/mizan/shapes/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/shapes/core.py b/packages/mizan-django/src/mizan/shapes/core.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/shapes/core.py rename to packages/mizan-django/src/mizan/shapes/core.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/__init__.py b/packages/mizan-django/src/mizan/tests/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/__init__.py rename to packages/mizan-django/src/mizan/tests/__init__.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_auth.py b/packages/mizan-django/src/mizan/tests/test_auth.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_auth.py rename to packages/mizan-django/src/mizan/tests/test_auth.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_benchmarks.py b/packages/mizan-django/src/mizan/tests/test_benchmarks.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_benchmarks.py rename to packages/mizan-django/src/mizan/tests/test_benchmarks.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_channels.py b/packages/mizan-django/src/mizan/tests/test_channels.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_channels.py rename to packages/mizan-django/src/mizan/tests/test_channels.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_core.py b/packages/mizan-django/src/mizan/tests/test_core.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_core.py rename to packages/mizan-django/src/mizan/tests/test_core.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_pentest.py b/packages/mizan-django/src/mizan/tests/test_pentest.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_pentest.py rename to packages/mizan-django/src/mizan/tests/test_pentest.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_security.py b/packages/mizan-django/src/mizan/tests/test_security.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_security.py rename to packages/mizan-django/src/mizan/tests/test_security.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/tests/test_shapes.py b/packages/mizan-django/src/mizan/tests/test_shapes.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/tests/test_shapes.py rename to packages/mizan-django/src/mizan/tests/test_shapes.py diff --git a/packages/mizan-rpc/adapters/django/src/mizan/urls.py b/packages/mizan-django/src/mizan/urls.py similarity index 100% rename from packages/mizan-rpc/adapters/django/src/mizan/urls.py rename to packages/mizan-django/src/mizan/urls.py diff --git a/packages/mizan-rpc/adapters/django/tests/__init__.py b/packages/mizan-django/tests/__init__.py similarity index 100% rename from packages/mizan-rpc/adapters/django/tests/__init__.py rename to packages/mizan-django/tests/__init__.py diff --git a/packages/mizan-rpc/adapters/django/tests/models.py b/packages/mizan-django/tests/models.py similarity index 100% rename from packages/mizan-rpc/adapters/django/tests/models.py rename to packages/mizan-django/tests/models.py diff --git a/packages/mizan-rpc/adapters/django/tests/settings.py b/packages/mizan-django/tests/settings.py similarity index 100% rename from packages/mizan-rpc/adapters/django/tests/settings.py rename to packages/mizan-django/tests/settings.py diff --git a/packages/mizan-rpc/adapters/django/tests/urls.py b/packages/mizan-django/tests/urls.py similarity index 100% rename from packages/mizan-rpc/adapters/django/tests/urls.py rename to packages/mizan-django/tests/urls.py diff --git a/packages/mizan-csr/adapters/react/.gitignore b/packages/mizan-react/.gitignore similarity index 100% rename from packages/mizan-csr/adapters/react/.gitignore rename to packages/mizan-react/.gitignore diff --git a/packages/mizan-csr/adapters/react/README.md b/packages/mizan-react/README.md similarity index 100% rename from packages/mizan-csr/adapters/react/README.md rename to packages/mizan-react/README.md diff --git a/packages/mizan-csr/adapters/react/package.json b/packages/mizan-react/package.json similarity index 100% rename from packages/mizan-csr/adapters/react/package.json rename to packages/mizan-react/package.json diff --git a/packages/mizan-csr/adapters/react/src/__tests__/context.test.tsx b/packages/mizan-react/src/__tests__/context.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/__tests__/context.test.tsx rename to packages/mizan-react/src/__tests__/context.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/__tests__/errors.test.ts b/packages/mizan-react/src/__tests__/errors.test.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/__tests__/errors.test.ts rename to packages/mizan-react/src/__tests__/errors.test.ts diff --git a/packages/mizan-csr/adapters/react/src/__tests__/forms.test.tsx b/packages/mizan-react/src/__tests__/forms.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/__tests__/forms.test.tsx rename to packages/mizan-react/src/__tests__/forms.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/__tests__/integration.test.tsx b/packages/mizan-react/src/__tests__/integration.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/__tests__/integration.test.tsx rename to packages/mizan-react/src/__tests__/integration.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/adapters/router.ts b/packages/mizan-react/src/allauth/adapters/router.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/adapters/router.ts rename to packages/mizan-react/src/allauth/adapters/router.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/api.ts b/packages/mizan-react/src/allauth/api.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/api.ts rename to packages/mizan-react/src/allauth/api.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/AllauthRouter.tsx b/packages/mizan-react/src/allauth/components/AllauthRouter.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/AllauthRouter.tsx rename to packages/mizan-react/src/allauth/components/AllauthRouter.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/AllauthUI.tsx b/packages/mizan-react/src/allauth/components/AllauthUI.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/AllauthUI.tsx rename to packages/mizan-react/src/allauth/components/AllauthUI.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/AuthCard.tsx b/packages/mizan-react/src/allauth/components/AuthCard.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/AuthCard.tsx rename to packages/mizan-react/src/allauth/components/AuthCard.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/AuthDjangoForm.tsx b/packages/mizan-react/src/allauth/components/AuthDjangoForm.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/AuthDjangoForm.tsx rename to packages/mizan-react/src/allauth/components/AuthDjangoForm.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/AuthForm.tsx b/packages/mizan-react/src/allauth/components/AuthForm.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/AuthForm.tsx rename to packages/mizan-react/src/allauth/components/AuthForm.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/AuthFormPage.tsx b/packages/mizan-react/src/allauth/components/AuthFormPage.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/AuthFormPage.tsx rename to packages/mizan-react/src/allauth/components/AuthFormPage.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/PasskeyLogin.tsx b/packages/mizan-react/src/allauth/components/PasskeyLogin.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/PasskeyLogin.tsx rename to packages/mizan-react/src/allauth/components/PasskeyLogin.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/ProviderList.tsx b/packages/mizan-react/src/allauth/components/ProviderList.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/ProviderList.tsx rename to packages/mizan-react/src/allauth/components/ProviderList.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/index.ts b/packages/mizan-react/src/allauth/components/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/index.ts rename to packages/mizan-react/src/allauth/components/index.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/AuthSettings.tsx b/packages/mizan-react/src/allauth/components/settings/AuthSettings.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/AuthSettings.tsx rename to packages/mizan-react/src/allauth/components/settings/AuthSettings.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/ConnectionsSection.tsx b/packages/mizan-react/src/allauth/components/settings/ConnectionsSection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/ConnectionsSection.tsx rename to packages/mizan-react/src/allauth/components/settings/ConnectionsSection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/EmailsSection.tsx b/packages/mizan-react/src/allauth/components/settings/EmailsSection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/EmailsSection.tsx rename to packages/mizan-react/src/allauth/components/settings/EmailsSection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/MFASection.tsx b/packages/mizan-react/src/allauth/components/settings/MFASection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/MFASection.tsx rename to packages/mizan-react/src/allauth/components/settings/MFASection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/PasskeysSection.tsx b/packages/mizan-react/src/allauth/components/settings/PasskeysSection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/PasskeysSection.tsx rename to packages/mizan-react/src/allauth/components/settings/PasskeysSection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/PasswordSection.tsx b/packages/mizan-react/src/allauth/components/settings/PasswordSection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/PasswordSection.tsx rename to packages/mizan-react/src/allauth/components/settings/PasswordSection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/ProfileSection.tsx b/packages/mizan-react/src/allauth/components/settings/ProfileSection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/ProfileSection.tsx rename to packages/mizan-react/src/allauth/components/settings/ProfileSection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/SessionsSection.tsx b/packages/mizan-react/src/allauth/components/settings/SessionsSection.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/SessionsSection.tsx rename to packages/mizan-react/src/allauth/components/settings/SessionsSection.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/SettingsComponents.tsx b/packages/mizan-react/src/allauth/components/settings/SettingsComponents.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/SettingsComponents.tsx rename to packages/mizan-react/src/allauth/components/settings/SettingsComponents.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/settings/index.ts b/packages/mizan-react/src/allauth/components/settings/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/settings/index.ts rename to packages/mizan-react/src/allauth/components/settings/index.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/LoginView.tsx b/packages/mizan-react/src/allauth/components/views/LoginView.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/LoginView.tsx rename to packages/mizan-react/src/allauth/components/views/LoginView.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/MFAChooserView.tsx b/packages/mizan-react/src/allauth/components/views/MFAChooserView.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/MFAChooserView.tsx rename to packages/mizan-react/src/allauth/components/views/MFAChooserView.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/MFARecoveryCodesView.tsx b/packages/mizan-react/src/allauth/components/views/MFARecoveryCodesView.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/MFARecoveryCodesView.tsx rename to packages/mizan-react/src/allauth/components/views/MFARecoveryCodesView.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/MFATOTPView.tsx b/packages/mizan-react/src/allauth/components/views/MFATOTPView.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/MFATOTPView.tsx rename to packages/mizan-react/src/allauth/components/views/MFATOTPView.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/MFAWebAuthnView.tsx b/packages/mizan-react/src/allauth/components/views/MFAWebAuthnView.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/MFAWebAuthnView.tsx rename to packages/mizan-react/src/allauth/components/views/MFAWebAuthnView.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/SignupView.tsx b/packages/mizan-react/src/allauth/components/views/SignupView.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/SignupView.tsx rename to packages/mizan-react/src/allauth/components/views/SignupView.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/components/views/index.ts b/packages/mizan-react/src/allauth/components/views/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/components/views/index.ts rename to packages/mizan-react/src/allauth/components/views/index.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/config.ts b/packages/mizan-react/src/allauth/config.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/config.ts rename to packages/mizan-react/src/allauth/config.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/APIContext.tsx b/packages/mizan-react/src/allauth/contexts/APIContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/APIContext.tsx rename to packages/mizan-react/src/allauth/contexts/APIContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/AllauthContext.tsx b/packages/mizan-react/src/allauth/contexts/AllauthContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/AllauthContext.tsx rename to packages/mizan-react/src/allauth/contexts/AllauthContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/AuthContext.tsx b/packages/mizan-react/src/allauth/contexts/AuthContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/AuthContext.tsx rename to packages/mizan-react/src/allauth/contexts/AuthContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/ConfigContext.tsx b/packages/mizan-react/src/allauth/contexts/ConfigContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/ConfigContext.tsx rename to packages/mizan-react/src/allauth/contexts/ConfigContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/RouterContext.tsx b/packages/mizan-react/src/allauth/contexts/RouterContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/RouterContext.tsx rename to packages/mizan-react/src/allauth/contexts/RouterContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/StylesContext.tsx b/packages/mizan-react/src/allauth/contexts/StylesContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/StylesContext.tsx rename to packages/mizan-react/src/allauth/contexts/StylesContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/contexts/index.ts b/packages/mizan-react/src/allauth/contexts/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/contexts/index.ts rename to packages/mizan-react/src/allauth/contexts/index.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/defines.ts b/packages/mizan-react/src/allauth/defines.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/defines.ts rename to packages/mizan-react/src/allauth/defines.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/events.ts b/packages/mizan-react/src/allauth/events.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/events.ts rename to packages/mizan-react/src/allauth/events.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/hydration.ts b/packages/mizan-react/src/allauth/hydration.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/hydration.ts rename to packages/mizan-react/src/allauth/hydration.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/index.ts b/packages/mizan-react/src/allauth/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/index.ts rename to packages/mizan-react/src/allauth/index.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/nextjs.tsx b/packages/mizan-react/src/allauth/nextjs.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/nextjs.tsx rename to packages/mizan-react/src/allauth/nextjs.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/routing.tsx b/packages/mizan-react/src/allauth/routing.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/routing.tsx rename to packages/mizan-react/src/allauth/routing.tsx diff --git a/packages/mizan-csr/adapters/react/src/allauth/styles/types.ts b/packages/mizan-react/src/allauth/styles/types.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/styles/types.ts rename to packages/mizan-react/src/allauth/styles/types.ts diff --git a/packages/mizan-csr/adapters/react/src/allauth/types.ts b/packages/mizan-react/src/allauth/types.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/allauth/types.ts rename to packages/mizan-react/src/allauth/types.ts diff --git a/packages/mizan-csr/adapters/react/src/channels/__tests__/connection.test.ts b/packages/mizan-react/src/channels/__tests__/connection.test.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/__tests__/connection.test.ts rename to packages/mizan-react/src/channels/__tests__/connection.test.ts diff --git a/packages/mizan-csr/adapters/react/src/channels/__tests__/context.test.tsx b/packages/mizan-react/src/channels/__tests__/context.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/__tests__/context.test.tsx rename to packages/mizan-react/src/channels/__tests__/context.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/channels/__tests__/hooks.test.tsx b/packages/mizan-react/src/channels/__tests__/hooks.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/__tests__/hooks.test.tsx rename to packages/mizan-react/src/channels/__tests__/hooks.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/channels/connection.ts b/packages/mizan-react/src/channels/connection.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/connection.ts rename to packages/mizan-react/src/channels/connection.ts diff --git a/packages/mizan-csr/adapters/react/src/channels/context.tsx b/packages/mizan-react/src/channels/context.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/context.tsx rename to packages/mizan-react/src/channels/context.tsx diff --git a/packages/mizan-csr/adapters/react/src/channels/hooks.ts b/packages/mizan-react/src/channels/hooks.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/hooks.ts rename to packages/mizan-react/src/channels/hooks.ts diff --git a/packages/mizan-csr/adapters/react/src/channels/index.ts b/packages/mizan-react/src/channels/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/index.ts rename to packages/mizan-react/src/channels/index.ts diff --git a/packages/mizan-csr/adapters/react/src/channels/types.ts b/packages/mizan-react/src/channels/types.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/channels/types.ts rename to packages/mizan-react/src/channels/types.ts diff --git a/packages/mizan-csr/adapters/react/src/client/AuthContext.tsx b/packages/mizan-react/src/client/AuthContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/AuthContext.tsx rename to packages/mizan-react/src/client/AuthContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/client/RouterContext.tsx b/packages/mizan-react/src/client/RouterContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/RouterContext.tsx rename to packages/mizan-react/src/client/RouterContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/client/index.ts b/packages/mizan-react/src/client/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/index.ts rename to packages/mizan-react/src/client/index.ts diff --git a/packages/mizan-csr/adapters/react/src/client/nextjs.tsx b/packages/mizan-react/src/client/nextjs.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/nextjs.tsx rename to packages/mizan-react/src/client/nextjs.tsx diff --git a/packages/mizan-csr/adapters/react/src/client/react.ts b/packages/mizan-react/src/client/react.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/react.ts rename to packages/mizan-react/src/client/react.ts diff --git a/packages/mizan-csr/adapters/react/src/client/routing.tsx b/packages/mizan-react/src/client/routing.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/routing.tsx rename to packages/mizan-react/src/client/routing.tsx diff --git a/packages/mizan-csr/adapters/react/src/client/types.ts b/packages/mizan-react/src/client/types.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/client/types.ts rename to packages/mizan-react/src/client/types.ts diff --git a/packages/mizan-csr/adapters/react/src/context.tsx b/packages/mizan-react/src/context.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/context.tsx rename to packages/mizan-react/src/context.tsx diff --git a/packages/mizan-csr/adapters/react/src/errors.ts b/packages/mizan-react/src/errors.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/errors.ts rename to packages/mizan-react/src/errors.ts diff --git a/packages/mizan-csr/adapters/react/src/forms.ts b/packages/mizan-react/src/forms.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/forms.ts rename to packages/mizan-react/src/forms.ts diff --git a/packages/mizan-csr/adapters/react/src/index.ts b/packages/mizan-react/src/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/index.ts rename to packages/mizan-react/src/index.ts diff --git a/packages/mizan-csr/adapters/react/src/jwt/JWTContext.tsx b/packages/mizan-react/src/jwt/JWTContext.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/jwt/JWTContext.tsx rename to packages/mizan-react/src/jwt/JWTContext.tsx diff --git a/packages/mizan-csr/adapters/react/src/jwt/__tests__/JWTContext.test.tsx b/packages/mizan-react/src/jwt/__tests__/JWTContext.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/jwt/__tests__/JWTContext.test.tsx rename to packages/mizan-react/src/jwt/__tests__/JWTContext.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/jwt/__tests__/contract.test.ts b/packages/mizan-react/src/jwt/__tests__/contract.test.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/jwt/__tests__/contract.test.ts rename to packages/mizan-react/src/jwt/__tests__/contract.test.ts diff --git a/packages/mizan-csr/adapters/react/src/jwt/__tests__/hooks.test.tsx b/packages/mizan-react/src/jwt/__tests__/hooks.test.tsx similarity index 100% rename from packages/mizan-csr/adapters/react/src/jwt/__tests__/hooks.test.tsx rename to packages/mizan-react/src/jwt/__tests__/hooks.test.tsx diff --git a/packages/mizan-csr/adapters/react/src/jwt/index.ts b/packages/mizan-react/src/jwt/index.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/jwt/index.ts rename to packages/mizan-react/src/jwt/index.ts diff --git a/packages/mizan-csr/adapters/react/src/testing.ts b/packages/mizan-react/src/testing.ts similarity index 100% rename from packages/mizan-csr/adapters/react/src/testing.ts rename to packages/mizan-react/src/testing.ts diff --git a/packages/mizan-csr/adapters/react/tsconfig.build.json b/packages/mizan-react/tsconfig.build.json similarity index 100% rename from packages/mizan-csr/adapters/react/tsconfig.build.json rename to packages/mizan-react/tsconfig.build.json diff --git a/packages/mizan-csr/adapters/react/tsconfig.json b/packages/mizan-react/tsconfig.json similarity index 100% rename from packages/mizan-csr/adapters/react/tsconfig.json rename to packages/mizan-react/tsconfig.json diff --git a/packages/mizan-csr/adapters/react/vitest.config.ts b/packages/mizan-react/vitest.config.ts similarity index 100% rename from packages/mizan-csr/adapters/react/vitest.config.ts rename to packages/mizan-react/vitest.config.ts diff --git a/packages/mizan-csr/adapters/react/vitest.setup.ts b/packages/mizan-react/vitest.setup.ts similarity index 100% rename from packages/mizan-csr/adapters/react/vitest.setup.ts rename to packages/mizan-react/vitest.setup.ts diff --git a/packages/mizan-runtime/index.ts b/packages/mizan-runtime/index.ts new file mode 100644 index 0000000..bee219b --- /dev/null +++ b/packages/mizan-runtime/index.ts @@ -0,0 +1,145 @@ +/** + * Mizan Runtime — The client state engine. + * + * Framework-agnostic. React, Vue, Svelte, Solid — all wrap this. + * + * Three concerns: + * 1. Context registry — mounted providers register here for invalidation + * 2. Invalidation — batched via microtask, supports scoped params + * 3. Fetch — mizanFetch (GET context bundles) + mizanCall (POST mutations) + */ + +// === Types === + +export class MizanError extends Error { + constructor(public status: number, public body: string) { + super(`Mizan call failed (${status})`) + } +} + +export type RefetchFn = () => void +type ParamKey = string // JSON.stringify of params + +interface ContextEntry { + params: Record + refetch: RefetchFn +} + +// === Configuration === + +let config = { + baseUrl: '/api/mizan', + getHeaders: (): Record => ({}), +} + +export function configure(opts: Partial) { + Object.assign(config, opts) +} + +// === Context Registry === +// Mounted context providers register here. Unmounted ones deregister. + +const contexts: Map> = new Map() + +export function registerContext( + name: string, + params: Record, + refetch: RefetchFn, +): () => void { + if (!contexts.has(name)) contexts.set(name, new Map()) + const key = JSON.stringify(params) + contexts.get(name)!.set(key, { params, refetch }) + return () => contexts.get(name)!.delete(key) +} + +// === Invalidation === +// Batched via microtask. Multiple invalidations in the same tick coalesce. + +const pending: Set = new Set() +const pendingScoped: Map> = new Map() +let scheduled = false + +export function invalidate(context: string, params?: Record) { + if (params) { + pendingScoped.set(context, params) + } else { + pending.add(context) + } + if (!scheduled) { + scheduled = true + queueMicrotask(flush) + } +} + +function flush() { + // Broad invalidations — refetch all instances of context + for (const name of pending) { + const entries = contexts.get(name) + if (entries) entries.forEach(entry => entry.refetch()) + } + + // Scoped invalidations — refetch only matching params + for (const [name, params] of pendingScoped) { + if (pending.has(name)) continue // already refetched all + const entries = contexts.get(name) + if (!entries) continue + const key = JSON.stringify(params) + const entry = entries.get(key) + if (entry) entry.refetch() + } + + pending.clear() + pendingScoped.clear() + scheduled = false +} + +// === Fetch === + +export async function mizanFetch( + contextName: string, + params?: Record, +): Promise { + const url = new URL(`${config.baseUrl}/ctx/${contextName}/`, globalThis.location?.origin ?? 'http://localhost') + if (params) { + for (const [k, v] of Object.entries(params)) { + url.searchParams.set(k, String(v)) + } + } + const res = await fetch(url.toString(), { + headers: { ...config.getHeaders(), 'Accept': 'application/json' }, + credentials: 'same-origin', + }) + if (!res.ok) throw new MizanError(res.status, await res.text()) + return res.json() +} + +export async function mizanCall( + functionName: string, + args: Record, +): Promise { + const res = await fetch(`${config.baseUrl}/call/`, { + method: 'POST', + headers: { + ...config.getHeaders(), + 'Content-Type': 'application/json', + }, + credentials: 'same-origin', + body: JSON.stringify({ function: functionName, args }), + }) + if (!res.ok) throw new MizanError(res.status, await res.text()) + + const data = await res.json() + + // Server-driven invalidation + if (data.invalidate) { + for (const entry of data.invalidate) { + if (typeof entry === 'string') { + invalidate(entry) + } else { + invalidate(entry.context, entry.params) + } + } + } + + return data.result +} diff --git a/packages/mizan-runtime/package.json b/packages/mizan-runtime/package.json new file mode 100644 index 0000000..22baaf5 --- /dev/null +++ b/packages/mizan-runtime/package.json @@ -0,0 +1,12 @@ +{ + "name": "@mizan/runtime", + "version": "0.1.0", + "description": "Mizan client state engine — framework-agnostic context registry, invalidation, and fetch.", + "type": "module", + "main": "index.ts", + "types": "index.ts", + "exports": { + ".": "./index.ts" + }, + "license": "MIT" +}