houdini 2.0.0-next.9 → 2.0.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/build/adapter/index.d.ts +2 -2
- package/build/adapter/index.js +6 -0
- package/build/cmd/generate.d.ts +5 -0
- package/build/cmd/generate.js +77 -0
- package/build/cmd/index.js +32 -0
- package/build/cmd/init.js +565 -0
- package/build/cmd/pullSchema.js +26 -0
- package/build/lib/ast.js +71 -0
- package/build/lib/codegen.d.ts +57 -0
- package/build/lib/codegen.js +627 -0
- package/build/lib/config.d.ts +240 -177
- package/build/lib/config.js +143 -0
- package/build/lib/constants.js +14 -0
- package/build/lib/database.d.ts +7 -0
- package/build/lib/database.js +624 -0
- package/build/lib/db.d.ts +13 -0
- package/build/lib/db.js +135 -0
- package/build/lib/deepMerge.js +23 -0
- package/build/lib/error.d.ts +16 -0
- package/build/lib/error.js +115 -0
- package/build/lib/fs.d.ts +9 -11
- package/build/lib/fs.js +245 -0
- package/build/lib/graphql.d.ts +5 -32
- package/build/lib/graphql.js +36 -0
- package/build/lib/imports.d.ts +29 -14
- package/build/lib/imports.js +66 -0
- package/build/lib/index.d.ts +17 -24
- package/build/lib/index.js +21 -0
- package/build/lib/logger.d.ts +12 -0
- package/build/lib/logger.js +45 -0
- package/build/lib/parse.d.ts +2 -3
- package/build/lib/parse.js +33 -0
- package/build/lib/path.d.ts +0 -1
- package/build/lib/path.js +44 -0
- package/build/lib/pipeline.d.ts +1 -1
- package/build/lib/pipeline.js +8 -0
- package/build/lib/plugins.d.ts +4 -0
- package/build/lib/plugins.js +88 -0
- package/build/lib/project.d.ts +19 -0
- package/build/lib/project.js +296 -0
- package/build/lib/schema.d.ts +1 -0
- package/build/lib/schema.js +61 -0
- package/build/lib/sleep.d.ts +1 -0
- package/build/lib/sleep.js +8 -0
- package/build/lib/types.d.ts +92 -303
- package/build/lib/types.js +37 -0
- package/build/lib/walk.d.ts +11 -6
- package/build/lib/walk.js +138 -0
- package/build/node/index.d.ts +44 -0
- package/build/node/index.js +402 -0
- package/build/oauth/index.d.ts +41 -0
- package/build/oauth/index.js +108 -0
- package/build/package.json +212 -0
- package/build/router/auth-token.d.ts +29 -0
- package/build/router/auth-token.js +168 -0
- package/build/{lib/router → router}/conventions.d.ts +10 -1
- package/build/router/conventions.js +165 -0
- package/build/{runtime-esm/router → router}/cookies.js +21 -21
- package/build/{runtime-esm/router → router}/jwt.js +8 -6
- package/build/{lib/router → router}/manifest.d.ts +2 -2
- package/build/router/manifest.js +279 -0
- package/build/{runtime/router → router}/match.d.ts +10 -10
- package/build/router/match.js +219 -0
- package/build/router/server.d.ts +57 -0
- package/build/router/server.js +500 -0
- package/build/{runtime/router → router}/session.d.ts +8 -3
- package/build/router/session.js +338 -0
- package/build/router/types.d.ts +44 -0
- package/build/runtime/cache/benchmarks/cache.bench.d.ts +1 -0
- package/build/runtime/cache/benchmarks/cache.bench.js +943 -0
- package/build/runtime/cache/gc.d.ts +2 -1
- package/build/{runtime-esm → runtime}/cache/gc.js +4 -1
- package/build/runtime/cache/index.d.ts +173 -3
- package/build/{runtime-esm/cache/cache.js → runtime/cache/index.js} +197 -70
- package/build/runtime/cache/lists.d.ts +9 -4
- package/build/{runtime-esm → runtime}/cache/lists.js +116 -27
- package/build/runtime/cache/staleManager.d.ts +2 -1
- package/build/{runtime-esm → runtime}/cache/staleManager.js +6 -2
- package/build/runtime/cache/storage.d.ts +5 -2
- package/build/{runtime-esm → runtime}/cache/storage.js +126 -54
- package/build/{runtime-esm → runtime}/cache/stuff.js +4 -3
- package/build/runtime/cache/subscription.d.ts +23 -9
- package/build/{runtime-esm → runtime}/cache/subscription.js +103 -65
- package/build/runtime/{client/index.d.ts → client.d.ts} +15 -22
- package/build/runtime/client.js +86 -0
- package/build/runtime/coerce.d.ts +4 -0
- package/build/runtime/coerce.js +31 -0
- package/build/runtime/config.d.ts +20 -0
- package/build/runtime/config.js +88 -0
- package/build/runtime/{lib/constants.d.ts → constants.d.ts} +1 -1
- package/build/runtime/{client/documentStore.d.ts → documentStore.d.ts} +18 -11
- package/build/{runtime-esm/client → runtime}/documentStore.js +53 -56
- package/build/runtime/endpoint.d.ts +14 -0
- package/build/runtime/endpoint.js +29 -0
- package/build/{runtime-cjs/lib → runtime}/flatten.d.ts +1 -1
- package/build/runtime/formData.d.ts +24 -0
- package/build/runtime/formData.js +93 -0
- package/build/runtime/index.d.ts +16 -8
- package/build/runtime/index.js +54 -0
- package/build/{runtime-cjs/lib → runtime}/key.d.ts +1 -1
- package/build/{runtime-esm/lib → runtime}/key.js +4 -4
- package/build/{runtime-esm/lib → runtime}/log.js +3 -3
- package/build/runtime/multipart.d.ts +8 -0
- package/build/runtime/multipart.js +49 -0
- package/build/{runtime-cjs/lib → runtime}/pageInfo.d.ts +3 -3
- package/build/{runtime-esm/lib → runtime}/pageInfo.js +2 -2
- package/build/{runtime-cjs/lib → runtime}/pagination.d.ts +12 -8
- package/build/{runtime-esm/lib → runtime}/pagination.js +157 -21
- package/build/{runtime-cjs/lib → runtime}/scalars.d.ts +6 -6
- package/build/{runtime-esm/lib → runtime}/scalars.js +10 -43
- package/build/{runtime-cjs/lib → runtime}/selection.d.ts +1 -1
- package/build/{runtime-esm/lib → runtime}/selection.js +17 -2
- package/build/runtime/{lib/store.d.ts → store.d.ts} +1 -1
- package/build/{runtime-esm/lib → runtime}/store.js +2 -3
- package/build/runtime/{lib/types.d.ts → types.d.ts} +107 -102
- package/build/{runtime-esm/lib → runtime}/types.js +37 -15
- package/build/test/index.d.ts +6 -25
- package/build/test/index.js +329 -0
- package/build/test/package.json +1 -0
- package/build/vite/hmr.d.ts +26 -3
- package/build/vite/hmr.js +433 -0
- package/build/vite/houdini.d.ts +4 -10
- package/build/vite/houdini.js +144 -0
- package/build/vite/index.d.ts +13 -7
- package/build/vite/index.js +106 -0
- package/build/vite/package.json +1 -0
- package/build/vite/schema.d.ts +5 -3
- package/build/vite/schema.js +193 -0
- package/package.json +148 -57
- package/build/adapter-cjs/index.js +0 -33
- package/build/adapter-cjs/package.json +0 -1
- package/build/adapter-esm/index.js +0 -9
- package/build/cmd-cjs/index.js +0 -89299
- package/build/cmd-cjs/package.json +0 -1
- package/build/cmd-esm/index.js +0 -89303
- package/build/codegen/generators/artifacts/fieldKey.d.ts +0 -3
- package/build/codegen/generators/artifacts/index.d.ts +0 -17
- package/build/codegen/generators/artifacts/indexFile.d.ts +0 -2
- package/build/codegen/generators/artifacts/inputs.d.ts +0 -4
- package/build/codegen/generators/artifacts/operations.d.ts +0 -11
- package/build/codegen/generators/artifacts/selection.d.ts +0 -20
- package/build/codegen/generators/artifacts/utils.d.ts +0 -8
- package/build/codegen/generators/comments/jsdoc.d.ts +0 -2
- package/build/codegen/generators/definitions/enums.d.ts +0 -2
- package/build/codegen/generators/definitions/index.d.ts +0 -2
- package/build/codegen/generators/index.d.ts +0 -6
- package/build/codegen/generators/indexFile/index.d.ts +0 -2
- package/build/codegen/generators/persistedQueries/index.d.ts +0 -2
- package/build/codegen/generators/runtime/graphqlFunction.d.ts +0 -2
- package/build/codegen/generators/runtime/index.d.ts +0 -3
- package/build/codegen/generators/runtime/injectPlugins.d.ts +0 -7
- package/build/codegen/generators/runtime/pluginIndex.d.ts +0 -5
- package/build/codegen/generators/runtime/pluginRuntime.d.ts +0 -15
- package/build/codegen/generators/runtime/runtimeConfig.d.ts +0 -7
- package/build/codegen/generators/typescript/addReferencedInputTypes.d.ts +0 -4
- package/build/codegen/generators/typescript/documentTypes.d.ts +0 -2
- package/build/codegen/generators/typescript/imperativeTypeDef.d.ts +0 -2
- package/build/codegen/generators/typescript/index.d.ts +0 -2
- package/build/codegen/generators/typescript/inlineType.d.ts +0 -29
- package/build/codegen/generators/typescript/loadingState.d.ts +0 -8
- package/build/codegen/index.d.ts +0 -8
- package/build/codegen/transforms/addFields.d.ts +0 -2
- package/build/codegen/transforms/collectDefinitions.d.ts +0 -9
- package/build/codegen/transforms/componentFields.d.ts +0 -8
- package/build/codegen/transforms/fragmentVariables.d.ts +0 -17
- package/build/codegen/transforms/index.d.ts +0 -9
- package/build/codegen/transforms/list.d.ts +0 -9
- package/build/codegen/transforms/paginate.d.ts +0 -4
- package/build/codegen/transforms/runtimeScalars.d.ts +0 -2
- package/build/codegen/transforms/schema.d.ts +0 -2
- package/build/codegen/transforms/typename.d.ts +0 -2
- package/build/codegen/utils/commonjs.d.ts +0 -5
- package/build/codegen/utils/flattenSelections.d.ts +0 -11
- package/build/codegen/utils/index.d.ts +0 -4
- package/build/codegen/utils/moduleExport.d.ts +0 -4
- package/build/codegen/utils/murmur.d.ts +0 -9
- package/build/codegen/utils/objectIdentificationSelection.d.ts +0 -3
- package/build/codegen/utils/stripLoc.d.ts +0 -3
- package/build/codegen/validators/componentFields.d.ts +0 -2
- package/build/codegen/validators/index.d.ts +0 -5
- package/build/codegen/validators/noIDAlias.d.ts +0 -2
- package/build/codegen/validators/plugins.d.ts +0 -3
- package/build/codegen/validators/typeCheck.d.ts +0 -5
- package/build/codegen/validators/uniqueNames.d.ts +0 -2
- package/build/codegen-cjs/index.js +0 -74656
- package/build/codegen-cjs/package.json +0 -1
- package/build/codegen-esm/index.js +0 -74655
- package/build/lib/cleanupFiles.d.ts +0 -1
- package/build/lib/detectTools.d.ts +0 -16
- package/build/lib/introspection.d.ts +0 -3
- package/build/lib/plugin.d.ts +0 -2
- package/build/lib/router/index.d.ts +0 -9
- package/build/lib/router/server.d.ts +0 -7
- package/build/lib/router/types.d.ts +0 -23
- package/build/lib/typescript.d.ts +0 -20
- package/build/lib/watchAndRun.d.ts +0 -61
- package/build/lib-cjs/index.js +0 -79739
- package/build/lib-cjs/package.json +0 -1
- package/build/lib-esm/index.js +0 -79648
- package/build/runtime/cache/cache.d.ts +0 -169
- package/build/runtime/client/plugins/cache.d.ts +0 -9
- package/build/runtime/client/plugins/fetch.d.ts +0 -38
- package/build/runtime/client/plugins/fetchParams.d.ts +0 -9
- package/build/runtime/client/plugins/fragment.d.ts +0 -2
- package/build/runtime/client/plugins/index.d.ts +0 -9
- package/build/runtime/client/plugins/injectedPlugins.d.ts +0 -4
- package/build/runtime/client/plugins/mutation.d.ts +0 -2
- package/build/runtime/client/plugins/optimisticKeys.d.ts +0 -7
- package/build/runtime/client/plugins/query.d.ts +0 -2
- package/build/runtime/client/plugins/subscription.d.ts +0 -20
- package/build/runtime/client/plugins/test.d.ts +0 -15
- package/build/runtime/client/plugins/throwOnError.d.ts +0 -8
- package/build/runtime/client/utils/documentPlugins.d.ts +0 -3
- package/build/runtime/client/utils/index.d.ts +0 -1
- package/build/runtime/generated.d.ts +0 -5
- package/build/runtime/imports/config.d.ts +0 -3
- package/build/runtime/imports/pluginConfig.d.ts +0 -3
- package/build/runtime/lib/config.d.ts +0 -216
- package/build/runtime/lib/deepEquals.d.ts +0 -1
- package/build/runtime/lib/flatten.d.ts +0 -2
- package/build/runtime/lib/index.d.ts +0 -10
- package/build/runtime/lib/key.d.ts +0 -6
- package/build/runtime/lib/log.d.ts +0 -6
- package/build/runtime/lib/lru.d.ts +0 -52
- package/build/runtime/lib/pageInfo.d.ts +0 -7
- package/build/runtime/lib/pagination.d.ts +0 -27
- package/build/runtime/lib/scalars.d.ts +0 -14
- package/build/runtime/lib/selection.d.ts +0 -2
- package/build/runtime/public/cache.d.ts +0 -42
- package/build/runtime/public/index.d.ts +0 -1
- package/build/runtime/public/list.d.ts +0 -18
- package/build/runtime/public/record.d.ts +0 -40
- package/build/runtime/public/tests/test.d.ts +0 -156
- package/build/runtime/public/types.d.ts +0 -62
- package/build/runtime/router/cookies.d.ts +0 -41
- package/build/runtime/router/jwt.d.ts +0 -117
- package/build/runtime/router/server.d.ts +0 -24
- package/build/runtime/router/types.d.ts +0 -26
- package/build/runtime/server/index.d.ts +0 -17
- package/build/runtime-cjs/cache/cache.d.ts +0 -169
- package/build/runtime-cjs/cache/cache.js +0 -1077
- package/build/runtime-cjs/cache/constants.d.ts +0 -1
- package/build/runtime-cjs/cache/constants.js +0 -28
- package/build/runtime-cjs/cache/gc.d.ts +0 -10
- package/build/runtime-cjs/cache/gc.js +0 -74
- package/build/runtime-cjs/cache/index.d.ts +0 -3
- package/build/runtime-cjs/cache/index.js +0 -25
- package/build/runtime-cjs/cache/lists.d.ts +0 -89
- package/build/runtime-cjs/cache/lists.js +0 -467
- package/build/runtime-cjs/cache/staleManager.d.ts +0 -31
- package/build/runtime-cjs/cache/staleManager.js +0 -123
- package/build/runtime-cjs/cache/storage.d.ts +0 -110
- package/build/runtime-cjs/cache/storage.js +0 -451
- package/build/runtime-cjs/cache/stuff.d.ts +0 -2
- package/build/runtime-cjs/cache/stuff.js +0 -56
- package/build/runtime-cjs/cache/subscription.d.ts +0 -52
- package/build/runtime-cjs/cache/subscription.js +0 -349
- package/build/runtime-cjs/client/documentStore.d.ts +0 -107
- package/build/runtime-cjs/client/documentStore.js +0 -487
- package/build/runtime-cjs/client/index.d.ts +0 -50
- package/build/runtime-cjs/client/index.js +0 -162
- package/build/runtime-cjs/client/plugins/cache.d.ts +0 -9
- package/build/runtime-cjs/client/plugins/cache.js +0 -138
- package/build/runtime-cjs/client/plugins/fetch.d.ts +0 -38
- package/build/runtime-cjs/client/plugins/fetch.js +0 -210
- package/build/runtime-cjs/client/plugins/fetchParams.d.ts +0 -9
- package/build/runtime-cjs/client/plugins/fetchParams.js +0 -47
- package/build/runtime-cjs/client/plugins/fragment.d.ts +0 -2
- package/build/runtime-cjs/client/plugins/fragment.js +0 -77
- package/build/runtime-cjs/client/plugins/index.d.ts +0 -9
- package/build/runtime-cjs/client/plugins/index.js +0 -45
- package/build/runtime-cjs/client/plugins/injectedPlugins.d.ts +0 -4
- package/build/runtime-cjs/client/plugins/injectedPlugins.js +0 -25
- package/build/runtime-cjs/client/plugins/mutation.d.ts +0 -2
- package/build/runtime-cjs/client/plugins/mutation.js +0 -89
- package/build/runtime-cjs/client/plugins/optimisticKeys.d.ts +0 -7
- package/build/runtime-cjs/client/plugins/optimisticKeys.js +0 -324
- package/build/runtime-cjs/client/plugins/query.d.ts +0 -2
- package/build/runtime-cjs/client/plugins/query.js +0 -93
- package/build/runtime-cjs/client/plugins/subscription.d.ts +0 -20
- package/build/runtime-cjs/client/plugins/subscription.js +0 -114
- package/build/runtime-cjs/client/plugins/test.d.ts +0 -15
- package/build/runtime-cjs/client/plugins/test.js +0 -118
- package/build/runtime-cjs/client/plugins/throwOnError.d.ts +0 -8
- package/build/runtime-cjs/client/plugins/throwOnError.js +0 -47
- package/build/runtime-cjs/client/utils/documentPlugins.d.ts +0 -3
- package/build/runtime-cjs/client/utils/documentPlugins.js +0 -57
- package/build/runtime-cjs/client/utils/index.d.ts +0 -1
- package/build/runtime-cjs/client/utils/index.js +0 -22
- package/build/runtime-cjs/generated.d.ts +0 -5
- package/build/runtime-cjs/generated.js +0 -16
- package/build/runtime-cjs/imports/config.d.ts +0 -3
- package/build/runtime-cjs/imports/config.js +0 -24
- package/build/runtime-cjs/imports/pluginConfig.d.ts +0 -3
- package/build/runtime-cjs/imports/pluginConfig.js +0 -25
- package/build/runtime-cjs/index.d.ts +0 -8
- package/build/runtime-cjs/index.js +0 -61
- package/build/runtime-cjs/lib/config.d.ts +0 -216
- package/build/runtime-cjs/lib/config.js +0 -110
- package/build/runtime-cjs/lib/constants.d.ts +0 -6
- package/build/runtime-cjs/lib/constants.js +0 -38
- package/build/runtime-cjs/lib/deepEquals.js +0 -52
- package/build/runtime-cjs/lib/flatten.js +0 -41
- package/build/runtime-cjs/lib/index.d.ts +0 -10
- package/build/runtime-cjs/lib/index.js +0 -40
- package/build/runtime-cjs/lib/key.js +0 -41
- package/build/runtime-cjs/lib/log.js +0 -72
- package/build/runtime-cjs/lib/lru.js +0 -73
- package/build/runtime-cjs/lib/pageInfo.js +0 -79
- package/build/runtime-cjs/lib/pagination.js +0 -240
- package/build/runtime-cjs/lib/scalars.js +0 -147
- package/build/runtime-cjs/lib/selection.js +0 -66
- package/build/runtime-cjs/lib/store.d.ts +0 -19
- package/build/runtime-cjs/lib/store.js +0 -81
- package/build/runtime-cjs/lib/types.d.ts +0 -417
- package/build/runtime-cjs/lib/types.js +0 -104
- package/build/runtime-cjs/package.json +0 -1
- package/build/runtime-cjs/public/cache.d.ts +0 -42
- package/build/runtime-cjs/public/cache.js +0 -98
- package/build/runtime-cjs/public/index.d.ts +0 -1
- package/build/runtime-cjs/public/index.js +0 -28
- package/build/runtime-cjs/public/list.d.ts +0 -18
- package/build/runtime-cjs/public/list.js +0 -151
- package/build/runtime-cjs/public/record.d.ts +0 -40
- package/build/runtime-cjs/public/record.js +0 -94
- package/build/runtime-cjs/public/tests/test.d.ts +0 -156
- package/build/runtime-cjs/public/tests/test.js +0 -60
- package/build/runtime-cjs/public/types.d.ts +0 -62
- package/build/runtime-cjs/public/types.js +0 -16
- package/build/runtime-cjs/router/cookies.js +0 -168
- package/build/runtime-cjs/router/jwt.js +0 -168
- package/build/runtime-cjs/router/match.d.ts +0 -39
- package/build/runtime-cjs/router/match.js +0 -158
- package/build/runtime-cjs/router/server.d.ts +0 -24
- package/build/runtime-cjs/router/server.js +0 -117
- package/build/runtime-cjs/router/session.d.ts +0 -22
- package/build/runtime-cjs/router/session.js +0 -100
- package/build/runtime-cjs/router/types.d.ts +0 -26
- package/build/runtime-cjs/router/types.js +0 -16
- package/build/runtime-cjs/server/index.d.ts +0 -17
- package/build/runtime-cjs/server/index.js +0 -62
- package/build/runtime-esm/cache/cache.d.ts +0 -169
- package/build/runtime-esm/cache/constants.d.ts +0 -1
- package/build/runtime-esm/cache/gc.d.ts +0 -10
- package/build/runtime-esm/cache/index.d.ts +0 -3
- package/build/runtime-esm/cache/index.js +0 -5
- package/build/runtime-esm/cache/lists.d.ts +0 -89
- package/build/runtime-esm/cache/staleManager.d.ts +0 -31
- package/build/runtime-esm/cache/storage.d.ts +0 -110
- package/build/runtime-esm/cache/stuff.d.ts +0 -2
- package/build/runtime-esm/cache/subscription.d.ts +0 -52
- package/build/runtime-esm/client/documentStore.d.ts +0 -107
- package/build/runtime-esm/client/index.d.ts +0 -50
- package/build/runtime-esm/client/index.js +0 -130
- package/build/runtime-esm/client/plugins/cache.d.ts +0 -9
- package/build/runtime-esm/client/plugins/cache.js +0 -104
- package/build/runtime-esm/client/plugins/fetch.d.ts +0 -38
- package/build/runtime-esm/client/plugins/fetch.js +0 -184
- package/build/runtime-esm/client/plugins/fetchParams.d.ts +0 -9
- package/build/runtime-esm/client/plugins/fetchParams.js +0 -23
- package/build/runtime-esm/client/plugins/fragment.d.ts +0 -2
- package/build/runtime-esm/client/plugins/fragment.js +0 -53
- package/build/runtime-esm/client/plugins/index.d.ts +0 -9
- package/build/runtime-esm/client/plugins/index.js +0 -12
- package/build/runtime-esm/client/plugins/injectedPlugins.d.ts +0 -4
- package/build/runtime-esm/client/plugins/injectedPlugins.js +0 -5
- package/build/runtime-esm/client/plugins/mutation.d.ts +0 -2
- package/build/runtime-esm/client/plugins/mutation.js +0 -65
- package/build/runtime-esm/client/plugins/optimisticKeys.d.ts +0 -7
- package/build/runtime-esm/client/plugins/optimisticKeys.js +0 -290
- package/build/runtime-esm/client/plugins/query.d.ts +0 -2
- package/build/runtime-esm/client/plugins/query.js +0 -69
- package/build/runtime-esm/client/plugins/subscription.d.ts +0 -20
- package/build/runtime-esm/client/plugins/subscription.js +0 -90
- package/build/runtime-esm/client/plugins/test.d.ts +0 -15
- package/build/runtime-esm/client/plugins/test.js +0 -93
- package/build/runtime-esm/client/plugins/throwOnError.d.ts +0 -8
- package/build/runtime-esm/client/plugins/throwOnError.js +0 -23
- package/build/runtime-esm/client/utils/documentPlugins.d.ts +0 -3
- package/build/runtime-esm/client/utils/documentPlugins.js +0 -33
- package/build/runtime-esm/client/utils/index.d.ts +0 -1
- package/build/runtime-esm/client/utils/index.js +0 -1
- package/build/runtime-esm/generated.d.ts +0 -5
- package/build/runtime-esm/generated.js +0 -0
- package/build/runtime-esm/imports/config.d.ts +0 -3
- package/build/runtime-esm/imports/config.js +0 -4
- package/build/runtime-esm/imports/pluginConfig.d.ts +0 -3
- package/build/runtime-esm/imports/pluginConfig.js +0 -5
- package/build/runtime-esm/index.d.ts +0 -8
- package/build/runtime-esm/index.js +0 -22
- package/build/runtime-esm/lib/config.d.ts +0 -216
- package/build/runtime-esm/lib/config.js +0 -69
- package/build/runtime-esm/lib/constants.d.ts +0 -6
- package/build/runtime-esm/lib/deepEquals.d.ts +0 -1
- package/build/runtime-esm/lib/flatten.d.ts +0 -2
- package/build/runtime-esm/lib/index.d.ts +0 -10
- package/build/runtime-esm/lib/index.js +0 -10
- package/build/runtime-esm/lib/key.d.ts +0 -6
- package/build/runtime-esm/lib/log.d.ts +0 -6
- package/build/runtime-esm/lib/lru.d.ts +0 -52
- package/build/runtime-esm/lib/pageInfo.d.ts +0 -7
- package/build/runtime-esm/lib/pagination.d.ts +0 -27
- package/build/runtime-esm/lib/scalars.d.ts +0 -14
- package/build/runtime-esm/lib/selection.d.ts +0 -2
- package/build/runtime-esm/lib/store.d.ts +0 -19
- package/build/runtime-esm/lib/types.d.ts +0 -417
- package/build/runtime-esm/public/cache.d.ts +0 -42
- package/build/runtime-esm/public/cache.js +0 -74
- package/build/runtime-esm/public/index.d.ts +0 -1
- package/build/runtime-esm/public/index.js +0 -4
- package/build/runtime-esm/public/list.d.ts +0 -18
- package/build/runtime-esm/public/list.js +0 -127
- package/build/runtime-esm/public/record.d.ts +0 -40
- package/build/runtime-esm/public/record.js +0 -70
- package/build/runtime-esm/public/tests/test.d.ts +0 -156
- package/build/runtime-esm/public/tests/test.js +0 -36
- package/build/runtime-esm/public/types.d.ts +0 -62
- package/build/runtime-esm/router/cookies.d.ts +0 -41
- package/build/runtime-esm/router/jwt.d.ts +0 -117
- package/build/runtime-esm/router/match.d.ts +0 -39
- package/build/runtime-esm/router/match.js +0 -131
- package/build/runtime-esm/router/server.d.ts +0 -24
- package/build/runtime-esm/router/server.js +0 -92
- package/build/runtime-esm/router/session.d.ts +0 -22
- package/build/runtime-esm/router/session.js +0 -74
- package/build/runtime-esm/router/types.d.ts +0 -26
- package/build/runtime-esm/router/types.js +0 -0
- package/build/runtime-esm/server/index.d.ts +0 -17
- package/build/runtime-esm/server/index.js +0 -38
- package/build/test-cjs/index.js +0 -75249
- package/build/test-cjs/package.json +0 -1
- package/build/test-esm/index.js +0 -75244
- package/build/vite/imports.d.ts +0 -40
- package/build/vite-cjs/index.js +0 -86272
- package/build/vite-cjs/package.json +0 -1
- package/build/vite-esm/index.js +0 -86264
- /package/build/{adapter-esm → adapter}/package.json +0 -0
- /package/build/{cmd-esm → cmd}/package.json +0 -0
- /package/build/{vite → lib}/ast.d.ts +0 -0
- /package/build/{codegen-esm → lib}/package.json +0 -0
- /package/build/{lib-esm → node}/package.json +0 -0
- /package/build/{runtime-esm → oauth}/package.json +0 -0
- /package/build/{runtime-cjs/router → router}/cookies.d.ts +0 -0
- /package/build/{runtime-cjs/router → router}/jwt.d.ts +0 -0
- /package/build/{test-esm → router}/package.json +0 -0
- /package/build/{runtime-esm/public → router}/types.js +0 -0
- /package/build/{runtime-esm → runtime}/cache/constants.js +0 -0
- /package/build/{runtime-esm/lib → runtime}/constants.js +0 -0
- /package/build/{runtime-cjs/lib → runtime}/deepEquals.d.ts +0 -0
- /package/build/{runtime-esm/lib → runtime}/deepEquals.js +0 -0
- /package/build/{runtime-esm/lib → runtime}/flatten.js +0 -0
- /package/build/{runtime-cjs/lib → runtime}/log.d.ts +0 -0
- /package/build/{runtime-cjs/lib → runtime}/lru.d.ts +0 -0
- /package/build/{runtime-esm/lib → runtime}/lru.js +0 -0
- /package/build/{vite-esm → runtime}/package.json +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createServerAdapter } from '@whatwg-node/server';
|
|
2
|
+
import type { ServerAdapterRequestHandler } from '@whatwg-node/server';
|
|
3
|
+
import type { GraphQLSchema } from 'graphql';
|
|
4
|
+
import { YogaServer, type YogaServerOptions as YogaConfig } from 'graphql-yoga';
|
|
5
|
+
import type { ConfigFile, ServerConfigFile } from '../lib/config.js';
|
|
6
|
+
import type { HoudiniClient } from '../runtime/client.js';
|
|
7
|
+
import { signFormToken } from './auth-token.js';
|
|
8
|
+
import type { RouterManifest, RouterPageManifest, YogaServerOptions } from './types.js';
|
|
9
|
+
export { signFormToken };
|
|
10
|
+
export type FormResult = Record<string, {
|
|
11
|
+
data: any;
|
|
12
|
+
errors: any;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function _serverHandler<ComponentType = unknown>({ schema, server, client, production, manifest, graphqlEndpoint, on_render, componentCache, config_file, server_config, }: {
|
|
15
|
+
schema?: GraphQLSchema | null;
|
|
16
|
+
server?: Server<any, any>;
|
|
17
|
+
client: HoudiniClient;
|
|
18
|
+
production: boolean;
|
|
19
|
+
manifest: RouterManifest<ComponentType> | null;
|
|
20
|
+
assetPrefix: string;
|
|
21
|
+
graphqlEndpoint: string;
|
|
22
|
+
componentCache: Record<string, any>;
|
|
23
|
+
on_render: (args: {
|
|
24
|
+
url: string;
|
|
25
|
+
match: RouterPageManifest<ComponentType> | null;
|
|
26
|
+
is404: boolean;
|
|
27
|
+
manifest: RouterManifest<unknown>;
|
|
28
|
+
session: App.Session;
|
|
29
|
+
componentCache: Record<string, any>;
|
|
30
|
+
headers: Record<string, string>;
|
|
31
|
+
formResult?: FormResult;
|
|
32
|
+
formToken?: string;
|
|
33
|
+
authUrl?: string;
|
|
34
|
+
}) => Response | Promise<Response | undefined> | undefined;
|
|
35
|
+
config_file: ConfigFile;
|
|
36
|
+
server_config?: ServerConfigFile;
|
|
37
|
+
} & Omit<YogaServerOptions, 'schema'>): (request: Request, ...extraContext: Array<any>) => Promise<Response>;
|
|
38
|
+
export declare const serverAdapterFactory: (args: Parameters<typeof _serverHandler>[0]) => ReturnType<typeof createServerAdapter>;
|
|
39
|
+
export declare function collect_response_headers(match: {
|
|
40
|
+
headers?: Array<() => Promise<(() => unknown) | undefined>>;
|
|
41
|
+
} | null): Promise<Record<string, string>>;
|
|
42
|
+
export declare function apply_antiframing_defaults(headers: Record<string, string>): void;
|
|
43
|
+
export type ServerAdapterFactory = typeof serverAdapterFactory;
|
|
44
|
+
type YogaParams = Required<ConstructorParameters<typeof YogaServer>>[0];
|
|
45
|
+
type YogaSchemaDefinition<TContext> = NonNullable<YogaConfig<any, TContext>['schema']>;
|
|
46
|
+
type ConstructorParams = Omit<YogaParams, 'schema' | 'graphqlEndpoint'>;
|
|
47
|
+
export declare class Server<ServerContext extends Record<string, any>, UserContext extends Record<string, any>> {
|
|
48
|
+
opts: ConstructorParams | null;
|
|
49
|
+
_yoga: YogaServer<any, any> | null;
|
|
50
|
+
constructor(opts?: ConstructorParams);
|
|
51
|
+
init({ endpoint, schema, getSession, }: {
|
|
52
|
+
schema: YogaSchemaDefinition<any>;
|
|
53
|
+
endpoint: string;
|
|
54
|
+
getSession: (request: Request) => Promise<UserContext>;
|
|
55
|
+
}): import("@whatwg-node/server").ServerAdapter<ServerContext, Server<ServerContext, UserContext>>;
|
|
56
|
+
handle: ServerAdapterRequestHandler<ServerContext>;
|
|
57
|
+
}
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { createServerAdapter } from "@whatwg-node/server";
|
|
2
|
+
import {
|
|
3
|
+
YogaServer
|
|
4
|
+
} from "graphql-yoga";
|
|
5
|
+
import { getAuthUrl, resolveApiEndpoint, setAuthUrl } from "../runtime/config.js";
|
|
6
|
+
import { interpolateRedirect, valueAtPath } from "../runtime/endpoint.js";
|
|
7
|
+
import { coerceFormData } from "../runtime/formData.js";
|
|
8
|
+
import { buildGraphQLBody } from "../runtime/multipart.js";
|
|
9
|
+
import { marshalInputs } from "../runtime/scalars.js";
|
|
10
|
+
import { CSRF_FIELD, signFormToken, verifyFormToken, signSessionToken } from "./auth-token.js";
|
|
11
|
+
import { serialize as encodeCookie } from "./cookies.js";
|
|
12
|
+
import { find_match, find_prefix_match } from "./match.js";
|
|
13
|
+
import {
|
|
14
|
+
applySessionToken,
|
|
15
|
+
clear_session,
|
|
16
|
+
get_session,
|
|
17
|
+
handle_request,
|
|
18
|
+
isAllowedOrigin,
|
|
19
|
+
session_cookie_name,
|
|
20
|
+
set_session,
|
|
21
|
+
sign_session
|
|
22
|
+
} from "./session.js";
|
|
23
|
+
const HOUDINI_REQUEST_HEADER = "x-houdini-request";
|
|
24
|
+
const HOUDINI_OPERATION_HEADER = "x-houdini-operation";
|
|
25
|
+
async function readBodyWithLimit(request, maxBytes) {
|
|
26
|
+
if (!request.body) {
|
|
27
|
+
return request;
|
|
28
|
+
}
|
|
29
|
+
const reader = request.body.getReader();
|
|
30
|
+
const chunks = [];
|
|
31
|
+
let total = 0;
|
|
32
|
+
while (true) {
|
|
33
|
+
const { done, value } = await reader.read();
|
|
34
|
+
if (done) {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
if (value) {
|
|
38
|
+
total += value.byteLength;
|
|
39
|
+
if (total > maxBytes) {
|
|
40
|
+
await reader.cancel();
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
chunks.push(value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const body = new Uint8Array(total);
|
|
47
|
+
let offset = 0;
|
|
48
|
+
for (const chunk of chunks) {
|
|
49
|
+
body.set(chunk, offset);
|
|
50
|
+
offset += chunk.byteLength;
|
|
51
|
+
}
|
|
52
|
+
return new Request(request.url, {
|
|
53
|
+
method: request.method,
|
|
54
|
+
headers: request.headers,
|
|
55
|
+
body
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function sessionMintPlugin(manifest, sessionKeys) {
|
|
59
|
+
return {
|
|
60
|
+
onExecute() {
|
|
61
|
+
return {
|
|
62
|
+
async onExecuteDone({ args, result, setResult }) {
|
|
63
|
+
if (!result || typeof result[Symbol.asyncIterator] === "function" || !result.data) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (args?.contextValue?.request?.headers?.get(INTERNAL_FORM_HEADER)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const token = await mintSessionToken({
|
|
70
|
+
data: result.data,
|
|
71
|
+
errors: result.errors,
|
|
72
|
+
operationName: operationNameOf(args),
|
|
73
|
+
requestHeaders: args.contextValue.request.headers,
|
|
74
|
+
manifest,
|
|
75
|
+
sessionKeys
|
|
76
|
+
});
|
|
77
|
+
if (!token) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setResult({
|
|
81
|
+
...result,
|
|
82
|
+
extensions: { ...result.extensions, houdiniSession: token }
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function mintSessionToken({
|
|
90
|
+
data,
|
|
91
|
+
errors,
|
|
92
|
+
operationName,
|
|
93
|
+
requestHeaders,
|
|
94
|
+
manifest,
|
|
95
|
+
sessionKeys
|
|
96
|
+
}) {
|
|
97
|
+
if (errors?.length) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const session = operationName ? manifest?.sessionMutations?.[operationName] : void 0;
|
|
101
|
+
if (!session) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const value = valueAtPath(data, session.sessionPath.split("."));
|
|
105
|
+
const priorSession = await get_session(requestHeaders, sessionKeys);
|
|
106
|
+
return await signSessionToken(
|
|
107
|
+
value ?? null,
|
|
108
|
+
sessionKeys,
|
|
109
|
+
session.merge,
|
|
110
|
+
priorSession
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const INTERNAL_FORM_HEADER = "x-houdini-internal-form";
|
|
114
|
+
function operationNameOf(args) {
|
|
115
|
+
if (args?.operationName) {
|
|
116
|
+
return args.operationName;
|
|
117
|
+
}
|
|
118
|
+
const ops = (args?.document?.definitions ?? []).filter(
|
|
119
|
+
(def) => def.kind === "OperationDefinition"
|
|
120
|
+
);
|
|
121
|
+
if (ops.length === 1 && ops[0].name?.value) {
|
|
122
|
+
return ops[0].name.value;
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
function _serverHandler({
|
|
127
|
+
schema,
|
|
128
|
+
server,
|
|
129
|
+
client,
|
|
130
|
+
production,
|
|
131
|
+
manifest,
|
|
132
|
+
graphqlEndpoint,
|
|
133
|
+
on_render,
|
|
134
|
+
componentCache,
|
|
135
|
+
config_file,
|
|
136
|
+
server_config
|
|
137
|
+
}) {
|
|
138
|
+
const session_keys = localApiSessionKeys(server_config);
|
|
139
|
+
setAuthUrl(server_config?.auth?.url);
|
|
140
|
+
const sessionProxyPath = schema ? void 0 : getAuthUrl() + "/proxy";
|
|
141
|
+
if (session_keys.length === 0) {
|
|
142
|
+
session_keys.push(crypto.randomUUID());
|
|
143
|
+
}
|
|
144
|
+
if (schema && !server) {
|
|
145
|
+
server = new Server({
|
|
146
|
+
landingPage: !production
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (server instanceof Server) {
|
|
150
|
+
server.opts = {
|
|
151
|
+
...server.opts ?? {},
|
|
152
|
+
plugins: [...server.opts?.plugins ?? [], sessionMintPlugin(manifest, session_keys)]
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
let requestHandler = null;
|
|
156
|
+
if (server && schema) {
|
|
157
|
+
requestHandler = server.init({
|
|
158
|
+
schema,
|
|
159
|
+
endpoint: graphqlEndpoint,
|
|
160
|
+
getSession: (request) => get_session(request.headers, session_keys)
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
client.componentCache = componentCache;
|
|
164
|
+
if (requestHandler) {
|
|
165
|
+
client.registerProxy(graphqlEndpoint, async ({ query, variables, session }) => {
|
|
166
|
+
const response = await requestHandler(
|
|
167
|
+
new Request(`http://localhost/${graphqlEndpoint}`, {
|
|
168
|
+
method: "POST",
|
|
169
|
+
headers: {
|
|
170
|
+
"Content-Type": "application/json",
|
|
171
|
+
// sign the session so the local handler's get_session (a signed-JWT verify)
|
|
172
|
+
// accepts it — a raw JSON cookie is rejected and would run session-less.
|
|
173
|
+
Cookie: encodeCookie(
|
|
174
|
+
session_cookie_name,
|
|
175
|
+
await sign_session(session ?? {}, session_keys[0]),
|
|
176
|
+
{ httpOnly: true }
|
|
177
|
+
)
|
|
178
|
+
},
|
|
179
|
+
body: JSON.stringify({
|
|
180
|
+
query,
|
|
181
|
+
variables
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
);
|
|
185
|
+
return await response.json();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
const renderPage = async (nonNullManifest, request, url, opts) => {
|
|
189
|
+
const [exactMatch] = find_match(nonNullManifest, url);
|
|
190
|
+
const is404 = !exactMatch;
|
|
191
|
+
const match = exactMatch ?? find_prefix_match(nonNullManifest, url);
|
|
192
|
+
const headers = await collect_response_headers(match);
|
|
193
|
+
apply_antiframing_defaults(headers);
|
|
194
|
+
const session = await get_session(request.headers, session_keys);
|
|
195
|
+
const formToken = await signFormToken(session, session_keys);
|
|
196
|
+
const rendered = await on_render({
|
|
197
|
+
url,
|
|
198
|
+
match,
|
|
199
|
+
is404,
|
|
200
|
+
session,
|
|
201
|
+
manifest: nonNullManifest,
|
|
202
|
+
componentCache,
|
|
203
|
+
headers,
|
|
204
|
+
formResult: opts?.formResult,
|
|
205
|
+
formToken,
|
|
206
|
+
// the session endpoint, injected so the client relay/useSession can reach it (it's
|
|
207
|
+
// server-only config). The GraphQL endpoint + proxy path are derived client-side from
|
|
208
|
+
// the public config, so they aren't injected here.
|
|
209
|
+
authUrl: getAuthUrl()
|
|
210
|
+
});
|
|
211
|
+
if (!rendered) {
|
|
212
|
+
return new Response("404", { status: 404 });
|
|
213
|
+
}
|
|
214
|
+
if (opts?.status && opts.status !== rendered.status) {
|
|
215
|
+
return new Response(rendered.body, { status: opts.status, headers: rendered.headers });
|
|
216
|
+
}
|
|
217
|
+
return rendered;
|
|
218
|
+
};
|
|
219
|
+
const handleForm = async (nonNullManifest, request, parsedURL, url) => {
|
|
220
|
+
if (request.method !== "POST") {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const contentType = request.headers.get("content-type") ?? "";
|
|
224
|
+
if (!contentType.includes("application/x-www-form-urlencoded") && !contentType.includes("multipart/form-data")) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (!isAllowedOrigin(request, server_config)) {
|
|
228
|
+
return new Response("Forbidden", { status: 403 });
|
|
229
|
+
}
|
|
230
|
+
const maxBodyBytes = server_config?.formMaxBodyBytes ?? 10 * 1024 * 1024;
|
|
231
|
+
const contentLength = Number(request.headers.get("content-length"));
|
|
232
|
+
if (Number.isFinite(contentLength) && contentLength > maxBodyBytes) {
|
|
233
|
+
return new Response("Payload Too Large", { status: 413 });
|
|
234
|
+
}
|
|
235
|
+
const limited = await readBodyWithLimit(request, maxBodyBytes);
|
|
236
|
+
if (limited === null) {
|
|
237
|
+
return new Response("Payload Too Large", { status: 413 });
|
|
238
|
+
}
|
|
239
|
+
const formData = await limited.formData();
|
|
240
|
+
const session = await get_session(request.headers, session_keys);
|
|
241
|
+
if (!await verifyFormToken(formData.get(CSRF_FIELD), session, session_keys)) {
|
|
242
|
+
return new Response("Forbidden", { status: 403 });
|
|
243
|
+
}
|
|
244
|
+
const mutationName = formData.get("__houdini_form");
|
|
245
|
+
if (typeof mutationName !== "string") {
|
|
246
|
+
return new Response("Bad Request", { status: 400 });
|
|
247
|
+
}
|
|
248
|
+
const formIdValue = formData.get("__houdini_form_id");
|
|
249
|
+
const formId = typeof formIdValue === "string" && formIdValue ? formIdValue : mutationName;
|
|
250
|
+
const loadArtifact = nonNullManifest.formActions?.[mutationName];
|
|
251
|
+
if (!loadArtifact) {
|
|
252
|
+
return new Response(`Unknown form mutation: ${mutationName}`, { status: 400 });
|
|
253
|
+
}
|
|
254
|
+
const handler = requestHandler;
|
|
255
|
+
if (!handler) {
|
|
256
|
+
return new Response("Form submissions require a local GraphQL server", { status: 500 });
|
|
257
|
+
}
|
|
258
|
+
const { default: artifact } = await loadArtifact();
|
|
259
|
+
const input = artifact.input ?? { fields: {}, types: {}, defaults: {}, runtimeScalars: {} };
|
|
260
|
+
const coerced = coerceFormData(formData, input, config_file, artifact.endpoint?.fields);
|
|
261
|
+
const variables = marshalInputs({ artifact, input: coerced, config: config_file }) ?? {};
|
|
262
|
+
const { contentType: bodyContentType, body } = buildGraphQLBody(artifact.raw, variables);
|
|
263
|
+
const response = await handler(
|
|
264
|
+
new Request(`http://localhost/${graphqlEndpoint}`, {
|
|
265
|
+
method: "POST",
|
|
266
|
+
headers: {
|
|
267
|
+
...bodyContentType ? { "Content-Type": bodyContentType } : {},
|
|
268
|
+
// mark this as the no-JS form's internal execution so the session-mint plugin
|
|
269
|
+
// skips it (we set the cookie directly below)
|
|
270
|
+
[INTERNAL_FORM_HEADER]: "1",
|
|
271
|
+
// sign the session so the in-process handler's get_session (a signed-JWT verify)
|
|
272
|
+
// accepts it — a raw JSON value would fail verification and run session-less
|
|
273
|
+
Cookie: encodeCookie(
|
|
274
|
+
session_cookie_name,
|
|
275
|
+
await sign_session(session ?? {}, session_keys[0]),
|
|
276
|
+
{ httpOnly: true }
|
|
277
|
+
)
|
|
278
|
+
},
|
|
279
|
+
body
|
|
280
|
+
})
|
|
281
|
+
);
|
|
282
|
+
const result = await response.json();
|
|
283
|
+
if (result.errors && result.errors.length > 0) {
|
|
284
|
+
return renderPage(nonNullManifest, request, url, {
|
|
285
|
+
formResult: { [formId]: { data: result.data ?? null, errors: result.errors } },
|
|
286
|
+
status: 422
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
let location = url;
|
|
290
|
+
const redirect = artifact.endpoint?.redirect;
|
|
291
|
+
if (redirect) {
|
|
292
|
+
const target = interpolateRedirect(redirect, result.data);
|
|
293
|
+
if (target) {
|
|
294
|
+
location = target;
|
|
295
|
+
} else if (!production) {
|
|
296
|
+
console.warn(
|
|
297
|
+
`@endpoint redirect for "${mutationName}" resolved to a null value; falling back to the current page`
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const formResponse = new Response(null, { status: 303, headers: { Location: location } });
|
|
302
|
+
const sessionWrite = nonNullManifest.sessionMutations?.[mutationName];
|
|
303
|
+
if (sessionWrite) {
|
|
304
|
+
const value = valueAtPath(result.data, sessionWrite.sessionPath.split("."));
|
|
305
|
+
const req = { request, config: config_file, session_keys };
|
|
306
|
+
if (value == null) {
|
|
307
|
+
clear_session(formResponse);
|
|
308
|
+
} else if (sessionWrite.merge) {
|
|
309
|
+
const existing = await get_session(request.headers, session_keys);
|
|
310
|
+
await set_session(req, formResponse, { ...existing, ...value });
|
|
311
|
+
} else {
|
|
312
|
+
await set_session(req, formResponse, value);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return formResponse;
|
|
316
|
+
};
|
|
317
|
+
const handleSessionProxy = async (request) => {
|
|
318
|
+
if (!sessionProxyPath || new URL(request.url).pathname !== sessionProxyPath) {
|
|
319
|
+
return void 0;
|
|
320
|
+
}
|
|
321
|
+
if (request.method !== "POST") {
|
|
322
|
+
return new Response("Method Not Allowed", { status: 405 });
|
|
323
|
+
}
|
|
324
|
+
if (!isAllowedOrigin(request, server_config)) {
|
|
325
|
+
return new Response("Forbidden", { status: 403 });
|
|
326
|
+
}
|
|
327
|
+
const maxBodyBytes = server_config?.formMaxBodyBytes ?? 10 * 1024 * 1024;
|
|
328
|
+
const limited = await readBodyWithLimit(request, maxBodyBytes);
|
|
329
|
+
if (limited === null) {
|
|
330
|
+
return new Response("Payload Too Large", { status: 413 });
|
|
331
|
+
}
|
|
332
|
+
const bodyBytes = new Uint8Array(await limited.arrayBuffer());
|
|
333
|
+
const forwardHeaders = new Headers(request.headers);
|
|
334
|
+
forwardHeaders.delete("cookie");
|
|
335
|
+
forwardHeaders.delete("host");
|
|
336
|
+
forwardHeaders.delete("content-length");
|
|
337
|
+
forwardHeaders.delete(HOUDINI_OPERATION_HEADER);
|
|
338
|
+
let upstreamResponse;
|
|
339
|
+
try {
|
|
340
|
+
upstreamResponse = await fetch(resolveApiEndpoint(config_file), {
|
|
341
|
+
method: "POST",
|
|
342
|
+
headers: forwardHeaders,
|
|
343
|
+
body: bodyBytes
|
|
344
|
+
});
|
|
345
|
+
} catch {
|
|
346
|
+
return new Response("Bad Gateway", { status: 502 });
|
|
347
|
+
}
|
|
348
|
+
const upstreamText = await upstreamResponse.text();
|
|
349
|
+
let payload;
|
|
350
|
+
try {
|
|
351
|
+
payload = JSON.parse(upstreamText);
|
|
352
|
+
} catch {
|
|
353
|
+
return new Response(upstreamText, {
|
|
354
|
+
status: upstreamResponse.status,
|
|
355
|
+
headers: {
|
|
356
|
+
"content-type": upstreamResponse.headers.get("content-type") ?? "text/plain"
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
const operationName = request.headers.get(HOUDINI_OPERATION_HEADER);
|
|
361
|
+
const carrier = new Response(null, { status: upstreamResponse.status });
|
|
362
|
+
let body = payload;
|
|
363
|
+
const token = await mintSessionToken({
|
|
364
|
+
data: payload?.data,
|
|
365
|
+
errors: payload?.errors,
|
|
366
|
+
operationName,
|
|
367
|
+
requestHeaders: request.headers,
|
|
368
|
+
manifest,
|
|
369
|
+
sessionKeys: session_keys
|
|
370
|
+
});
|
|
371
|
+
if (token && await applySessionToken(
|
|
372
|
+
{ request, config: config_file, server_config, session_keys },
|
|
373
|
+
carrier,
|
|
374
|
+
token
|
|
375
|
+
)) {
|
|
376
|
+
body = {
|
|
377
|
+
...payload,
|
|
378
|
+
extensions: { ...payload?.extensions, houdiniSessionApplied: true }
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
carrier.headers.set("content-type", "application/json");
|
|
382
|
+
return new Response(JSON.stringify(body), {
|
|
383
|
+
status: upstreamResponse.status,
|
|
384
|
+
headers: carrier.headers
|
|
385
|
+
});
|
|
386
|
+
};
|
|
387
|
+
return async (request, ...extraContext) => {
|
|
388
|
+
if (!manifest) {
|
|
389
|
+
return new Response(
|
|
390
|
+
"Adapter did not provide the project's manifest. Please open an issue on github.",
|
|
391
|
+
{ status: 500 }
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
const parsedURL = new URL(request.url);
|
|
395
|
+
const url = parsedURL.pathname + parsedURL.search;
|
|
396
|
+
if (requestHandler && parsedURL.pathname === graphqlEndpoint) {
|
|
397
|
+
if (request.method === "POST") {
|
|
398
|
+
const contentType = request.headers.get("content-type") ?? "";
|
|
399
|
+
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
400
|
+
return new Response("Unsupported Media Type", { status: 415 });
|
|
401
|
+
}
|
|
402
|
+
const corsSimpleBody = contentType === "" || contentType.includes("multipart/form-data") || contentType.includes("text/plain");
|
|
403
|
+
if (corsSimpleBody && !request.headers.get(HOUDINI_REQUEST_HEADER)) {
|
|
404
|
+
return new Response("Forbidden", { status: 403 });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return requestHandler(request, ...extraContext);
|
|
408
|
+
}
|
|
409
|
+
const proxyResponse = await handleSessionProxy(request);
|
|
410
|
+
if (proxyResponse) {
|
|
411
|
+
return proxyResponse;
|
|
412
|
+
}
|
|
413
|
+
const authResponse = await handle_request({
|
|
414
|
+
request,
|
|
415
|
+
config: config_file,
|
|
416
|
+
server_config,
|
|
417
|
+
session_keys
|
|
418
|
+
});
|
|
419
|
+
if (authResponse) {
|
|
420
|
+
return authResponse;
|
|
421
|
+
}
|
|
422
|
+
const formResponse = await handleForm(manifest, request, parsedURL, url);
|
|
423
|
+
if (formResponse) {
|
|
424
|
+
return formResponse;
|
|
425
|
+
}
|
|
426
|
+
return renderPage(manifest, request, url);
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
const serverAdapterFactory = (args) => {
|
|
430
|
+
return createServerAdapter(_serverHandler(args));
|
|
431
|
+
};
|
|
432
|
+
async function collect_response_headers(match) {
|
|
433
|
+
const merged = {};
|
|
434
|
+
for (const load of match?.headers ?? []) {
|
|
435
|
+
const fn = await load();
|
|
436
|
+
if (typeof fn !== "function") {
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
const result = await fn();
|
|
440
|
+
if (result && typeof result === "object") {
|
|
441
|
+
for (const [key, value] of Object.entries(result)) {
|
|
442
|
+
merged[key] = String(value);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return merged;
|
|
447
|
+
}
|
|
448
|
+
function apply_antiframing_defaults(headers) {
|
|
449
|
+
const has = (name) => Object.keys(headers).some((key) => key.toLowerCase() === name);
|
|
450
|
+
if (!has("content-security-policy")) {
|
|
451
|
+
headers["Content-Security-Policy"] = "frame-ancestors 'self'";
|
|
452
|
+
}
|
|
453
|
+
if (!has("x-frame-options")) {
|
|
454
|
+
headers["X-Frame-Options"] = "SAMEORIGIN";
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
function localApiSessionKeys(serverConfig) {
|
|
458
|
+
return serverConfig?.auth?.sessionKeys ?? [];
|
|
459
|
+
}
|
|
460
|
+
class Server {
|
|
461
|
+
opts;
|
|
462
|
+
_yoga = null;
|
|
463
|
+
constructor(opts) {
|
|
464
|
+
this.opts = opts ?? null;
|
|
465
|
+
}
|
|
466
|
+
init({
|
|
467
|
+
endpoint,
|
|
468
|
+
schema,
|
|
469
|
+
getSession
|
|
470
|
+
}) {
|
|
471
|
+
this._yoga = new YogaServer({
|
|
472
|
+
...this.opts,
|
|
473
|
+
schema,
|
|
474
|
+
graphqlEndpoint: endpoint,
|
|
475
|
+
context: async (ctx) => {
|
|
476
|
+
const userContext = !this.opts ? {} : typeof this.opts.context === "function" ? await this.opts.context(ctx) : this.opts.context || {};
|
|
477
|
+
const sessionContext = await getSession(ctx.request) || {};
|
|
478
|
+
return {
|
|
479
|
+
...userContext,
|
|
480
|
+
session: sessionContext
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
return createServerAdapter(this, {
|
|
485
|
+
fetchAPI: this._yoga.fetchAPI,
|
|
486
|
+
plugins: this._yoga.plugins
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
handle = (request, serverContext) => {
|
|
490
|
+
return this._yoga.handle(request, serverContext);
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
export {
|
|
494
|
+
Server,
|
|
495
|
+
_serverHandler,
|
|
496
|
+
apply_antiframing_defaults,
|
|
497
|
+
collect_response_headers,
|
|
498
|
+
serverAdapterFactory,
|
|
499
|
+
signFormToken
|
|
500
|
+
};
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { ConfigFile } from '../lib';
|
|
2
|
-
|
|
1
|
+
import type { ConfigFile, ServerConfigFile } from '../lib/index.js';
|
|
2
|
+
export declare function isAllowedOrigin(request: Request, server_config?: ServerConfigFile): boolean;
|
|
3
|
+
export type ServerHandlerArgs = {
|
|
3
4
|
request: Request;
|
|
4
5
|
config: ConfigFile;
|
|
6
|
+
server_config?: ServerConfigFile;
|
|
5
7
|
session_keys: string[];
|
|
6
8
|
};
|
|
9
|
+
export declare function applySessionToken(args: ServerHandlerArgs, response: Response, token: unknown): Promise<boolean>;
|
|
7
10
|
export declare function handle_request(args: ServerHandlerArgs): Promise<Response | undefined>;
|
|
8
11
|
export type Server = {
|
|
9
12
|
use(fn: ServerMiddleware): void;
|
|
@@ -18,5 +21,7 @@ export type ServerResponse = {
|
|
|
18
21
|
set_header(name: string, value: string): void;
|
|
19
22
|
};
|
|
20
23
|
export declare const session_cookie_name = "__houdini__";
|
|
24
|
+
export declare function clear_session(response: Response): void;
|
|
25
|
+
export declare function sign_session(session: App.Session, key: string): Promise<string>;
|
|
26
|
+
export declare function set_session(req: ServerHandlerArgs, response: Response, value: App.Session): Promise<void>;
|
|
21
27
|
export declare function get_session(req: Headers, secrets: string[]): Promise<App.Session>;
|
|
22
|
-
export {};
|