Contracts-TS Documentation
    Preparing search index...

    Contracts-TS Documentation

    @jonloucks/contracts-ts

    CI npm version Coverage Badge Typedoc Badge

    Typescript Dependency Contracts for dependency inversion

    npm install @jonloucks/contracts-ts
    
    Importing the Package
    import { CONTRACTS, createContract } from '@jonloucks/contracts-ts';
    
    Importing the Convenience Package
    import {
    AutoClose,
    bind,
    claim,
    Contract,
    createExtractor,
    createLifeCycle,
    createRepository,
    createSingleton,
    createValue,
    createContract,
    enforce,
    guardFunctions,
    isBound
    } from "@jonloucks/contracts-ts/api/Convenience";
    Creating a Contract
    // Define a service interface
    interface Logger {
    log(message: string): void;
    }

    // Create a contract for the service
    const LOGGER_CONTRACT: Contract<Logger> = createContract<Logger>({
    name: "Logger",
    test: (obj: unknown): obj is Logger => { // example of duck-typing check
    return guardFunctions(obj, 'log'); // example of using guardFunctions helper
    }
    });
    Binding a Contract

    bind<Logger>(LOGGER_CONTRACT,
    createSingleton<Logger>(
    () => ({
    log: (message: string) => {
    console.log("LOG:", message);
    }
    })));
    Using the Contract
    const logger : Logger = enforce<Logger>(LOGGER_CONTRACT);
    logger.log("Using the service in the test.");
    Install dependencies
    npm install
    
    Build the project
    npm run build
    
    Run tests
    npm test
    
    Run tests in watch mode
    npm run test:watch
    
    Run test coverage
    npm run test:coverage
    
    Lint the code
    npm run lint
    
    Fix linting issues
    npm run lint:fix
    
    Generate documents
    npm run docs
    
    Generate badges
    npm run badges
    
    Project Structure
    • All tests must have suffix of -test.ts or -spec.ts
    • Tests that validate supported APIs go in src/test
    • Tests that validate internal implementation details go in src/impl
    contracts-ts
    ├── .github
    │   ├── ISSUE_TEMPLATE
    │   │   ├── bug_report.md
    │   │   └── feature_request.md
    │   └── workflows
    │      ├── main-pull-request-matrix.yml
    │      ├── main-pull-request.yml
    │      ├── main-push.yml
    │      └── main-release.yml
    ├── CODE_OF_CONDUCT.md
    ├── CODING_STANDARDS.md
    ├── CONTRIBUTING.md
    ├── editorconfig
    ├── eslint.config.mjs
    ├── jest.config.js
    ├── LICENSE
    ├── package-lock.json
    ├── package.json
    ├── PULL_REQUEST_TEMPLATE.md
    ├── README.md
    ├── scripts
    │   ├── badge-template.svg.dat
    │   └── tsconfig.json
    ├── SECURITY.md
    ├── src
    │   ├── index.ts
    │   ├── version.ts
    │   ├── api
    │   │   ├── *.ts
    │   │   ├── *.api.ts
    │   ├── auxiliary
    │   │   ├── *.ts
    │   │   ├── *.impl.ts
    │   │   ├── *.test.ts // internal implementation specific
    │   │   └── *.api.ts
    │   ├── impl
    │   │   ├── *.ts
    │   │   ├── *.impl.ts
    │   │   ├── *.test.ts // internal implementation specific
    │   │   └── *.api.ts
    │   ├── test
    │   │ └── *.test.ts
    │   └── never-publish // non shippable development scripts
    │      ├── *.ts
    │      ├── *.*. // data files etc
    │   └── *.test.ts
    ├── tsconfig.json
    └── typedoc.json
    CI Workflow

    The CI workflow runs on every push and pull request to main branch. It:

    • Tests against Node.js versions 18.x, 20.x, 22.x, and 24.x
    • Runs linting
    • Builds the project
    • Runs tests with coverage
    • Uploads coverage to Codecov (optional)
    Publish Workflow

    The GitHub publishings workflows are run to make an official release.

    • If all scanning and tests pass it is published. There is no other way allowed.
    • Publishing authentication is done using (OIDC trusted publishing)

    To set up your own publishing:

    1. Publishing this project as is intentionally disabled
    2. You are welcome to fork this repository and publish where you want.
    3. Run npm pkg delete private to remove the private flag from the package.
    4. Change the name field in package.json to your desired package name.

    MIT