@c9up/ream 0.2.21 → 0.2.22

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.
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Reading `hotHook` out of the application's package.json.
3
+ *
4
+ * The boundaries are the APPLICATION's to declare, as they are upstream: they
5
+ * depend on a layout the framework does not own, and hot-hook requires every
6
+ * file matching one to be dynamically imported — a glob that also catches a
7
+ * statically imported service reports `shouldBeReloadable` and costs a FULL
8
+ * reload, worse than the restart it replaced. `ream new` writes the block;
9
+ * `ream doctor` reports its absence.
10
+ *
11
+ * Extracted from the loader entry so the parsing can be tested: that entry
12
+ * registers an ESM loader the moment it is imported, which a test cannot undo.
13
+ */
14
+ export interface HotHookConfig {
15
+ root?: string;
16
+ boundaries?: string[];
17
+ restart?: string[];
18
+ ignore?: string[];
19
+ throwWhenBoundariesAreNotDynamicallyImported?: boolean;
20
+ }
21
+ /** Read `hotHook` out of a parsed package.json, with no assumptions. */
22
+ export declare function readHotHookConfig(pkg: unknown): HotHookConfig;
23
+ //# sourceMappingURL=hotConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hotConfig.d.ts","sourceRoot":"","sources":["../../src/dev/hotConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,4CAA4C,CAAC,EAAE,OAAO,CAAA;CACvD;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAkB7D"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Reading `hotHook` out of the application's package.json.
3
+ *
4
+ * The boundaries are the APPLICATION's to declare, as they are upstream: they
5
+ * depend on a layout the framework does not own, and hot-hook requires every
6
+ * file matching one to be dynamically imported — a glob that also catches a
7
+ * statically imported service reports `shouldBeReloadable` and costs a FULL
8
+ * reload, worse than the restart it replaced. `ream new` writes the block;
9
+ * `ream doctor` reports its absence.
10
+ *
11
+ * Extracted from the loader entry so the parsing can be tested: that entry
12
+ * registers an ESM loader the moment it is imported, which a test cannot undo.
13
+ */
14
+ /** Read `hotHook` out of a parsed package.json, with no assumptions. */
15
+ export function readHotHookConfig(pkg) {
16
+ if (typeof pkg !== 'object' || pkg === null)
17
+ return {};
18
+ const raw = Reflect.get(pkg, 'hotHook');
19
+ if (typeof raw !== 'object' || raw === null)
20
+ return {};
21
+ const stringArray = (key) => {
22
+ const value = Reflect.get(raw, key);
23
+ if (!Array.isArray(value))
24
+ return undefined;
25
+ return value.filter((entry) => typeof entry === 'string');
26
+ };
27
+ const root = Reflect.get(raw, 'root');
28
+ const strict = Reflect.get(raw, 'throwWhenBoundariesAreNotDynamicallyImported');
29
+ return {
30
+ root: typeof root === 'string' ? root : undefined,
31
+ boundaries: stringArray('boundaries'),
32
+ restart: stringArray('restart'),
33
+ ignore: stringArray('ignore'),
34
+ throwWhenBoundariesAreNotDynamicallyImported: typeof strict === 'boolean' ? strict : undefined,
35
+ };
36
+ }
37
+ //# sourceMappingURL=hotConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hotConfig.js","sourceRoot":"","sources":["../../src/dev/hotConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACvC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IACtD,MAAM,WAAW,GAAG,CAAC,GAAW,EAAwB,EAAE;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAA;IAC5E,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,8CAA8C,CAAC,CAAA;IAC/E,OAAO;QACL,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACjD,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC;QACrC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC;QAC/B,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;QAC7B,4CAA4C,EAAE,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC/F,CAAA;AACH,CAAC"}
package/dist/hot.js CHANGED
@@ -26,42 +26,19 @@
26
26
  * upstream's behaviour, unmodified.
27
27
  */
28
28
  import { hotReloadHappened } from './dev/hmr.js';
29
+ import { readHotHookConfig } from './dev/hotConfig.js';
29
30
  /** Exit code meaning "restart me" — see `EXIT_RESTART` in the CLI's dev module. */
30
31
  const FULL_RELOAD_EXIT_CODE = 75;
31
- /** Read `hotHook` out of the application's package.json, with no assumptions. */
32
- function readConfig(pkg) {
33
- if (typeof pkg !== 'object' || pkg === null)
34
- return {};
35
- const raw = Reflect.get(pkg, 'hotHook');
36
- if (typeof raw !== 'object' || raw === null)
37
- return {};
38
- const stringArray = (key) => {
39
- const value = Reflect.get(raw, key);
40
- if (!Array.isArray(value))
41
- return undefined;
42
- return value.filter((entry) => typeof entry === 'string');
43
- };
44
- const root = Reflect.get(raw, 'root');
45
- const strict = Reflect.get(raw, 'throwWhenBoundariesAreNotDynamicallyImported');
46
- return {
47
- root: typeof root === 'string' ? root : undefined,
48
- boundaries: stringArray('boundaries'),
49
- restart: stringArray('restart'),
50
- ignore: stringArray('ignore'),
51
- throwWhenBoundariesAreNotDynamicallyImported: typeof strict === 'boolean' ? strict : undefined,
52
- };
53
- }
54
32
  const { readFile } = await import('node:fs/promises');
55
33
  const { dirname, resolve } = await import('node:path');
56
34
  const packageJsonPath = resolve(process.cwd(), 'package.json');
57
35
  let config = {};
58
36
  try {
59
- config = readConfig(JSON.parse(await readFile(packageJsonPath, 'utf8')));
37
+ config = readHotHookConfig(JSON.parse(await readFile(packageJsonPath, 'utf8')));
60
38
  }
61
39
  catch {
62
- // No package.json, or unreadable: hot-hook still works, it just has no
63
- // boundaries, so every change asks for a restart. That is the old
64
- // behaviour, not a failure worth stopping dev over.
40
+ // No package.json, or unreadable: fall through to the conventional
41
+ // boundaries below rather than stopping dev over it.
65
42
  }
66
43
  // `hot-hook` is an optional peer, declared by the application because it is a
67
44
  // dev dependency there and has no business in a production install. Imported by
package/dist/hot.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hot.js","sourceRoot":"","sources":["../src/hot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hot.js","sourceRoot":"","sources":["../src/hot.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -121,5 +121,5 @@ export { BaseEvent, Emitter, type EmitterResolver, type ListenerClass, } from '.
121
121
  export { type BufferedEvent, type BufferedEventName, type EventFinder, EventsBuffer, } from './events/EventsBuffer.js';
122
122
  export type { ErrorReporter, LockBackend, LockBackendFactory, LockRedisClient, LockRedisResolver, RunTaskOutcome, ScheduleEvent, ScheduleEventSink, ScheduleInvocation, ScheduleMetadata, ScheduleProviderOptions, SchedulerConfig, SchedulerOptions, ScheduleTaskCompletedEvent, ScheduleTaskFailedEvent, ScheduleTaskSkippedEvent, ScheduleTaskStartedEvent, TaskInfo, TaskStats, } from './scheduler/index.js';
123
123
  export { defineSchedulerConfig, getScheduleMetadata, locks, MemoryLockBackend, RedisLockBackend, SCHEDULE_METADATA_KEY, Schedule, ScheduleProvider, Scheduler, StatsTracker, } from './scheduler/index.js';
124
- export declare const VERSION = "0.2.21";
124
+ export declare const VERSION = "0.2.22";
125
125
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -92,5 +92,5 @@ export { defineConfig as defineEventsConfig } from './events/config.js';
92
92
  export { BaseEvent, Emitter, } from './events/Emitter.js';
93
93
  export { EventsBuffer, } from './events/EventsBuffer.js';
94
94
  export { defineSchedulerConfig, getScheduleMetadata, locks, MemoryLockBackend, RedisLockBackend, SCHEDULE_METADATA_KEY, Schedule, ScheduleProvider, Scheduler, StatsTracker, } from './scheduler/index.js';
95
- export const VERSION = '0.2.21';
95
+ export const VERSION = '0.2.22';
96
96
  //# sourceMappingURL=index.js.map
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c9up/ream",
3
- "version": "0.2.21",
3
+ "version": "0.2.22",
4
4
  "description": "Ream — Rust-powered Node.js application framework",
5
5
  "license": "MIT",
6
6
  "type": "module",
Binary file
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Reading `hotHook` out of the application's package.json.
3
+ *
4
+ * The boundaries are the APPLICATION's to declare, as they are upstream: they
5
+ * depend on a layout the framework does not own, and hot-hook requires every
6
+ * file matching one to be dynamically imported — a glob that also catches a
7
+ * statically imported service reports `shouldBeReloadable` and costs a FULL
8
+ * reload, worse than the restart it replaced. `ream new` writes the block;
9
+ * `ream doctor` reports its absence.
10
+ *
11
+ * Extracted from the loader entry so the parsing can be tested: that entry
12
+ * registers an ESM loader the moment it is imported, which a test cannot undo.
13
+ */
14
+
15
+ export interface HotHookConfig {
16
+ root?: string
17
+ boundaries?: string[]
18
+ restart?: string[]
19
+ ignore?: string[]
20
+ throwWhenBoundariesAreNotDynamicallyImported?: boolean
21
+ }
22
+
23
+ /** Read `hotHook` out of a parsed package.json, with no assumptions. */
24
+ export function readHotHookConfig(pkg: unknown): HotHookConfig {
25
+ if (typeof pkg !== 'object' || pkg === null) return {}
26
+ const raw = Reflect.get(pkg, 'hotHook')
27
+ if (typeof raw !== 'object' || raw === null) return {}
28
+ const stringArray = (key: string): string[] | undefined => {
29
+ const value = Reflect.get(raw, key)
30
+ if (!Array.isArray(value)) return undefined
31
+ return value.filter((entry): entry is string => typeof entry === 'string')
32
+ }
33
+ const root = Reflect.get(raw, 'root')
34
+ const strict = Reflect.get(raw, 'throwWhenBoundariesAreNotDynamicallyImported')
35
+ return {
36
+ root: typeof root === 'string' ? root : undefined,
37
+ boundaries: stringArray('boundaries'),
38
+ restart: stringArray('restart'),
39
+ ignore: stringArray('ignore'),
40
+ throwWhenBoundariesAreNotDynamicallyImported: typeof strict === 'boolean' ? strict : undefined,
41
+ }
42
+ }
package/src/hot.ts CHANGED
@@ -27,6 +27,7 @@
27
27
  */
28
28
 
29
29
  import { hotReloadHappened } from './dev/hmr.js'
30
+ import { type HotHookConfig, readHotHookConfig } from './dev/hotConfig.js'
30
31
 
31
32
  /** Exit code meaning "restart me" — see `EXIT_RESTART` in the CLI's dev module. */
32
33
  const FULL_RELOAD_EXIT_CODE = 75
@@ -43,46 +44,16 @@ interface HotHook {
43
44
  }): Promise<void>
44
45
  }
45
46
 
46
- interface HotHookConfig {
47
- root?: string
48
- boundaries?: string[]
49
- restart?: string[]
50
- ignore?: string[]
51
- throwWhenBoundariesAreNotDynamicallyImported?: boolean
52
- }
53
-
54
- /** Read `hotHook` out of the application's package.json, with no assumptions. */
55
- function readConfig(pkg: unknown): HotHookConfig {
56
- if (typeof pkg !== 'object' || pkg === null) return {}
57
- const raw = Reflect.get(pkg, 'hotHook')
58
- if (typeof raw !== 'object' || raw === null) return {}
59
- const stringArray = (key: string): string[] | undefined => {
60
- const value = Reflect.get(raw, key)
61
- if (!Array.isArray(value)) return undefined
62
- return value.filter((entry): entry is string => typeof entry === 'string')
63
- }
64
- const root = Reflect.get(raw, 'root')
65
- const strict = Reflect.get(raw, 'throwWhenBoundariesAreNotDynamicallyImported')
66
- return {
67
- root: typeof root === 'string' ? root : undefined,
68
- boundaries: stringArray('boundaries'),
69
- restart: stringArray('restart'),
70
- ignore: stringArray('ignore'),
71
- throwWhenBoundariesAreNotDynamicallyImported: typeof strict === 'boolean' ? strict : undefined,
72
- }
73
- }
74
-
75
47
  const { readFile } = await import('node:fs/promises')
76
48
  const { dirname, resolve } = await import('node:path')
77
49
 
78
50
  const packageJsonPath = resolve(process.cwd(), 'package.json')
79
51
  let config: HotHookConfig = {}
80
52
  try {
81
- config = readConfig(JSON.parse(await readFile(packageJsonPath, 'utf8')))
53
+ config = readHotHookConfig(JSON.parse(await readFile(packageJsonPath, 'utf8')))
82
54
  } catch {
83
- // No package.json, or unreadable: hot-hook still works, it just has no
84
- // boundaries, so every change asks for a restart. That is the old
85
- // behaviour, not a failure worth stopping dev over.
55
+ // No package.json, or unreadable: fall through to the conventional
56
+ // boundaries below rather than stopping dev over it.
86
57
  }
87
58
 
88
59
  // `hot-hook` is an optional peer, declared by the application because it is a
package/src/index.ts CHANGED
@@ -385,4 +385,4 @@ export {
385
385
  StatsTracker,
386
386
  } from './scheduler/index.js'
387
387
 
388
- export const VERSION = '0.2.21'
388
+ export const VERSION = '0.2.22'