@modplayjs/fmt-prowizard 0.0.0-stage → 0.2.2
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 +42 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/prowiz.d.ts +44 -0
- package/dist/prowiz.d.ts.map +1 -0
- package/dist/prowiz.js +157 -0
- package/dist/prowiz.js.map +1 -0
- package/dist/ptktable.d.ts +5 -0
- package/dist/ptktable.d.ts.map +1 -0
- package/dist/ptktable.js +49 -0
- package/dist/ptktable.js.map +1 -0
- package/dist/pw-ac1d.d.ts +4 -0
- package/dist/pw-ac1d.d.ts.map +1 -0
- package/dist/pw-ac1d.js +133 -0
- package/dist/pw-ac1d.js.map +1 -0
- package/dist/pw-di.d.ts +4 -0
- package/dist/pw-di.d.ts.map +1 -0
- package/dist/pw-di.js +177 -0
- package/dist/pw-di.js.map +1 -0
- package/dist/pw-eureka.d.ts +4 -0
- package/dist/pw-eureka.d.ts.map +1 -0
- package/dist/pw-eureka.js +171 -0
- package/dist/pw-eureka.js.map +1 -0
- package/dist/pw-fcm.d.ts +4 -0
- package/dist/pw-fcm.d.ts.map +1 -0
- package/dist/pw-fcm.js +102 -0
- package/dist/pw-fcm.js.map +1 -0
- package/dist/pw-fuchs.d.ts +4 -0
- package/dist/pw-fuchs.d.ts.map +1 -0
- package/dist/pw-fuchs.js +139 -0
- package/dist/pw-fuchs.js.map +1 -0
- package/dist/pw-heatseek.d.ts +4 -0
- package/dist/pw-heatseek.d.ts.map +1 -0
- package/dist/pw-heatseek.js +197 -0
- package/dist/pw-heatseek.js.map +1 -0
- package/dist/pw-hrt.d.ts +4 -0
- package/dist/pw-hrt.d.ts.map +1 -0
- package/dist/pw-hrt.js +104 -0
- package/dist/pw-hrt.js.map +1 -0
- package/dist/pw-ksm.d.ts +4 -0
- package/dist/pw-ksm.d.ts.map +1 -0
- package/dist/pw-ksm.js +212 -0
- package/dist/pw-ksm.js.map +1 -0
- package/dist/pw-mp.d.ts +6 -0
- package/dist/pw-mp.d.ts.map +1 -0
- package/dist/pw-mp.js +171 -0
- package/dist/pw-mp.js.map +1 -0
- package/dist/pw-np12.d.ts +6 -0
- package/dist/pw-np12.d.ts.map +1 -0
- package/dist/pw-np12.js +234 -0
- package/dist/pw-np12.js.map +1 -0
- package/dist/pw-np3.d.ts +4 -0
- package/dist/pw-np3.d.ts.map +1 -0
- package/dist/pw-np3.js +218 -0
- package/dist/pw-np3.js.map +1 -0
- package/dist/pw-p40.d.ts +4 -0
- package/dist/pw-p40.d.ts.map +1 -0
- package/dist/pw-p40.js +221 -0
- package/dist/pw-p40.js.map +1 -0
- package/dist/pw-plugin.d.ts +8 -0
- package/dist/pw-plugin.d.ts.map +1 -0
- package/dist/pw-plugin.js +27 -0
- package/dist/pw-plugin.js.map +1 -0
- package/dist/pw-pp.d.ts +8 -0
- package/dist/pw-pp.d.ts.map +1 -0
- package/dist/pw-pp.js +341 -0
- package/dist/pw-pp.js.map +1 -0
- package/dist/pw-skyt.d.ts +4 -0
- package/dist/pw-skyt.d.ts.map +1 -0
- package/dist/pw-skyt.js +116 -0
- package/dist/pw-skyt.js.map +1 -0
- package/dist/pw-starpack.d.ts +4 -0
- package/dist/pw-starpack.d.ts.map +1 -0
- package/dist/pw-starpack.js +253 -0
- package/dist/pw-starpack.js.map +1 -0
- package/dist/pw-theplayer.d.ts +6 -0
- package/dist/pw-theplayer.d.ts.map +1 -0
- package/dist/pw-theplayer.js +367 -0
- package/dist/pw-theplayer.js.map +1 -0
- package/dist/pw-tp1.d.ts +4 -0
- package/dist/pw-tp1.d.ts.map +1 -0
- package/dist/pw-tp1.js +162 -0
- package/dist/pw-tp1.js.map +1 -0
- package/dist/pw-tp3.d.ts +6 -0
- package/dist/pw-tp3.d.ts.map +1 -0
- package/dist/pw-tp3.js +217 -0
- package/dist/pw-tp3.js.map +1 -0
- package/dist/pw-unic.d.ts +8 -0
- package/dist/pw-unic.d.ts.map +1 -0
- package/dist/pw-unic.js +285 -0
- package/dist/pw-unic.js.map +1 -0
- package/dist/pw-unic2.d.ts +4 -0
- package/dist/pw-unic2.d.ts.map +1 -0
- package/dist/pw-unic2.js +173 -0
- package/dist/pw-unic2.js.map +1 -0
- package/dist/pw-wn.d.ts +4 -0
- package/dist/pw-wn.d.ts.map +1 -0
- package/dist/pw-wn.js +82 -0
- package/dist/pw-wn.js.map +1 -0
- package/dist/pw-xann.d.ts +4 -0
- package/dist/pw-xann.d.ts.map +1 -0
- package/dist/pw-xann.js +220 -0
- package/dist/pw-xann.js.map +1 -0
- package/dist/pw-zen.d.ts +4 -0
- package/dist/pw-zen.d.ts.map +1 -0
- package/dist/pw-zen.js +162 -0
- package/dist/pw-zen.js.map +1 -0
- package/package.json +49 -4
package/README.md
CHANGED
|
@@ -1,3 +1,43 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @modplayjs/fmt-prowizard
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**ProWizard packed-MOD depacker plugin** for `@modplayjs/core` — ported
|
|
4
|
+
1:1 from libxmp's `src/loaders/prowizard/`. Detects and converts ~30
|
|
5
|
+
classic Amiga tracker packers into playable modules:
|
|
6
|
+
|
|
7
|
+
PowerPacker (PP20), XPK, Starpack (Startrekker Packer), The Dark Demon,
|
|
8
|
+
Soundtracker packs (Ultimate Soundtracker variants, Ice Face The Music),
|
|
9
|
+
Tuning, Fuchs Tracker, FC-M, Eureka Packer, Hornet, Digital Illusions,
|
|
10
|
+
AC1D, JamCracker, ProPacker 1/2/3, The Player 1.0/2.0/3.0/4.0/5.0/6.0
|
|
11
|
+
(Titanics, Sketch, …), Zen, Ultra Soundtracker ID variants and more.
|
|
12
|
+
|
|
13
|
+
**30 of the C reference's 43 depackers are ported** (the remaining 11 —
|
|
14
|
+
pm18a, pm10c, prun1, prun2, pha, p61a, noiserun, novotrade/crb, tdd,
|
|
15
|
+
gmc, fuzzac — are listed as pending in `src/prowiz.ts`).
|
|
16
|
+
|
|
17
|
+
The no-signature probe order matches `prowiz.c`'s `pw_formats` array
|
|
18
|
+
(order is load-bearing). Loader parity is verified per depacker against
|
|
19
|
+
the C reference (`tools/pw-e2e.mjs`).
|
|
20
|
+
|
|
21
|
+
## Install
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
npm install @modplayjs/fmt-prowizard
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { CorePlayer } from '@modplayjs/core';
|
|
31
|
+
import { pwPlugin } from '@modplayjs/fmt-prowizard';
|
|
32
|
+
|
|
33
|
+
const core = new CorePlayer();
|
|
34
|
+
core.registries.registerFormat(pwPlugin);
|
|
35
|
+
core.loadModule(bytes); // packed .mod variants
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Also exports
|
|
39
|
+
|
|
40
|
+
`pwCheck`, `pwWizardry`, `pwFormats`, `pwReadTitle`, `type PwFormat`,
|
|
41
|
+
`pwTest`, `pwLoad`.
|
|
42
|
+
|
|
43
|
+
Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
// Copyright (c) 2026 Bitti09 — modplayjs contributors
|
|
3
|
+
// Project-original code.
|
|
4
|
+
// @modplayjs/fmt-prowizard — ProWizard packed-MOD depackers.
|
|
5
|
+
export { pwCheck, pwWizardry, pwFormats, pwReadTitle } from './prowiz.js';
|
|
6
|
+
export { pwPlugin, pwTest, pwLoad } from './pw-plugin.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,yBAAyB;AACzB,6DAA6D;AAE7D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/prowiz.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** pw_format (prowiz.h:28-32). */
|
|
2
|
+
export interface PwFormat {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
test(data: Uint8Array, start: number): number;
|
|
5
|
+
depack(data: Uint8Array, start: number): Uint8Array;
|
|
6
|
+
}
|
|
7
|
+
/** readmem16b (dataio.c:168-175). */
|
|
8
|
+
export declare function readmem16b(d: Uint8Array, off: number): number;
|
|
9
|
+
/** readmem32b (dataio.c:190-198). */
|
|
10
|
+
export declare function readmem32b(d: Uint8Array, off: number): number;
|
|
11
|
+
/** readmem16l (dataio.c). */
|
|
12
|
+
export declare function readmem16l(d: Uint8Array, off: number): number;
|
|
13
|
+
/** readmem24b (dataio.c) — big-endian 24-bit. */
|
|
14
|
+
export declare function readmem24b(d: Uint8Array, off: number): number;
|
|
15
|
+
/** readmem32l (dataio.c). */
|
|
16
|
+
export declare function readmem32l(d: Uint8Array, off: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* pw_formats (prowiz.c:32-84) — probe ORDER IS LOAD-BEARING:
|
|
19
|
+
* signature-based entries first, then heuristics; pw_mp_noid must be
|
|
20
|
+
* checked before Heatseeker and after ProPacker 1.0 (comment :66).
|
|
21
|
+
* Populated incrementally as depackers land (Wave 2, FORMAT-PLUGINS.md).
|
|
22
|
+
*/
|
|
23
|
+
export declare const pwFormats: PwFormat[];
|
|
24
|
+
/** pw_move_data (prowiz.c:87-100): copy `len` bytes input→output. */
|
|
25
|
+
export declare function moveData(src: Uint8Array, srcOff: number, out: number[], len: number): void;
|
|
26
|
+
/** pw_write_zero (prowiz.c:102-112): append `len` zero bytes. */
|
|
27
|
+
export declare function writeZero(out: number[], len: number): void;
|
|
28
|
+
/** pw_read_title (prowiz.c:209-223): up to 20 title bytes. */
|
|
29
|
+
export declare function pwReadTitle(b: Uint8Array | null, s: number): string;
|
|
30
|
+
/**
|
|
31
|
+
* pw_check (prowiz.c:143-198): probe all formats in table order. Buffer
|
|
32
|
+
* growth requests (res > 0) can't be satisfied when the input is already
|
|
33
|
+
* fully in memory — matches C's "fetch < res → try next format" path.
|
|
34
|
+
*/
|
|
35
|
+
export declare function pwCheck(data: Uint8Array, start: number): PwFormat | null;
|
|
36
|
+
/**
|
|
37
|
+
* pw_wizardry (prowiz.c:113-139): find format + depack to M.K. bytes.
|
|
38
|
+
* Sets outName.name to the winning pw_format.name (pw_load.c:128 prints
|
|
39
|
+
* it as mod->type).
|
|
40
|
+
*/
|
|
41
|
+
export declare function pwWizardry(data: Uint8Array, start: number, outName: {
|
|
42
|
+
name?: string;
|
|
43
|
+
}): Uint8Array;
|
|
44
|
+
//# sourceMappingURL=prowiz.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prowiz.d.ts","sourceRoot":"","sources":["../src/prowiz.ts"],"names":[],"mappings":"AAsCA,kCAAkC;AAClC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9C,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CACrD;AAED,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,QAAQ,EA6C/B,CAAC;AAEF,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAI1F;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAMlG"}
|
package/dist/prowiz.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
// Copyright (c) 2026 Bitti09 — modplayjs contributors
|
|
3
|
+
// Ported from: libxmp src/loaders/prowizard/prowiz.c (pw_format contract
|
|
4
|
+
// prowiz.h:28-32, pw_formats table :32-84, pw_move_data :87-100,
|
|
5
|
+
// pw_write_zero :102-112, pw_wizardry :113-139, pw_check :143-198,
|
|
6
|
+
// pw_read_title :209-223) — the ProWizard depacker framework.
|
|
7
|
+
//
|
|
8
|
+
// JS contract: depackers work over byte buffers. test(data, start) returns
|
|
9
|
+
// 0 (match) / -1 (no) / N>0 (request N more bytes, prowiz.c:173-186 grows
|
|
10
|
+
// the buffer and re-tests; our input is fully in memory so N>0 → try next
|
|
11
|
+
// format, matching the "can't read more" path). depack(data, start) writes
|
|
12
|
+
// a synthetic standard 31-sample M.K. MOD byte stream — pw_load.c feeds
|
|
13
|
+
// that to the shared MOD parse core (fmt-mod/modcore.ts).
|
|
14
|
+
import { ParseError } from '@modplayjs/core';
|
|
15
|
+
import { pwPp10, pwPp21, pwPp30 } from './pw-pp.js';
|
|
16
|
+
import { pwP4x } from './pw-p40.js';
|
|
17
|
+
import { pwP50a, pwP60a } from './pw-theplayer.js';
|
|
18
|
+
import { pwTp1 } from './pw-tp1.js';
|
|
19
|
+
import { pwTp2, pwTp3 } from './pw-tp3.js';
|
|
20
|
+
import { pwUnicId, pwUnicNoid, pwUnicEmptyId } from './pw-unic.js';
|
|
21
|
+
import { pwUnic2 } from './pw-unic2.js';
|
|
22
|
+
import { pwNp1, pwNp2 } from './pw-np12.js';
|
|
23
|
+
import { pwNp3 } from './pw-np3.js';
|
|
24
|
+
import { pwXann } from './pw-xann.js';
|
|
25
|
+
import { pwWn } from './pw-wn.js';
|
|
26
|
+
import { pwZen } from './pw-zen.js';
|
|
27
|
+
import { pwKsm } from './pw-ksm.js';
|
|
28
|
+
import { pwHrt } from './pw-hrt.js';
|
|
29
|
+
import { pwMpId, pwMpNoid } from './pw-mp.js';
|
|
30
|
+
import { pwDi } from './pw-di.js';
|
|
31
|
+
import { pwAc1d } from './pw-ac1d.js';
|
|
32
|
+
import { pwEu } from './pw-eureka.js';
|
|
33
|
+
import { pwFcm } from './pw-fcm.js';
|
|
34
|
+
import { pwFchs } from './pw-fuchs.js';
|
|
35
|
+
import { pwSkyt } from './pw-skyt.js';
|
|
36
|
+
import { pwStarpack } from './pw-starpack.js';
|
|
37
|
+
/** readmem16b (dataio.c:168-175). */
|
|
38
|
+
export function readmem16b(d, off) {
|
|
39
|
+
return (d[off] << 8) | d[off + 1];
|
|
40
|
+
}
|
|
41
|
+
/** readmem32b (dataio.c:190-198). */
|
|
42
|
+
export function readmem32b(d, off) {
|
|
43
|
+
return ((d[off] << 24) | (d[off + 1] << 16) | (d[off + 2] << 8) | d[off + 3]) >>> 0;
|
|
44
|
+
}
|
|
45
|
+
/** readmem16l (dataio.c). */
|
|
46
|
+
export function readmem16l(d, off) {
|
|
47
|
+
return d[off] | (d[off + 1] << 8);
|
|
48
|
+
}
|
|
49
|
+
/** readmem24b (dataio.c) — big-endian 24-bit. */
|
|
50
|
+
export function readmem24b(d, off) {
|
|
51
|
+
return (d[off] << 16) | (d[off + 1] << 8) | d[off + 2];
|
|
52
|
+
}
|
|
53
|
+
/** readmem32l (dataio.c). */
|
|
54
|
+
export function readmem32l(d, off) {
|
|
55
|
+
return (d[off] | (d[off + 1] << 8) | (d[off + 2] << 16) | (d[off + 3] << 24)) >>> 0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* pw_formats (prowiz.c:32-84) — probe ORDER IS LOAD-BEARING:
|
|
59
|
+
* signature-based entries first, then heuristics; pw_mp_noid must be
|
|
60
|
+
* checked before Heatseeker and after ProPacker 1.0 (comment :66).
|
|
61
|
+
* Populated incrementally as depackers land (Wave 2, FORMAT-PLUGINS.md).
|
|
62
|
+
*/
|
|
63
|
+
export const pwFormats = [
|
|
64
|
+
// With signature (prowiz.c:33-50) — order verbatim
|
|
65
|
+
pwAc1d,
|
|
66
|
+
pwFchs,
|
|
67
|
+
pwFcm,
|
|
68
|
+
pwHrt,
|
|
69
|
+
pwKsm,
|
|
70
|
+
pwMpId,
|
|
71
|
+
// pwP18a — pending
|
|
72
|
+
// pwP10c — pending
|
|
73
|
+
// pwPru1 — pending
|
|
74
|
+
// pwPru2 — pending
|
|
75
|
+
// pwPha — pending
|
|
76
|
+
pwWn,
|
|
77
|
+
pwUnicId,
|
|
78
|
+
pwTp3,
|
|
79
|
+
pwTp2,
|
|
80
|
+
pwTp1,
|
|
81
|
+
pwSkyt,
|
|
82
|
+
// No signature (prowiz.c:52-84) — order verbatim
|
|
83
|
+
pwXann,
|
|
84
|
+
pwDi,
|
|
85
|
+
pwEu,
|
|
86
|
+
pwP4x,
|
|
87
|
+
pwPp21,
|
|
88
|
+
pwPp30,
|
|
89
|
+
pwPp10,
|
|
90
|
+
pwP50a,
|
|
91
|
+
pwP60a,
|
|
92
|
+
// pwP61a — pending
|
|
93
|
+
pwMpNoid, // must be checked before Heatseeker, after ProPacker 1.0 (:66)
|
|
94
|
+
// pwNru — pending
|
|
95
|
+
pwNp2,
|
|
96
|
+
pwNp1,
|
|
97
|
+
pwNp3,
|
|
98
|
+
pwZen,
|
|
99
|
+
pwUnicEmptyId,
|
|
100
|
+
pwUnicNoid,
|
|
101
|
+
pwUnic2,
|
|
102
|
+
// pwCrb — pending
|
|
103
|
+
// pwTdd — pending
|
|
104
|
+
pwStarpack,
|
|
105
|
+
// pwGmc — pending
|
|
106
|
+
// pwTitanics — pending
|
|
107
|
+
];
|
|
108
|
+
/** pw_move_data (prowiz.c:87-100): copy `len` bytes input→output. */
|
|
109
|
+
export function moveData(src, srcOff, out, len) {
|
|
110
|
+
for (let i = 0; i < len && srcOff + i < src.length; i++) {
|
|
111
|
+
out.push(src[srcOff + i]);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** pw_write_zero (prowiz.c:102-112): append `len` zero bytes. */
|
|
115
|
+
export function writeZero(out, len) {
|
|
116
|
+
for (let i = 0; i < len; i++)
|
|
117
|
+
out.push(0);
|
|
118
|
+
}
|
|
119
|
+
/** pw_read_title (prowiz.c:209-223): up to 20 title bytes. */
|
|
120
|
+
export function pwReadTitle(b, s) {
|
|
121
|
+
if (b === null)
|
|
122
|
+
return '';
|
|
123
|
+
if (s > 20)
|
|
124
|
+
s = 20;
|
|
125
|
+
let t = '';
|
|
126
|
+
for (let i = 0; i < s; i++)
|
|
127
|
+
t += String.fromCharCode(b[i]);
|
|
128
|
+
return t;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* pw_check (prowiz.c:143-198): probe all formats in table order. Buffer
|
|
132
|
+
* growth requests (res > 0) can't be satisfied when the input is already
|
|
133
|
+
* fully in memory — matches C's "fetch < res → try next format" path.
|
|
134
|
+
*/
|
|
135
|
+
export function pwCheck(data, start) {
|
|
136
|
+
for (let i = 0; i < pwFormats.length; i++) {
|
|
137
|
+
const res = pwFormats[i].test(data, start);
|
|
138
|
+
if (res === 0)
|
|
139
|
+
return pwFormats[i];
|
|
140
|
+
// res < 0 → no match; res > 0 → more data requested (unavailable)
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* pw_wizardry (prowiz.c:113-139): find format + depack to M.K. bytes.
|
|
146
|
+
* Sets outName.name to the winning pw_format.name (pw_load.c:128 prints
|
|
147
|
+
* it as mod->type).
|
|
148
|
+
*/
|
|
149
|
+
export function pwWizardry(data, start, outName) {
|
|
150
|
+
const format = pwCheck(data, start);
|
|
151
|
+
if (format === null)
|
|
152
|
+
throw new ParseError('prowizard: no format matched');
|
|
153
|
+
const out = format.depack(data, start);
|
|
154
|
+
outName.name = format.name;
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=prowiz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prowiz.js","sourceRoot":"","sources":["../src/prowiz.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** ptk_table[37][2] (ptktable.c:4-46): Amiga period pairs per note index. */
|
|
2
|
+
export declare const ptkTable: ReadonlyArray<readonly [number, number]>;
|
|
3
|
+
/** PTK_IS_VALID_NOTE (prowiz.h:20). */
|
|
4
|
+
export declare function ptkIsValidNote(n: number): boolean;
|
|
5
|
+
//# sourceMappingURL=ptktable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ptktable.d.ts","sourceRoot":"","sources":["../src/ptktable.ts"],"names":[],"mappings":"AAKA,6EAA6E;AAC7E,eAAO,MAAM,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAyC7D,CAAC;AAEF,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjD"}
|
package/dist/ptktable.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
// Copyright (c) 2026 Bitti09 — modplayjs contributors
|
|
3
|
+
// Ported from: libxmp src/loaders/prowizard/ptktable.c (ptk_table) and
|
|
4
|
+
// tuning.c (tun_table) — shared ProWizard lookup tables.
|
|
5
|
+
/** ptk_table[37][2] (ptktable.c:4-46): Amiga period pairs per note index. */
|
|
6
|
+
export const ptkTable = [
|
|
7
|
+
[0x00, 0x00],
|
|
8
|
+
[0x03, 0x58],
|
|
9
|
+
[0x03, 0x28],
|
|
10
|
+
[0x02, 0xfa],
|
|
11
|
+
[0x02, 0xd0],
|
|
12
|
+
[0x02, 0xa6],
|
|
13
|
+
[0x02, 0x80], /* 1 */
|
|
14
|
+
[0x02, 0x5c],
|
|
15
|
+
[0x02, 0x3a],
|
|
16
|
+
[0x02, 0x1a],
|
|
17
|
+
[0x01, 0xfc],
|
|
18
|
+
[0x01, 0xe0],
|
|
19
|
+
[0x01, 0xc5],
|
|
20
|
+
[0x01, 0xac],
|
|
21
|
+
[0x01, 0x94],
|
|
22
|
+
[0x01, 0x7d],
|
|
23
|
+
[0x01, 0x68],
|
|
24
|
+
[0x01, 0x53],
|
|
25
|
+
[0x01, 0x40], /* 2 */
|
|
26
|
+
[0x01, 0x2e],
|
|
27
|
+
[0x01, 0x1d],
|
|
28
|
+
[0x01, 0x0d],
|
|
29
|
+
[0x00, 0xfe],
|
|
30
|
+
[0x00, 0xf0],
|
|
31
|
+
[0x00, 0xe2],
|
|
32
|
+
[0x00, 0xd6],
|
|
33
|
+
[0x00, 0xca],
|
|
34
|
+
[0x00, 0xbe],
|
|
35
|
+
[0x00, 0xb4],
|
|
36
|
+
[0x00, 0xaa],
|
|
37
|
+
[0x00, 0xa0], /* 3 */
|
|
38
|
+
[0x00, 0x97],
|
|
39
|
+
[0x00, 0x8f],
|
|
40
|
+
[0x00, 0x87],
|
|
41
|
+
[0x00, 0x7f],
|
|
42
|
+
[0x00, 0x78],
|
|
43
|
+
[0x00, 0x71],
|
|
44
|
+
];
|
|
45
|
+
/** PTK_IS_VALID_NOTE (prowiz.h:20). */
|
|
46
|
+
export function ptkIsValidNote(n) {
|
|
47
|
+
return n >= 0 && n < ptkTable.length;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ptktable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ptktable.js","sourceRoot":"","sources":["../src/ptktable.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,uEAAuE;AACvE,yDAAyD;AAEzD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,QAAQ,GAA6C;IACjE,CAAC,IAAI,EAAE,IAAI,CAAC;IAEZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAI,SAAS;IACzB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IAEZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAI,SAAS;IACzB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IAEZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAI,SAAS;IACzB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,uCAAuC;AACvC,MAAM,UAAU,cAAc,CAAC,CAAS;IACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-ac1d.d.ts","sourceRoot":"","sources":["../src/pw-ac1d.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgD,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AA0I1F,8BAA8B;AAC9B,eAAO,MAAM,MAAM,EAAE,QAIpB,CAAC"}
|
package/dist/pw-ac1d.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BSD-3-Clause
|
|
2
|
+
// Copyright (c) 2026 Bitti09 — modplayjs contributors
|
|
3
|
+
// Ported from: libxmp src/loaders/prowizard/ac1d.c (AC1D Packer) —
|
|
4
|
+
// depack_ac1d :37-152, test_ac1d :155-185.
|
|
5
|
+
import { ptkTable, ptkIsValidNote } from './ptktable.js';
|
|
6
|
+
import { readmem32b, moveData, writeZero, pwReadTitle } from './prowiz.js';
|
|
7
|
+
const NO_NOTE = 0xff;
|
|
8
|
+
function put8(out, b) { out.push(b & 0xff); }
|
|
9
|
+
function put16b(out, v) { out.push((v >> 8) & 0xff, v & 0xff); }
|
|
10
|
+
function put32b(out, v) {
|
|
11
|
+
out.push((v >>> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
|
|
12
|
+
}
|
|
13
|
+
/** depack_ac1d (ac1d.c:37-152). */
|
|
14
|
+
function depackAc1d(data, start) {
|
|
15
|
+
let pos = start;
|
|
16
|
+
const out = [];
|
|
17
|
+
const u8 = () => data[pos++] ?? 0;
|
|
18
|
+
const u16 = () => { const v = (data[pos] << 8) | data[pos + 1]; pos += 2; return v; };
|
|
19
|
+
const u32 = () => { const v = readmem32b(data, pos); pos += 4; return v; };
|
|
20
|
+
const npos = u8();
|
|
21
|
+
const ntkByte = u8();
|
|
22
|
+
u16(); // bypass ID
|
|
23
|
+
const saddr = u32(); // sample data address
|
|
24
|
+
writeZero(out, 20); // title
|
|
25
|
+
// Sample headers (ac1d.c:49-58)
|
|
26
|
+
let ssize = 0;
|
|
27
|
+
for (let i = 0; i < 31; i++) {
|
|
28
|
+
writeZero(out, 22); // name
|
|
29
|
+
const size = u16();
|
|
30
|
+
ssize += size * 2;
|
|
31
|
+
put16b(out, size);
|
|
32
|
+
put8(out, u8()); // finetune
|
|
33
|
+
put8(out, u8()); // volume
|
|
34
|
+
put16b(out, u16()); // loop start
|
|
35
|
+
put16b(out, u16()); // loop size
|
|
36
|
+
}
|
|
37
|
+
// Pattern addresses (ac1d.c:61-70): 0-terminated list
|
|
38
|
+
const paddr = [];
|
|
39
|
+
let npat = 0;
|
|
40
|
+
for (; npat < 128; npat++) {
|
|
41
|
+
paddr.push(u32());
|
|
42
|
+
if (paddr[npat] === 0)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
if (npat === 0)
|
|
46
|
+
throw new Error('ac1d: no patterns');
|
|
47
|
+
npat--;
|
|
48
|
+
put8(out, npos);
|
|
49
|
+
put8(out, ntkByte);
|
|
50
|
+
// Pattern table (ac1d.c:77-79) at 0x300
|
|
51
|
+
pos = start + 0x300;
|
|
52
|
+
moveData(data, pos, out, 128);
|
|
53
|
+
put32b(out, 0x4d2e4b2e); // M.K.
|
|
54
|
+
// Pattern data (ac1d.c:82-140): per pattern skip 3 u32 headers, then
|
|
55
|
+
// 4 channels × 64 rows of packed cells with 0x80-run skips.
|
|
56
|
+
for (let i = 0; i < npat; i++) {
|
|
57
|
+
pos = start + paddr[i];
|
|
58
|
+
u32();
|
|
59
|
+
u32();
|
|
60
|
+
u32(); // tsize headers
|
|
61
|
+
const tmp = new Uint8Array(1024);
|
|
62
|
+
for (let k = 0; k < 4 && pos < data.length; k++) {
|
|
63
|
+
for (let j = 0; j < 64; j++) {
|
|
64
|
+
const x = j * 16 + k * 4;
|
|
65
|
+
const c1 = u8();
|
|
66
|
+
if ((c1 & 0x80) !== 0) {
|
|
67
|
+
const c4 = c1 & 0x7f;
|
|
68
|
+
j += c4 - 1;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const c2 = u8();
|
|
72
|
+
const ins = ((c1 & 0xc0) >> 2) | ((c2 >> 4) & 0x0f);
|
|
73
|
+
let note = c1 & 0x3f;
|
|
74
|
+
if (note === 0x3f)
|
|
75
|
+
note = NO_NOTE;
|
|
76
|
+
else if (note !== 0)
|
|
77
|
+
note -= 0x0b;
|
|
78
|
+
if (note === 0)
|
|
79
|
+
note++;
|
|
80
|
+
tmp[x] = ins & 0xf0;
|
|
81
|
+
if (note !== NO_NOTE && ptkIsValidNote(note)) {
|
|
82
|
+
tmp[x] = (tmp[x] | ptkTable[note][0]) & 0xff;
|
|
83
|
+
tmp[x + 1] = ptkTable[note][1];
|
|
84
|
+
}
|
|
85
|
+
if ((c2 & 0x0f) === 0x07) {
|
|
86
|
+
tmp[x + 2] = ((ins << 4) & 0xf0) & 0xff;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const c3 = u8();
|
|
90
|
+
const fxt = c2 & 0x0f;
|
|
91
|
+
const fxp = c3;
|
|
92
|
+
tmp[x + 2] = (((ins << 4) & 0xf0) | fxt) & 0xff;
|
|
93
|
+
tmp[x + 3] = fxp;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (let t = 0; t < 1024; t++)
|
|
97
|
+
out.push(tmp[t]);
|
|
98
|
+
}
|
|
99
|
+
// Sample data (ac1d.c:146-148)
|
|
100
|
+
moveData(data, start + saddr, out, ssize);
|
|
101
|
+
return Uint8Array.from(out);
|
|
102
|
+
}
|
|
103
|
+
/** test_ac1d (ac1d.c:155-185). */
|
|
104
|
+
function testAc1d(data, start) {
|
|
105
|
+
const s = data.length - start;
|
|
106
|
+
if (s < 896)
|
|
107
|
+
return 896 - s;
|
|
108
|
+
// test #1 (ac1d.c:162-165): 0xac 0x1d at offset 2
|
|
109
|
+
if (data[start + 2] !== 0xac || data[start + 3] !== 0x1d)
|
|
110
|
+
return -1;
|
|
111
|
+
// test #2 (ac1d.c:167-170)
|
|
112
|
+
if (data[start] > 0x7f)
|
|
113
|
+
return -1;
|
|
114
|
+
// test #4 (ac1d.c:172-176)
|
|
115
|
+
for (let i = 0; i < 31; i++) {
|
|
116
|
+
if (data[start + 10 + 8 * i] > 0x0f)
|
|
117
|
+
return -1;
|
|
118
|
+
}
|
|
119
|
+
// test #5 (ac1d.c:178-182)
|
|
120
|
+
for (let i = 0; i < 128; i++) {
|
|
121
|
+
if (data[start + 768 + i] > 0x7f)
|
|
122
|
+
return -1;
|
|
123
|
+
}
|
|
124
|
+
pwReadTitle(null, 0);
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
/** pw_ac1d: "AC1D Packer". */
|
|
128
|
+
export const pwAc1d = {
|
|
129
|
+
name: 'AC1D Packer',
|
|
130
|
+
test: testAc1d,
|
|
131
|
+
depack: depackAc1d,
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=pw-ac1d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-ac1d.js","sourceRoot":"","sources":["../src/pw-ac1d.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sDAAsD;AACtD,mEAAmE;AACnE,2CAA2C;AAE3C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAE1F,MAAM,OAAO,GAAG,IAAI,CAAC;AAErB,SAAS,IAAI,CAAC,GAAa,EAAE,CAAS,IAAU,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,SAAS,MAAM,CAAC,GAAa,EAAE,CAAS,IAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxF,SAAS,MAAM,CAAC,GAAa,EAAE,CAAS;IACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,mCAAmC;AACnC,SAAS,UAAU,CAAC,IAAgB,EAAE,KAAa;IACjD,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC;IACrB,GAAG,EAAE,CAAC,CAAC,YAAY;IACnB,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,sBAAsB;IAE3C,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;IAE5B,gCAAgC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO;QAC3B,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW;QAC5B,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;QAC1B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa;QACjC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY;IAClC,CAAC;IAED,sDAAsD;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM;IAC/B,CAAC;IACD,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC;IAEP,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEnB,wCAAwC;IACxC,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAE9B,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO;IAEhC,qEAAqE;IACrE,4DAA4D;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACxB,GAAG,EAAE,CAAC;QAAC,GAAG,EAAE,CAAC;QAAC,GAAG,EAAE,CAAC,CAAC,gBAAgB;QAErC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEzB,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;oBACrB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBAED,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpD,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;gBAErB,IAAI,IAAI,KAAK,IAAI;oBAAE,IAAI,GAAG,OAAO,CAAC;qBAC7B,IAAI,IAAI,KAAK,CAAC;oBAAE,IAAI,IAAI,IAAI,CAAC;gBAElC,IAAI,IAAI,KAAK,CAAC;oBAAE,IAAI,EAAE,CAAC;gBAEvB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBAEpB,IAAI,IAAI,KAAK,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,QAAQ,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBAC/C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;gBAED,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBACzB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;oBACxC,SAAS;gBACX,CAAC;gBAED,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;gBACtB,MAAM,GAAG,GAAG,EAAE,CAAC;gBACf,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;gBAChD,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACnB,CAAC;QACH,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;IACnD,CAAC;IAED,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAE1C,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,kCAAkC;AAClC,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAa;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAC9B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC;IAE5B,kDAAkD;IAClD,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAEpE,2BAA2B;IAC3B,IAAI,IAAI,CAAC,KAAK,CAAE,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAEnC,2BAA2B;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,2BAA2B;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAE,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAErB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,MAAM,GAAa;IAC9B,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,UAAU;CACnB,CAAC"}
|
package/dist/pw-di.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-di.d.ts","sourceRoot":"","sources":["../src/pw-di.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4D,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AA6KtG,kCAAkC;AAClC,eAAO,MAAM,IAAI,EAAE,QAIlB,CAAC"}
|