diff --git a/core/daml-codegen-helpers/package.json b/core/daml-codegen-helpers/package.json new file mode 100644 index 000000000..ff4839ed9 --- /dev/null +++ b/core/daml-codegen-helpers/package.json @@ -0,0 +1,47 @@ +{ + "name": "@canton-network/core-daml-codegen-helpers", + "version": "1.0.0", + "type": "module", + "description": "Helpers for combining Daml codegen TypeScript output with the Splice Wallet SDK.", + "license": "Apache-2.0", + "author": "Phillip Olesen ", + "packageManager": "yarn@4.9.4", + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "default": "./dist/index.js" + } + }, + "scripts": { + "build": "tsup && tsc -p tsconfig.types.json", + "dev": "tsup --watch --onSuccess \"tsc -p tsconfig.types.json\"", + "clean": "tsc -b --clean; rm -rf dist", + "flatpack": "yarn pack --out \"$FLATPACK_OUTDIR\"", + "test": "vitest run --project node --project browser --passWithNoTests", + "test:coverage": "vitest run --project node --project browser --coverage --passWithNoTests" + }, + "devDependencies": { + "@types/node": "^25.0.10", + "@vitest/browser-playwright": "^4.1.2", + "@vitest/coverage-v8": "^4.1.2", + "tsup": "^8.5.1", + "typescript": "^5.9.3", + "vitest": "^4.1.2" + }, + "files": [ + "dist/**" + ], + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hyperledger-labs/splice-wallet-kernel.git", + "directory": "core/daml-codegen-helpers" + } +} diff --git a/core/daml-codegen-helpers/src/index.ts b/core/daml-codegen-helpers/src/index.ts new file mode 100644 index 000000000..16bf866a0 --- /dev/null +++ b/core/daml-codegen-helpers/src/index.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +export { + type AcsContractLike, + type TypedAcsContract, + toTemplateContract, + toTemplateContracts, + expectTemplateContract, +} from './typed-contract.js' diff --git a/core/daml-codegen-helpers/src/typed-contract.ts b/core/daml-codegen-helpers/src/typed-contract.ts new file mode 100644 index 000000000..214a55767 --- /dev/null +++ b/core/daml-codegen-helpers/src/typed-contract.ts @@ -0,0 +1,62 @@ +// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +export type AcsContractLike = { + templateId: string + createArgument: unknown +} + +export type TypedAcsContract< + TPayload, + TContract extends AcsContractLike = AcsContractLike, +> = Omit & { + createArgument: TPayload +} + +export function toTemplateContract( + contract: TContract, + expectedTemplateId: string +): TypedAcsContract | undefined { + if (contract.templateId !== expectedTemplateId) { + return undefined + } + + return contract as TypedAcsContract +} + +export function toTemplateContracts< + TPayload, + TContract extends AcsContractLike, +>( + contracts: TContract[], + expectedTemplateId: string +): TypedAcsContract[] { + return contracts + .map((contract) => + toTemplateContract( + contract, + expectedTemplateId + ) + ) + .filter( + (contract): contract is TypedAcsContract => + contract !== undefined + ) +} + +export function expectTemplateContract< + TPayload, + TContract extends AcsContractLike, +>( + contract: TContract, + expectedTemplateId: string, + label: string +): TypedAcsContract { + if (contract.templateId !== expectedTemplateId) { + throw new Error( + `${label} expected template ${expectedTemplateId}, got ${contract.templateId}` + ) + } + + return contract as TypedAcsContract +} diff --git a/core/daml-codegen-helpers/tsconfig.json b/core/daml-codegen-helpers/tsconfig.json new file mode 100644 index 000000000..572eba58e --- /dev/null +++ b/core/daml-codegen-helpers/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.web.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["src"] +} diff --git a/core/daml-codegen-helpers/tsconfig.types.json b/core/daml-codegen-helpers/tsconfig.types.json new file mode 100644 index 000000000..e522515b7 --- /dev/null +++ b/core/daml-codegen-helpers/tsconfig.types.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.web.json", + "compilerOptions": { + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "rootDir": "./src", + "outDir": "./dist", + "moduleResolution": "bundler", + "noEmit": false, + "composite": false + }, + "include": ["src/**/*.ts", "src/**/*.d.ts"], + "exclude": ["**/*.test.*", "**/*.spec.*", "**/__tests__/**"] +} diff --git a/core/daml-codegen-helpers/tsup.config.ts b/core/daml-codegen-helpers/tsup.config.ts new file mode 100644 index 000000000..1f4074292 --- /dev/null +++ b/core/daml-codegen-helpers/tsup.config.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { defineConfig } from 'tsup' +import { base } from '../../tsup.base' + +export default defineConfig({ + ...base, + entry: ['src/index.ts'], +}) diff --git a/core/daml-codegen-helpers/vitest.config.ts b/core/daml-codegen-helpers/vitest.config.ts new file mode 100644 index 000000000..6d6980ae1 --- /dev/null +++ b/core/daml-codegen-helpers/vitest.config.ts @@ -0,0 +1,48 @@ +// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { defineConfig, defineProject } from 'vitest/config' +import { playwright } from '@vitest/browser-playwright' + +export default defineConfig({ + test: { + coverage: { + include: ['src/**/*.ts'], + provider: 'v8', + reporter: ['text', 'html', 'lcov'], + thresholds: { + lines: 0, + functions: 0, + branches: 0, + statements: 0, + }, + }, + environment: 'node', + include: ['src/**/*.test.ts'], + projects: [ + defineProject({ + test: { + name: 'node', + environment: 'node', + include: ['src/**/*.test.ts'], + }, + }), + defineProject({ + test: { + name: 'browser', + include: ['src/**/*.test.ts'], + browser: { + enabled: true, + provider: playwright({ + trace: 'off', + screenshot: 'off', + video: 'off', + }), + instances: [{ browser: 'chromium' }], + headless: true, + }, + }, + }), + ], + }, +}) diff --git a/yarn.lock b/yarn.lock index 032debef0..dd437f7de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1340,6 +1340,19 @@ __metadata: languageName: unknown linkType: soft +"@canton-network/core-daml-codegen-helpers@workspace:core/daml-codegen-helpers": + version: 0.0.0-use.local + resolution: "@canton-network/core-daml-codegen-helpers@workspace:core/daml-codegen-helpers" + dependencies: + "@types/node": "npm:^25.0.10" + "@vitest/browser-playwright": "npm:^4.1.2" + "@vitest/coverage-v8": "npm:^4.1.2" + tsup: "npm:^8.5.1" + typescript: "npm:^5.9.3" + vitest: "npm:^4.1.2" + languageName: unknown + linkType: soft + "@canton-network/core-ledger-client-types@workspace:^, @canton-network/core-ledger-client-types@workspace:core/ledger-client-types": version: 0.0.0-use.local resolution: "@canton-network/core-ledger-client-types@workspace:core/ledger-client-types"