@flighthq/textsegment 0.5.1-next.815.cc08b93 → 0.5.1-next.903.f434bc2

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 CHANGED
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/textsegment`. The `@
13
13
  This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
14
14
 
15
15
  - [Flight project](https://github.com/flighthq/flight)
16
- - [Source for @flighthq/textsegment@0.5.1-next.815.cc08b93](https://github.com/flighthq/flight/tree/cc08b93ef981080fa86bdd5143dc61dbdbf2665b/packages/textsegment)
17
- - [License](https://github.com/flighthq/flight/blob/cc08b93ef981080fa86bdd5143dc61dbdbf2665b/LICENSE.md)
16
+ - [Source for @flighthq/textsegment@0.5.1-next.903.f434bc2](https://github.com/flighthq/flight/tree/f434bc233778d75aeea61995df3a8cfaec459a85/packages/textsegment)
17
+ - [License](https://github.com/flighthq/flight/blob/f434bc233778d75aeea61995df3a8cfaec459a85/LICENSE.md)
@@ -1,7 +1,8 @@
1
- import type { HasTextSegmenter, TextSegmenterBackend } from '@flighthq/types/contract';
1
+ import type { EntityConstruction, HasTextSegmenter, TextSegmenterBackend } from '@flighthq/types/contract';
2
2
  export declare function createWebTextSegmenterBackend(): TextSegmenterBackend;
3
3
  export declare const webTextSegmenterBackend: TextSegmenterBackend;
4
4
  export declare function getTextSegmenterBackend(host?: HasTextSegmenter): TextSegmenterBackend;
5
+ export declare function initializeWebTextSegmenterBackend(out: EntityConstruction<TextSegmenterBackend>): void;
5
6
  /**
6
7
  * Installs the backend used by calls that omit an explicit host; pass null to restore the stable
7
8
  * bundled web default.
@@ -1 +1 @@
1
- {"version":3,"file":"textSegmenterBackend.d.ts","sourceRoot":"","sources":["../src/textSegmenterBackend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAGhB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,6BAA6B,IAAI,oBAAoB,CAEpE;AAID,eAAO,MAAM,uBAAuB,EAAE,oBAAsD,CAAC;AAK7F,wBAAgB,uBAAuB,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,oBAAoB,CAErF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAElF"}
1
+ {"version":3,"file":"textSegmenterBackend.d.ts","sourceRoot":"","sources":["../src/textSegmenterBackend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAGhB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,6BAA6B,IAAI,oBAAoB,CAIpE;AAID,eAAO,MAAM,uBAAuB,EAAE,oBAAsD,CAAC;AAK7F,wBAAgB,uBAAuB,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,oBAAoB,CAErF;AAED,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAErG;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAElF"}
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  // Builds the default web backend: a wrapper over the browser-native Intl.Segmenter. It ships no
3
3
  // Unicode tables — the engine already carries them — so the common path costs nothing in bundle
4
4
  // weight. Intl.Segmenter instances are cached by (locale, granularity) because constructing one is
@@ -6,7 +6,9 @@ import { createEntity } from '@flighthq/entity/contract';
6
6
  // engine), segment() returns [] rather than throwing; compose a from-scratch UAX #29 backend into
7
7
  // the host for those environments.
8
8
  export function createWebTextSegmenterBackend() {
9
- return createEntity({ segment: segmentWithIntlSegmenter });
9
+ const out = allocateEntity();
10
+ initializeWebTextSegmenterBackend(out);
11
+ return finishEntity(out);
10
12
  }
11
13
  // Stable bundled web provider. Hosts can import this directly when composing their explicit
12
14
  // capability object; callers that omit a host receive it as the final fallback.
@@ -17,6 +19,9 @@ export const webTextSegmenterBackend = createWebTextSegmenterBackend();
17
19
  export function getTextSegmenterBackend(host) {
18
20
  return host?.text.segmenter ?? _backend ?? webTextSegmenterBackend;
19
21
  }
22
+ export function initializeWebTextSegmenterBackend(out) {
23
+ out.segment = segmentWithIntlSegmenter;
24
+ }
20
25
  /**
21
26
  * Installs the backend used by calls that omit an explicit host; pass null to restore the stable
22
27
  * bundled web default.
@@ -1 +1 @@
1
- {"version":3,"file":"textSegmenterBackend.js","sourceRoot":"","sources":["../src/textSegmenterBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQzD,gGAAgG;AAChG,gGAAgG;AAChG,mGAAmG;AACnG,oGAAoG;AACpG,kGAAkG;AAClG,mCAAmC;AACnC,MAAM,UAAU,6BAA6B;IAC3C,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,4FAA4F;AAC5F,gFAAgF;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAyB,6BAA6B,EAAE,CAAC;AAE7F,6FAA6F;AAC7F,gGAAgG;AAChG,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB,CAAC,IAAuB;IAC7D,OAAO,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,IAAI,uBAAuB,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAoC;IAC1E,QAAQ,GAAG,OAAO,CAAC;AACrB,CAAC;AAED,IAAI,QAAQ,GAAgC,IAAI,CAAC;AAEjD,qGAAqG;AACrG,oGAAoG;AACpG,mDAAmD;AACnD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;AAC1D,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,SAAS,kBAAkB,CAAC,MAA0B,EAAE,WAAmC;IACzF,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE5C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1D,IAAI,eAAe,CAAC,IAAI,IAAI,uBAAuB,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACnD,IAAI,MAAM,KAAK,SAAS;YAAE,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAY,EACZ,WAAmC,EACnC,MAAe;IAEf,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,iBAAiB,GAAG,WAAW,KAAK,MAAM,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,MAAM,GAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5F,4EAA4E;QAC5E,IAAI,iBAAiB;YAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;QACpE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"textSegmenterBackend.js","sourceRoot":"","sources":["../src/textSegmenterBackend.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/textsegment",
3
- "version": "0.5.1-next.815.cc08b93",
3
+ "version": "0.5.1-next.903.f434bc2",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,8 +38,8 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/entity": "0.5.1-next.815.cc08b93",
42
- "@flighthq/types": "0.5.1-next.815.cc08b93"
41
+ "@flighthq/entity": "0.5.1-next.903.f434bc2",
42
+ "@flighthq/types": "0.5.1-next.903.f434bc2"
43
43
  },
44
44
  "devDependencies": {
45
45
  "typescript": "^5.3.0"
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  import type { EntityRuntimeKey } from '@flighthq/types/contract';
3
3
  import type {
4
4
  HasTextSegmenter,
@@ -47,13 +47,12 @@ describe('segmentGraphemes', () => {
47
47
 
48
48
  it('threads the locale argument to the active backend', () => {
49
49
  let seenLocale: string | undefined = 'unset';
50
- const fake = createEntity<Omit<TextSegmenterBackend, typeof EntityRuntimeKey>>({
51
- segment(text: string, _granularity: TextSegmentGranularity, locale?: string): readonly TextSegment[] {
52
- seenLocale = locale;
53
- return [{ start: 0, end: text.length, text }];
54
- },
55
- });
56
- setTextSegmenterBackend(fake);
50
+ const fake = allocateEntity<TextSegmenterBackend>();
51
+ fake.segment = (text: string, _granularity: TextSegmentGranularity, locale?: string): readonly TextSegment[] => {
52
+ seenLocale = locale;
53
+ return [{ start: 0, end: text.length, text }];
54
+ };
55
+ setTextSegmenterBackend(finishEntity(fake));
57
56
  segmentGraphemes('hi', 'de-DE');
58
57
  expect(seenLocale).toBe('de-DE');
59
58
  });
@@ -64,9 +63,9 @@ function segmenterHost(segmenter: TextSegmenterBackend): HasTextSegmenter {
64
63
  }
65
64
 
66
65
  function taggingBackend(tag: string): TextSegmenterBackend {
67
- return createEntity({
68
- segment: () => [{ start: 0, end: tag.length, text: tag }],
69
- });
66
+ const out = allocateEntity<TextSegmenterBackend>();
67
+ out.segment = () => [{ start: 0, end: tag.length, text: tag }];
68
+ return finishEntity(out);
70
69
  }
71
70
 
72
71
  describe('segmentSentences', () => {
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  import type { EntityRuntimeKey } from '@flighthq/types/contract';
3
3
  import type { HasTextSegmenter, TextSegmenterBackend } from '@flighthq/types/contract';
4
4
 
@@ -73,11 +73,16 @@ describe('getPreviousWordBoundary', () => {
73
73
 
74
74
  describe('getWordRangeAt', () => {
75
75
  it('threads an explicit host through the boundary helper', () => {
76
- const explicit = createEntity<Omit<TextSegmenterBackend, typeof EntityRuntimeKey>>({
77
- segment: (text) => [{ start: 0, end: text.length, text, isWordLike: true }],
78
- });
79
- const host: HasTextSegmenter = { text: { segmenter: explicit } };
80
- setTextSegmenterBackend(createEntity({ segment: () => [] }));
76
+ const explicit = allocateEntity<TextSegmenterBackend>();
77
+ explicit.segment = (text: string) => [{ start: 0, end: text.length, text, isWordLike: true }];
78
+ const host: HasTextSegmenter = { text: { segmenter: finishEntity(explicit) } };
79
+ setTextSegmenterBackend(
80
+ (() => {
81
+ const out = allocateEntity<TextSegmenterBackend>();
82
+ out.segment = () => [];
83
+ return finishEntity(out);
84
+ })(),
85
+ );
81
86
  expect(getWordRangeAt('word', 1, undefined, host)).toEqual({ start: 0, end: 4 });
82
87
  });
83
88
 
@@ -100,12 +105,14 @@ describe('getWordRangeAt', () => {
100
105
  it('threads the locale to the active backend', () => {
101
106
  let seenLocale: string | undefined = 'unset';
102
107
  setTextSegmenterBackend(
103
- createEntity<Omit<TextSegmenterBackend, typeof EntityRuntimeKey>>({
104
- segment(text, _granularity, locale) {
108
+ (() => {
109
+ const out = allocateEntity<TextSegmenterBackend>();
110
+ out.segment = (text: string, _granularity: string, locale: string) => {
105
111
  seenLocale = locale;
106
112
  return [{ start: 0, end: text.length, text, isWordLike: true }];
107
- },
108
- }),
113
+ };
114
+ return finishEntity(out);
115
+ })(),
109
116
  );
110
117
  getWordRangeAt('word', 1, 'ja-JP');
111
118
  expect(seenLocale).toBe('ja-JP');
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  import type { EntityRuntimeKey } from '@flighthq/types/contract';
3
3
  import type {
4
4
  HasTextSegmenter,
@@ -20,13 +20,13 @@ interface RecordingBackend extends TextSegmenterBackend {
20
20
 
21
21
  function recordingBackend(): RecordingBackend {
22
22
  const calls: RecordingBackend['calls'] = [];
23
- return createEntity<Omit<RecordingBackend, typeof EntityRuntimeKey>>({
24
- calls,
25
- segment(text: string, granularity: TextSegmentGranularity, locale?: string): readonly TextSegment[] {
26
- calls.push({ text, granularity, locale });
27
- return [{ start: 0, end: text.length, text }];
28
- },
29
- });
23
+ const out = allocateEntity<any>();
24
+ out.calls = calls;
25
+ out.segment = (text: string, granularity: TextSegmentGranularity, locale?: string): readonly TextSegment[] => {
26
+ calls.push({ text, granularity, locale });
27
+ return [{ start: 0, end: text.length, text }];
28
+ };
29
+ return finishEntity(out);
30
30
  }
31
31
 
32
32
  afterEach(() => setTextSegmenterBackend(null));