@1sat/types 0.0.39 → 0.0.41

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2GH,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACpB,4BAAe,CAAA;IACf,4BAAe,CAAA;AAChB,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAED,MAAM,CAAN,IAAY,sBAKX;AALD,WAAY,sBAAsB;IACjC,oDAA0B,CAAA;IAC1B,kDAAwB,CAAA;IACxB,gDAAsB,CAAA;IACtB,2CAAiB,CAAA;AAClB,CAAC,EALW,sBAAsB,KAAtB,sBAAsB,QAKjC;AAED,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACzB,6BAAW,CAAA;IACX,mCAAiB,CAAA;AAClB,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAiID,qEAAqE;AACrE,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACvB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;AAClB,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAkTD,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2GH,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACpB,4BAAe,CAAA;IACf,4BAAe,CAAA;AAChB,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAED,MAAM,CAAN,IAAY,sBAKX;AALD,WAAY,sBAAsB;IACjC,oDAA0B,CAAA;IAC1B,kDAAwB,CAAA;IACxB,gDAAsB,CAAA;IACtB,2CAAiB,CAAA;AAClB,CAAC,EALW,sBAAsB,KAAtB,sBAAsB,QAKjC;AAED,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACzB,6BAAW,CAAA;IACX,mCAAiB,CAAA;AAClB,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAiID,qEAAqE;AACrE,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACvB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;AAClB,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAkTD,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA"}
@@ -1,16 +1,59 @@
1
1
  import { describe, expect, test } from 'bun:test';
2
- import { P1SAT_INTENTS, P1SAT_INTENT_LABEL_PREFIX, P1SAT_LABEL, buildIntentLabel, hasP1SatDispatchLabel, parseIntentLabel, } from './constants';
3
- describe('intent labels', () => {
4
- test('build / parse round-trip', () => {
5
- const label = buildIntentLabel(P1SAT_INTENTS.OPNS_REGISTER);
6
- expect(label).toBe(`${P1SAT_INTENT_LABEL_PREFIX}opns.register`);
7
- expect(parseIntentLabel([label, 'other'])).toBe('opns.register');
2
+ import { P1SAT_LABEL, buildActionDispatchLabel, buildExternalInputLabel, buildInputAssetLabel, ensureSchemeActionLabel, hasAssetDispatchLabel, hasSchemeDispatchLabel, parseInputAssetLabels, parseOneInputLabel, } from './constants.js';
3
+ describe('scheme dispatch labels', () => {
4
+ test('buildActionDispatchLabel', () => {
5
+ expect(buildActionDispatchLabel('1sat')).toBe('p 1sat action');
6
+ expect(buildActionDispatchLabel('opns')).toBe('p opns action');
7
+ expect(P1SAT_LABEL).toBe('p 1sat action');
8
8
  });
9
- test('hasP1SatDispatchLabel accepts intent or bare action', () => {
10
- expect(hasP1SatDispatchLabel([P1SAT_LABEL])).toBe(true);
11
- expect(hasP1SatDispatchLabel([buildIntentLabel('opns.register')])).toBe(true);
12
- expect(hasP1SatDispatchLabel(['p 1sat input opns x'])).toBe(false);
13
- expect(hasP1SatDispatchLabel(undefined)).toBe(false);
9
+ test('hasSchemeDispatchLabel / hasAssetDispatchLabel', () => {
10
+ expect(hasSchemeDispatchLabel([P1SAT_LABEL], '1sat')).toBe(true);
11
+ expect(hasSchemeDispatchLabel(['p opns input id abc'], 'opns')).toBe(true);
12
+ expect(hasSchemeDispatchLabel(['p opns input id abc'], '1sat')).toBe(false);
13
+ expect(hasAssetDispatchLabel(['p bsv21 action'])).toBe(true);
14
+ expect(hasAssetDispatchLabel(['p 1sat'])).toBe(false);
15
+ expect(hasAssetDispatchLabel(undefined)).toBe(false);
16
+ });
17
+ test('ensureSchemeActionLabel', () => {
18
+ expect(ensureSchemeActionLabel(undefined, '1sat')).toEqual([P1SAT_LABEL]);
19
+ expect(ensureSchemeActionLabel(['other'], 'opns')).toEqual([
20
+ 'other',
21
+ 'p opns action',
22
+ ]);
23
+ expect(ensureSchemeActionLabel([P1SAT_LABEL], '1sat')).toEqual([
24
+ P1SAT_LABEL,
25
+ ]);
26
+ });
27
+ });
28
+ describe('input labels', () => {
29
+ test('held: p <scheme> input id <key>', () => {
30
+ const label = buildInputAssetLabel('1sat', 'id1');
31
+ expect(label).toBe('p 1sat input id id1');
32
+ expect(parseInputAssetLabels([label])).toEqual([
33
+ { scheme: '1sat', basket: '1sat', id: 'id1' },
34
+ ]);
35
+ });
36
+ test('opns / bsv21', () => {
37
+ expect(buildInputAssetLabel('opns', 'abc')).toBe('p opns input id abc');
38
+ expect(buildInputAssetLabel('bsv21', 'tok')).toBe('p bsv21 input id tok');
39
+ expect(parseInputAssetLabels(['p opns input id abc'])).toEqual([
40
+ { scheme: 'opns', basket: 'opns', id: 'abc' },
41
+ ]);
42
+ });
43
+ test('rejects legacy basket-middle and bare-key forms', () => {
44
+ expect(parseOneInputLabel('p 1sat input opns oldid')).toBeUndefined();
45
+ expect(parseOneInputLabel('p 1sat input barekey')).toBeUndefined();
46
+ expect(parseInputAssetLabels(['p 1sat input opns oldid'])).toEqual([]);
47
+ });
48
+ test('external: p <scheme> input <outpoint>', () => {
49
+ const op = `${'aa'.repeat(32)}.0`;
50
+ const label = buildExternalInputLabel('1sat', op);
51
+ expect(label).toBe(`p 1sat input ${op}`);
52
+ expect(parseOneInputLabel(label)).toEqual({
53
+ kind: 'outpoint',
54
+ scheme: '1sat',
55
+ outpoint: op,
56
+ });
14
57
  });
15
58
  });
16
59
  //# sourceMappingURL=intentLabel.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"intentLabel.test.js","sourceRoot":"","sources":["../src/intentLabel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EACN,aAAa,EACb,yBAAyB,EACzB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,GAChB,MAAM,aAAa,CAAA;AAEpB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,yBAAyB,eAAe,CAAC,CAAA;QAC/D,MAAM,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,qBAAqB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACtE,IAAI,CACJ,CAAA;QACD,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClE,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"intentLabel.test.js","sourceRoot":"","sources":["../src/intentLabel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EACN,WAAW,EACX,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,GAClB,MAAM,gBAAgB,CAAA;AAEvB,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9D,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9D,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,sBAAsB,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChE,MAAM,CAAC,sBAAsB,CAAC,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1E,MAAM,CAAC,sBAAsB,CAAC,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3E,MAAM,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,MAAM,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,uBAAuB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;QACzE,MAAM,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,OAAO;YACP,eAAe;SACf,CAAC,CAAA;QACF,MAAM,CAAC,uBAAuB,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9D,WAAW;SACX,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACzC,MAAM,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9C,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE;SAC7C,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACvE,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;QACzE,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9D,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE;SAC7C,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACrE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QAClE,MAAM,CAAC,qBAAqB,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;QACjC,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACzC,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,EAAE;SACZ,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,38 +1,33 @@
1
- import type { OrdfsMetadata } from './services';
2
- /** Longest `name:` tag value we store. */
1
+ import type { OrdfsMetadata } from './services.js';
2
+ /** Longest display name we put in customInstructions (not tags). */
3
3
  export declare const MAX_NAME_TAG_LENGTH = 64;
4
4
  /**
5
- * Canonical identity tags for an ordinal, derived from ORDFS metadata.
6
- *
7
- * The single place that decides what tags an ordinal carries. Every path that
8
- * reads from ORDFS — `resolveOrdinalTags` in actions, the wallet's
9
- * `OriginIndexer`, the permission module's verification — must go through
10
- * here, so an asset is tagged identically whether it arrived by sync, by
11
- * purchase, or by transfer.
12
- *
13
- * Pure: callers fetch through their own services and pass the result in.
14
- *
15
- * Emits:
16
- * - `origin:<outpoint>` — the resolved genesis. **Omitted entirely when
17
- * unknown**; an empty `origin:` reads as a resolved value and is never
18
- * correct. The bare `origin` marker is a separate thing, set only on the
19
- * inscription transaction itself, where the output cannot know its own
20
- * outpoint.
21
- * - `type:<category>` **and** `type:<base>` — hierarchical, so callers can
22
- * query broadly (`type:image`) or exactly (`type:image/png`).
23
- * - `name:<name>` — from MAP `name`, else `subTypeData.name`, truncated.
5
+ * Ordinals / indexer outpoint form: `txid_vout`.
6
+ * Accepts dotted (BRC-100) or underscore input. Used for origin tags, CI
7
+ * origin, BSV21 tokenId-style ids, and OrdFS keys.
8
+ */
9
+ export declare function formatOrdinalOutpoint(outpoint: string): string;
10
+ /** @deprecated Use {@link formatOrdinalOutpoint} */
11
+ export declare const formatOriginOutpoint: typeof formatOrdinalOutpoint;
12
+ /**
13
+ * Canonical identity tags for an ordinal (BRC-147).
24
14
  *
25
- * @param metadata - ORDFS metadata, resolved at seq `-2`
26
- * @param fallbackOrigin - used only when metadata carries no origin
15
+ * Emits filter tags (lowercase-safe). Does **not** emit `name:` (→ CI `name`).
16
+ * Bare `origin` is only for the mint out itself (caller stamps that).
27
17
  */
28
18
  export declare function ordinalTagsFromMetadata(metadata: Partial<OrdfsMetadata> | undefined, fallbackOrigin?: string): string[];
29
19
  /**
30
- * Hierarchical `type:` tags for a content type.
31
- *
32
- * `image/png; charset=x` yields `type:image` and `type:image/png`. Returns
33
- * empty for a missing or blank content type — an empty `type:` is never useful.
20
+ * Single `type:<mime>` tag. Strips `;…` parameters. No category dual-tag.
21
+ */
22
+ export declare function contentTypeTag(contentType: string | undefined): string | undefined;
23
+ /**
24
+ * @deprecated Use {@link contentTypeTag}. Returns 0–1 tags for spread compat.
34
25
  */
35
26
  export declare function contentTypeTags(contentType: string | undefined): string[];
36
- /** MAP name, falling back to `subTypeData.name`. */
27
+ /** Parse MAP `subTypeData` (object or JSON string). */
28
+ export declare function parseMapSubTypeData(map: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
29
+ /** MAP name, falling back to `subTypeData.name`. For CI `name`, not tags. */
37
30
  export declare function nameFromMap(map: Record<string, unknown> | undefined): string | undefined;
31
+ /** Truncate display name for CI. */
32
+ export declare function displayNameForCi(name: string | undefined): string | undefined;
38
33
  //# sourceMappingURL=ordinalTags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ordinalTags.d.ts","sourceRoot":"","sources":["../src/ordinalTags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,0CAA0C;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,EAC5C,cAAc,CAAC,EAAE,MAAM,GACrB,MAAM,EAAE,CAYV;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQzE;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtC,MAAM,GAAG,SAAS,CAOpB"}
1
+ {"version":3,"file":"ordinalTags.d.ts","sourceRoot":"","sources":["../src/ordinalTags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,8BAAwB,CAAA;AAEzD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,EAC5C,cAAc,CAAC,EAAE,MAAM,GACrB,MAAM,EAAE,CAuCV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,GAAG,SAAS,CAIpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAGzE;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAiBrC;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACtC,MAAM,GAAG,SAAS,CAOpB;AAED,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG7E"}
@@ -1,64 +1,118 @@
1
- /** Longest `name:` tag value we store. */
1
+ /** Longest display name we put in customInstructions (not tags). */
2
2
  export const MAX_NAME_TAG_LENGTH = 64;
3
3
  /**
4
- * Canonical identity tags for an ordinal, derived from ORDFS metadata.
5
- *
6
- * The single place that decides what tags an ordinal carries. Every path that
7
- * reads from ORDFS — `resolveOrdinalTags` in actions, the wallet's
8
- * `OriginIndexer`, the permission module's verification — must go through
9
- * here, so an asset is tagged identically whether it arrived by sync, by
10
- * purchase, or by transfer.
11
- *
12
- * Pure: callers fetch through their own services and pass the result in.
13
- *
14
- * Emits:
15
- * - `origin:<outpoint>` — the resolved genesis. **Omitted entirely when
16
- * unknown**; an empty `origin:` reads as a resolved value and is never
17
- * correct. The bare `origin` marker is a separate thing, set only on the
18
- * inscription transaction itself, where the output cannot know its own
19
- * outpoint.
20
- * - `type:<category>` **and** `type:<base>` — hierarchical, so callers can
21
- * query broadly (`type:image`) or exactly (`type:image/png`).
22
- * - `name:<name>` — from MAP `name`, else `subTypeData.name`, truncated.
4
+ * Ordinals / indexer outpoint form: `txid_vout`.
5
+ * Accepts dotted (BRC-100) or underscore input. Used for origin tags, CI
6
+ * origin, BSV21 tokenId-style ids, and OrdFS keys.
7
+ */
8
+ export function formatOrdinalOutpoint(outpoint) {
9
+ const s = outpoint.trim();
10
+ if (s.length >= 66) {
11
+ const sep = s[64];
12
+ if (sep === '.' || sep === '_') {
13
+ return `${s.slice(0, 64)}_${s.slice(65)}`;
14
+ }
15
+ }
16
+ const dot = s.indexOf('.');
17
+ if (dot === 64)
18
+ return `${s.slice(0, 64)}_${s.slice(65)}`;
19
+ return s.replace('.', '_');
20
+ }
21
+ /** @deprecated Use {@link formatOrdinalOutpoint} */
22
+ export const formatOriginOutpoint = formatOrdinalOutpoint;
23
+ /**
24
+ * Canonical identity tags for an ordinal (BRC-147).
23
25
  *
24
- * @param metadata - ORDFS metadata, resolved at seq `-2`
25
- * @param fallbackOrigin - used only when metadata carries no origin
26
+ * Emits filter tags (lowercase-safe). Does **not** emit `name:` (→ CI `name`).
27
+ * Bare `origin` is only for the mint out itself (caller stamps that).
26
28
  */
27
29
  export function ordinalTagsFromMetadata(metadata, fallbackOrigin) {
28
30
  const tags = [];
29
31
  const origin = metadata?.origin || fallbackOrigin;
30
32
  if (origin)
31
- tags.push(`origin:${origin}`);
32
- for (const t of contentTypeTags(metadata?.contentType))
33
- tags.push(t);
34
- const name = nameFromMap(metadata?.map);
35
- if (name)
36
- tags.push(`name:${name.slice(0, MAX_NAME_TAG_LENGTH)}`);
33
+ tags.push(`origin:${formatOrdinalOutpoint(origin)}`);
34
+ const map = metadata?.map;
35
+ const subTypeData = parseMapSubTypeData(map);
36
+ // Display pointer when media is not at origin (e.g. OrdFS parent / MAP content)
37
+ const content = typeof map?.content === 'string'
38
+ ? map.content
39
+ : typeof metadata?.parent === 'string'
40
+ ? metadata.parent
41
+ : undefined;
42
+ if (content)
43
+ tags.push(`content:${formatOrdinalOutpoint(content)}`);
44
+ // collectionId is often nested: MAP subTypeData JSON (collection items)
45
+ const collectionId = typeof map?.collectionId === 'string'
46
+ ? map.collectionId
47
+ : typeof map?.collection === 'string'
48
+ ? map.collection
49
+ : typeof subTypeData?.collectionId === 'string'
50
+ ? subTypeData.collectionId
51
+ : typeof subTypeData?.collection === 'string'
52
+ ? subTypeData.collection
53
+ : undefined;
54
+ if (collectionId) {
55
+ tags.push(`collection:${formatOrdinalOutpoint(collectionId)}`);
56
+ }
57
+ const app = typeof map?.app === 'string' ? map.app : undefined;
58
+ if (app)
59
+ tags.push(`app:${app}`);
60
+ const typeTag = contentTypeTag(metadata?.contentType);
61
+ if (typeTag)
62
+ tags.push(typeTag);
37
63
  return tags;
38
64
  }
39
65
  /**
40
- * Hierarchical `type:` tags for a content type.
41
- *
42
- * `image/png; charset=x` yields `type:image` and `type:image/png`. Returns
43
- * empty for a missing or blank content type — an empty `type:` is never useful.
66
+ * Single `type:<mime>` tag. Strips `;…` parameters. No category dual-tag.
44
67
  */
45
- export function contentTypeTags(contentType) {
68
+ export function contentTypeTag(contentType) {
46
69
  const base = contentType?.split(';')[0]?.trim();
47
70
  if (!base)
48
- return [];
49
- const category = base.split('/')[0];
50
- return category && category !== base
51
- ? [`type:${category}`, `type:${base}`]
52
- : [`type:${base}`];
71
+ return undefined;
72
+ return `type:${base}`;
53
73
  }
54
- /** MAP name, falling back to `subTypeData.name`. */
74
+ /**
75
+ * @deprecated Use {@link contentTypeTag}. Returns 0–1 tags for spread compat.
76
+ */
77
+ export function contentTypeTags(contentType) {
78
+ const t = contentTypeTag(contentType);
79
+ return t ? [t] : [];
80
+ }
81
+ /** Parse MAP `subTypeData` (object or JSON string). */
82
+ export function parseMapSubTypeData(map) {
83
+ if (!map)
84
+ return undefined;
85
+ const raw = map.subTypeData;
86
+ if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
87
+ return raw;
88
+ }
89
+ if (typeof raw === 'string' && raw.trim()) {
90
+ try {
91
+ const o = JSON.parse(raw);
92
+ if (o && typeof o === 'object' && !Array.isArray(o)) {
93
+ return o;
94
+ }
95
+ }
96
+ catch {
97
+ /* ignore */
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /** MAP name, falling back to `subTypeData.name`. For CI `name`, not tags. */
55
103
  export function nameFromMap(map) {
56
104
  if (!map)
57
105
  return undefined;
58
106
  if (typeof map.name === 'string' && map.name)
59
107
  return map.name;
60
- const subTypeData = map.subTypeData;
108
+ const subTypeData = parseMapSubTypeData(map);
61
109
  const subName = subTypeData?.name;
62
110
  return typeof subName === 'string' && subName ? subName : undefined;
63
111
  }
112
+ /** Truncate display name for CI. */
113
+ export function displayNameForCi(name) {
114
+ if (!name?.trim())
115
+ return undefined;
116
+ return name.trim().slice(0, MAX_NAME_TAG_LENGTH);
117
+ }
64
118
  //# sourceMappingURL=ordinalTags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ordinalTags.js","sourceRoot":"","sources":["../src/ordinalTags.ts"],"names":[],"mappings":"AAEA,0CAA0C;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,uBAAuB,CACtC,QAA4C,EAC5C,cAAuB;IAEvB,MAAM,IAAI,GAAa,EAAE,CAAA;IAEzB,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,IAAI,cAAc,CAAA;IACjD,IAAI,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAA;IAEzC,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAEpE,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACvC,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAA;IAEjE,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,WAA+B;IAC9D,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,OAAO,QAAQ,IAAI,QAAQ,KAAK,IAAI;QACnC,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;AACpB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,WAAW,CAC1B,GAAwC;IAExC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,CAAA;IAE7D,MAAM,WAAW,GAAG,GAAG,CAAC,WAAkD,CAAA;IAC1E,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,CAAA;IACjC,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC"}
1
+ {"version":3,"file":"ordinalTags.js","sourceRoot":"","sources":["../src/ordinalTags.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1sat/types",
3
- "version": "0.0.39",
3
+ "version": "0.0.41",
4
4
  "description": "Type definitions for 1Sat Ordinals SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",