build: dual CJS/ESM output, ES2020 target, Node 18 floor
"exports" gains "import" and "types" next to "require": import "alex2node" failed with ERR_PACKAGE_PATH_NOT_EXPORTED. scripts/build.mjs compiles src/ to dist/cjs, dist/esm and dist/types in a staging directory and swaps them in only when both compiler runs passed. "main" and "types" follow for resolvers that do not read "exports". Target ES6 -> ES2020, "engines": node >= 18, relative imports carry ".js" for Node's ESM loader. uuid gives way to crypto.randomUUID(); mqtt is the only runtime dependency left. Tests load the package by name. New: both entry points, the modules the builds import, dist/ equal to a fresh build, a round trip on the ES module build, and two compiled type fixtures in place of the .d.ts regexes. 22 tests pass in 5.7 s. dist/: 16 files, 79,711 B -> 25 files, 132,291 B; the npm tarball is 25,125 B. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
58869d44c1
commit
1d88c7811a
50 changed files with 1472 additions and 195 deletions
11
test/fixtures/tsconfig.json
vendored
Normal file
11
test/fixtures/tsconfig.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"module": "Node16",
|
||||
"moduleResolution": "Node16",
|
||||
"strict": true,
|
||||
"skipLibCheck": false,
|
||||
"noEmit": true
|
||||
},
|
||||
"files": ["types.ts", "types.mts"]
|
||||
}
|
||||
10
test/fixtures/types.mts
vendored
Normal file
10
test/fixtures/types.mts
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// Compiled, never run: the same declarations as seen from an ES module. Without a "types" condition in "exports" the
|
||||
// import resolves to dist/esm/index.js, which has no declarations next to it, and this file fails with TS7016.
|
||||
import { Alex2MQTT, DEFAULT_HOST, EndpointHealth } from "alex2node";
|
||||
import type { Device } from "alex2node";
|
||||
|
||||
const bridge = new Alex2MQTT("user", "password", "root", false, { host: DEFAULT_HOST });
|
||||
const devices: Device[] = bridge.getDevices();
|
||||
const health: EndpointHealth = EndpointHealth.OK;
|
||||
|
||||
export { devices, health };
|
||||
36
test/fixtures/types.ts
vendored
Normal file
36
test/fixtures/types.ts
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// Compiled, never run (test/typings.test.js, npm run check): a CommonJS TypeScript consumer of the declarations in
|
||||
// dist/types, resolved through the package's "exports". A "@ts-expect-error" line fails the compile when the
|
||||
// declaration stops rejecting what follows it.
|
||||
import { ActionMapping, AlexaActions, AlexaInterfaceType, DisplayCategory, EndpointHealth, PowerController } from "alex2node";
|
||||
import type { Alex2MQTT, Alex2MQTTOptions, AlexaInterface, AlexaStatusMessage, ChangeCause, Device, SupportedMode } from "alex2node";
|
||||
|
||||
declare const bridge: Alex2MQTT;
|
||||
declare const message: AlexaStatusMessage;
|
||||
declare const capability: AlexaInterface;
|
||||
|
||||
const options: Alex2MQTTOptions = { host: "mqtt://127.0.0.1:1883", mqtt: { reconnectPeriod: 1000 }, log: (line) => line.length };
|
||||
const device: Device = bridge.registerDevice("Lamp", "lamp-1", [DisplayCategory.LIGHT, DisplayCategory.SWITCH]);
|
||||
const added: AlexaInterface = device.addCapability(AlexaInterfaceType.POWER_CONTROLLER, { proactivelyReported: true });
|
||||
|
||||
// ActionMapping: the payload is optional
|
||||
const close = new ActionMapping([AlexaActions.Close], "TurnOn");
|
||||
capability.addActionMapping(close);
|
||||
|
||||
// addHealthProp: the enum or its string values, chainable
|
||||
const chained: AlexaStatusMessage = message.addHealthProp(EndpointHealth.OK).addHealthProp("UNREACHABLE", 50);
|
||||
// @ts-expect-error not a connectivity value
|
||||
message.addHealthProp("ASLEEP");
|
||||
// @ts-expect-error a power state is ON or OFF
|
||||
message.addPowerControllerProp("ON ");
|
||||
message.addPowerControllerProp(PowerController.ON);
|
||||
|
||||
// addSupportedModes: Mode objects, plain strings still accepted
|
||||
const mode: SupportedMode = { value: "Fan.Auto", modeResources: { friendlyNames: [{ "@type": "text", value: { text: "Auto", locale: "en-US" } }] } };
|
||||
capability.addSupportedModes([mode, "Fan.On"]);
|
||||
|
||||
const cause: ChangeCause = "PHYSICAL_INTERACTION";
|
||||
const sent: Promise<string> = device.getChangeReport(cause).addPowerControllerProp(PowerController.OFF).send();
|
||||
// @ts-expect-error not a cause Alexa knows
|
||||
device.getChangeReport("BUTTON");
|
||||
|
||||
export { options, added, chained, sent };
|
||||
Loading…
Add table
Add a link
Reference in a new issue