@getcronit/pylon 2.2.0 → 2.3.0

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 ADDED
@@ -0,0 +1,192 @@
1
+ ![Pylon cover](https://github.com/user-attachments/assets/c28e49b2-5672-4849-826e-8b2eab0360cc)
2
+
3
+ <div align="center"><strong>Pylon</strong></div>
4
+ <div align="center">The next generation of building APIs.<br />Automatic schema generation for your service logic.</div>
5
+ <br />
6
+ <div align="center">
7
+ <a href="https://pylon.cronit.io">Website</a>
8
+ <span> · </span>
9
+ <a href="https://github.com/getcronit/pylon">GitHub</a>
10
+ <span> · </span>
11
+ <a href="https://discord.com/invite/cbJjkVrnHe">Discord</a>
12
+
13
+ <br />
14
+ <br />
15
+
16
+ [![Documentation](https://img.shields.io/badge/documentation-documentation?color=000000)](https://pylon.cronit.io/docs)
17
+ [![NPM](https://img.shields.io/npm/v/%40getcronit%2Fpylon)](https://www.npmjs.com/package/@getcronit/pylon)
18
+ [![Discord](https://img.shields.io/discord/1270327745662029854)](https://discord.com/invite/cbJjkVrnHe)
19
+
20
+ </div>
21
+
22
+ ## Introduction
23
+
24
+ A framework for building GraphQL APIs without defining any kind of schema.
25
+ It reduces the time spent on writing and maintaining API definitions, allowing you to focus solely on writing your service logic.
26
+
27
+ ## Why
28
+
29
+ We believe that the current approach to building APIs is outdated. Writing and maintaining API definitions is time-consuming and error-prone. When you already have TypeScript definitions, why not use them to infer the API schema? Pylon does exactly that.
30
+
31
+ Pylon also provides a set of tools to help you build, test, and deploy your APIs. We believe that building services should be easy and fun. Major functionalities like authentication, authorization, and context management are built-in, so you can focus on what matters most: your service logic.
32
+
33
+ With Pylon, you can build APIs faster, with fewer errors, and with less code.
34
+
35
+ ## Create
36
+
37
+ To create a new Pylon project, run the following command:
38
+
39
+ ```bash
40
+ npm create pylon@latest
41
+ ```
42
+
43
+ Afterwards, you can navigate to the newly created project and start the development server:
44
+
45
+ ```bash
46
+ cd my-pylon
47
+ npm run dev
48
+ ```
49
+
50
+ This will start the development server on `http://localhost:3000`.
51
+
52
+ Open the [Pylon Playground](https://pylon.cronit.io/docs/getting-started#built-in-graphql-playground) in your browser and start building your API.
53
+
54
+ ## Develop
55
+
56
+ Update your service logic in the `src` directory.
57
+
58
+ ```typescript
59
+ import {app} from '@getcronit/pylon'
60
+
61
+ export const graphql = {
62
+ Query: {
63
+ user: (id: string) => {
64
+ return {
65
+ id,
66
+ name: 'John Doe',
67
+ email: 'johndoe@example.com'
68
+ }
69
+ },
70
+ products: () => [
71
+ {id: '1', name: 'Laptop', price: 999.99},
72
+ {id: '2', name: 'Smartphone', price: 499.99},
73
+ {id: '3', name: 'Tablet', price: 299.99}
74
+ ]
75
+ },
76
+ Mutation: {
77
+ updateUserEmail: (id: string, newEmail: string) => {
78
+ return {
79
+ id,
80
+ email: newEmail
81
+ }
82
+ },
83
+ createOrder: (userId: string, productIds: string[]) => {
84
+ return {
85
+ id: 'order-123',
86
+ userId,
87
+ productIds,
88
+ status: 'PENDING'
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ export default app
95
+ ```
96
+
97
+ **Query:**
98
+
99
+ ```graphql
100
+ query GetUser {
101
+ user(id: "1") {
102
+ id
103
+ name
104
+ email
105
+ }
106
+ }
107
+
108
+ query GetProducts {
109
+ products {
110
+ id
111
+ name
112
+ price
113
+ }
114
+ }
115
+ ```
116
+
117
+ **Mutation:**
118
+
119
+ ```graphql
120
+ mutation UpdateUserEmail {
121
+ updateUserEmail(id: "1", newEmail: "johndoe2@example.com") {
122
+ id
123
+ email
124
+ }
125
+ }
126
+
127
+ mutation CreateOrder {
128
+ createOrder(userId: "1", productIds: ["1", "2"]) {
129
+ id
130
+ userId
131
+ productIds
132
+ status
133
+ }
134
+ }
135
+ ```
136
+
137
+ ## Deploy
138
+
139
+ Pylon is fully compatible with Cloudflare Workers, allowing you to deploy your service to the edge in just one minute.
140
+ Watch the video below to see how easy it is to deploy a Pylon.
141
+
142
+ ![Cloudflare Workers](https://github.com/user-attachments/assets/8e9f96a7-47e3-4c66-8426-fe09329de598)
143
+
144
+ If you prefer to deploy your service to a different platform, you can use the provided Dockerfile to build a Docker image and deploy it to your favorite cloud provider.
145
+
146
+ ```bash
147
+ docker build -t my-pylon .
148
+ docker run -p 3000:3000 my-pylon
149
+ ```
150
+
151
+ ## Runtimes
152
+
153
+ Designed to be flexible, Pylon can be run on various platforms, including:
154
+
155
+ | <img src="https://bun.sh/logo.svg" width="48px" height="48px" alt="Bun.js logo"> | <img src="https://nodejs.org/static/logos/jsIconWhite.svg" width="48px" height="48px" alt="Node.JS"> | <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgW7cAlhYN23JXGKy9Uji4Ae2mnHOR9eXX9g&s" width="48px" height="48px" alt="Gmail logo"> |
156
+ | :------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------: |
157
+ | Bun.js | Node.js | Cloudflare Workers |
158
+
159
+ ## Features
160
+
161
+ Pylon offers a comprehensive set of features to streamline the development of modern web services:
162
+
163
+ | Feature | Description |
164
+ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
165
+ | **Automatic Schema Generation** | Pylon generates GraphQL schemas based on your TypeScript definitions, ensuring type safety and reducing manual coding effort. |
166
+ | **Type Safety** | By leveraging TypeScript, Pylon ensures that your services are type-safe, catching errors at compile time. |
167
+ | **Authentication and Authorization** | Built-in support for OIDC standard and integration with ZITADEL for managing user authentication and role-based access control. |
168
+ | **Logging and Monitoring** | Sentry for error tracking, providing robust monitoring capabilities. |
169
+ | **Database Integration** | Seamlessly works with Prisma to generate extended models that support automatic resolution of relations and paginatable connections. |
170
+ | **Deployment Ready** | Includes pre-configured Dockerfile for easy deployment using Docker or manual methods. |
171
+
172
+ ## Playground
173
+
174
+ You can try Pylon in the [Playground](https://pylon.cronit.io/playground) without installing anything.
175
+ Or simply click the image below to open the Playground.
176
+
177
+ [![Playground](https://github.com/user-attachments/assets/39df08d0-4094-4836-a36b-37ad62e292cf)](https://pylon.cronit.io/playground)
178
+
179
+ ## Contributing
180
+
181
+ Documentation, bug reports, pull requests, and other contributions are welcomed!
182
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for more information.
183
+
184
+ ## Support
185
+
186
+ - **Community Support:** Join the Pylon community on GitHub to report bugs and request features.
187
+ - **Professional Support:** For professional support and consulting services, contact [office@cronit.io](mailto:office@cronit.io).
188
+ - Join the [Pylon Discord server](https://discord.gg/cbJjkVrnHe) to connect with other users and contributors.
189
+
190
+ ---
191
+
192
+ Pylon is brought to you by Cronit.
package/dist/index.js CHANGED
@@ -28,6 +28,16 @@ var setContext = (context) => {
28
28
  };
29
29
 
30
30
  // src/define-pylon.ts
31
+ function getAllPropertyNames(instance) {
32
+ const allProps = new Set;
33
+ let currentObj = instance;
34
+ while (currentObj && currentObj !== Object.prototype) {
35
+ const ownProps = Object.getOwnPropertyNames(currentObj);
36
+ ownProps.forEach((prop) => allProps.add(prop));
37
+ currentObj = Object.getPrototypeOf(currentObj);
38
+ }
39
+ return Array.from(allProps).filter((prop) => prop !== "constructor");
40
+ }
31
41
  async function wrapFunctionsRecursively(obj, wrapper, that = null, selectionSet = [], info) {
32
42
  if (obj === null || obj instanceof Date) {
33
43
  return obj;
@@ -46,44 +56,10 @@ async function wrapFunctionsRecursively(obj, wrapper, that = null, selectionSet
46
56
  } else if (obj instanceof Promise) {
47
57
  return await wrapFunctionsRecursively(await obj, wrapper, that, selectionSet, info);
48
58
  } else if (typeof obj === "object") {
49
- const result = {};
50
- const fields = [];
51
59
  that = obj;
52
- const resolveFragmentSpreadFields = (fragment) => {
53
- const fragmentFields = [];
54
- for (const fragmentSelection of fragment.selectionSet.selections) {
55
- if (fragmentSelection.kind === "Field") {
56
- fragmentFields.push({
57
- key: fragmentSelection.name.value,
58
- selectionSet: fragmentSelection.selectionSet?.selections || []
59
- });
60
- } else if (fragmentSelection.kind === "InlineFragment") {
61
- consola.warn(`Inline fragments are not supported yet.`);
62
- } else if (fragmentSelection.kind === "FragmentSpread") {
63
- const fragment2 = info.fragments[fragmentSelection.name.value];
64
- fragmentFields.push(...resolveFragmentSpreadFields(fragment2));
65
- }
66
- }
67
- return fragmentFields;
68
- };
69
- for (const selection of selectionSet) {
70
- if (selection.kind === "Field") {
71
- fields.push({
72
- key: selection.name.value,
73
- selectionSet: selection.selectionSet?.selections || []
74
- });
75
- } else if (selection.kind === "InlineFragment") {
76
- consola.warn(`Inline fragments are not supported yet.`);
77
- } else if (selection.kind === "FragmentSpread") {
78
- const fragment = info.fragments[selection.name.value];
79
- fields.push(...resolveFragmentSpreadFields(fragment));
80
- }
81
- }
82
- for (const { key, selectionSet: selectionSet2 } of Object.values(fields)) {
83
- result[key] = await wrapFunctionsRecursively(obj[key], wrapper, that, selectionSet2, info);
84
- }
85
- if (Object.keys(result).length === 0) {
86
- return obj;
60
+ const result = {};
61
+ for (const key of getAllPropertyNames(obj)) {
62
+ result[key] = await wrapFunctionsRecursively(obj[key], wrapper, that, selectionSet, info);
87
63
  }
88
64
  return result;
89
65
  } else {
@@ -200,6 +176,11 @@ export const graphql = {
200
176
  }
201
177
  `);
202
178
  }
179
+ for (const key of Object.keys(resolvers)) {
180
+ if (key !== "Query" && key !== "Mutation") {
181
+ graphqlResolvers[key] = resolvers[key];
182
+ }
183
+ }
203
184
  return graphqlResolvers;
204
185
  };
205
186
 
@@ -803,7 +784,7 @@ function getEnv() {
803
784
  const skipTracing = arguments[0] === true;
804
785
  try {
805
786
  const context = asyncContext.getStore();
806
- return context.env;
787
+ return context.env || process.env || {};
807
788
  } catch {
808
789
  return process.env;
809
790
  } finally {
@@ -829,4 +810,4 @@ export {
829
810
  ServiceError
830
811
  };
831
812
 
832
- //# debugId=75C5685715415CC164756E2164756E21
813
+ //# debugId=D59EB4BDBC50014E64756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,7 +2,7 @@
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/graphql-handler.ts", "../src/app/envelop/use-sentry.ts", "../src/get-env.ts"],
4
4
  "sourcesContent": [
5
- "import * as Sentry from '@sentry/bun'\nimport consola from 'consola'\nimport {\n FragmentDefinitionNode,\n GraphQLError,\n GraphQLErrorExtensions,\n GraphQLResolveInfo,\n SelectionSetNode\n} from 'graphql'\n\nimport {Context, asyncContext} from './context'\n\nexport interface Resolvers {\n Query: Record<string, any>\n Mutation: Record<string, any>\n}\n\ntype FunctionWrapper = (fn: (...args: any[]) => any) => (...args: any[]) => any\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 (typeof obj === 'object') {\n const result: any = {}\n\n const fields: {\n key: string\n selectionSet: SelectionSetNode['selections']\n }[] = []\n\n that = obj\n\n const resolveFragmentSpreadFields = (fragment: FragmentDefinitionNode) => {\n const fragmentFields: typeof fields = []\n\n for (const fragmentSelection of fragment.selectionSet.selections) {\n if (fragmentSelection.kind === 'Field') {\n fragmentFields.push({\n key: fragmentSelection.name.value,\n selectionSet: fragmentSelection.selectionSet?.selections || []\n })\n } else if (fragmentSelection.kind === 'InlineFragment') {\n consola.warn(`Inline fragments are not supported yet.`)\n } else if (fragmentSelection.kind === 'FragmentSpread') {\n const fragment = info.fragments[fragmentSelection.name.value]\n\n fragmentFields.push(...resolveFragmentSpreadFields(fragment))\n }\n }\n\n return fragmentFields\n }\n\n for (const selection of selectionSet) {\n if (selection.kind === 'Field') {\n fields.push({\n key: selection.name.value,\n selectionSet: selection.selectionSet?.selections || []\n })\n } else if (selection.kind === 'InlineFragment') {\n consola.warn(`Inline fragments are not supported yet.`)\n } else if (selection.kind === 'FragmentSpread') {\n const fragment = info.fragments[selection.name.value]\n\n fields.push(...resolveFragmentSpreadFields(fragment))\n }\n }\n\n for (const {key, selectionSet} of Object.values(fields)) {\n result[key] = await wrapFunctionsRecursively(\n obj[key],\n wrapper,\n that,\n selectionSet,\n info\n )\n }\n\n // If no fields were selected, return the original object.\n if (Object.keys(result).length === 0) {\n return obj\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 (_: object, args: Record<string, any>, ctx: Context, info: any) => {\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 const isQuery = info.operation.operation === 'query'\n const isMutation = info.operation.operation === 'mutation'\n\n if (!isQuery && !isMutation) {\n throw new Error('Only queries and mutations are supported.')\n }\n\n // Get the field metadata for the current query or mutation.\n const type = isQuery\n ? info.schema.getQueryType()\n : info.schema.getMutationType()\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 return await wrappedFn(preparedArguments)\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 // 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 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",
5
+ "import * as Sentry from '@sentry/bun'\nimport consola from 'consola'\nimport {\n FragmentDefinitionNode,\n GraphQLError,\n GraphQLErrorExtensions,\n GraphQLResolveInfo,\n SelectionSetNode\n} from 'graphql'\n\nimport {Context, asyncContext} from './context'\n\nexport interface Resolvers {\n Query: Record<string, any>\n Mutation: 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 (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 (_: object, args: Record<string, any>, ctx: Context, info: any) => {\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 const isQuery = info.operation.operation === 'query'\n const isMutation = info.operation.operation === 'mutation'\n\n if (!isQuery && !isMutation) {\n throw new Error('Only queries and mutations are supported.')\n }\n\n // Get the field metadata for the current query or mutation.\n const type = isQuery\n ? info.schema.getQueryType()\n : info.schema.getMutationType()\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 return await wrappedFn(preparedArguments)\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 // 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') {\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
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'\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 return ctx\n}\n\nexport const setContext = (context: Context) => {\n return asyncContext.enterWith(context)\n}\n",
7
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 {StatusCode} 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 StatusCode, {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",
@@ -11,9 +11,9 @@
11
11
  "import type {MiddlewareHandler} from 'hono'\nimport {html} from 'hono/html'\n\nexport const graphqlViewerHandler: MiddlewareHandler = async (c, next) => {\n return c.html(html`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Pylon Viewer</title>\n <script src=\"https://cdn.jsdelivr.net/npm/react@16/umd/react.production.min.js\"></script>\n <script src=\"https://cdn.jsdelivr.net/npm/react-dom@16/umd/react-dom.production.min.js\"></script>\n\n <link\n rel=\"stylesheet\"\n href=\"https://cdn.jsdelivr.net/npm/graphql-voyager/dist/voyager.css\"\n />\n <style>\n body {\n padding: 0;\n margin: 0;\n width: 100%;\n height: 100vh;\n overflow: hidden;\n }\n\n #voyager {\n height: 100%;\n position: relative;\n }\n }\n </style>\n <script src=\"https://cdn.jsdelivr.net/npm/graphql-voyager/dist/voyager.min.js\"></script>\n </head>\n <body>\n <div id=\"voyager\">Loading...</div>\n <script>\n function introspectionProvider(introspectionQuery) {\n // ... do a call to server using introspectionQuery provided\n // or just return pre-fetched introspection\n\n // Endpoint is current path instead of root/graphql\n const endpoint = window.location.pathname.replace(\n '/viewer',\n '/graphql'\n )\n\n return fetch(endpoint, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({query: introspectionQuery})\n }).then(response => response.json())\n }\n\n // Render <Voyager />\n GraphQLVoyager.init(document.getElementById('voyager'), {\n introspection: introspectionProvider\n })\n </script>\n </body>\n </html>\n `)\n}\n",
12
12
  "import {createSchema, createYoga} from 'graphql-yoga'\nimport {GraphQLScalarType, Kind} from 'graphql'\n\nimport {useSentry} from '../envelop/use-sentry'\nimport {Context} from '../../context'\nimport {resolversToGraphQLResolvers} from '../../define-pylon'\n\nexport interface SchemaOptions {\n typeDefs: string\n resolvers: {\n Query: Record<string, any>\n Mutation: Record<string, any>\n }\n}\n\nexport const graphqlHandler =\n (c: Context) =>\n ({typeDefs, resolvers}: SchemaOptions) => {\n resolvers = resolversToGraphQLResolvers(resolvers)\n\n const schema = createSchema({\n typeDefs,\n resolvers: {\n ...resolvers,\n // Transforms a date object to a timestamp\n Date: new GraphQLScalarType({\n name: 'Date',\n description: 'Date custom scalar type',\n parseValue(value) {\n if (typeof value === 'string') {\n return new Date(value)\n }\n\n if (value instanceof Date) {\n return value // value from the client\n }\n\n throw Error(\n 'GraphQL Date Scalar parseValue expected a `Date` or string'\n )\n },\n serialize(value) {\n if (value instanceof Date) {\n return value.toISOString() // value sent to the client\n }\n\n throw Error(\n 'GraphQL Date Scalar serializer expected a `Date` object'\n )\n },\n parseLiteral(ast) {\n if (ast.kind === Kind.INT) {\n return new Date(parseInt(ast.value, 10))\n } else if (ast.kind === Kind.STRING) {\n return new Date(ast.value)\n }\n\n return null\n }\n }),\n Number: new GraphQLScalarType({\n name: 'Number',\n description: 'Custom scalar that handles both integers and floats',\n\n // Parsing input from query variables\n parseValue(value) {\n if (typeof value !== 'number') {\n throw new TypeError(`Value is not a number: ${value}`)\n }\n return value // Valid number\n },\n\n // Validation when sending from client (input literals)\n parseLiteral(ast) {\n if (ast.kind === Kind.INT || ast.kind === Kind.FLOAT) {\n return parseFloat(ast.value) // Convert the value to a float\n }\n throw new TypeError(\n `Value is not a valid number or float: ${\n 'value' in ast ? ast.value : ast\n }`\n )\n },\n\n // Serialize output to be sent to the client\n serialize(value) {\n if (typeof value !== 'number') {\n throw new TypeError(`Value is not a number: ${value}`)\n }\n return value\n }\n })\n }\n })\n\n const yoga = createYoga({\n schema: schema as any,\n landingPage: false,\n plugins: [useSentry()],\n graphiql: req => {\n return {\n shouldPersistHeaders: true,\n title: 'Pylon Playground',\n defaultQuery: `# Welcome to the Pylon Playground!`\n }\n },\n context: c\n })\n\n return yoga\n }\n",
13
13
  "import {GraphQLError, Kind, OperationDefinitionNode, print} from 'graphql'\nimport {\n getDocumentString,\n handleStreamOrSingleExecutionResult,\n isOriginalGraphQLError,\n OnExecuteDoneHookResultOnNextHook,\n TypedExecutionArgs,\n type Plugin\n} from '@envelop/core'\nimport * as Sentry from '@sentry/node'\nimport type {Span, TraceparentData} from '@sentry/types'\n\nexport type SentryPluginOptions<PluginContext extends Record<string, any>> = {\n /**\n * Starts a new transaction for every GraphQL Operation.\n * When disabled, an already existing Transaction will be used.\n *\n * @default true\n */\n startTransaction?: boolean\n /**\n * Renames Transaction.\n * @default false\n */\n renameTransaction?: boolean\n /**\n * Adds result of each resolver and operation to Span's data (available under \"result\")\n * @default false\n */\n includeRawResult?: boolean\n /**\n * Adds operation's variables to a Scope (only in case of errors)\n * @default false\n */\n includeExecuteVariables?: boolean\n /**\n * The key of the event id in the error's extension. `null` to disable.\n * @default sentryEventId\n */\n eventIdKey?: string | null\n /**\n * Adds custom tags to every Transaction.\n */\n appendTags?: (\n args: TypedExecutionArgs<PluginContext>\n ) => Record<string, unknown>\n /**\n * Callback to set context information onto the scope.\n */\n configureScope?: (\n args: TypedExecutionArgs<PluginContext>,\n scope: Sentry.Scope\n ) => void\n /**\n * Produces a name of Transaction (only when \"renameTransaction\" or \"startTransaction\" are enabled) and description of created Span.\n *\n * @default operation's name or \"Anonymous Operation\" when missing)\n */\n transactionName?: (args: TypedExecutionArgs<PluginContext>) => string\n /**\n * Produces tracing data for Transaction\n *\n * @default is empty\n */\n traceparentData?: (\n args: TypedExecutionArgs<PluginContext>\n ) => TraceparentData | undefined\n /**\n * Produces a \"op\" (operation) of created Span.\n *\n * @default execute\n */\n operationName?: (args: TypedExecutionArgs<PluginContext>) => string\n /**\n * Indicates whether or not to skip the entire Sentry flow for given GraphQL operation.\n * By default, no operations are skipped.\n */\n skip?: (args: TypedExecutionArgs<PluginContext>) => boolean\n /**\n * Indicates whether or not to skip Sentry exception reporting for a given error.\n * By default, this plugin skips all `GraphQLError` errors and does not report it to Sentry.\n */\n skipError?: (args: Error) => boolean\n}\n\nexport const defaultSkipError = isOriginalGraphQLError\n\nexport const useSentry = <PluginContext extends Record<string, any> = {}>(\n options: SentryPluginOptions<PluginContext> = {}\n): Plugin<PluginContext> => {\n function pick<K extends keyof SentryPluginOptions<PluginContext>>(\n key: K,\n defaultValue: NonNullable<SentryPluginOptions<PluginContext>[K]>\n ) {\n return options[key] ?? defaultValue\n }\n\n const startTransaction = pick('startTransaction', true)\n const includeRawResult = pick('includeRawResult', false)\n const includeExecuteVariables = pick('includeExecuteVariables', false)\n const renameTransaction = pick('renameTransaction', false)\n const skipOperation = pick('skip', () => false)\n const skipError = pick('skipError', defaultSkipError)\n\n const eventIdKey = options.eventIdKey === null ? null : 'sentryEventId'\n\n function addEventId(err: GraphQLError, eventId: string | null): GraphQLError {\n if (eventIdKey !== null && eventId !== null) {\n err.extensions[eventIdKey] = eventId\n }\n\n return err\n }\n\n return {\n onExecute({args}) {\n if (skipOperation(args)) {\n return\n }\n\n const rootOperation = args.document.definitions.find(\n o => o.kind === Kind.OPERATION_DEFINITION\n ) as OperationDefinitionNode\n const operationType = rootOperation.operation\n\n const document = getDocumentString(args.document, print)\n\n const opName =\n args.operationName || rootOperation.name?.value || 'Anonymous Operation'\n const addedTags: Record<string, any> =\n (options.appendTags && options.appendTags(args)) || {}\n const traceparentData =\n (options.traceparentData && options.traceparentData(args)) || {}\n\n const transactionName = options.transactionName\n ? options.transactionName(args)\n : opName\n const op = options.operationName ? options.operationName(args) : 'execute'\n const tags = {\n operationName: opName,\n operation: operationType,\n ...addedTags\n }\n\n if (options.configureScope) {\n options.configureScope(args, Sentry.getCurrentScope())\n }\n\n return {\n onExecuteDone(payload) {\n const handleResult: OnExecuteDoneHookResultOnNextHook<{}> = ({\n result,\n setResult\n }) => {\n Sentry.startSpanManual(\n {\n op,\n name: opName,\n attributes: tags\n },\n span => {\n if (renameTransaction) {\n span.updateName(transactionName)\n }\n\n span.setAttribute('document', document)\n\n if (includeRawResult) {\n span.setAttribute('result', JSON.stringify(result))\n }\n\n if (result.errors && result.errors.length > 0) {\n Sentry.withScope(scope => {\n scope.setTransactionName(opName)\n scope.setTag('operation', operationType)\n scope.setTag('operationName', opName)\n scope.setExtra('document', document)\n\n scope.setTags(addedTags || {})\n\n if (includeRawResult) {\n scope.setExtra('result', result)\n }\n\n if (includeExecuteVariables) {\n scope.setExtra('variables', args.variableValues)\n }\n\n const errors = result.errors?.map(err => {\n if (skipError(err) === true) {\n return err\n }\n\n const errorPath = (err.path ?? [])\n .map((v: string | number) =>\n typeof v === 'number' ? '$index' : v\n )\n .join(' > ')\n\n if (errorPath) {\n scope.addBreadcrumb({\n category: 'execution-path',\n message: errorPath,\n level: 'debug'\n })\n }\n\n const eventId = Sentry.captureException(\n err.originalError,\n {\n fingerprint: [\n 'graphql',\n errorPath,\n opName,\n operationType\n ],\n contexts: {\n GraphQL: {\n operationName: opName,\n operationType,\n variables: args.variableValues\n }\n }\n }\n )\n\n return addEventId(err, eventId)\n })\n\n setResult({\n ...result,\n errors\n })\n })\n }\n\n span.end()\n }\n )\n }\n return handleStreamOrSingleExecutionResult(payload, handleResult)\n }\n }\n }\n }\n}\n",
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 return context.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"
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
  ],
16
- "mappings": "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",
17
- "debugId": "75C5685715415CC164756E2164756E21",
16
+ "mappings": "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",
17
+ "debugId": "D59EB4BDBC50014E64756E2164756E21",
18
18
  "names": []
19
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getcronit/pylon",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",