microtags 0.0.0
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/LICENSE +168 -0
- package/README.md +246 -0
- package/dist/builders.d.ts +46 -0
- package/dist/builders.d.ts.map +1 -0
- package/dist/context.cjs +89 -0
- package/dist/context.cjs.map +7 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +70 -0
- package/dist/context.js.map +7 -0
- package/dist/context.min.js +2 -0
- package/dist/context.min.js.map +7 -0
- package/dist/factory.d.ts +27 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/index.cjs +28 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +7 -0
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +7 -0
- package/dist/meta.json +101 -0
- package/dist/reactivity.d.ts +15 -0
- package/dist/reactivity.d.ts.map +1 -0
- package/dist/render.cjs +86 -0
- package/dist/render.cjs.map +7 -0
- package/dist/render.d.ts +12 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +67 -0
- package/dist/render.js.map +7 -0
- package/dist/render.min.js +2 -0
- package/dist/render.min.js.map +7 -0
- package/dist/setup-context.d.ts +8 -0
- package/dist/setup-context.d.ts.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +69 -0
package/dist/render.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const elementData = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
const elementKeys = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
function renderList(container, template, options) {
|
|
6
|
+
const { data, key: getKey, update } = options;
|
|
7
|
+
const existingByKey = /* @__PURE__ */ new Map();
|
|
8
|
+
for (const child of Array.from(container.children)) {
|
|
9
|
+
const key = elementKeys.get(child);
|
|
10
|
+
if (key !== void 0) existingByKey.set(key, child);
|
|
11
|
+
}
|
|
12
|
+
const dataKeys = new Set(data.map(getKey));
|
|
13
|
+
for (const child of Array.from(container.children)) {
|
|
14
|
+
const key = elementKeys.get(child);
|
|
15
|
+
if (key === void 0 || !dataKeys.has(key)) {
|
|
16
|
+
child.remove();
|
|
17
|
+
elementKeys.delete(child);
|
|
18
|
+
elementData.delete(child);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let prev = null;
|
|
22
|
+
for (let i = 0; i < data.length; i++) {
|
|
23
|
+
const item = data[i];
|
|
24
|
+
const key = getKey(item, i);
|
|
25
|
+
let el = existingByKey.get(key);
|
|
26
|
+
if (!el) {
|
|
27
|
+
el = template.content.cloneNode(true).firstElementChild;
|
|
28
|
+
elementKeys.set(el, key);
|
|
29
|
+
}
|
|
30
|
+
if (elementData.get(el) !== item) {
|
|
31
|
+
update(el, item);
|
|
32
|
+
elementData.set(el, item);
|
|
33
|
+
}
|
|
34
|
+
const expected = prev ? prev.nextElementSibling : container.firstElementChild;
|
|
35
|
+
if (el !== expected) {
|
|
36
|
+
if (prev) prev.after(el);
|
|
37
|
+
else container.prepend(el);
|
|
38
|
+
}
|
|
39
|
+
prev = el;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
__name(renderList, "renderList");
|
|
43
|
+
let _tplCounter = 0;
|
|
44
|
+
const tplIds = /* @__PURE__ */ new WeakMap();
|
|
45
|
+
function render(container, template, options) {
|
|
46
|
+
renderList(container, template, {
|
|
47
|
+
data: [
|
|
48
|
+
options !== void 0 && "data" in options ? options.data : {}
|
|
49
|
+
],
|
|
50
|
+
key: /* @__PURE__ */ __name(() => {
|
|
51
|
+
let id = tplIds.get(template);
|
|
52
|
+
if (id === void 0) {
|
|
53
|
+
id = _tplCounter++;
|
|
54
|
+
tplIds.set(template, id);
|
|
55
|
+
}
|
|
56
|
+
return id;
|
|
57
|
+
}, "key"),
|
|
58
|
+
update: options?.update ?? (() => {
|
|
59
|
+
})
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
__name(render, "render");
|
|
63
|
+
export {
|
|
64
|
+
render,
|
|
65
|
+
renderList
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/render.ts"],
|
|
4
|
+
"sourcesContent": ["export type RenderListOptions<T, E extends Element = Element> = {\n data:readonly T[];\n key:(item:T, index:number) => string | number;\n update:(el:E, item:T) => void;\n};\n\nexport type RenderOptions<T, E extends Element = Element> = {\n data?:T;\n update?:(el:E, item:T) => void;\n};\n\nconst elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:RenderListOptions<T, E>\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:RenderOptions<T, E>\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
|
|
5
|
+
"mappings": ";;AAWA,MAAM,cAAc,oBAAI,QAA0B;AAClD,MAAM,cAAc,oBAAI,QAAkC;AAEnD,SAAS,WACZ,WACA,UACA,SACG;AACH,QAAM,EAAE,MAAM,KAAK,QAAQ,OAAO,IAAI;AACtC,QAAM,gBAAgB,oBAAI,IAAwB;AAElD,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,OAAW,eAAc,IAAI,KAAK,KAAU;AAAA,EAC5D;AAEA,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC;AAEzC,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,UAAa,CAAC,SAAS,IAAI,GAAG,GAAG;AACzC,YAAM,OAAO;AACb,kBAAY,OAAO,KAAK;AACxB,kBAAY,OAAO,KAAK;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,OAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,KAAK,cAAc,IAAI,GAAG;AAE9B,QAAI,CAAC,IAAI;AACL,WAAM,SAAS,QAAQ,UAAU,IAAI,EAChC;AACL,kBAAY,IAAI,IAAI,GAAG;AAAA,IAC3B;AAEA,QAAI,YAAY,IAAI,EAAE,MAAM,MAAM;AAC9B,aAAO,IAAI,IAAI;AACf,kBAAY,IAAI,IAAI,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,OACb,KAAK,qBACL,UAAU;AAEd,QAAI,OAAO,UAAU;AACjB,UAAI,KAAM,MAAK,MAAM,EAAE;AAAA,UAClB,WAAU,QAAQ,EAAE;AAAA,IAC7B;AAEA,WAAO;AAAA,EACX;AACJ;AApDgB;AAsDhB,IAAI,cAAc;AAClB,MAAM,SAAS,oBAAI,QAAqC;AAEjD,SAAS,OACZ,WACA,UACA,SACG;AACH,aAAiB,WAAW,UAAU;AAAA,IAClC,MAAM;AAAA,MACF,YAAY,UAAa,UAAU,UAC/B,QAAQ,OACR,CAAC;AAAA,IACT;AAAA,IACA,KAAK,6BAAM;AACP,UAAI,KAAK,OAAO,IAAI,QAAQ;AAC5B,UAAI,OAAO,QAAW;AAClB,aAAK;AACL,eAAO,IAAI,UAAU,EAAE;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,GAPK;AAAA,IAQL,QAAQ,SAAS,WAAW,MAAM;AAAA,IAAC;AAAA,EACvC,CAAC;AACL;AArBgB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var g=Object.defineProperty;var a=(d,i)=>g(d,"name",{value:i,configurable:!0});var o=new WeakMap,m=new WeakMap;function x(d,i,s){let{data:l,key:E,update:T}=s,p=new Map;for(let e of Array.from(d.children)){let t=m.get(e);t!==void 0&&p.set(t,e)}let c=new Set(l.map(E));for(let e of Array.from(d.children)){let t=m.get(e);(t===void 0||!c.has(t))&&(e.remove(),m.delete(e),o.delete(e))}let r=null;for(let e=0;e<l.length;e++){let t=l[e],f=E(t,e),n=p.get(f);n||(n=i.content.cloneNode(!0).firstElementChild,m.set(n,f)),o.get(n)!==t&&(T(n,t),o.set(n,t));let y=r?r.nextElementSibling:d.firstElementChild;n!==y&&(r?r.after(n):d.prepend(n)),r=n}}a(x,"renderList");var k=0,u=new WeakMap;function M(d,i,s){x(d,i,{data:[s!==void 0&&"data"in s?s.data:{}],key:a(()=>{let l=u.get(i);return l===void 0&&(l=k++,u.set(i,l)),l},"key"),update:s?.update??(()=>{})})}a(M,"render");export{M as render,x as renderList};
|
|
2
|
+
//# sourceMappingURL=render.min.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/render.ts"],
|
|
4
|
+
"sourcesContent": ["export type RenderListOptions<T, E extends Element = Element> = {\n data:readonly T[];\n key:(item:T, index:number) => string | number;\n update:(el:E, item:T) => void;\n};\n\nexport type RenderOptions<T, E extends Element = Element> = {\n data?:T;\n update?:(el:E, item:T) => void;\n};\n\nconst elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:RenderListOptions<T, E>\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:RenderOptions<T, E>\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
|
|
5
|
+
"mappings": "+EAWA,IAAMA,EAAc,IAAI,QAClBC,EAAc,IAAI,QAEjB,SAASC,EACZC,EACAC,EACAC,EACG,CACH,GAAM,CAAE,KAAAC,EAAM,IAAKC,EAAQ,OAAAC,CAAO,EAAIH,EAChCI,EAAgB,IAAI,IAE1B,QAAWC,KAAS,MAAM,KAAKP,EAAU,QAAQ,EAAG,CAChD,IAAMQ,EAAMV,EAAY,IAAIS,CAAK,EAC7BC,IAAQ,QAAWF,EAAc,IAAIE,EAAKD,CAAU,CAC5D,CAEA,IAAME,EAAW,IAAI,IAAIN,EAAK,IAAIC,CAAM,CAAC,EAEzC,QAAWG,KAAS,MAAM,KAAKP,EAAU,QAAQ,EAAG,CAChD,IAAMQ,EAAMV,EAAY,IAAIS,CAAK,GAC7BC,IAAQ,QAAa,CAACC,EAAS,IAAID,CAAG,KACtCD,EAAM,OAAO,EACbT,EAAY,OAAOS,CAAK,EACxBV,EAAY,OAAOU,CAAK,EAEhC,CAEA,IAAIG,EAAgB,KACpB,QAASC,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,IAAK,CAClC,IAAMC,EAAOT,EAAKQ,CAAC,EACbH,EAAMJ,EAAOQ,EAAMD,CAAC,EACtBE,EAAKP,EAAc,IAAIE,CAAG,EAEzBK,IACDA,EAAMZ,EAAS,QAAQ,UAAU,EAAI,EAChC,kBACLH,EAAY,IAAIe,EAAIL,CAAG,GAGvBX,EAAY,IAAIgB,CAAE,IAAMD,IACxBP,EAAOQ,EAAID,CAAI,EACff,EAAY,IAAIgB,EAAID,CAAI,GAG5B,IAAME,EAAWJ,EACbA,EAAK,mBACLV,EAAU,kBAEVa,IAAOC,IACHJ,EAAMA,EAAK,MAAMG,CAAE,EAClBb,EAAU,QAAQa,CAAE,GAG7BH,EAAOG,CACX,CACJ,CApDgBE,EAAAhB,EAAA,cAsDhB,IAAIiB,EAAc,EACZC,EAAS,IAAI,QAEZ,SAASC,EACZlB,EACAC,EACAC,EACG,CACHH,EAAiBC,EAAWC,EAAU,CAClC,KAAM,CACFC,IAAY,QAAa,SAAUA,EAC/BA,EAAQ,KACR,CAAC,CACT,EACA,IAAKa,EAAA,IAAM,CACP,IAAII,EAAKF,EAAO,IAAIhB,CAAQ,EAC5B,OAAIkB,IAAO,SACPA,EAAKH,IACLC,EAAO,IAAIhB,EAAUkB,CAAE,GAEpBA,CACX,EAPK,OAQL,OAAQjB,GAAS,SAAW,IAAM,CAAC,EACvC,CAAC,CACL,CArBgBa,EAAAG,EAAA",
|
|
6
|
+
"names": ["elementData", "elementKeys", "renderList", "container", "template", "options", "data", "getKey", "update", "existingByKey", "child", "key", "dataKeys", "prev", "i", "item", "el", "expected", "__name", "_tplCounter", "tplIds", "render", "id"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SetupContext, Cleanup, PropsSignals, PropDef } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the ctx object passed to a component's setup() callback.
|
|
4
|
+
* The cleanups array is mutated in place so factory.ts can drain it
|
|
5
|
+
* on disconnect without copying.
|
|
6
|
+
*/
|
|
7
|
+
export declare function makeSetupContext<Props extends Record<string, PropDef> = Record<string, PropDef>>(host: HTMLElement, props: PropsSignals<Props>, refs: Record<string, Element | Element[]>, contexts: Record<string, unknown>, cleanups: Cleanup[]): SetupContext<Props, any, any>;
|
|
8
|
+
//# sourceMappingURL=setup-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-context.d.ts","sourceRoot":"","sources":["../src/setup-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,OAAO,EAEV,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE/D,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,EACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,OAAO,EAAE,GACpB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CA6C/B"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
2
|
+
/**
|
|
3
|
+
* A callable alien-signals signal.
|
|
4
|
+
* Call with no args to read (and subscribe in an effect).
|
|
5
|
+
* Call with a value to write.
|
|
6
|
+
*/
|
|
7
|
+
export type Signal<T> = {
|
|
8
|
+
(): T;
|
|
9
|
+
(value: T): void;
|
|
10
|
+
};
|
|
11
|
+
/** Converts a raw attribute string (or null) to T. */
|
|
12
|
+
export type Coercer<T> = (raw: string | null) => T;
|
|
13
|
+
/**
|
|
14
|
+
* A property-only prop: not backed by an attribute.
|
|
15
|
+
* The signal is initialised to `initial` and never updated
|
|
16
|
+
* from an attribute string.
|
|
17
|
+
*/
|
|
18
|
+
export interface PropertyOnlyProp<T> {
|
|
19
|
+
readonly _microtag: 'prop';
|
|
20
|
+
readonly initial: T;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A prop definition accepted by withProps.
|
|
24
|
+
* Either a bare coercer function, a Standard Schema validator,
|
|
25
|
+
* or a property-only marker.
|
|
26
|
+
*/
|
|
27
|
+
export type PropDef<T = unknown> = Coercer<T> | StandardSchemaV1<unknown, T> | PropertyOnlyProp<T>;
|
|
28
|
+
/** Infer T from a PropDef. */
|
|
29
|
+
export type PropType<D> = D extends Coercer<infer T> ? T : D extends StandardSchemaV1<infer _I, infer O> ? O : D extends PropertyOnlyProp<infer T> ? T : never;
|
|
30
|
+
/** Map a record of PropDefs to a record of callable Signals. */
|
|
31
|
+
export type PropsSignals<Defs extends Record<string, PropDef>> = {
|
|
32
|
+
[K in keyof Defs]: Signal<PropType<Defs[K]>>;
|
|
33
|
+
};
|
|
34
|
+
/** Opaque token identifying a context. */
|
|
35
|
+
export interface ContextToken<T> {
|
|
36
|
+
readonly _type?: T;
|
|
37
|
+
readonly id: symbol;
|
|
38
|
+
}
|
|
39
|
+
/** Infer the value type from a ContextToken. */
|
|
40
|
+
export type ContextValue<Tok> = Tok extends ContextToken<infer T> ? T : never;
|
|
41
|
+
/** Map a record of ContextTokens to their resolved values. */
|
|
42
|
+
export type ContextsMap<Tokens extends Record<string, ContextToken<unknown>>> = {
|
|
43
|
+
[K in keyof Tokens]: ContextValue<Tokens[K]> | undefined;
|
|
44
|
+
};
|
|
45
|
+
/** Marker: a single [data-ref="name"] element. */
|
|
46
|
+
export interface SingleRefDef {
|
|
47
|
+
readonly _microtag: 'ref:one';
|
|
48
|
+
}
|
|
49
|
+
/** Marker: all [data-ref="name"] elements. */
|
|
50
|
+
export interface MultipleRefDef {
|
|
51
|
+
readonly _microtag: 'ref:all';
|
|
52
|
+
}
|
|
53
|
+
/** Union of ref definition markers. */
|
|
54
|
+
export type RefDef = SingleRefDef | MultipleRefDef;
|
|
55
|
+
/** Resolve a record of RefDefs to their DOM types. */
|
|
56
|
+
export type RefsMap<Defs extends Record<string, RefDef>> = {
|
|
57
|
+
[K in keyof Defs]: Defs[K] extends MultipleRefDef ? Element[] : Element;
|
|
58
|
+
};
|
|
59
|
+
/** A teardown function registered via ctx.onCleanup or ctx.on. */
|
|
60
|
+
export type Cleanup = () => void;
|
|
61
|
+
/**
|
|
62
|
+
* The setup context (ctx) passed to every component's setup() callback.
|
|
63
|
+
* This is the shape declaration so factory.ts and define.ts can typecheck
|
|
64
|
+
* against it before setup-context.ts is implemented.
|
|
65
|
+
*/
|
|
66
|
+
export interface SetupContext<Props extends Record<string, PropDef> = Record<string, PropDef>, Refs extends Record<string, Element | Element[] | null> = Record<string, Element | Element[] | null>, Contexts extends Record<string, unknown> = Record<string, unknown>> {
|
|
67
|
+
/** The host custom element. */
|
|
68
|
+
host: HTMLElement;
|
|
69
|
+
/** Callable signals for each declared prop. */
|
|
70
|
+
props: PropsSignals<Props>;
|
|
71
|
+
/** Resolved DOM refs keyed by name. */
|
|
72
|
+
refs: Refs;
|
|
73
|
+
/** Resolved context values keyed by name. */
|
|
74
|
+
contexts: Contexts;
|
|
75
|
+
/**
|
|
76
|
+
* Read a signal's current value without creating a subscription,
|
|
77
|
+
* even when called inside a ctx.effect.
|
|
78
|
+
*/
|
|
79
|
+
peek<T>(sig: Signal<T>): T;
|
|
80
|
+
/** Add a DOM event listener that is auto-removed on disconnect. */
|
|
81
|
+
on<K extends keyof HTMLElementEventMap>(target: EventTarget, type: K, handler: (event: HTMLElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
82
|
+
on(target: EventTarget, type: string, handler: EventListener, options?: boolean | AddEventListenerOptions): void;
|
|
83
|
+
/**
|
|
84
|
+
* Run an alien-signals effect that auto-tracks the signals it reads.
|
|
85
|
+
* The effect is auto-disposed on disconnect.
|
|
86
|
+
*/
|
|
87
|
+
effect(fn: () => void | Cleanup): void;
|
|
88
|
+
/**
|
|
89
|
+
* Two-way bind a DOM property to a signal.
|
|
90
|
+
* The binding is auto-cleaned on disconnect.
|
|
91
|
+
*/
|
|
92
|
+
bind<T>(target: Record<string, unknown>, property: string, sig: Signal<T>): void;
|
|
93
|
+
/** Register custom teardown to run on disconnect. */
|
|
94
|
+
onCleanup(fn: Cleanup): void;
|
|
95
|
+
/** Read an optional context value. */
|
|
96
|
+
consume<T>(token: ContextToken<T>): T | undefined;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Cleanup } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Coerce a raw attribute string to a number.
|
|
4
|
+
* Returns NaN if the value cannot be parsed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function coerceNumber(raw: string | null): number;
|
|
7
|
+
/**
|
|
8
|
+
* Coerce a raw attribute string to a string.
|
|
9
|
+
* Converts null to empty string.
|
|
10
|
+
*/
|
|
11
|
+
export declare function coerceString(raw: string | null): string;
|
|
12
|
+
/**
|
|
13
|
+
* Coerce a raw attribute string to a boolean.
|
|
14
|
+
* Absence (null) is false; presence of any value (including '') is true.
|
|
15
|
+
*/
|
|
16
|
+
export declare function coerceBoolean(raw: string | null): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Coerce a raw attribute string to a parsed JSON value.
|
|
19
|
+
* Returns undefined if the value is null or cannot be parsed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function coerceJson<T = unknown>(raw: string | null): T | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Run every cleanup in the list, ensuring all run even if some throw.
|
|
24
|
+
* After all have run, re-throws the first error encountered.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runCleanups(fns: Cleanup[]): void;
|
|
27
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC;;;GAGG;AACH,wBAAgB,YAAY,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAG,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,SAAS,CAO1E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAcjD"}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "microtags",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"./dist/*"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"lint": "eslint \"./**/*.{ts,js}\"",
|
|
12
|
+
"test": "esbuild --bundle ./test/index.ts | tapout",
|
|
13
|
+
"build-cjs": "esbuild src/index.ts src/render.ts src/context.ts --format=cjs --keep-names --tsconfig=tsconfig.build.json --outdir=./dist --out-extension:.js=.cjs --sourcemap",
|
|
14
|
+
"build-esm": "esbuild src/index.ts src/render.ts src/context.ts --format=esm --metafile=dist/meta.json --keep-names --tsconfig=tsconfig.build.json --outdir=./dist --sourcemap && tsc --emitDeclarationOnly --project tsconfig.build.json --outDir dist",
|
|
15
|
+
"build-esm:min": "esbuild src/index.ts src/render.ts src/context.ts --format=esm --keep-names --bundle --tsconfig=tsconfig.build.json --minify --out-extension:.js=.min.js --outdir=./dist --sourcemap",
|
|
16
|
+
"build-example": "mkdir -p ./public && rm -rf ./public/* && NODE_ENV=development vite --mode staging --base=\"/microtags\" build",
|
|
17
|
+
"build-docs": "typedoc --tsconfig tsconfig.build.json ./src/index.ts",
|
|
18
|
+
"build": "mkdir -p ./dist && rm -rf ./dist/* && npm run build-cjs && npm run build-esm && npm run build-esm:min",
|
|
19
|
+
"start": "vite",
|
|
20
|
+
"toc": "markdown-toc --maxdepth 3 -i README.md",
|
|
21
|
+
"preversion": "npm run lint",
|
|
22
|
+
"version": "npm run toc && auto-changelog -p --template keepachangelog --breaking-pattern 'BREAKING CHANGE:' && git add CHANGELOG.md README.md",
|
|
23
|
+
"postversion": "git push --follow-tags && npm publish",
|
|
24
|
+
"prepublishOnly": "npm run build"
|
|
25
|
+
},
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js",
|
|
30
|
+
"require": "./dist/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"./render": {
|
|
33
|
+
"types": "./dist/render.d.ts",
|
|
34
|
+
"import": "./dist/render.js",
|
|
35
|
+
"require": "./dist/render.cjs"
|
|
36
|
+
},
|
|
37
|
+
"./context": {
|
|
38
|
+
"types": "./dist/context.d.ts",
|
|
39
|
+
"import": "./dist/context.js",
|
|
40
|
+
"require": "./dist/context.cjs"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@substrate-system/debug": "^0.9.64",
|
|
45
|
+
"@substrate-system/dom": "^0.1.13",
|
|
46
|
+
"@substrate-system/tapout": "^0.0.38",
|
|
47
|
+
"@substrate-system/tapzero": "^0.10.16",
|
|
48
|
+
"@typescript-eslint/eslint-plugin": "^8.7.0",
|
|
49
|
+
"@typescript-eslint/parser": "^8.7.0",
|
|
50
|
+
"auto-changelog": "^2.4.0",
|
|
51
|
+
"browserslist": "^4.28.4",
|
|
52
|
+
"esbuild": "^0.28.0",
|
|
53
|
+
"eslint": "^8.57.0",
|
|
54
|
+
"eslint-config-standard": "^17.1.0",
|
|
55
|
+
"lightningcss": "^1.32.0",
|
|
56
|
+
"markdown-toc": "^1.2.0",
|
|
57
|
+
"nanotags": "^0.15.2",
|
|
58
|
+
"tap-spec": "^5.0.0",
|
|
59
|
+
"typedoc": "^0.28.1",
|
|
60
|
+
"typescript": "^6.0.3",
|
|
61
|
+
"vite": "^8.0.5"
|
|
62
|
+
},
|
|
63
|
+
"author": "nichoth <nichoth@nichoth.com> (https://nichoth.com)",
|
|
64
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@standard-schema/spec": "^1.1.0",
|
|
67
|
+
"alien-signals": "^3.2.1"
|
|
68
|
+
}
|
|
69
|
+
}
|