houdini-svelte 3.0.1 → 3.0.3

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.
@@ -125,6 +125,8 @@ if (PLATFORM_OVERRIDE === 'wasm') {
125
125
  }
126
126
 
127
127
  // --- Native binary path ---
128
+ const attempted = [];
129
+
128
130
  function getBinaryPath() {
129
131
  if (MANUAL_BINARY_PATH && fs.existsSync(MANUAL_BINARY_PATH)) {
130
132
  return MANUAL_BINARY_PATH;
@@ -138,36 +140,82 @@ function getBinaryPath() {
138
140
  process.stderr.write(`[houdini-svelte] Unknown platform "${PLATFORM_OVERRIDE}". Valid values: ${Object.keys(BINARY_DISTRIBUTION_PACKAGES).join(', ')}, wasm\n`);
139
141
  process.exit(1);
140
142
  }
141
- return path.join(__dirname, binaryName);
143
+ return path.join(__dirname, '..', binaryName);
142
144
  }
143
145
 
146
+ // module resolution from the shim's own location: real installs, and any
147
+ // environment that provides NODE_PATH (pnpm scripts do)
144
148
  try {
145
149
  const platformPackagePath = require.resolve(`${platformSpecificPackageName}/package.json`);
146
150
  return path.join(path.dirname(platformPackagePath), 'bin', binaryName);
147
151
  } catch {
148
- const siblingPath = path.join(__dirname, '..', platformSpecificPackageName, 'bin', binaryName);
149
- if (fs.existsSync(siblingPath)) return siblingPath;
150
-
151
- const pnpmMatch = __dirname.match(/(.+\/node_modules\/)\.pnpm\/[^/]+\/node_modules\//);
152
- if (pnpmMatch) {
153
- const pnpmDir = path.join(pnpmMatch[1], '.pnpm');
154
- try {
155
- const packageJSON = require(path.join(__dirname, '..', 'package.json'));
156
- const entry = `${platformSpecificPackageName}@${packageJSON.version}`;
157
- const found = fs.readdirSync(pnpmDir).find(e => e === entry);
158
- if (found) {
159
- const p = path.join(pnpmDir, found, 'node_modules', platformSpecificPackageName, 'bin', binaryName);
160
- if (fs.existsSync(p)) return p;
161
- }
162
- } catch {}
163
- }
152
+ attempted.push(`require.resolve('${platformSpecificPackageName}') from ${__dirname}`);
153
+ }
154
+
155
+ // module resolution from the invoking project: a linked development setup puts
156
+ // the platform package in the project's node_modules, which the walk from the
157
+ // shim's realpath (inside the linked repo) never visits
158
+ try {
159
+ const platformPackagePath = require.resolve(`${platformSpecificPackageName}/package.json`, {
160
+ paths: [process.cwd()],
161
+ });
162
+ return path.join(path.dirname(platformPackagePath), 'bin', binaryName);
163
+ } catch {
164
+ attempted.push(`require.resolve('${platformSpecificPackageName}') from ${process.cwd()}`);
165
+ }
164
166
 
165
- return path.join(__dirname, binaryName);
167
+ // flat node_modules: the platform package next to this one
168
+ const siblingPath = path.join(__dirname, '..', platformSpecificPackageName, 'bin', binaryName);
169
+ if (fs.existsSync(siblingPath)) return siblingPath;
170
+ attempted.push(siblingPath);
171
+
172
+ // monorepo build layout: the shim lives at <pkg>/build/houdini-svelte/bin and the
173
+ // platform package at <pkg>/build/<platform package>
174
+ const buildSiblingPath = path.join(__dirname, '..', '..', platformSpecificPackageName, 'bin', binaryName);
175
+ if (fs.existsSync(buildSiblingPath)) return buildSiblingPath;
176
+ attempted.push(buildSiblingPath);
177
+
178
+ const pnpmMatch = __dirname.match(/(.+\/node_modules\/)\.pnpm\/[^/]+\/node_modules\//);
179
+ if (pnpmMatch) {
180
+ const pnpmDir = path.join(pnpmMatch[1], '.pnpm');
181
+ try {
182
+ const packageJSON = require(path.join(__dirname, '..', 'package.json'));
183
+ const entry = `${platformSpecificPackageName}@${packageJSON.version}`;
184
+ const found = fs.readdirSync(pnpmDir).find(e => e === entry);
185
+ if (found) {
186
+ const p = path.join(pnpmDir, found, 'node_modules', platformSpecificPackageName, 'bin', binaryName);
187
+ if (fs.existsSync(p)) return p;
188
+ }
189
+ attempted.push(path.join(pnpmDir, entry, 'node_modules', platformSpecificPackageName, 'bin', binaryName));
190
+ } catch {}
166
191
  }
192
+
193
+ // the binary postInstall downloads into the package root when no platform
194
+ // package could be installed (the shim lives in bin/, one level down)
195
+ return path.join(__dirname, '..', binaryName);
196
+ }
197
+
198
+ // Refuse to exec ourselves: when every resolution attempt fails, the final
199
+ // candidate (the postInstall download location) can be this very script — exec'ing
200
+ // it recurses forever, forking a new node per iteration until the machine chokes.
201
+ // A missing binary must be a loud error, never a spawn loop.
202
+ const binaryPath = getBinaryPath();
203
+ let realBinaryPath = null;
204
+ try {
205
+ realBinaryPath = fs.realpathSync(binaryPath);
206
+ } catch {}
207
+ if (!realBinaryPath || realBinaryPath === fs.realpathSync(__filename)) {
208
+ attempted.push(binaryPath);
209
+ process.stderr.write(
210
+ `[houdini-svelte] Could not locate the houdini-svelte binary for ${process.platform}-${process.arch}. Tried:\n` +
211
+ attempted.map((p) => ` - ${p}\n`).join('') +
212
+ `Install the platform package for your system or point HOUDINI_SVELTE_BINARY_PATH at the binary.\n`
213
+ );
214
+ process.exit(1);
167
215
  }
168
216
 
169
217
  try {
170
- execFileSync(getBinaryPath(), process.argv.slice(2), { stdio: 'inherit' });
218
+ execFileSync(binaryPath, process.argv.slice(2), { stdio: 'inherit' });
171
219
  } catch (error) {
172
220
  process.exit(error.status || 1);
173
221
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "houdini-svelte",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/HoudiniGraphql/houdini.git"
@@ -19,13 +19,13 @@
19
19
  "svelte": "^5.19.0"
20
20
  },
21
21
  "optionalDependencies": {
22
- "houdini-svelte-darwin-x64": "3.0.1",
23
- "houdini-svelte-darwin-arm64": "3.0.1",
24
- "houdini-svelte-linux-x64": "3.0.1",
25
- "houdini-svelte-linux-arm64": "3.0.1",
26
- "houdini-svelte-win32-x64": "3.0.1",
27
- "houdini-svelte-win32-arm64": "3.0.1",
28
- "houdini-svelte-wasm": "3.0.1"
22
+ "houdini-svelte-darwin-x64": "3.0.3",
23
+ "houdini-svelte-darwin-arm64": "3.0.3",
24
+ "houdini-svelte-linux-x64": "3.0.3",
25
+ "houdini-svelte-linux-arm64": "3.0.3",
26
+ "houdini-svelte-win32-x64": "3.0.3",
27
+ "houdini-svelte-win32-arm64": "3.0.3",
28
+ "houdini-svelte-wasm": "3.0.3"
29
29
  },
30
30
  "exports": {
31
31
  "./package.json": "./package.json",
package/postInstall.js CHANGED
@@ -5,7 +5,7 @@ const https = require('https')
5
5
  const child_process = require('child_process')
6
6
 
7
7
  // Adjust the version you want to install. You can also make this dynamic.
8
- const BINARY_DISTRIBUTION_VERSION = '3.0.1'
8
+ const BINARY_DISTRIBUTION_VERSION = '3.0.3'
9
9
 
10
10
  // Windows binaries end with .exe so we need to special case them.
11
11
  const binaryName = process.platform === 'win32' ? 'houdini-svelte.exe' : 'houdini-svelte'
@@ -21,14 +21,17 @@ export class FragmentStore<
21
21
  _Data extends GraphQLObject,
22
22
  _ReferenceType extends {},
23
23
  _Input extends GraphQLVariables = GraphQLVariables,
24
+ // generated stores narrow this to their document's artifact type so a store
25
+ // can be matched back to its data/input types (e.g. by record.read/write)
26
+ _Artifact extends FragmentArtifact = FragmentArtifact,
24
27
  > {
25
- artifact: FragmentArtifact
28
+ artifact: _Artifact
26
29
  name: string
27
30
  kind = CompiledFragmentKind
28
31
 
29
32
  protected context: HoudiniFetchContext | null = null
30
33
 
31
- constructor({ artifact, storeName }: { artifact: FragmentArtifact; storeName: string }) {
34
+ constructor({ artifact, storeName }: { artifact: _Artifact; storeName: string }) {
32
35
  this.artifact = artifact
33
36
  this.name = storeName
34
37
  }
@@ -26,16 +26,19 @@ import type { OffsetFragmentStoreInstance } from '../../types.js'
26
26
  import { FragmentStore } from '../fragment.js'
27
27
  import type { StoreConfig } from '../query.js'
28
28
 
29
- type FragmentStoreConfig<_Data extends GraphQLObject, _Input> = StoreConfig<
30
- _Data,
29
+ type FragmentStoreConfig<
30
+ _Data extends GraphQLObject,
31
31
  _Input,
32
- FragmentArtifact
33
- > & { paginationArtifact: QueryArtifact }
32
+ _Artifact extends FragmentArtifact = FragmentArtifact,
33
+ > = StoreConfig<_Data, _Input, _Artifact> & { paginationArtifact: QueryArtifact }
34
34
 
35
35
  export class BasePaginatedFragmentStore<
36
36
  _Data extends GraphQLObject,
37
37
  _ReferenceType extends {},
38
38
  _Input,
39
+ // generated stores narrow this to their document's artifact type so a store
40
+ // can be matched back to its data/input types (e.g. by record.read/write)
41
+ _Artifact extends FragmentArtifact = FragmentArtifact,
39
42
  > {
40
43
  // all paginated stores need to have a flag to distinguish from other fragment stores
41
44
  paginated = true
@@ -43,9 +46,9 @@ export class BasePaginatedFragmentStore<
43
46
  protected paginationArtifact: QueryArtifact
44
47
  name: string
45
48
  kind = CompiledFragmentKind
46
- artifact: FragmentArtifact
49
+ artifact: _Artifact
47
50
 
48
- constructor(config: FragmentStoreConfig<_Data, _Input>) {
51
+ constructor(config: FragmentStoreConfig<_Data, _Input, _Artifact>) {
49
52
  this.paginationArtifact = config.paginationArtifact
50
53
  this.name = config.storeName
51
54
  this.artifact = config.artifact
@@ -93,7 +96,8 @@ export class FragmentStoreCursor<
93
96
  _Data extends GraphQLObject,
94
97
  _ReferenceType extends {},
95
98
  _Input extends GraphQLVariables,
96
- > extends BasePaginatedFragmentStore<_Data, _ReferenceType, _Input> {
99
+ _Artifact extends FragmentArtifact = FragmentArtifact,
100
+ > extends BasePaginatedFragmentStore<_Data, _ReferenceType, _Input, _Artifact> {
97
101
  // we want to add the cursor-based fetch to the return value of get
98
102
  get(initialValue: _Data | { [fragmentKey]: _ReferenceType } | null) {
99
103
  const base = new FragmentStore<_Data, {}, _Input>({
@@ -286,7 +290,8 @@ export class FragmentStoreOffset<
286
290
  _Data extends GraphQLObject,
287
291
  _ReferenceType extends {},
288
292
  _Input extends GraphQLVariables,
289
- > extends BasePaginatedFragmentStore<_Data, _ReferenceType, _Input> {
293
+ _Artifact extends FragmentArtifact = FragmentArtifact,
294
+ > extends BasePaginatedFragmentStore<_Data, _ReferenceType, _Input, _Artifact> {
290
295
  get(initialValue: _Data | null): OffsetFragmentStoreInstance<_Data, _Input> {
291
296
  const base = new FragmentStore<_Data, {}, _Input>({
292
297
  artifact: this.artifact,
@@ -2,6 +2,7 @@ import { extractPageInfo } from 'houdini/runtime'
2
2
  import { cursorHandlers, offsetHandlers } from 'houdini/runtime'
3
3
  import type {
4
4
  GraphQLObject,
5
+ QueryArtifact,
5
6
  QueryResult,
6
7
  CursorHandlers,
7
8
  OffsetHandlers,
@@ -30,7 +31,8 @@ export type CursorStoreResult<
30
31
  export class QueryStoreCursor<
31
32
  _Data extends GraphQLObject,
32
33
  _Input extends GraphQLVariables | null | undefined,
33
- > extends QueryStore<_Data, _Input> {
34
+ _Artifact extends QueryArtifact = QueryArtifact,
35
+ > extends QueryStore<_Data, _Input, _Artifact> {
34
36
  // all paginated stores need to have a flag to distinguish from other query stores
35
37
  paginated = true
36
38
 
@@ -130,7 +132,8 @@ export class QueryStoreCursor<
130
132
  export class QueryStoreOffset<
131
133
  _Data extends GraphQLObject,
132
134
  _Input extends GraphQLVariables | null | undefined,
133
- > extends QueryStore<_Data, _Input> {
135
+ _Artifact extends QueryArtifact = QueryArtifact,
136
+ > extends QueryStore<_Data, _Input, _Artifact> {
134
137
  // all paginated stores need to have a flag to distinguish from other query stores
135
138
  paginated = true
136
139
 
@@ -29,7 +29,10 @@ import { BaseStore } from './base.js'
29
29
  export class QueryStore<
30
30
  _Data extends GraphQLObject,
31
31
  _Input extends GraphQLVariables | null | undefined,
32
- > extends BaseStore<_Data, _Input, QueryArtifact> {
32
+ // generated stores narrow this to their document's artifact type so a store
33
+ // can be matched back to its result/input types (e.g. by cache.read/write)
34
+ _Artifact extends QueryArtifact = QueryArtifact,
35
+ > extends BaseStore<_Data, _Input, _Artifact> {
33
36
  // whether the store requires variables for input
34
37
  variables: boolean
35
38
 
@@ -42,7 +45,7 @@ export class QueryStore<
42
45
  // the string identifying the store
43
46
  protected storeName: string
44
47
 
45
- constructor({ artifact, storeName, variables }: StoreConfig<_Data, _Input, QueryArtifact>) {
48
+ constructor({ artifact, storeName, variables }: StoreConfig<_Data, _Input, _Artifact>) {
46
49
  super({
47
50
  artifact,
48
51
  })
@@ -16,11 +16,11 @@ import { getSession } from '../session.js'
16
16
  import { FragmentStore } from './fragment.js'
17
17
  import type { StoreConfig } from './query.js'
18
18
 
19
- type RefetchableFragmentStoreConfig<_Data extends GraphQLObject, _Input> = StoreConfig<
20
- _Data,
19
+ type RefetchableFragmentStoreConfig<
20
+ _Data extends GraphQLObject,
21
21
  _Input,
22
- FragmentArtifact
23
- > & { refetchArtifact: QueryArtifact }
22
+ _Artifact extends FragmentArtifact = FragmentArtifact,
23
+ > = StoreConfig<_Data, _Input, _Artifact> & { refetchArtifact: QueryArtifact }
24
24
 
25
25
  // the value handed back to components subscribing to a refetchable fragment store
26
26
  export type RefetchableFragmentResult<_Data extends GraphQLObject, _Input> = {
@@ -42,15 +42,18 @@ export class FragmentStoreRefetchable<
42
42
  _Data extends GraphQLObject,
43
43
  _ReferenceType extends {},
44
44
  _Input extends GraphQLVariables,
45
+ // generated stores narrow this to their document's artifact type so a store
46
+ // can be matched back to its data/input types (e.g. by record.read/write)
47
+ _Artifact extends FragmentArtifact = FragmentArtifact,
45
48
  > {
46
49
  kind = CompiledFragmentKind
47
- artifact: FragmentArtifact
50
+ artifact: _Artifact
48
51
  name: string
49
52
  // a flag the refetchableFragment() helper looks for to validate the store
50
53
  refetchable = true
51
54
  protected refetchArtifact: QueryArtifact
52
55
 
53
- constructor(config: RefetchableFragmentStoreConfig<_Data, _Input>) {
56
+ constructor(config: RefetchableFragmentStoreConfig<_Data, _Input, _Artifact>) {
54
57
  this.artifact = config.artifact
55
58
  this.name = config.storeName
56
59
  this.refetchArtifact = config.refetchArtifact