@jonloucks/contracts-ts
v1.2.2
Published
Typescript Dependency Contracts for dependency inversion
Maintainers
Readme
@jonloucks/contracts-ts
Badges
Typescript Dependency Contracts for dependency inversion
Documentation
- License
- Contributing
- Code of conduct
- Coding standards
- Security policy
- Pull request template
- How to use API
- Test coverage report
Installation
npm install @jonloucks/contracts-tsUsage - code fragments from Example.test.ts
import { CONTRACTS, createContract } from '@jonloucks/contracts-ts';import {
AutoClose,
bind,
claim,
Contract,
createExtractor,
createLifeCycle,
createRepository,
createSingleton,
createValue,
createContract,
enforce,
guardFunctions,
isBound
} from "@jonloucks/contracts-ts/api/Convenience";// 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
}
});
bind<Logger>(LOGGER_CONTRACT,
createSingleton<Logger>(
() => ({
log: (message: string) => {
console.log("LOG:", message);
}
})));const logger : Logger = enforce<Logger>(LOGGER_CONTRACT);
logger.log("Using the service in the test.");Development
npm installnpm run buildnpm testnpm run test:watchnpm run test:coveragenpm run lintnpm run lint:fixnpm run docsnpm run badges- 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.jsonGitHub Workflows
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)
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:
- Publishing this project as is intentionally disabled
- You are welcome to fork this repository and publish where you want.
- Run
npm pkg delete privateto remove theprivateflag from the package. - Change the
namefield inpackage.jsonto your desired package name.
License
MIT
