demiurgeJS

DemiurgeJS

DemiurgeJS is a lightweight pseudo-SPA architecture for static sites that need routing-like behavior, layout partials, per-page scripts, and utility services without a framework runtime.

It supports both:

Architecture Overview

Core runtime modules:

Bootstrap and entries:

Package Architecture

Source structure (src/)

Build tooling (tools/)

Distribution Targets

npm run build generates dist/ artifacts for multiple consumption modes:

Using as Library vs Script

Library usage (npm/pnpm)

Use this when your project has a bundler/build system.

import { bootstrapDemiurge, Modal } from "@n0m4d-d3v/demiurgejs";
import "@n0m4d-d3v/demiurgejs/style.css";

bootstrapDemiurge();

You can also import individual APIs:

import { Modal, initModalDelegation } from "@n0m4d-d3v/demiurgejs";

initModalDelegation(document);

Script usage (browser global)

Use this for static sites without a bundler.

Manual bootstrap:

<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/@n0m4d-d3v/demiurgejs/dist/demiurge.min.css"
/>
<script src="https://cdn.jsdelivr.net/npm/@n0m4d-d3v/demiurgejs/dist/demiurge.global.min.js"></script>
<script>
  Demiurge.bootstrapDemiurge();
</script>

Auto-bootstrap (legacy-friendly):

<script src="https://cdn.jsdelivr.net/npm/@n0m4d-d3v/demiurgejs/dist/auto-bootstrap.global.min.js"></script>

Backward Compatibility (Globals)

The browser global build preserves legacy globals for existing integrations:

Preferred global namespace for new code:

PageConfig Contract

PageScriptLoader expects:

Minimal example:

window.PageConfig = {
  layout: {
    header: { selector: "#app-header", url: "/partials/header.html" },
    footer: { selector: "#app-footer", url: "/partials/footer.html" },
    navSelector: "#menu a[href]",
  },
  sharedScripts: ["/scripts/shared/common.js"],
  pages: {
    home: {
      scripts: ["/scripts/pages/home.js"],
      init: "HomePage.init",
      teardown: "HomePage.teardown",
    },
  },
};

Cleanup behavior when navigating away:

  1. Runs cleanup returned by init() (if any)
  2. Runs configured teardown function (if any)

Declarative usage (recommended):

<button data-modal-open="#my-modal">Open modal</button>

<section id="my-modal" class="modal" aria-hidden="true" role="dialog" aria-modal="true">
  <div class="modal__backdrop" data-modal-close></div>
  <div class="modal__dialog" role="document">
    <button class="modal__close" aria-label="Close" data-modal-close>×</button>
    <p>Modal content</p>
  </div>
</section>

Programmatic usage:

const modal = Modal.getOrCreate(document.querySelector("#my-modal"));
modal?.open();

Delegated listeners are attached at the document level, so modal triggers continue working after pseudo-SPA page swaps.

Development Workflow

Install dependencies:

npm install

Build package outputs:

npm run build

Watch mode:

npm run dev

Smoke checks:

npm run test:smoke

CLI (demiurgejs)

The package includes a local/global CLI binary: demiurgejs.

Main commands:

demiurgejs skill sync
demiurgejs skill sync --project /path/to/project
demiurgejs init my-project

skill sync installs or updates the packaged architecture skill in the target project:

From this repository root:

npm link
demiurgejs --help

To remove the global link:

npm unlink -g @n0m4d-d3v/demiurgejs