@getcronit/pylon 2.8.0 → 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/context.d.ts +2 -0
- package/dist/index.js +5 -2
- package/dist/index.js.map +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,6 +32,22 @@ Pylon also provides a set of tools to help you build, test, and deploy your APIs
|
|
|
32
32
|
|
|
33
33
|
With Pylon, you can build APIs faster, with fewer errors, and with less code.
|
|
34
34
|
|
|
35
|
+
## Roadmap
|
|
36
|
+
|
|
37
|
+
We would love to hear your feedback and suggestions for new features. Please open an issue or join our Discord server to share your thoughts.
|
|
38
|
+
|
|
39
|
+
- [ ] **Documentation:** Improve the documentation and provide more examples.
|
|
40
|
+
- [ ] **Testing:** Add a test suite to ensure the stability of the framework. [#7](https://github.com/getcronit/pylon/issues/7)
|
|
41
|
+
- [ ] **Breaking Change Detection:** Implement a mechanism to detect breaking changes in the generated schema. [#8](https://github.com/getcronit/pylon/issues/8)
|
|
42
|
+
- [ ] **Date-Based Versioning:** Automatically version the service when backward-incompatible changes are made. This will ensure that clients are aware of the changes and can adapt accordingly. This should be similar to the way Shopify handles API versioning. [#9](https://github.com/getcronit/pylon/issues/9)
|
|
43
|
+
- [ ] **GraphQL Directives:** Allow users to define custom directives that can be used to modify the generated schema. These directives should then be applied to the service logic (schema) to provide additional functionality. More information can be found in the [GraphQL spec](https://spec.graphql.org/June2018/#sec-Type-System.Directives).
|
|
44
|
+
- [ ] **Support Custom Authentication:** Currently, Pylon only supports OIDC for ZITADEL for authentication. We would like to add support for different authentication methods, such as JWT, OAuth, and others. This will then be used by the ´requireAuth´ function to authenticate / authorize users. [#21](https://github.com/getcronit/pylon/issues/21)
|
|
45
|
+
- [ ] **Better Prisma Integration:** Improve the integration with Prisma to provide a more seamless experience when working with databases. This includes better support for relations, pagination, and other features provided by Prisma. The main pain point is that prisma does not include relations by default, so a lot of manual work is required to add them. To solve this, we would like to leverage the prisma client extensions to automatically resolve relations and provide paginatable connections.
|
|
46
|
+
- [ ] **Find Edge Cases:** Find edge cases where the generated schema does not match the service logic, or build errors occur. This will help to improve the overall stability of the framework and provide a better developer experience.
|
|
47
|
+
- [ ] **Fix the Sentry Integration:** Currently, the Sentry integration is not working as expected. We would like to fix this and provide better error tracking capabilities for Pylon users.
|
|
48
|
+
- [ ] **Integrate @getcronit/pylon-builder into @getcronit/pylon-dev:** The pylon-builder package is used to generate the schema from the service logic. Currently, this is a separate package that gets installed alongside the pylon-dev package. This means that there could be version mismatches between the two packages. To solve this, we would like to integrate the builder into the dev package so that they are always in sync. This will also make it easier to maintain and update the packages.
|
|
49
|
+
- [ ] **Spread the Word:** Spread the word about Pylon and get more people involved in the project. This includes writing blog posts, creating videos, and sharing the project on social media.
|
|
50
|
+
|
|
35
51
|
## Create
|
|
36
52
|
|
|
37
53
|
To create a new Pylon project, run the following command:
|
package/dist/context.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Context as HonoContext } from 'hono';
|
|
|
2
2
|
import type { Toucan } from 'toucan-js';
|
|
3
3
|
import { AuthState } from './auth';
|
|
4
4
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
5
|
+
import type { GraphQLResolveInfo } from 'graphql';
|
|
5
6
|
export interface Bindings {
|
|
6
7
|
NODE_ENV: string;
|
|
7
8
|
AUTH_PROJECT_ID?: string;
|
|
@@ -11,6 +12,7 @@ export interface Bindings {
|
|
|
11
12
|
export interface Variables {
|
|
12
13
|
auth: AuthState;
|
|
13
14
|
sentry: Toucan;
|
|
15
|
+
graphqlResolveInfo?: GraphQLResolveInfo;
|
|
14
16
|
}
|
|
15
17
|
export type Env = {
|
|
16
18
|
Bindings: Bindings;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
var __require = import.meta.require;
|
|
3
|
+
|
|
2
4
|
// src/define-pylon.ts
|
|
3
5
|
import * as Sentry from "@sentry/bun";
|
|
4
6
|
import consola from "consola";
|
|
@@ -107,6 +109,7 @@ var resolversToGraphQLResolvers = (resolvers, configureContext) => {
|
|
|
107
109
|
if (!ctx2) {
|
|
108
110
|
consola.warn("Context is not defined. Make sure AsyncLocalStorage is supported in your environment.");
|
|
109
111
|
}
|
|
112
|
+
ctx2?.set("graphqlResolveInfo", info);
|
|
110
113
|
const auth = ctx2?.get("auth");
|
|
111
114
|
if (auth?.active) {
|
|
112
115
|
scope.setUser({
|
|
@@ -752,7 +755,7 @@ var handler = (options) => {
|
|
|
752
755
|
if (!resolvers) {
|
|
753
756
|
const resolversPath = path2.join(process.cwd(), ".pylon", "resolvers.js");
|
|
754
757
|
if (resolversPath) {
|
|
755
|
-
resolvers =
|
|
758
|
+
resolvers = __require(resolversPath).resolvers;
|
|
756
759
|
}
|
|
757
760
|
}
|
|
758
761
|
const graphqlResolvers = resolversToGraphQLResolvers(graphql);
|
|
@@ -850,4 +853,4 @@ export {
|
|
|
850
853
|
ServiceError
|
|
851
854
|
};
|
|
852
855
|
|
|
853
|
-
//# debugId=
|
|
856
|
+
//# debugId=74580444FF33230964756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/define-pylon.ts", "../src/context.ts", "../src/auth/index.ts", "../src/auth/decorators/requireAuth.ts", "../src/create-decorator.ts", "../src/app/index.ts", "../src/app/handler/graphql-viewer-handler.ts", "../src/app/handler/pylon-handler.ts", "../src/app/envelop/use-sentry.ts", "../src/get-env.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import * as Sentry from '@sentry/bun'\nimport consola from 'consola'\nimport {\n FragmentDefinitionNode,\n GraphQLError,\n GraphQLErrorExtensions,\n GraphQLObjectType,\n GraphQLResolveInfo,\n SelectionSetNode\n} from 'graphql'\n\nimport {Context, asyncContext} from './context'\nimport {isAsyncIterable, Maybe} from 'graphql-yoga'\n\nexport interface Resolvers {\n Query: Record<string, any>\n Mutation?: Record<string, any>\n Subscription?: Record<string, any>\n}\n\ntype FunctionWrapper = (fn: (...args: any[]) => any) => (...args: any[]) => any\n\nfunction getAllPropertyNames(instance: any): string[] {\n const allProps = new Set<string>()\n\n // Traverse the prototype chain\n let currentObj: any = instance\n\n while (currentObj && currentObj !== Object.prototype) {\n // Get all own property names of the current object\n const ownProps = Object.getOwnPropertyNames(currentObj)\n\n // Add each property to the Set\n ownProps.forEach(prop => allProps.add(prop))\n\n // Move up the prototype chain\n currentObj = Object.getPrototypeOf(currentObj)\n }\n\n // Convert Set to array and filter out the constructor if desired\n return Array.from(allProps).filter(prop => prop !== 'constructor')\n}\n\nasync function wrapFunctionsRecursively(\n obj: any,\n wrapper: FunctionWrapper,\n that: any = null,\n selectionSet: SelectionSetNode['selections'] = [],\n info: GraphQLResolveInfo\n): Promise<any> {\n // Skip if the object is a Date object or any other special object.\n // Those objects are then handled by custom resolvers.\n if (obj === null || obj instanceof Date) {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return await Promise.all(\n obj.map(async item => {\n return await wrapFunctionsRecursively(\n item,\n wrapper,\n that,\n selectionSet,\n info\n )\n })\n )\n } else if (typeof obj === 'function') {\n return Sentry.startSpan(\n {\n name: obj.name,\n op: 'pylon.fn'\n },\n async () => {\n // @ts-ignore\n return await wrapper.call(that, obj, selectionSet, info)\n }\n )\n } else if (obj instanceof Promise) {\n return await wrapFunctionsRecursively(\n await obj,\n wrapper,\n that,\n selectionSet,\n info\n )\n } else if (isAsyncIterable(obj)) {\n return obj\n } else if (typeof obj === 'object') {\n that = obj\n\n const result: Record<string, any> = {}\n\n for (const key of getAllPropertyNames(obj)) {\n result[key] = await wrapFunctionsRecursively(\n obj[key],\n wrapper,\n that,\n selectionSet,\n info\n )\n }\n\n return result\n } else {\n return await obj\n }\n}\nfunction spreadFunctionArguments<T extends (...args: any[]) => any>(fn: T) {\n return (otherArgs: Record<string, any>, c: any, info: GraphQLResolveInfo) => {\n const selections = arguments[1] as SelectionSetNode['selections']\n const realInfo = arguments[2] as GraphQLResolveInfo\n\n let args: Record<string, any> = {}\n\n if (info) {\n const type = info.parentType\n\n const field = type.getFields()[info.fieldName]\n\n const fieldArguments = field?.args\n\n const preparedArguments = fieldArguments?.reduce(\n (acc: {[x: string]: undefined}, arg: {name: string | number}) => {\n if (otherArgs[arg.name] !== undefined) {\n acc[arg.name] = otherArgs[arg.name]\n } else {\n acc[arg.name] = undefined\n }\n\n return acc\n },\n {} as Record<string, any>\n )\n\n if (preparedArguments) {\n args = preparedArguments\n }\n } else {\n args = otherArgs\n }\n\n const orderedArgs = Object.keys(args).map(key => args[key])\n\n const that = this || {}\n\n const result = wrapFunctionsRecursively(\n fn.call(that, ...orderedArgs),\n spreadFunctionArguments,\n this,\n selections,\n realInfo\n )\n\n return result as ReturnType<typeof fn>\n }\n}\n\n/**\n * Converts a set of resolvers into a corresponding set of GraphQL resolvers.\n * @param resolvers The original resolvers.\n * @returns The converted GraphQL resolvers.\n */\nexport const resolversToGraphQLResolvers = (\n resolvers: Resolvers,\n configureContext?: (context: Context) => Context\n): Resolvers => {\n // Define a root resolver function that maps a given resolver function or object to a GraphQL resolver.\n const rootGraphqlResolver =\n (fn: Function | object | Promise<Function> | Promise<object>) =>\n async (\n _: object,\n args: Record<string, any>,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => {\n return Sentry.withScope(async scope => {\n const ctx = asyncContext.getStore()\n\n if (!ctx) {\n consola.warn(\n 'Context is not defined. Make sure AsyncLocalStorage is supported in your environment.'\n )\n }\n\n const auth = ctx?.get('auth')\n\n if (auth?.active) {\n scope.setUser({\n id: auth.sub,\n username: auth.preferred_username,\n email: auth.email,\n details: auth\n })\n }\n\n // get query or mutation field\n\n let type: Maybe<GraphQLObjectType> | null = null\n\n switch (info.operation.operation) {\n case 'query':\n type = info.schema.getQueryType()\n break\n case 'mutation':\n type = info.schema.getMutationType()\n break\n case 'subscription':\n type = info.schema.getSubscriptionType()\n break\n default:\n throw new Error('Unknown operation')\n }\n\n const field = type?.getFields()[info.fieldName]\n\n // Get the list of arguments expected by the current query field.\n const fieldArguments = field?.args || []\n\n // Prepare the arguments for the resolver function call by adding any missing arguments with an undefined value.\n const preparedArguments = fieldArguments.reduce(\n (acc: {[x: string]: undefined}, arg: {name: string | number}) => {\n if (args[arg.name] !== undefined) {\n acc[arg.name] = args[arg.name]\n } else {\n acc[arg.name] = undefined\n }\n\n return acc\n },\n {} as Record<string, any>\n )\n\n // Determine the resolver function to call (either the given function or the wrappedWithContext function if it exists).\n let inner = await fn\n\n let baseSelectionSet: SelectionSetNode['selections'] = []\n\n // Find the selection set for the current field.\n for (const selection of info.operation.selectionSet.selections) {\n if (\n selection.kind === 'Field' &&\n selection.name.value === info.fieldName\n ) {\n baseSelectionSet = selection.selectionSet?.selections || []\n }\n }\n\n // Wrap the resolver function with any required middleware.\n const wrappedFn = await wrapFunctionsRecursively(\n inner,\n spreadFunctionArguments,\n this,\n baseSelectionSet,\n info\n )\n\n // Call the resolver function with the prepared arguments.\n if (typeof wrappedFn !== 'function') {\n return wrappedFn\n }\n\n const res = await wrappedFn(preparedArguments)\n\n return res\n })\n }\n\n // Convert the Query and Mutation resolvers to GraphQL resolvers.\n const graphqlResolvers = {} as Resolvers\n\n // Remove empty resolvers\n for (const key of Object.keys(resolvers.Query)) {\n if (!resolvers.Query[key]) {\n delete resolvers.Query[key]\n }\n }\n\n if (resolvers.Query && Object.keys(resolvers.Query).length > 0) {\n for (const [key, value] of Object.entries(resolvers.Query)) {\n if (!graphqlResolvers.Query) {\n graphqlResolvers.Query = {}\n }\n\n graphqlResolvers.Query[key] = rootGraphqlResolver(\n value as Function | object\n )\n }\n }\n\n if (resolvers.Mutation && Object.keys(resolvers.Mutation).length > 0) {\n if (!graphqlResolvers.Mutation) {\n graphqlResolvers.Mutation = {}\n }\n\n for (const [key, value] of Object.entries(resolvers.Mutation)) {\n graphqlResolvers.Mutation[key] = rootGraphqlResolver(\n value as Function | object\n )\n }\n }\n\n if (\n resolvers.Subscription &&\n Object.keys(resolvers.Subscription).length > 0\n ) {\n if (!graphqlResolvers.Subscription) {\n graphqlResolvers.Subscription = {}\n }\n\n for (const [key, value] of Object.entries(resolvers.Subscription)) {\n graphqlResolvers.Subscription[key] = {\n subscribe: rootGraphqlResolver(value as Function | object),\n resolve: (payload: any) => payload\n }\n }\n }\n\n // Query root type must be provided.\n if (!graphqlResolvers.Query) {\n // Custom Error for Query root type must be provided.\n\n throw new Error(`At least one 'Query' resolver must be provided.\n\nExample:\n\nexport const graphql = {\n Query: {\n // Define at least one query resolver here\n hello: () => 'world'\n }\n}\n`)\n }\n\n // Add extra resolvers (e.g. custom scalars) to the GraphQL resolvers.\n for (const key of Object.keys(resolvers)) {\n if (key !== 'Query' && key !== 'Mutation' && key !== 'Subscription') {\n graphqlResolvers[key] = resolvers[key]\n }\n }\n\n return graphqlResolvers\n}\n\nexport class ServiceError extends GraphQLError {\n extensions: GraphQLErrorExtensions\n\n constructor(\n message: string,\n extensions: {\n code: string\n statusCode: number\n details?: Record<string, any>\n },\n error?: Error\n ) {\n super(message, {\n originalError: error\n })\n this.extensions = extensions\n this.cause = error\n }\n}\n",
|
|
6
|
-
"import {Context as HonoContext} from 'hono'\nimport type {Toucan} from 'toucan-js'\nimport {AuthState} from './auth'\nimport {AsyncLocalStorage} from 'async_hooks'\nimport {sendFunctionEvent} from '@getcronit/pylon-telemetry'\nimport {env} from 'hono/adapter'\n\nexport interface Bindings {\n NODE_ENV: string\n AUTH_PROJECT_ID?: string\n AUTH_KEY?: string\n AUTH_ISSUER?: string\n}\n\nexport interface Variables {\n auth: AuthState\n sentry: Toucan\n}\n\nexport type Env = {\n Bindings: Bindings\n Variables: Variables\n}\n\nexport type Context = HonoContext<Env, string, {}>\n\nexport const asyncContext = new AsyncLocalStorage<Context>()\n\nexport const getContext = () => {\n const start = Date.now()\n const ctx = asyncContext.getStore()\n\n sendFunctionEvent({\n name: 'getContext',\n duration: Date.now() - start\n }).then(() => {})\n\n if (!ctx) {\n throw new Error('Context not defined')\n }\n\n ctx.env = env(ctx)\n\n return ctx\n}\n\nexport const setContext = (context: Context) => {\n return asyncContext.enterWith(context)\n}\n",
|
|
7
|
-
"import {MiddlewareHandler} from 'hono'\nimport jwt from 'jsonwebtoken'\nimport type {IdTokenClaims, IntrospectionResponse} from 'openid-client'\nimport path from 'path'\nimport {HTTPException} from 'hono/http-exception'\nimport {
|
|
5
|
+
"import * as Sentry from '@sentry/bun'\nimport consola from 'consola'\nimport {\n FragmentDefinitionNode,\n GraphQLError,\n GraphQLErrorExtensions,\n GraphQLObjectType,\n GraphQLResolveInfo,\n SelectionSetNode\n} from 'graphql'\n\nimport {Context, asyncContext} from './context'\nimport {isAsyncIterable, Maybe} from 'graphql-yoga'\n\nexport interface Resolvers {\n Query: Record<string, any>\n Mutation?: Record<string, any>\n Subscription?: Record<string, any>\n}\n\ntype FunctionWrapper = (fn: (...args: any[]) => any) => (...args: any[]) => any\n\nfunction getAllPropertyNames(instance: any): string[] {\n const allProps = new Set<string>()\n\n // Traverse the prototype chain\n let currentObj: any = instance\n\n while (currentObj && currentObj !== Object.prototype) {\n // Get all own property names of the current object\n const ownProps = Object.getOwnPropertyNames(currentObj)\n\n // Add each property to the Set\n ownProps.forEach(prop => allProps.add(prop))\n\n // Move up the prototype chain\n currentObj = Object.getPrototypeOf(currentObj)\n }\n\n // Convert Set to array and filter out the constructor if desired\n return Array.from(allProps).filter(prop => prop !== 'constructor')\n}\n\nasync function wrapFunctionsRecursively(\n obj: any,\n wrapper: FunctionWrapper,\n that: any = null,\n selectionSet: SelectionSetNode['selections'] = [],\n info: GraphQLResolveInfo\n): Promise<any> {\n // Skip if the object is a Date object or any other special object.\n // Those objects are then handled by custom resolvers.\n if (obj === null || obj instanceof Date) {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return await Promise.all(\n obj.map(async item => {\n return await wrapFunctionsRecursively(\n item,\n wrapper,\n that,\n selectionSet,\n info\n )\n })\n )\n } else if (typeof obj === 'function') {\n return Sentry.startSpan(\n {\n name: obj.name,\n op: 'pylon.fn'\n },\n async () => {\n // @ts-ignore\n return await wrapper.call(that, obj, selectionSet, info)\n }\n )\n } else if (obj instanceof Promise) {\n return await wrapFunctionsRecursively(\n await obj,\n wrapper,\n that,\n selectionSet,\n info\n )\n } else if (isAsyncIterable(obj)) {\n return obj\n } else if (typeof obj === 'object') {\n that = obj\n\n const result: Record<string, any> = {}\n\n for (const key of getAllPropertyNames(obj)) {\n result[key] = await wrapFunctionsRecursively(\n obj[key],\n wrapper,\n that,\n selectionSet,\n info\n )\n }\n\n return result\n } else {\n return await obj\n }\n}\nfunction spreadFunctionArguments<T extends (...args: any[]) => any>(fn: T) {\n return (otherArgs: Record<string, any>, c: any, info: GraphQLResolveInfo) => {\n const selections = arguments[1] as SelectionSetNode['selections']\n const realInfo = arguments[2] as GraphQLResolveInfo\n\n let args: Record<string, any> = {}\n\n if (info) {\n const type = info.parentType\n\n const field = type.getFields()[info.fieldName]\n\n const fieldArguments = field?.args\n\n const preparedArguments = fieldArguments?.reduce(\n (acc: {[x: string]: undefined}, arg: {name: string | number}) => {\n if (otherArgs[arg.name] !== undefined) {\n acc[arg.name] = otherArgs[arg.name]\n } else {\n acc[arg.name] = undefined\n }\n\n return acc\n },\n {} as Record<string, any>\n )\n\n if (preparedArguments) {\n args = preparedArguments\n }\n } else {\n args = otherArgs\n }\n\n const orderedArgs = Object.keys(args).map(key => args[key])\n\n const that = this || {}\n\n const result = wrapFunctionsRecursively(\n fn.call(that, ...orderedArgs),\n spreadFunctionArguments,\n this,\n selections,\n realInfo\n )\n\n return result as ReturnType<typeof fn>\n }\n}\n\n/**\n * Converts a set of resolvers into a corresponding set of GraphQL resolvers.\n * @param resolvers The original resolvers.\n * @returns The converted GraphQL resolvers.\n */\nexport const resolversToGraphQLResolvers = (\n resolvers: Resolvers,\n configureContext?: (context: Context) => Context\n): Resolvers => {\n // Define a root resolver function that maps a given resolver function or object to a GraphQL resolver.\n const rootGraphqlResolver =\n (fn: Function | object | Promise<Function> | Promise<object>) =>\n async (\n _: object,\n args: Record<string, any>,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => {\n return Sentry.withScope(async scope => {\n const ctx = asyncContext.getStore()\n\n\n if (!ctx) {\n consola.warn(\n 'Context is not defined. Make sure AsyncLocalStorage is supported in your environment.'\n )\n }\n\n ctx?.set(\"graphqlResolveInfo\", info)\n\n const auth = ctx?.get('auth')\n\n if (auth?.active) {\n scope.setUser({\n id: auth.sub,\n username: auth.preferred_username,\n email: auth.email,\n details: auth\n })\n }\n\n // get query or mutation field\n\n let type: Maybe<GraphQLObjectType> | null = null\n\n switch (info.operation.operation) {\n case 'query':\n type = info.schema.getQueryType()\n break\n case 'mutation':\n type = info.schema.getMutationType()\n break\n case 'subscription':\n type = info.schema.getSubscriptionType()\n break\n default:\n throw new Error('Unknown operation')\n }\n\n const field = type?.getFields()[info.fieldName]\n\n // Get the list of arguments expected by the current query field.\n const fieldArguments = field?.args || []\n\n // Prepare the arguments for the resolver function call by adding any missing arguments with an undefined value.\n const preparedArguments = fieldArguments.reduce(\n (acc: {[x: string]: undefined}, arg: {name: string | number}) => {\n if (args[arg.name] !== undefined) {\n acc[arg.name] = args[arg.name]\n } else {\n acc[arg.name] = undefined\n }\n\n return acc\n },\n {} as Record<string, any>\n )\n\n // Determine the resolver function to call (either the given function or the wrappedWithContext function if it exists).\n let inner = await fn\n\n let baseSelectionSet: SelectionSetNode['selections'] = []\n\n // Find the selection set for the current field.\n for (const selection of info.operation.selectionSet.selections) {\n if (\n selection.kind === 'Field' &&\n selection.name.value === info.fieldName\n ) {\n baseSelectionSet = selection.selectionSet?.selections || []\n }\n }\n\n // Wrap the resolver function with any required middleware.\n const wrappedFn = await wrapFunctionsRecursively(\n inner,\n spreadFunctionArguments,\n this,\n baseSelectionSet,\n info\n )\n\n // Call the resolver function with the prepared arguments.\n if (typeof wrappedFn !== 'function') {\n return wrappedFn\n }\n\n const res = await wrappedFn(preparedArguments)\n\n return res\n })\n }\n\n // Convert the Query and Mutation resolvers to GraphQL resolvers.\n const graphqlResolvers = {} as Resolvers\n\n // Remove empty resolvers\n for (const key of Object.keys(resolvers.Query)) {\n if (!resolvers.Query[key]) {\n delete resolvers.Query[key]\n }\n }\n\n if (resolvers.Query && Object.keys(resolvers.Query).length > 0) {\n for (const [key, value] of Object.entries(resolvers.Query)) {\n if (!graphqlResolvers.Query) {\n graphqlResolvers.Query = {}\n }\n\n graphqlResolvers.Query[key] = rootGraphqlResolver(\n value as Function | object\n )\n }\n }\n\n if (resolvers.Mutation && Object.keys(resolvers.Mutation).length > 0) {\n if (!graphqlResolvers.Mutation) {\n graphqlResolvers.Mutation = {}\n }\n\n for (const [key, value] of Object.entries(resolvers.Mutation)) {\n graphqlResolvers.Mutation[key] = rootGraphqlResolver(\n value as Function | object\n )\n }\n }\n\n if (\n resolvers.Subscription &&\n Object.keys(resolvers.Subscription).length > 0\n ) {\n if (!graphqlResolvers.Subscription) {\n graphqlResolvers.Subscription = {}\n }\n\n for (const [key, value] of Object.entries(resolvers.Subscription)) {\n graphqlResolvers.Subscription[key] = {\n subscribe: rootGraphqlResolver(value as Function | object),\n resolve: (payload: any) => payload\n }\n }\n }\n\n // Query root type must be provided.\n if (!graphqlResolvers.Query) {\n // Custom Error for Query root type must be provided.\n\n throw new Error(`At least one 'Query' resolver must be provided.\n\nExample:\n\nexport const graphql = {\n Query: {\n // Define at least one query resolver here\n hello: () => 'world'\n }\n}\n`)\n }\n\n // Add extra resolvers (e.g. custom scalars) to the GraphQL resolvers.\n for (const key of Object.keys(resolvers)) {\n if (key !== 'Query' && key !== 'Mutation' && key !== 'Subscription') {\n graphqlResolvers[key] = resolvers[key]\n }\n }\n\n return graphqlResolvers\n}\n\nexport class ServiceError extends GraphQLError {\n extensions: GraphQLErrorExtensions\n\n constructor(\n message: string,\n extensions: {\n code: string\n statusCode: number\n details?: Record<string, any>\n },\n error?: Error\n ) {\n super(message, {\n originalError: error\n })\n this.extensions = extensions\n this.cause = error\n }\n}\n",
|
|
6
|
+
"import {Context as HonoContext} from 'hono'\nimport type {Toucan} from 'toucan-js'\nimport {AuthState} from './auth'\nimport {AsyncLocalStorage} from 'async_hooks'\nimport {sendFunctionEvent} from '@getcronit/pylon-telemetry'\nimport {env} from 'hono/adapter'\nimport type { GraphQLResolveInfo } from 'graphql'\n\nexport interface Bindings {\n NODE_ENV: string\n AUTH_PROJECT_ID?: string\n AUTH_KEY?: string\n AUTH_ISSUER?: string\n}\n\nexport interface Variables {\n auth: AuthState\n sentry: Toucan\n graphqlResolveInfo?: GraphQLResolveInfo\n}\n\nexport type Env = {\n Bindings: Bindings\n Variables: Variables\n}\n\nexport type Context = HonoContext<Env, string, {}>\n\nexport const asyncContext = new AsyncLocalStorage<Context>()\n\nexport const getContext = () => {\n const start = Date.now()\n const ctx = asyncContext.getStore()\n\n sendFunctionEvent({\n name: 'getContext',\n duration: Date.now() - start\n }).then(() => {})\n\n if (!ctx) {\n throw new Error('Context not defined')\n }\n\n ctx.env = env(ctx)\n\n return ctx\n}\n\nexport const setContext = (context: Context) => {\n return asyncContext.enterWith(context)\n}\n",
|
|
7
|
+
"import {MiddlewareHandler} from 'hono'\nimport jwt from 'jsonwebtoken'\nimport type {IdTokenClaims, IntrospectionResponse} from 'openid-client'\nimport path from 'path'\nimport {HTTPException} from 'hono/http-exception'\nimport {ContentfulStatusCode} from 'hono/utils/http-status'\nimport {env} from 'hono/adapter'\nimport * as Sentry from '@sentry/bun'\nimport {existsSync, readFileSync} from 'fs'\nimport {sendFunctionEvent} from '@getcronit/pylon-telemetry'\n\nexport type AuthState = IntrospectionResponse &\n IdTokenClaims & {\n roles: string[]\n }\n\nconst authInitialize = () => {\n // Load private key file from cwd\n const authKeyFilePath = path.join(process.cwd(), 'key.json')\n\n // Load private key file from cwd\n let API_PRIVATE_KEY_FILE:\n | {\n type: 'application'\n keyId: string\n key: string\n appId: string\n clientId: string\n }\n | undefined = undefined\n\n if (existsSync(authKeyFilePath)) {\n try {\n API_PRIVATE_KEY_FILE = JSON.parse(readFileSync(authKeyFilePath, 'utf-8'))\n } catch (error) {\n throw new Error(\n 'Error while reading key file. Make sure it is valid JSON'\n )\n }\n }\n\n const middleware: MiddlewareHandler<{\n Variables: {\n auth: AuthState\n }\n }> = Sentry.startSpan(\n {\n name: 'AuthMiddleware',\n op: 'auth'\n },\n () =>\n async function (ctx, next) {\n const AUTH_ISSUER = env(ctx).AUTH_ISSUER\n\n if (!AUTH_ISSUER) {\n throw new Error('AUTH_ISSUER is not set')\n }\n\n if (!API_PRIVATE_KEY_FILE) {\n // If the private key file is not loaded, try to load it from the environment\n const AUTH_KEY = env(ctx).AUTH_KEY as string | undefined\n\n API_PRIVATE_KEY_FILE = AUTH_KEY ? JSON.parse(AUTH_KEY) : undefined\n }\n\n if (!API_PRIVATE_KEY_FILE) {\n throw new Error(\n 'You have initialized the auth middleware without a private key file'\n )\n }\n\n const AUTH_PROJECT_ID = env(ctx).AUTH_PROJECT_ID\n\n const ZITADEL_INTROSPECTION_URL = `${AUTH_ISSUER}/oauth/v2/introspect`\n\n async function getRolesFromToken(tokenString: string) {\n const response = await fetch(\n `${AUTH_ISSUER}/auth/v1/usergrants/me/_search`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokenString}`\n }\n }\n )\n\n const data = (await response.json()) as any\n\n const userRoles = (data.result?.map((grant: any) => {\n return (grant.roles || []).map((role: any) => {\n return `${grant.projectId}:${role}`\n })\n }) || []) as string[][]\n\n const projectScopedRoles = userRoles.flat()\n\n const rolesSet = new Set(projectScopedRoles)\n\n // Add unscoped roles based on project id\n // This is useful so that it is not necessary to specify the project id for every role check\n if (AUTH_PROJECT_ID) {\n for (const role of projectScopedRoles) {\n const [projectId, ...roleNameParts] = role.split(':')\n\n const roleName = roleNameParts.join(':')\n\n if (projectId === AUTH_PROJECT_ID) {\n rolesSet.add(roleName)\n }\n }\n }\n\n return Array.from(rolesSet)\n }\n\n async function introspectToken(\n tokenString: string\n ): Promise<AuthState> {\n if (!API_PRIVATE_KEY_FILE) {\n throw new Error('Internal error: API_PRIVATE_KEY_FILE is not set')\n }\n\n // Create JWT for client assertion\n const payload = {\n iss: API_PRIVATE_KEY_FILE.clientId,\n sub: API_PRIVATE_KEY_FILE.clientId,\n aud: AUTH_ISSUER,\n exp: Math.floor(Date.now() / 1000) + 60 * 60, // Expires in 1 hour\n iat: Math.floor(Date.now() / 1000)\n }\n\n const headers = {\n alg: 'RS256',\n kid: API_PRIVATE_KEY_FILE.keyId\n }\n const jwtToken = jwt.sign(payload, API_PRIVATE_KEY_FILE.key, {\n algorithm: 'RS256',\n header: headers\n })\n\n const scopeSet = new Set<string>()\n\n scopeSet.add('openid')\n scopeSet.add('profile')\n scopeSet.add('email')\n\n if (AUTH_PROJECT_ID) {\n scopeSet.add(\n `urn:zitadel:iam:org:project:id:${AUTH_PROJECT_ID}:aud`\n )\n }\n\n const scope = Array.from(scopeSet).join(' ')\n\n // Send introspection request\n const body = new URLSearchParams({\n client_assertion_type:\n 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',\n client_assertion: jwtToken,\n token: tokenString,\n scope\n }).toString()\n\n try {\n const response = await fetch(ZITADEL_INTROSPECTION_URL, {\n method: 'POST',\n headers: {'Content-Type': 'application/x-www-form-urlencoded'},\n body\n })\n\n if (!response.ok) {\n throw new Error('Network response was not ok')\n }\n\n const tokenData = (await response.json()) as IntrospectionResponse\n\n const roles = await getRolesFromToken(tokenString)\n\n const state = {\n ...tokenData,\n roles\n } as AuthState\n\n return state\n } catch (error) {\n console.error('Error while introspecting token', error)\n throw new Error('Token introspection failed')\n }\n }\n\n let token: string | undefined = undefined\n\n if (ctx.req.header('Authorization')) {\n const authHeader = ctx.req.header('Authorization')\n\n if (authHeader) {\n const parts = authHeader.split(' ')\n\n if (parts.length === 2 && parts[0] === 'Bearer') {\n token = parts[1]\n }\n }\n }\n\n if (!token) {\n const queryToken = ctx.req.query('token')\n\n if (queryToken) {\n token = queryToken\n }\n }\n\n if (token) {\n const auth = await introspectToken(token)\n\n if (auth.active) {\n ctx.set('auth', auth)\n\n Sentry.setUser({\n id: auth.sub,\n username: auth.preferred_username,\n email: auth.email,\n details: auth\n })\n }\n }\n\n return next()\n }\n )\n\n sendFunctionEvent({\n name: 'authInitialize',\n duration: 0\n }).then(() => {})\n\n return middleware\n}\n\nexport type AuthRequireChecks = {\n roles?: string[]\n}\n\nconst authRequire = (checks: AuthRequireChecks = {}) => {\n sendFunctionEvent({\n name: 'authRequire',\n duration: 0\n }).then(() => {})\n\n const middleware: MiddlewareHandler<{\n Variables: {\n auth?: AuthState\n }\n }> = async (ctx, next) => {\n const AUTH_PROJECT_ID = env(ctx).AUTH_PROJECT_ID\n\n // Check if user is authenticated\n const auth = ctx.get('auth')\n\n if (!auth) {\n throw new HTTPException(401, {\n message: 'Authentication required'\n })\n }\n\n if (checks.roles) {\n const roles = auth.roles\n\n const hasRole = checks.roles.some(role => {\n return (\n roles.includes(role) || roles.includes(`${AUTH_PROJECT_ID}:${role}`)\n )\n })\n\n if (!hasRole) {\n const resError = new Response('Forbidden', {\n status: 403,\n statusText: 'Forbidden',\n headers: {\n 'Missing-Roles': checks.roles.join(','),\n 'Obtained-Roles': roles.join(',')\n }\n })\n\n throw new HTTPException(resError.status as ContentfulStatusCode, {res: resError})\n }\n }\n\n return next()\n }\n\n sendFunctionEvent({\n name: 'authRequire',\n duration: 0\n }).then(() => {})\n\n return middleware\n}\n\nexport const auth = {\n initialize: authInitialize,\n require: authRequire\n}\n\nexport {requireAuth} from './decorators/requireAuth'\n",
|
|
8
8
|
"import {sendFunctionEvent} from '@getcronit/pylon-telemetry'\nimport {HTTPException} from 'hono/http-exception'\n\nimport {AuthRequireChecks, auth} from '..'\nimport {getContext} from '../../context'\nimport {ServiceError} from '../../define-pylon'\nimport {createDecorator} from '../../create-decorator'\n\nexport function requireAuth(checks?: AuthRequireChecks) {\n sendFunctionEvent({\n name: 'requireAuth',\n duration: 0\n }).then(() => {})\n\n const checkAuth = async (c: any) => {\n const ctx = await c\n\n try {\n await auth.require(checks)(ctx, async () => {})\n } catch (e) {\n if (e instanceof HTTPException) {\n if (e.status === 401) {\n throw new ServiceError(e.message, {\n statusCode: 401,\n code: 'AUTH_REQUIRED'\n })\n } else if (e.status === 403) {\n const res = e.getResponse()\n\n throw new ServiceError(res.statusText, {\n statusCode: res.status,\n code: 'AUTHORIZATION_REQUIRED',\n details: {\n missingRoles: res.headers.get('Missing-Roles')?.split(','),\n obtainedRoles: res.headers.get('Obtained-Roles')?.split(',')\n }\n })\n } else {\n throw e\n }\n }\n\n throw e\n }\n }\n\n return createDecorator(async () => {\n const ctx = getContext()\n\n await checkAuth(ctx)\n })\n}\n",
|
|
9
9
|
"import {sendFunctionEvent} from '@getcronit/pylon-telemetry'\n\nexport function createDecorator(callback: (...args: any[]) => Promise<void>) {\n sendFunctionEvent({\n name: 'createDecorator',\n duration: 0\n }).then(() => {})\n\n function MyDecorator<T extends (...args: any[]) => any>(\n target: Object,\n propertyKey: string | symbol\n ): void\n\n function MyDecorator<T>(fn: T): T\n\n function MyDecorator<T>(\n arg1: Object | T,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): any {\n if (descriptor) {\n const originalMethod = descriptor.value as T\n\n descriptor.value = async function (...args: any[]) {\n await callback(...args)\n return (originalMethod as any).apply(this, args)\n }\n\n return descriptor\n } else {\n if (!descriptor) {\n if (propertyKey === undefined) {\n const originalFunction = arg1 as T\n\n return async function (\n ...args: Parameters<any>\n ): Promise<ReturnType<any>> {\n await callback(...args)\n return (originalFunction as any)(...args)\n } as T\n }\n\n let value: any = arg1[propertyKey]\n Object.defineProperty(arg1, propertyKey, {\n get: function () {\n return async function (...args: Parameters<any>) {\n await callback(...args)\n if (typeof value === 'function') {\n return value(...args)\n }\n\n return value\n }\n },\n set: function (newValue) {\n value = newValue\n },\n enumerable: true,\n configurable: true\n })\n\n return\n }\n }\n }\n\n return MyDecorator\n}\n",
|
|
10
10
|
"import {Hono} from 'hono'\nimport {logger} from 'hono/logger'\nimport {sentry} from '@hono/sentry'\n\nimport {asyncContext, Env} from '../context'\nimport {graphqlViewerHandler} from './handler/graphql-viewer-handler'\n\nexport const app = new Hono<Env>()\n\napp.use('*', sentry())\n\napp.use('*', async (c, next) => {\n return new Promise((resolve, reject) => {\n asyncContext.run(c, async () => {\n try {\n resolve(await next()) // You can pass the value you want to return here\n } catch (error) {\n reject(error) // If an error occurs during the execution of `next()`, reject the Promise\n }\n })\n })\n})\n\napp.use('*', logger())\n\napp.use((c, next) => {\n // @ts-ignore\n c.req.id = crypto.randomUUID()\n return next()\n})\n\napp.get('/viewer', graphqlViewerHandler)\n",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"import {sendFunctionEvent} from '@getcronit/pylon-telemetry'\nimport {asyncContext, Context} from './context'\n\nexport function getEnv() {\n const start = Date.now()\n const skipTracing = arguments[0] === true\n\n try {\n const context = asyncContext.getStore() as Context\n\n // Fall back to process.env or an empty object if no context is available\n // This is useful for testing\n // ref: https://hono.dev/docs/guides/testing#env\n return context.env || process.env || {}\n } catch {\n return process.env\n } finally {\n if (!skipTracing) {\n sendFunctionEvent({\n name: 'getEnv',\n duration: Date.now() - start\n }).then(() => {})\n }\n }\n}\n",
|
|
15
15
|
"import {YogaServerOptions} from 'graphql-yoga'\nimport {Context} from './context.js'\n\nexport {ServiceError} from './define-pylon.js'\nexport * from './auth/index.js'\nexport {\n Context,\n Env,\n Variables,\n Bindings,\n asyncContext,\n getContext,\n setContext\n} from './context.js'\nexport {app} from './app/index.js'\nexport {handler} from './app/handler/pylon-handler.js'\nexport {getEnv} from './get-env.js'\nexport {createDecorator} from './create-decorator.js'\nexport {createPubSub as experimentalCreatePubSub} from 'graphql-yoga'\n\nexport type PylonConfig = Pick<YogaServerOptions<Context, Context>, 'plugins'>\n\nexport type ID = string & {readonly brand?: unique symbol}\nexport type Int = number & {readonly brand?: unique symbol}\nexport type Float = number & {readonly brand?: unique symbol}\n"
|
|
16
16
|
],
|
|
17
|
-
"mappings": "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",
|
|
18
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "74580444FF33230964756E2164756E21",
|
|
19
19
|
"names": []
|
|
20
20
|
}
|