From 6a74194644f6aba59f24bf112395b6ee42940a72 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Fri, 14 Mar 2025 10:15:07 -0700 Subject: [PATCH 01/15] feat(token-introspection): simplify token-introspection package --- packages/auth/package.json | 3 +- packages/auth/src/accessToken/routes.test.ts | 10 -- packages/auth/src/app.ts | 8 -- packages/auth/src/index.ts | 5 +- packages/auth/tsconfig.json | 7 +- packages/backend/package.json | 3 +- packages/backend/tsconfig.json | 7 +- packages/token-introspection/package.json | 5 +- .../token-introspection/src/client/index.ts | 10 +- .../src/client/introspection.test.ts | 43 +------ .../src/client/introspection.ts | 46 +------ packages/token-introspection/src/index.ts | 1 - .../src/openapi/generated/types.ts | 10 +- .../src/openapi/index.test.ts | 24 ---- .../token-introspection/src/openapi/index.ts | 13 -- .../src/openapi/token-introspection.yaml | 116 ------------------ .../token-introspection/src/test/helpers.ts | 11 -- packages/token-introspection/tsconfig.json | 1 + 18 files changed, 37 insertions(+), 286 deletions(-) delete mode 100644 packages/token-introspection/src/openapi/index.test.ts delete mode 100644 packages/token-introspection/src/openapi/index.ts delete mode 100644 packages/token-introspection/src/openapi/token-introspection.yaml diff --git a/packages/auth/package.json b/packages/auth/package.json index 23ba457dd6..2b1216cf07 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -8,8 +8,7 @@ "scripts": { "knex": "knex", "generate": "graphql-codegen --config codegen.yml", - "build:deps": "pnpm --filter token-introspection build", - "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "test": "NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --maxWorkers=50%", "test:cov": "pnpm test -- --coverage", diff --git a/packages/auth/src/accessToken/routes.test.ts b/packages/auth/src/accessToken/routes.test.ts index ac9fb14964..e76735a77c 100644 --- a/packages/auth/src/accessToken/routes.test.ts +++ b/packages/auth/src/accessToken/routes.test.ts @@ -105,9 +105,6 @@ describe('Access Token Routes', (): void => { grantId: grant.id, ...BASE_TOKEN }) - - const openApi = await deps.use('openApi') - jestOpenAPI(openApi.tokenIntrospectionSpec) }) test('Cannot introspect fake token', async (): Promise => { const ctx = createContext( @@ -124,7 +121,6 @@ describe('Access Token Routes', (): void => { access_token: v4() } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' @@ -151,7 +147,6 @@ describe('Access Token Routes', (): void => { } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' @@ -187,7 +182,6 @@ describe('Access Token Routes', (): void => { access_token: token.value } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' @@ -215,7 +209,6 @@ describe('Access Token Routes', (): void => { } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' @@ -259,7 +252,6 @@ describe('Access Token Routes', (): void => { } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' @@ -307,7 +299,6 @@ describe('Access Token Routes', (): void => { } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' @@ -350,7 +341,6 @@ describe('Access Token Routes', (): void => { } await expect(accessTokenRoutes.introspect(ctx)).resolves.toBeUndefined() - expect(ctx.response).toSatisfyApiSpec() expect(ctx.status).toBe(200) expect(ctx.response.get('Content-Type')).toBe( 'application/json; charset=utf-8' diff --git a/packages/auth/src/app.ts b/packages/auth/src/app.ts index 3e8bb9d0f7..2f173eab79 100644 --- a/packages/auth/src/app.ts +++ b/packages/auth/src/app.ts @@ -394,18 +394,10 @@ export class App { }) const accessTokenRoutes = await this.container.use('accessTokenRoutes') - const openApi = await this.container.use('openApi') // Token Introspection router.post( '/', - createValidatorMiddleware( - openApi.tokenIntrospectionSpec, - { - path: '/', - method: HttpMethod.POST - } - ), accessTokenRoutes.introspect ) diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts index 2315fe083b..a2d0a7bf57 100644 --- a/packages/auth/src/index.ts +++ b/packages/auth/src/index.ts @@ -19,7 +19,6 @@ import { getAuthServerOpenAPI } from '@interledger/open-payments' import { createInteractionService } from './interaction/service' -import { getTokenIntrospectionOpenAPI } from 'token-introspection' import { Redis } from 'ioredis' const container = initIocContainer(Config) @@ -167,12 +166,10 @@ export function initIocContainer( const idpSpec = await createOpenAPI( path.resolve(__dirname, './openapi/specs/id-provider.yaml') ) - const tokenIntrospectionSpec = await getTokenIntrospectionOpenAPI() return { authServerSpec, - idpSpec, - tokenIntrospectionSpec + idpSpec } }) diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json index 707ef5cc80..dccaa20efa 100644 --- a/packages/auth/tsconfig.json +++ b/packages/auth/tsconfig.json @@ -9,5 +9,10 @@ "include": ["src/**/*"], "ts-node": { "swc": true - } + }, + "references": [ + { + "path": "../token-introspection" + } + ] } diff --git a/packages/backend/package.json b/packages/backend/package.json index 7ecba85f8c..b87bb89178 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,8 +8,7 @@ "test:sincemain:cov": "pnpm test:sincemain --coverage", "knex": "knex", "generate": "graphql-codegen --config codegen.yml", - "build:deps": "pnpm --filter token-introspection build", - "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 0ea2a8b22f..608fe22f8c 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -8,5 +8,10 @@ "include": ["src/**/*"], "ts-node": { "swc": true - } + }, + "references": [ + { + "path": "../token-introspection" + } + ] } diff --git a/packages/token-introspection/package.json b/packages/token-introspection/package.json index be5ad8b715..c85deb3610 100644 --- a/packages/token-introspection/package.json +++ b/packages/token-introspection/package.json @@ -7,11 +7,10 @@ "dist/**/*" ], "scripts": { - "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build": "pnpm clean && pnpm generate:types && tsc --build tsconfig.json", "clean": "rm -fr dist/", - "copy-files": "mkdir -p ./dist/openapi/specs && cp -r ./src/openapi/specs/*.yaml ./dist/openapi/specs/", "copy-op-schemas": "cp ./node_modules/@interledger/open-payments/dist/openapi/specs/auth-server.yaml ./node_modules/@interledger/open-payments/dist/openapi/specs/schemas.yaml ./src/openapi/specs/", - "generate:types": "openapi-typescript ../../openapi/token-introspection.yaml --output src/openapi/generated/types.ts -t", + "generate:types": "openapi-typescript ./src/openapi/specs/token-introspection.yaml --output src/openapi/generated/types.ts -t", "postinstall": "pnpm copy-op-schemas", "prepack": "pnpm build", "test": "jest --passWithNoTests", diff --git a/packages/token-introspection/src/client/index.ts b/packages/token-introspection/src/client/index.ts index 608a7b6dfd..ed59fc5b29 100644 --- a/packages/token-introspection/src/client/index.ts +++ b/packages/token-introspection/src/client/index.ts @@ -1,19 +1,13 @@ import axios, { AxiosInstance } from 'axios' -import { OpenAPI } from '@interledger/openapi' import createLogger, { Logger } from 'pino' import config from '../config' import { createIntrospectionRoutes, IntrospectionRoutes } from './introspection' -import { getTokenIntrospectionOpenAPI } from '../openapi' export interface BaseDeps { axiosInstance: AxiosInstance logger: Logger } -export interface RouteDeps extends BaseDeps { - openApi: OpenAPI -} - export interface CreateClientArgs { logger?: Logger requestTimeoutMs?: number @@ -28,13 +22,11 @@ export const createClient = async (args: CreateClientArgs): Promise => { requestTimeoutMs: args?.requestTimeoutMs ?? config.DEFAULT_REQUEST_TIMEOUT_MS }) - const openApi = await getTokenIntrospectionOpenAPI() const logger = args?.logger ?? createLogger() return createIntrospectionRoutes({ axiosInstance, - logger, - openApi + logger }) } diff --git a/packages/token-introspection/src/client/introspection.test.ts b/packages/token-introspection/src/client/introspection.test.ts index 422ccb20ea..f1681edc0d 100644 --- a/packages/token-introspection/src/client/introspection.test.ts +++ b/packages/token-introspection/src/client/introspection.test.ts @@ -1,39 +1,22 @@ import { createIntrospectionRoutes, introspectToken } from './introspection' -import { OpenAPI, HttpMethod } from '@interledger/openapi' import { defaultAxiosInstance, - mockOpenApiResponseValidators, mockTokenInfo, silentLogger } from '../test/helpers' import nock from 'nock' -import { getTokenIntrospectionOpenAPI } from '../openapi' describe('introspection', (): void => { - let openApi: OpenAPI - - beforeAll(async () => { - openApi = await getTokenIntrospectionOpenAPI() - }) - const axiosInstance = defaultAxiosInstance const logger = silentLogger const baseUrl = 'http://localhost:1000' - const openApiValidators = mockOpenApiResponseValidators() describe('createIntrospectionRoutes', (): void => { - test('creates introspectOpenApiValidator properly', async (): Promise => { - jest.spyOn(openApi, 'createResponseValidator') - + test('creates introspection client properly', async (): Promise => { createIntrospectionRoutes({ axiosInstance, - openApi, logger }) - expect(openApi.createResponseValidator).toHaveBeenCalledWith({ - path: '/', - method: HttpMethod.POST - }) }) }) @@ -42,7 +25,7 @@ describe('introspection', (): void => { access_token: 'OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0' } - test('returns token info if passes validation', async (): Promise => { + test('returns token info', async (): Promise => { const tokenInfo = mockTokenInfo() const scope = nock(baseUrl).post('/', body).reply(200, tokenInfo) @@ -52,8 +35,7 @@ describe('introspection', (): void => { axiosInstance, logger }, - body, - openApiValidators.successfulValidator + body ) ).resolves.toStrictEqual(tokenInfo) scope.done() @@ -70,24 +52,7 @@ describe('introspection', (): void => { axiosInstance, logger }, - body, - openApiValidators.successfulValidator - ) - ).rejects.toThrowError() - scope.done() - }) - - test('throws if token info does not pass open api validation', async (): Promise => { - const scope = nock(baseUrl).post('/', body).reply(200, mockTokenInfo()) - - await expect(() => - introspectToken( - { - axiosInstance, - logger - }, - body, - openApiValidators.failedValidator + body ) ).rejects.toThrowError() scope.done() diff --git a/packages/token-introspection/src/client/introspection.ts b/packages/token-introspection/src/client/introspection.ts index 76e35c45e8..dc0ca2a1fd 100644 --- a/packages/token-introspection/src/client/introspection.ts +++ b/packages/token-introspection/src/client/introspection.ts @@ -1,5 +1,4 @@ -import { HttpMethod, ResponseValidator } from '@interledger/openapi' -import { BaseDeps, RouteDeps } from '.' +import { BaseDeps } from '.' import { IntrospectArgs, TokenInfo } from '../types' export interface IntrospectionRoutes { @@ -7,57 +6,24 @@ export interface IntrospectionRoutes { } export const createIntrospectionRoutes = ( - deps: RouteDeps + deps: BaseDeps ): IntrospectionRoutes => { - const { axiosInstance, openApi, logger } = deps - - const introspectOpenApiValidator = openApi.createResponseValidator( - { - path: '/', - method: HttpMethod.POST - } - ) + const { axiosInstance, logger } = deps return { introspect: (args: IntrospectArgs) => - introspectToken( - { axiosInstance, logger }, - args, - introspectOpenApiValidator - ) + introspectToken({ axiosInstance, logger }, args) } } -export const introspectToken = async ( - deps: BaseDeps, - args: IntrospectArgs, - validateOpenApiResponse: ResponseValidator -) => { +export const introspectToken = async (deps: BaseDeps, args: IntrospectArgs) => { const { axiosInstance, logger } = deps try { - const { data, status } = await axiosInstance.request({ + const { data } = await axiosInstance.request({ data: args }) - try { - validateOpenApiResponse({ - status, - body: data - }) - } catch (error) { - const errorMessage = 'Failed to validate OpenApi response' - logger.error( - { - data: JSON.stringify(data), - validationError: error instanceof Error && error.message - }, - errorMessage - ) - - throw new Error(errorMessage) - } - return data } catch (error) { const errorMessage = `Error when making introspection request: ${ diff --git a/packages/token-introspection/src/index.ts b/packages/token-introspection/src/index.ts index 9532c480fb..35b91efc69 100644 --- a/packages/token-introspection/src/index.ts +++ b/packages/token-introspection/src/index.ts @@ -1,3 +1,2 @@ export { TokenInfo, ActiveTokenInfo, isActiveTokenInfo } from './types' -export { getTokenIntrospectionOpenAPI } from './openapi' export { createClient, Client } from './client' diff --git a/packages/token-introspection/src/openapi/generated/types.ts b/packages/token-introspection/src/openapi/generated/types.ts index fb10a08903..725df2be7d 100644 --- a/packages/token-introspection/src/openapi/generated/types.ts +++ b/packages/token-introspection/src/openapi/generated/types.ts @@ -275,9 +275,15 @@ export type external = { /** * Receiver * Format: uri - * @description The URL of the incoming payment or ILP STREAM connection that is being paid. + * @description The URL of the incoming payment that is being paid. */ receiver: string; + /** + * Wallet Address + * Format: uri + * @description URL of a wallet address hosted by a Rafiki instance. + */ + walletAddress: string; }; responses: never; parameters: never; @@ -381,7 +387,7 @@ export type operations = { * @description The interaction reference generated for this * interaction by the AS. */ - interact_ref: string; + interact_ref?: string; }; }; }; diff --git a/packages/token-introspection/src/openapi/index.test.ts b/packages/token-introspection/src/openapi/index.test.ts deleted file mode 100644 index 1c71600303..0000000000 --- a/packages/token-introspection/src/openapi/index.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { getTokenIntrospectionOpenAPI } from '.' - -describe('OpenAPI', (): void => { - describe('getTokenIntrospectionOpenAPI', () => { - test('properly generates API paths', async () => { - const openApi = await getTokenIntrospectionOpenAPI() - - expect(openApi).toBeDefined() - expect(Object.keys(openApi.paths)).toEqual(expect.arrayContaining(['/'])) - }) - - test('properly references $ref to external ./schemas.yaml', async () => { - const openApi = await getTokenIntrospectionOpenAPI() - - expect( - openApi.paths?.['/']?.['post']?.['requestBody']?.['content'][ - 'application/json' - ]['schema']['properties']['access']['items']['oneOf'] - .map((access) => access.properties.type.enum[0]) - .sort() - ).toEqual(['incoming-payment', 'outgoing-payment', 'quote'].sort()) - }) - }) -}) diff --git a/packages/token-introspection/src/openapi/index.ts b/packages/token-introspection/src/openapi/index.ts deleted file mode 100644 index aa987cfad0..0000000000 --- a/packages/token-introspection/src/openapi/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createOpenAPI } from '@interledger/openapi' -import path from 'path' - -/** - * Returns the OpenAPI object for the Token Introspection OpenAPI spec. - * This object allows validating requests and responses against the spec. - * See more: https://github.com/interledger/open-payments/blob/main/packages/openapi/README.md - */ -export async function getTokenIntrospectionOpenAPI() { - return createOpenAPI( - path.resolve(__dirname, './specs/token-introspection.yaml') - ) -} diff --git a/packages/token-introspection/src/openapi/token-introspection.yaml b/packages/token-introspection/src/openapi/token-introspection.yaml deleted file mode 100644 index 566ee2a9a1..0000000000 --- a/packages/token-introspection/src/openapi/token-introspection.yaml +++ /dev/null @@ -1,116 +0,0 @@ -openapi: 3.1.0 -info: - title: Rafiki Authorization Server - Resource Server Connection - version: '1.0' - license: - name: Apache 2.0 - identifier: Apache-2.0 - summary: Rafiki Authorization Server - Resource Server Connection - description: 'The Open Payments API is secured via [GNAP](https://datatracker.ietf.org/doc/html/draft-ietf-gnap-core-protocol). This specification describes the connection between the Rafiki Open Payments Authorization Server and the Rafiki Open Payments Resource Server, which is an opinionated version of the [Grant Negotiation and Authorization Protocol Resource Server Connections](https://datatracker.ietf.org/doc/html/draft-ietf-gnap-resource-servers).' - contact: - email: tech@interledger.org -servers: - - url: 'https://openpayments.guide/auth' -tags: - - name: introspection - description: Token introspection -paths: - /: - parameters: [] - post: - summary: Introspect Access Token - operationId: post-introspect - responses: - '200': - description: OK - content: - application/json: - schema: - oneOf: - - properties: - active: - type: boolean - enum: - - false - required: - - active - - $ref: '#/components/schemas/token-info' - examples: - Token Introspection: - value: - active: true - grant: 1ee48d97-8fa1-4ab4-b89d-95284b665517 - access: - - type: outgoing-payment - actions: - - create - - read - identifier: 'https://openpayments.guide/alice' - limits: - interval: 'R12/2019-08-24T14:15:22Z/P1M' - receiver: 'https://openpayments.guide/bob/incoming-payments/48884225-b393-4872-90de-1b737e2491c2' - debitAmount: - value: '500' - assetCode: USD - assetScale: 2 - client: 'https://webmonize.com/.well-known/pay' - '404': - description: Not Found - description: Introspect an access token to get grant details. - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - access_token: - type: string - description: The access token value presented to the RS by the client instance. - access: - $ref: ./auth-server.yaml#/components/schemas/access - required: - - access_token - examples: - Introspect token: - value: - access_token: OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0 - tags: - - introspection -components: - schemas: - token-info: - title: token-info - type: object - properties: - active: - type: boolean - enum: - - true - grant: - type: string - access: - $ref: ./auth-server.yaml#/components/schemas/access - client: - title: client - type: string - description: |- - Wallet address of the client instance that is making this request. - - When sending a non-continuation request to the AS, the client instance MUST identify itself by including the client field of the request and by signing the request. - - A JSON Web Key Set document, including the public key that the client instance will use to protect this request and any continuation requests at the AS and any user-facing information about the client instance used in interactions, MUST be available at the wallet address + `/jwks.json` url. - - If sending a grant initiation request that requires RO interaction, the wallet address MUST serve necessary client display information. - required: - - active - - grant - - access - - client - securitySchemes: - GNAP: - name: Authorization - type: apiKey - in: header -security: - - GNAP: [] diff --git a/packages/token-introspection/src/test/helpers.ts b/packages/token-introspection/src/test/helpers.ts index 44b189d8a4..7f2adf16cc 100644 --- a/packages/token-introspection/src/test/helpers.ts +++ b/packages/token-introspection/src/test/helpers.ts @@ -1,7 +1,6 @@ import createLogger from 'pino' import { createAxiosInstance } from '../client' import { TokenInfo } from '../types' -import { ResponseValidator } from '@interledger/openapi' export const silentLogger = createLogger({ level: 'silent' @@ -12,16 +11,6 @@ export const defaultAxiosInstance = createAxiosInstance({ requestTimeoutMs: 0 }) -export const mockOpenApiResponseValidators = () => ({ - successfulValidator: ((data: unknown): data is unknown => - // eslint-disable-next-line @typescript-eslint/no-explicit-any - true) as ResponseValidator, - failedValidator: ((data: unknown): data is unknown => { - throw new Error('Failed to validate response') - // eslint-disable-next-line @typescript-eslint/no-explicit-any - }) as ResponseValidator -}) - export const mockTokenInfo = (overrides?: Partial): TokenInfo => ({ active: true, access: [ diff --git a/packages/token-introspection/tsconfig.json b/packages/token-introspection/tsconfig.json index bc4252bfc2..b332b4dd94 100644 --- a/packages/token-introspection/tsconfig.json +++ b/packages/token-introspection/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.build.json", "compilerOptions": { + "composite": true, "lib": ["ES2020"], "outDir": "./dist", "rootDir": "./src", From cdcbf2297e79d3e1d8739e65427d42ea406cb7f6 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Mon, 17 Mar 2025 15:41:42 -0700 Subject: [PATCH 02/15] chore: make backend declarative --- packages/backend/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 608fe22f8c..aa14e833be 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "lib": ["ESNext"], "outDir": "./dist", - "rootDir": "./src" + "rootDir": "./src", + "declaration": true }, "include": ["src/**/*"], "ts-node": { From 4a9570a9f2c35f85928479cc54ddafbf6eee4243 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Tue, 18 Mar 2025 07:41:39 -0700 Subject: [PATCH 03/15] fix: remove build:deps from workflows --- .github/workflows/node-build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/node-build.yml b/.github/workflows/node-build.yml index d8dde494b3..d20b3ca867 100644 --- a/.github/workflows/node-build.yml +++ b/.github/workflows/node-build.yml @@ -28,7 +28,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup - - run: pnpm --filter backend build:deps - run: NODE_OPTIONS="--max-old-space-size=4096" pnpm --filter backend test:ci - name: AsyncAPI extension run: | @@ -54,7 +53,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup - - run: pnpm --filter auth build:deps - run: pnpm --filter auth test - name: AsyncAPI extension run: | From f299a8ba2252f9db86a9e95f19ab05ff6e3d0894 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Tue, 18 Mar 2025 13:54:22 -0700 Subject: [PATCH 04/15] chore: debug with postinstall stuff --- packages/auth/package.json | 2 +- packages/backend/package.json | 3 ++- packages/token-introspection/package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/auth/package.json b/packages/auth/package.json index 2b1216cf07..6ae953f5f5 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -15,7 +15,7 @@ "test:sincemain": "pnpm test -- --changedSince=main", "test:sincemain:cov": "pnpm test:sincemain --coverage", "prepack": "pnpm build", - "postinstall": "pnpm copy-op-schemas", + "postinstall": "pwd && pnpm copy-op-schemas", "copy-op-schemas": "cp ./node_modules/@interledger/open-payments/dist/openapi/specs/auth-server.yaml ./node_modules/@interledger/open-payments/dist/openapi/specs/schemas.yaml ./src/openapi/specs/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only src/index.ts" diff --git a/packages/backend/package.json b/packages/backend/package.json index b87bb89178..bf9cdfc2b9 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -12,7 +12,8 @@ "clean": "rm -fr dist/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", - "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only --require ./src/telemetry/index.ts src/index.ts" + "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only --require ./src/telemetry/index.ts src/index.ts", + "postinstall": "pwd" }, "devDependencies": { "@apollo/client": "^3.11.8", diff --git a/packages/token-introspection/package.json b/packages/token-introspection/package.json index c85deb3610..c2cfaa2332 100644 --- a/packages/token-introspection/package.json +++ b/packages/token-introspection/package.json @@ -11,7 +11,7 @@ "clean": "rm -fr dist/", "copy-op-schemas": "cp ./node_modules/@interledger/open-payments/dist/openapi/specs/auth-server.yaml ./node_modules/@interledger/open-payments/dist/openapi/specs/schemas.yaml ./src/openapi/specs/", "generate:types": "openapi-typescript ./src/openapi/specs/token-introspection.yaml --output src/openapi/generated/types.ts -t", - "postinstall": "pnpm copy-op-schemas", + "postinstall": "pwd && pnpm copy-op-schemas", "prepack": "pnpm build", "test": "jest --passWithNoTests", "test:cov": "pnpm test -- --coverage", From 60de43cf5e85c6cfdeb75883d4b36852504ad70f Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Tue, 18 Mar 2025 14:10:38 -0700 Subject: [PATCH 05/15] chore: more postinstall debugging --- packages/backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index bf9cdfc2b9..fa7500845e 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -13,7 +13,7 @@ "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only --require ./src/telemetry/index.ts src/index.ts", - "postinstall": "pwd" + "postinstall": "pwd && cd ./node_modules/token-introspection && pwd && ls" }, "devDependencies": { "@apollo/client": "^3.11.8", From 5eb9189b2e0c761e497586a1a07ef8f5a1084ea8 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Tue, 18 Mar 2025 15:00:55 -0700 Subject: [PATCH 06/15] chore: remove declaration flag from backend --- packages/backend/tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index aa14e833be..1b6510082e 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -3,8 +3,8 @@ "compilerOptions": { "lib": ["ESNext"], "outDir": "./dist", - "rootDir": "./src", - "declaration": true + "rootDir": "./src" + // "declaration": true }, "include": ["src/**/*"], "ts-node": { From fa4fe9e4f33829e6f9f6a0ab665f5d158a0919b9 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Mon, 24 Mar 2025 11:57:45 -0700 Subject: [PATCH 07/15] chore: debug with auth postinstall --- packages/auth/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/auth/package.json b/packages/auth/package.json index 6ae953f5f5..ba7d4888dc 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -15,7 +15,7 @@ "test:sincemain": "pnpm test -- --changedSince=main", "test:sincemain:cov": "pnpm test:sincemain --coverage", "prepack": "pnpm build", - "postinstall": "pwd && pnpm copy-op-schemas", + "postinstall": "pwd && pnpm copy-op-schemas && cd ./node_modules/token-introspection && pwd && ls", "copy-op-schemas": "cp ./node_modules/@interledger/open-payments/dist/openapi/specs/auth-server.yaml ./node_modules/@interledger/open-payments/dist/openapi/specs/schemas.yaml ./src/openapi/specs/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only src/index.ts" From 31cb1f297413a5b682ebd4f1f58334a6ffd0f764 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Tue, 25 Mar 2025 13:43:39 -0700 Subject: [PATCH 08/15] chore: make backend declarative --- packages/backend/tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 1b6510082e..aa14e833be 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -3,8 +3,8 @@ "compilerOptions": { "lib": ["ESNext"], "outDir": "./dist", - "rootDir": "./src" - // "declaration": true + "rootDir": "./src", + "declaration": true }, "include": ["src/**/*"], "ts-node": { From ee806dc1b7dea8502eb3ac624d1f9cd671c107a9 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Tue, 25 Mar 2025 14:21:33 -0700 Subject: [PATCH 09/15] chore: reinstate buiild:deps --- packages/backend/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index fa7500845e..8370682712 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,7 +8,8 @@ "test:sincemain:cov": "pnpm test:sincemain --coverage", "knex": "knex", "generate": "graphql-codegen --config codegen.yml", - "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build:deps": "pnpm --filter token-introspection build", + "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", From db1dca2cd09938c48a1c0808f894d3f0f4d780f2 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Wed, 26 Mar 2025 08:41:13 -0700 Subject: [PATCH 10/15] chore: add build:deps to workflow again --- .github/workflows/node-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/node-build.yml b/.github/workflows/node-build.yml index d20b3ca867..30f763f5b3 100644 --- a/.github/workflows/node-build.yml +++ b/.github/workflows/node-build.yml @@ -28,6 +28,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup + - run: pnpm --filter backend build:deps - run: NODE_OPTIONS="--max-old-space-size=4096" pnpm --filter backend test:ci - name: AsyncAPI extension run: | From 789c172e1b2661035a0ce50c1f2b42edbfeb44b5 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Wed, 26 Mar 2025 12:48:10 -0700 Subject: [PATCH 11/15] chore: update dockerfile.dev --- packages/backend/Dockerfile.dev | 1 - packages/backend/package.json | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/backend/Dockerfile.dev b/packages/backend/Dockerfile.dev index 2488781670..f024db696e 100644 --- a/packages/backend/Dockerfile.dev +++ b/packages/backend/Dockerfile.dev @@ -30,6 +30,5 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ --recursive \ --offline \ --frozen-lockfile -RUN pnpm --filter backend build:deps CMD pnpm --filter backend dev \ No newline at end of file diff --git a/packages/backend/package.json b/packages/backend/package.json index 8370682712..fa7500845e 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,8 +8,7 @@ "test:sincemain:cov": "pnpm test:sincemain --coverage", "knex": "knex", "generate": "graphql-codegen --config codegen.yml", - "build:deps": "pnpm --filter token-introspection build", - "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", From 03554f0692b3ed0a3debf6701a5c1b22d9784970 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Wed, 26 Mar 2025 14:13:45 -0700 Subject: [PATCH 12/15] chore: revert all build:deps --- packages/auth/package.json | 3 ++- packages/backend/Dockerfile.dev | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/auth/package.json b/packages/auth/package.json index ba7d4888dc..9bbc6d0f11 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -8,7 +8,8 @@ "scripts": { "knex": "knex", "generate": "graphql-codegen --config codegen.yml", - "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build:deps": "pnpm --filter token-introspection build", + "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "test": "NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --maxWorkers=50%", "test:cov": "pnpm test -- --coverage", diff --git a/packages/backend/Dockerfile.dev b/packages/backend/Dockerfile.dev index f024db696e..2488781670 100644 --- a/packages/backend/Dockerfile.dev +++ b/packages/backend/Dockerfile.dev @@ -30,5 +30,6 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ --recursive \ --offline \ --frozen-lockfile +RUN pnpm --filter backend build:deps CMD pnpm --filter backend dev \ No newline at end of file From 2662d538a3d9ad9aa27588bd3784d2bf1e804cf8 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Wed, 26 Mar 2025 14:42:55 -0700 Subject: [PATCH 13/15] chore: keep reverting build:deps --- packages/backend/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index fa7500845e..8370682712 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,7 +8,8 @@ "test:sincemain:cov": "pnpm test:sincemain --coverage", "knex": "knex", "generate": "graphql-codegen --config codegen.yml", - "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build:deps": "pnpm --filter token-introspection build", + "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", From 23d1f0c62f4e8c1f39919f8536800fcfa235b164 Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Wed, 26 Mar 2025 15:09:51 -0700 Subject: [PATCH 14/15] chore: add build:deps back to auht --- .github/workflows/node-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/node-build.yml b/.github/workflows/node-build.yml index 30f763f5b3..99d707452a 100644 --- a/.github/workflows/node-build.yml +++ b/.github/workflows/node-build.yml @@ -54,6 +54,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup + - run: pnpm --filter backend build:deps - run: pnpm --filter auth test - name: AsyncAPI extension run: | From 2cc30d2c3dcf820b2fac35b47270744d8db2954c Mon Sep 17 00:00:00 2001 From: Nathan Lie Date: Mon, 31 Mar 2025 14:16:04 -0700 Subject: [PATCH 15/15] fix: use build:deps again --- .github/workflows/node-build.yml | 2 +- packages/auth/package.json | 4 ++-- packages/auth/tsconfig.json | 7 +------ packages/backend/package.json | 3 +-- packages/backend/tsconfig.json | 10 ++-------- packages/token-introspection/package.json | 4 ++-- packages/token-introspection/tsconfig.json | 3 +-- 7 files changed, 10 insertions(+), 23 deletions(-) diff --git a/.github/workflows/node-build.yml b/.github/workflows/node-build.yml index 99d707452a..d8dde494b3 100644 --- a/.github/workflows/node-build.yml +++ b/.github/workflows/node-build.yml @@ -54,7 +54,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup - - run: pnpm --filter backend build:deps + - run: pnpm --filter auth build:deps - run: pnpm --filter auth test - name: AsyncAPI extension run: | diff --git a/packages/auth/package.json b/packages/auth/package.json index 9bbc6d0f11..143cc6bdf3 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -9,14 +9,14 @@ "knex": "knex", "generate": "graphql-codegen --config codegen.yml", "build:deps": "pnpm --filter token-introspection build", - "build": "pnpm build:deps && pnpm clean && tsc --build tsconfig.json && pnpm copy-files", + "build": "pnpm build:deps && pnpm clean && pnpm build:deps && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "test": "NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --maxWorkers=50%", "test:cov": "pnpm test -- --coverage", "test:sincemain": "pnpm test -- --changedSince=main", "test:sincemain:cov": "pnpm test:sincemain --coverage", "prepack": "pnpm build", - "postinstall": "pwd && pnpm copy-op-schemas && cd ./node_modules/token-introspection && pwd && ls", + "postinstall": "pnpm copy-op-schemas", "copy-op-schemas": "cp ./node_modules/@interledger/open-payments/dist/openapi/specs/auth-server.yaml ./node_modules/@interledger/open-payments/dist/openapi/specs/schemas.yaml ./src/openapi/specs/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only src/index.ts" diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json index dccaa20efa..707ef5cc80 100644 --- a/packages/auth/tsconfig.json +++ b/packages/auth/tsconfig.json @@ -9,10 +9,5 @@ "include": ["src/**/*"], "ts-node": { "swc": true - }, - "references": [ - { - "path": "../token-introspection" - } - ] + } } diff --git a/packages/backend/package.json b/packages/backend/package.json index 8370682712..7ecba85f8c 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -13,8 +13,7 @@ "clean": "rm -fr dist/", "copy-files": "cp src/graphql/schema.graphql dist/graphql/ && cp -r ./src/openapi ./dist/", "prepack": "pnpm build", - "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only --require ./src/telemetry/index.ts src/index.ts", - "postinstall": "pwd && cd ./node_modules/token-introspection && pwd && ls" + "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only --require ./src/telemetry/index.ts src/index.ts" }, "devDependencies": { "@apollo/client": "^3.11.8", diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index aa14e833be..0ea2a8b22f 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -3,16 +3,10 @@ "compilerOptions": { "lib": ["ESNext"], "outDir": "./dist", - "rootDir": "./src", - "declaration": true + "rootDir": "./src" }, "include": ["src/**/*"], "ts-node": { "swc": true - }, - "references": [ - { - "path": "../token-introspection" - } - ] + } } diff --git a/packages/token-introspection/package.json b/packages/token-introspection/package.json index c2cfaa2332..6c153f5dc5 100644 --- a/packages/token-introspection/package.json +++ b/packages/token-introspection/package.json @@ -8,10 +8,10 @@ ], "scripts": { "build": "pnpm clean && pnpm generate:types && tsc --build tsconfig.json", - "clean": "rm -fr dist/", + "clean": "rm -fr dist/ tsconfig.tsbuildinfo", "copy-op-schemas": "cp ./node_modules/@interledger/open-payments/dist/openapi/specs/auth-server.yaml ./node_modules/@interledger/open-payments/dist/openapi/specs/schemas.yaml ./src/openapi/specs/", "generate:types": "openapi-typescript ./src/openapi/specs/token-introspection.yaml --output src/openapi/generated/types.ts -t", - "postinstall": "pwd && pnpm copy-op-schemas", + "postinstall": "pnpm copy-op-schemas", "prepack": "pnpm build", "test": "jest --passWithNoTests", "test:cov": "pnpm test -- --coverage", diff --git a/packages/token-introspection/tsconfig.json b/packages/token-introspection/tsconfig.json index b332b4dd94..bd9105e444 100644 --- a/packages/token-introspection/tsconfig.json +++ b/packages/token-introspection/tsconfig.json @@ -4,8 +4,7 @@ "composite": true, "lib": ["ES2020"], "outDir": "./dist", - "rootDir": "./src", - "declaration": true + "rootDir": "./src" }, "include": ["src/**/*"], "exclude": ["**/*.test.ts", "src/test/*"]