adnbn 0.12.0 → 0.13.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/dist/cli/bundler/layers.d.ts +3 -3
- package/dist/cli/bundler/layers.js +6 -7
- package/dist/cli/bundler/layers.js.map +1 -1
- package/dist/cli/bundler/plugins/build-assets-map/BuildAssetsMapPlugin.js +42 -14
- package/dist/cli/bundler/plugins/build-assets-map/BuildAssetsMapPlugin.js.map +1 -1
- package/dist/cli/bundler/plugins/build-assets-map/normalize.d.ts +3 -0
- package/dist/cli/bundler/plugins/build-assets-map/normalize.js +24 -0
- package/dist/cli/bundler/plugins/build-assets-map/normalize.js.map +1 -0
- package/dist/cli/bundler/plugins/build-assets-map/templates/runtime.template.d.ts +2 -0
- package/dist/cli/bundler/plugins/build-assets-map/templates.d.ts +9 -0
- package/dist/cli/bundler/plugins/build-assets-map/templates.js +32 -0
- package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js +11 -0
- package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js.map +1 -1
- package/dist/cli/bundler/plugins/isolated-styles/IsolatedStylesPlugin.d.ts +1 -1
- package/dist/cli/bundler/plugins/isolated-styles/IsolatedStylesPlugin.js +38 -13
- package/dist/cli/bundler/plugins/isolated-styles/IsolatedStylesPlugin.js.map +1 -1
- package/dist/cli/bundler/plugins/isolated-styles/chunks.d.ts +5 -1
- package/dist/cli/bundler/plugins/isolated-styles/chunks.js +17 -16
- package/dist/cli/bundler/plugins/isolated-styles/chunks.js.map +1 -1
- package/dist/cli/bundler/plugins/isolated-styles/split-chunks.d.ts +4 -0
- package/dist/cli/bundler/plugins/isolated-styles/split-chunks.js +51 -0
- package/dist/cli/bundler/plugins/isolated-styles/split-chunks.js.map +1 -0
- package/dist/cli/bundler/plugins/isolated-styles/templates.js +36 -6
- package/dist/cli/plugins/content/bundler.d.ts +0 -3
- package/dist/cli/plugins/content/bundler.js +4 -20
- package/dist/cli/plugins/content/bundler.js.map +1 -1
- package/dist/cli/plugins/content/index.js +2 -3
- package/dist/cli/plugins/content/index.js.map +1 -1
- package/dist/cli/plugins/locale/Locale.js +5 -2
- package/dist/cli/plugins/locale/Locale.js.map +1 -1
- package/dist/cli/plugins/style/index.d.ts +1 -2
- package/dist/cli/plugins/style/index.js +19 -30
- package/dist/cli/plugins/style/index.js.map +1 -1
- package/dist/cli/resolvers/config.js +1 -2
- package/dist/cli/resolvers/config.js.map +1 -1
- package/dist/entry/content/adapters/react/Builder.d.ts +4 -2
- package/dist/entry/content/adapters/react/Builder.js +11 -5
- package/dist/entry/content/adapters/react/Builder.js.map +1 -1
- package/dist/entry/content/adapters/react/Node.js +2 -2
- package/dist/entry/content/adapters/react/Node.js.map +1 -1
- package/dist/entry/content/adapters/react/definition.d.ts +2 -0
- package/dist/entry/content/adapters/react/{resolvers/definition.js → definition.js} +1 -1
- package/dist/entry/content/adapters/react/definition.js.map +1 -0
- package/dist/entry/content/adapters/react/index.d.ts +1 -1
- package/dist/entry/content/adapters/react/index.js +1 -1
- package/dist/entry/content/adapters/react/index.js.map +1 -1
- package/dist/entry/content/adapters/vanilla/Builder.d.ts +4 -2
- package/dist/entry/content/adapters/vanilla/Builder.js +14 -5
- package/dist/entry/content/adapters/vanilla/Builder.js.map +1 -1
- package/dist/entry/content/adapters/vanilla/definition.d.ts +2 -0
- package/dist/entry/content/adapters/vanilla/{resolvers/definition.js → definition.js} +2 -2
- package/dist/entry/content/adapters/vanilla/definition.js.map +1 -0
- package/dist/entry/content/adapters/vanilla/index.d.ts +1 -1
- package/dist/entry/content/adapters/vanilla/index.js +1 -1
- package/dist/entry/content/adapters/vanilla/index.js.map +1 -1
- package/dist/entry/content/adapters/vanilla/utils.d.ts +1 -0
- package/dist/entry/content/adapters/vanilla/utils.js +7 -0
- package/dist/entry/content/adapters/vanilla/utils.js.map +1 -0
- package/dist/entry/content/lifecycle/Builder.d.ts +10 -4
- package/dist/entry/content/lifecycle/Builder.js +102 -60
- package/dist/entry/content/lifecycle/Builder.js.map +1 -1
- package/dist/entry/content/lifecycle/MountBuilder.d.ts +6 -3
- package/dist/entry/content/lifecycle/MountBuilder.js +32 -16
- package/dist/entry/content/lifecycle/MountBuilder.js.map +1 -1
- package/dist/entry/content/lifecycle/context/ContainerRegistry.d.ts +7 -0
- package/dist/entry/content/lifecycle/context/ContainerRegistry.js +45 -0
- package/dist/entry/content/lifecycle/context/ContainerRegistry.js.map +1 -0
- package/dist/entry/content/lifecycle/context/Context.d.ts +6 -3
- package/dist/entry/content/lifecycle/context/Context.js +21 -6
- package/dist/entry/content/lifecycle/context/Context.js.map +1 -1
- package/dist/entry/content/lifecycle/context/ManagedContext.d.ts +4 -1
- package/dist/entry/content/lifecycle/context/ManagedContext.js +7 -0
- package/dist/entry/content/lifecycle/context/ManagedContext.js.map +1 -1
- package/dist/entry/content/lifecycle/context/index.d.ts +1 -0
- package/dist/entry/content/lifecycle/context/index.js +6 -4
- package/dist/entry/content/lifecycle/context/index.js.map +1 -1
- package/dist/entry/content/lifecycle/markers/AttributeMarker.js +3 -1
- package/dist/entry/content/lifecycle/markers/AttributeMarker.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/EventNode.d.ts +4 -2
- package/dist/entry/content/lifecycle/nodes/EventNode.js +7 -2
- package/dist/entry/content/lifecycle/nodes/EventNode.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/FrameNode.d.ts +2 -1
- package/dist/entry/content/lifecycle/nodes/FrameNode.js +3 -0
- package/dist/entry/content/lifecycle/nodes/FrameNode.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/MarkerNode.d.ts +1 -1
- package/dist/entry/content/lifecycle/nodes/MarkerNode.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/MountNode.d.ts +7 -3
- package/dist/entry/content/lifecycle/nodes/MountNode.js +47 -12
- package/dist/entry/content/lifecycle/nodes/MountNode.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/Node.d.ts +1 -1
- package/dist/entry/content/lifecycle/nodes/Node.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/RenderNode.d.ts +13 -4
- package/dist/entry/content/lifecycle/nodes/RenderNode.js +71 -6
- package/dist/entry/content/lifecycle/nodes/RenderNode.js.map +1 -1
- package/dist/entry/content/lifecycle/nodes/ShadowNode.d.ts +2 -1
- package/dist/entry/content/lifecycle/nodes/ShadowNode.js +3 -0
- package/dist/entry/content/lifecycle/nodes/ShadowNode.js.map +1 -1
- package/dist/entry/content/lifecycle/types.d.ts +28 -0
- package/dist/entry/content/resolvers/watch.d.ts +1 -1
- package/dist/entry/content/resolvers/watch.js +29 -14
- package/dist/entry/content/resolvers/watch.js.map +1 -1
- package/dist/entry/relay/index.js.map +1 -1
- package/dist/shared/locale/index.d.ts +1 -1
- package/dist/shared/locale/index.js +3 -1
- package/dist/shared/locale/index.js.map +1 -1
- package/dist/shared/locale/messages.d.ts +4 -0
- package/dist/shared/locale/messages.js +12 -0
- package/dist/shared/locale/messages.js.map +1 -1
- package/dist/types/content/common.d.ts +8 -0
- package/dist/types/content/common.js.map +1 -1
- package/dist/types/content/definition.d.ts +5 -0
- package/dist/types/locale.d.ts +3 -0
- package/dist/types/locale.js.map +1 -1
- package/package.json +1 -3
- package/types/client.d.ts +3 -3
- package/dist/cli/plugins/style/types.d.ts +0 -5
- package/dist/entry/content/adapters/react/resolvers/definition.d.ts +0 -2
- package/dist/entry/content/adapters/react/resolvers/definition.js.map +0 -1
- package/dist/entry/content/adapters/react/resolvers/render.d.ts +0 -2
- package/dist/entry/content/adapters/react/resolvers/render.js +0 -9
- package/dist/entry/content/adapters/react/resolvers/render.js.map +0 -1
- package/dist/entry/content/adapters/vanilla/resolvers/definition.d.ts +0 -2
- package/dist/entry/content/adapters/vanilla/resolvers/definition.js.map +0 -1
- package/dist/entry/content/adapters/vanilla/resolvers/render.d.ts +0 -3
- package/dist/entry/content/adapters/vanilla/resolvers/render.js +0 -15
- package/dist/entry/content/adapters/vanilla/resolvers/render.js.map +0 -1
- /package/dist/{cli/plugins/style → entry/content/lifecycle}/types.js +0 -0
- /package/dist/{cli/plugins/style → entry/content/lifecycle}/types.js.map +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ContentScriptNode } from "../../../types/content/index.js";
|
|
2
|
+
/** One owner drains discovery requests for a single builder generation. */
|
|
3
|
+
export interface ContentScriptCycle {
|
|
4
|
+
generation: number;
|
|
5
|
+
pending: boolean;
|
|
6
|
+
promise: Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/** One completion callback for the event decorator paired with this renderer. */
|
|
9
|
+
export interface ContentScriptMountNotifier {
|
|
10
|
+
setMountHandler(handler: () => void): void;
|
|
11
|
+
}
|
|
12
|
+
export interface ContentScriptRenderLifecycle extends ContentScriptMountNotifier {
|
|
13
|
+
/** The owning lifecycle handles deferred renderer failures without throwing. */
|
|
14
|
+
setErrorHandler(handler: (error: unknown) => void): void;
|
|
15
|
+
}
|
|
16
|
+
/** Internal composition result; only renderers supply their own completion signal. */
|
|
17
|
+
export interface ContentScriptNodeAssembly {
|
|
18
|
+
node: ContentScriptNode;
|
|
19
|
+
renderer?: ContentScriptRenderLifecycle;
|
|
20
|
+
}
|
|
21
|
+
export interface ContentScriptRenderOptions {
|
|
22
|
+
ready?: () => Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/** The isolation stage supplies a node and optional readiness for its render target. */
|
|
25
|
+
export interface ContentScriptIsolationAssembly {
|
|
26
|
+
node: ContentScriptNode;
|
|
27
|
+
ready?: () => Promise<void>;
|
|
28
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ContentScriptWatchStrategy } from "../../../types/content/index.js";
|
|
2
|
-
/**
|
|
2
|
+
/** Batch DOM mutations in a fixed window. Calling the returned strategy starts observing. */
|
|
3
3
|
export declare const createMutationObserverStrategy: (options?: MutationObserverInit) => ContentScriptWatchStrategy;
|
|
4
4
|
/** Observe DOM mutations while waiting for the first content nodes. */
|
|
5
5
|
export declare const createAwaitFirstStrategy: (options?: MutationObserverInit) => ContentScriptWatchStrategy;
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
const createMutationObserverStrategy = (options) => (update, context) => {
|
|
2
|
+
let timer;
|
|
3
|
+
const observer = new MutationObserver((records) => {
|
|
4
|
+
if (timer !== void 0 || !records.some((record) => !context.owns(record.target))) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
timer = setTimeout(() => {
|
|
8
|
+
timer = void 0;
|
|
9
|
+
void update();
|
|
10
|
+
}, 200);
|
|
11
|
+
});
|
|
8
12
|
observer.observe(document.body ?? document.documentElement ?? document, {
|
|
9
13
|
childList: true,
|
|
10
14
|
subtree: true,
|
|
11
|
-
attributes: true,
|
|
12
|
-
characterData: true,
|
|
13
15
|
...options
|
|
14
16
|
});
|
|
15
17
|
return () => {
|
|
16
|
-
|
|
18
|
+
clearTimeout(timer);
|
|
19
|
+
timer = void 0;
|
|
17
20
|
observer.disconnect();
|
|
18
21
|
};
|
|
19
22
|
};
|
|
@@ -24,16 +27,28 @@ const createAwaitFirstStrategy = (options) => (update, context) => {
|
|
|
24
27
|
...options
|
|
25
28
|
});
|
|
26
29
|
let unwatch;
|
|
30
|
+
let pending;
|
|
27
31
|
const clear = () => {
|
|
28
32
|
unwatch && unwatch();
|
|
29
33
|
unwatch = void 0;
|
|
34
|
+
pending = void 0;
|
|
30
35
|
};
|
|
31
36
|
if (context.nodes.size === 0) {
|
|
32
|
-
unwatch = resolver(
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
37
|
+
unwatch = resolver(() => {
|
|
38
|
+
const completion = Promise.resolve(update());
|
|
39
|
+
if (completion === pending) {
|
|
40
|
+
return completion;
|
|
36
41
|
}
|
|
42
|
+
pending = completion;
|
|
43
|
+
return completion.then(() => {
|
|
44
|
+
if (context.nodes.size > 0) {
|
|
45
|
+
clear();
|
|
46
|
+
}
|
|
47
|
+
}).finally(() => {
|
|
48
|
+
if (pending === completion) {
|
|
49
|
+
pending = void 0;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
37
52
|
}, context);
|
|
38
53
|
}
|
|
39
54
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/entry/content/resolvers/watch.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../src/entry/content/resolvers/watch.ts"],"sourcesContent":["import type {ContentScriptWatchStrategy} from \"@typing/content\";\n\n/** Batch DOM mutations in a fixed window. Calling the returned strategy starts observing. */\n// prettier-ignore\nexport const createMutationObserverStrategy =\n (options?: MutationObserverInit): ContentScriptWatchStrategy =>\n (update, context) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const observer = new MutationObserver(records => {\n if (timer !== undefined || !records.some(record => !context.owns(record.target))) {\n return;\n }\n\n timer = setTimeout(() => {\n timer = undefined;\n void update();\n }, 200);\n });\n\n observer.observe(document.body ?? document.documentElement ?? document, {\n childList: true,\n subtree: true,\n ...options,\n });\n\n return () => {\n clearTimeout(timer);\n timer = undefined;\n observer.disconnect();\n };\n };\n\n/** Observe DOM mutations while waiting for the first content nodes. */\n// prettier-ignore\nexport const createAwaitFirstStrategy =\n (options?: MutationObserverInit): ContentScriptWatchStrategy =>\n (update, context) => {\n const resolver = createMutationObserverStrategy({\n attributes: false,\n characterData: false,\n ...options,\n });\n\n let unwatch: { (): void } | undefined;\n let pending: Promise<void> | undefined;\n\n const clear = () => {\n unwatch && unwatch();\n unwatch = undefined;\n pending = undefined;\n };\n\n if (context.nodes.size === 0) {\n unwatch = resolver(() => {\n const completion = Promise.resolve(update());\n\n if (completion === pending) {\n return completion;\n }\n\n pending = completion;\n\n return completion.then(() => {\n if (context.nodes.size > 0) {\n clear();\n }\n }).finally(() => {\n if (pending === completion) {\n pending = undefined;\n }\n });\n }, context);\n }\n\n return () => {\n clear();\n };\n };\n\n// prettier-ignore\nexport const withLocationTracking =\n (strategy: ContentScriptWatchStrategy): ContentScriptWatchStrategy =>\n (update, context) => {\n let currentUrl = location.href;\n\n const interval = setInterval(() => {\n if (currentUrl !== location.href) {\n currentUrl = location.href;\n\n try {\n context.mount();\n } catch (error) {\n console.error(\"Content script mount on location change failed\", error);\n }\n }\n }, 300);\n\n const unwatch = strategy(update, context);\n\n return () => {\n clearInterval(interval);\n unwatch();\n };\n };\n"],"mappings":"AAIO,MAAM,iCACT,CAAC,YACG,CAAC,QAAQ,YAAY;AACjB,MAAI;AAEJ,QAAM,WAAW,IAAI,iBAAiB,aAAW;AAC7C,QAAI,UAAU,UAAa,CAAC,QAAQ,KAAK,YAAU,CAAC,QAAQ,KAAK,OAAO,MAAM,CAAC,GAAG;AAC9E;AAAA,IACJ;AAEA,YAAQ,WAAW,MAAM;AACrB,cAAQ;AACR,WAAK,OAAO;AAAA,IAChB,GAAG,GAAG;AAAA,EACV,CAAC;AAED,WAAS,QAAQ,SAAS,QAAQ,SAAS,mBAAmB,UAAU;AAAA,IACpE,WAAW;AAAA,IACX,SAAS;AAAA,IACT,GAAG;AAAA,EACP,CAAC;AAED,SAAO,MAAM;AACT,iBAAa,KAAK;AAClB,YAAQ;AACR,aAAS,WAAW;AAAA,EACxB;AACJ;AAID,MAAM,2BACT,CAAC,YACG,CAAC,QAAQ,YAAY;AACjB,QAAM,WAAW,+BAA+B;AAAA,IAC5C,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,GAAG;AAAA,EACP,CAAC;AAED,MAAI;AACJ,MAAI;AAEJ,QAAM,QAAQ,MAAM;AAChB,eAAW,QAAQ;AACnB,cAAU;AACV,cAAU;AAAA,EACd;AAEA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC1B,cAAU,SAAS,MAAM;AACrB,YAAM,aAAa,QAAQ,QAAQ,OAAO,CAAC;AAE3C,UAAI,eAAe,SAAS;AACxB,eAAO;AAAA,MACX;AAEA,gBAAU;AAEV,aAAO,WAAW,KAAK,MAAM;AACzB,YAAI,QAAQ,MAAM,OAAO,GAAG;AACxB,gBAAM;AAAA,QACV;AAAA,MACJ,CAAC,EAAE,QAAQ,MAAM;AACb,YAAI,YAAY,YAAY;AACxB,oBAAU;AAAA,QACd;AAAA,MACJ,CAAC;AAAA,IACL,GAAG,OAAO;AAAA,EACd;AAEA,SAAO,MAAM;AACT,UAAM;AAAA,EACV;AACJ;AAGD,MAAM,uBACT,CAAC,aACG,CAAC,QAAQ,YAAY;AACjB,MAAI,aAAa,SAAS;AAE1B,QAAM,WAAW,YAAY,MAAM;AAC/B,QAAI,eAAe,SAAS,MAAM;AAC9B,mBAAa,SAAS;AAEtB,UAAI;AACA,gBAAQ,MAAM;AAAA,MAClB,SAAS,OAAO;AACZ,gBAAQ,MAAM,kDAAkD,KAAK;AAAA,MACzE;AAAA,IACJ;AAAA,EACJ,GAAG,GAAG;AAEN,QAAM,UAAU,SAAS,QAAQ,OAAO;AAExC,SAAO,MAAM;AACT,kBAAc,QAAQ;AACtB,YAAQ;AAAA,EACZ;AACJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/entry/relay/index.ts"],"sourcesContent":["import Builder from \"./Builder\";\n\nimport type {RelayUnresolvedDefinition} from \"@typing/relay\";\nimport type {TransportType} from \"@typing/transport\";\nimport type {ContentScriptIsolation} from \"@typing/content\";\n\nexport {Builder};\nexport {resolveDefinition} from \"./resolvers/definition\";\nexport type {RelayUnresolvedDefinition} from \"@typing/relay\";\n\nexport default function relay<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n>(\n definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ConstructorParameters<typeof Builder<T, Data, NoInfer<Isolation>>>[1]\n): void {\n new Builder(definition, contentBuilder).build().catch(error => {\n console.error(\"Failed to build relay: \", error);\n });\n}\n"],"mappings":"AAAA,OAAO,aAAa;AAOpB,SAAQ,yBAAwB;
|
|
1
|
+
{"version":3,"sources":["../../../src/entry/relay/index.ts"],"sourcesContent":["import Builder from \"./Builder\";\n\nimport type {RelayUnresolvedDefinition} from \"@typing/relay\";\nimport type {TransportType} from \"@typing/transport\";\nimport type {ContentScriptIsolation} from \"@typing/content\";\n\nexport {Builder};\nexport {resolveDefinition} from \"./resolvers/definition\";\n\nexport type {RelayUnresolvedDefinition} from \"@typing/relay\";\n\nexport default function relay<\n T extends TransportType,\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n>(\n definition: RelayUnresolvedDefinition<T, Data, Isolation>,\n contentBuilder: ConstructorParameters<typeof Builder<T, Data, NoInfer<Isolation>>>[1]\n): void {\n new Builder(definition, contentBuilder).build().catch(error => {\n console.error(\"Failed to build relay: \", error);\n });\n}\n"],"mappings":"AAAA,OAAO,aAAa;AAOpB,SAAQ,yBAAwB;AAIjB,SAAR,MAKH,YACA,gBACI;AACJ,MAAI,QAAQ,YAAY,cAAc,EAAE,MAAM,EAAE,MAAM,WAAS;AAC3D,YAAQ,MAAM,2BAA2B,KAAK;AAAA,EAClD,CAAC;AACL;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { convertLocaleKey, convertLocaleMessageKey, extractLocaleKey, isLocaleKey, modifyLocaleMessageKey } from "./keys.js";
|
|
2
2
|
export { getLocaleDir, isLocaleRtl, resolveLanguage } from "./language.js";
|
|
3
|
-
export { flattenLocaleMessages, getLocaleFilename } from "./messages.js";
|
|
3
|
+
export { escapeLocaleMessage, escapeLocaleMessages, flattenLocaleMessages, getLocaleFilename } from "./messages.js";
|
|
4
4
|
export { selectPluralForm } from "./plural.js";
|
|
5
5
|
export { applySubstitutions, parsePlaceholders } from "./substitutions.js";
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { convertLocaleKey, convertLocaleMessageKey, extractLocaleKey, isLocaleKey, modifyLocaleMessageKey } from "./keys.js";
|
|
2
2
|
import { getLocaleDir, isLocaleRtl, resolveLanguage } from "./language.js";
|
|
3
|
-
import { flattenLocaleMessages, getLocaleFilename } from "./messages.js";
|
|
3
|
+
import { escapeLocaleMessage, escapeLocaleMessages, flattenLocaleMessages, getLocaleFilename } from "./messages.js";
|
|
4
4
|
import { selectPluralForm } from "./plural.js";
|
|
5
5
|
import { applySubstitutions, parsePlaceholders } from "./substitutions.js";
|
|
6
6
|
export {
|
|
7
7
|
applySubstitutions,
|
|
8
8
|
convertLocaleKey,
|
|
9
9
|
convertLocaleMessageKey,
|
|
10
|
+
escapeLocaleMessage,
|
|
11
|
+
escapeLocaleMessages,
|
|
10
12
|
extractLocaleKey,
|
|
11
13
|
flattenLocaleMessages,
|
|
12
14
|
getLocaleDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/shared/locale/index.ts"],"sourcesContent":["export {convertLocaleKey, convertLocaleMessageKey, extractLocaleKey, isLocaleKey, modifyLocaleMessageKey} from \"./keys\";\nexport {getLocaleDir, isLocaleRtl, resolveLanguage} from \"./language\";\nexport {flattenLocaleMessages, getLocaleFilename} from \"./messages\";\nexport {selectPluralForm} from \"./plural\";\nexport {applySubstitutions, parsePlaceholders} from \"./substitutions\";\n"],"mappings":"AAAA,SAAQ,kBAAkB,yBAAyB,kBAAkB,aAAa,8BAA6B;AAC/G,SAAQ,cAAc,aAAa,uBAAsB;AACzD,SAAQ,uBAAuB,yBAAwB;
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/locale/index.ts"],"sourcesContent":["export {convertLocaleKey, convertLocaleMessageKey, extractLocaleKey, isLocaleKey, modifyLocaleMessageKey} from \"./keys\";\nexport {getLocaleDir, isLocaleRtl, resolveLanguage} from \"./language\";\nexport {escapeLocaleMessage, escapeLocaleMessages, flattenLocaleMessages, getLocaleFilename} from \"./messages\";\nexport {selectPluralForm} from \"./plural\";\nexport {applySubstitutions, parsePlaceholders} from \"./substitutions\";\n"],"mappings":"AAAA,SAAQ,kBAAkB,yBAAyB,kBAAkB,aAAa,8BAA6B;AAC/G,SAAQ,cAAc,aAAa,uBAAsB;AACzD,SAAQ,qBAAqB,sBAAsB,uBAAuB,yBAAwB;AAClG,SAAQ,wBAAuB;AAC/B,SAAQ,oBAAoB,yBAAwB;","names":[]}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { Language, LocaleMessages } from "../../types/locale.js";
|
|
2
|
+
/** Native i18n consumes the first dollar in each escaped run; the catalogue keeps the original text. */
|
|
3
|
+
export declare const escapeLocaleMessage: (message: string) => string;
|
|
4
|
+
/** Protects literal $NAME$ text from the earlier named-placeholder pass as well. */
|
|
5
|
+
export declare const escapeLocaleMessages: (messages: LocaleMessages) => LocaleMessages;
|
|
2
6
|
export declare const getLocaleFilename: (lang: Language) => string;
|
|
3
7
|
export declare const flattenLocaleMessages: (messages: LocaleMessages) => Record<string, string>;
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
+
const escapeLocaleMessage = (message) => message.replace(/\$+/g, (dollars) => "$" + dollars);
|
|
2
|
+
const escapeLocaleMessages = (messages) => Object.fromEntries(
|
|
3
|
+
Object.entries(messages).map(([key, value]) => {
|
|
4
|
+
const message = escapeLocaleMessage(value.message);
|
|
5
|
+
return [
|
|
6
|
+
key,
|
|
7
|
+
/\$[a-z0-9_@]+\$/i.test(value.message) ? { ...value, message: "$text$", placeholders: { text: { content: message } } } : { ...value, message }
|
|
8
|
+
];
|
|
9
|
+
})
|
|
10
|
+
);
|
|
1
11
|
const getLocaleFilename = (lang) => {
|
|
2
12
|
return `_locales/${lang}/messages.json`;
|
|
3
13
|
};
|
|
4
14
|
const flattenLocaleMessages = (messages) => Object.fromEntries(Object.entries(messages).map(([key, value]) => [key, value.message]));
|
|
5
15
|
export {
|
|
16
|
+
escapeLocaleMessage,
|
|
17
|
+
escapeLocaleMessages,
|
|
6
18
|
flattenLocaleMessages,
|
|
7
19
|
getLocaleFilename
|
|
8
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/shared/locale/messages.ts"],"sourcesContent":["import type {Language, LocaleMessages} from \"@typing/locale\";\n\nexport const getLocaleFilename = (lang: Language): string => {\n return `_locales/${lang}/messages.json`;\n};\n\nexport const flattenLocaleMessages = (messages: LocaleMessages): Record<string, string> =>\n Object.fromEntries(Object.entries(messages).map(([key, value]) => [key, value.message]));\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/locale/messages.ts"],"sourcesContent":["import type {Language, LocaleMessages} from \"@typing/locale\";\n\n/** Native i18n consumes the first dollar in each escaped run; the catalogue keeps the original text. */\nexport const escapeLocaleMessage = (message: string): string => message.replace(/\\$+/g, dollars => \"$\" + dollars);\n\n/** Protects literal $NAME$ text from the earlier named-placeholder pass as well. */\nexport const escapeLocaleMessages = (messages: LocaleMessages): LocaleMessages =>\n Object.fromEntries(\n Object.entries(messages).map(([key, value]) => {\n const message = escapeLocaleMessage(value.message);\n\n return [\n key,\n /\\$[a-z0-9_@]+\\$/i.test(value.message)\n ? {...value, message: \"$text$\", placeholders: {text: {content: message}}}\n : {...value, message},\n ];\n })\n );\n\nexport const getLocaleFilename = (lang: Language): string => {\n return `_locales/${lang}/messages.json`;\n};\n\nexport const flattenLocaleMessages = (messages: LocaleMessages): Record<string, string> =>\n Object.fromEntries(Object.entries(messages).map(([key, value]) => [key, value.message]));\n"],"mappings":"AAGO,MAAM,sBAAsB,CAAC,YAA4B,QAAQ,QAAQ,QAAQ,aAAW,MAAM,OAAO;AAGzG,MAAM,uBAAuB,CAAC,aACjC,OAAO;AAAA,EACH,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC3C,UAAM,UAAU,oBAAoB,MAAM,OAAO;AAEjD,WAAO;AAAA,MACH;AAAA,MACA,mBAAmB,KAAK,MAAM,OAAO,IAC/B,EAAC,GAAG,OAAO,SAAS,UAAU,cAAc,EAAC,MAAM,EAAC,SAAS,QAAO,EAAC,EAAC,IACtE,EAAC,GAAG,OAAO,QAAO;AAAA,IAC5B;AAAA,EACJ,CAAC;AACL;AAEG,MAAM,oBAAoB,CAAC,SAA2B;AACzD,SAAO,YAAY,IAAI;AAC3B;AAEO,MAAM,wBAAwB,CAAC,aAClC,OAAO,YAAY,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,OAAO,CAAC,CAAC;","names":[]}
|
|
@@ -53,6 +53,8 @@ export interface ContentScriptStylesRuntime {
|
|
|
53
53
|
initialize(resolveUrl: (file: string) => string): void;
|
|
54
54
|
/** Retry restored styles once on load error; future loads keep the default failure behavior. */
|
|
55
55
|
add(root: ShadowRoot | HTMLElement, target: Element | null, retry?: boolean): void;
|
|
56
|
+
/** Waits for initial and already requested CSS for this root; retries missing failed links. */
|
|
57
|
+
ready(root: ShadowRoot | HTMLElement): Promise<void>;
|
|
56
58
|
delete(root: ShadowRoot | HTMLElement): void;
|
|
57
59
|
load(url: string): Promise<void>;
|
|
58
60
|
}
|
|
@@ -224,6 +226,12 @@ export interface ContentScriptEventEmitter {
|
|
|
224
226
|
}
|
|
225
227
|
export interface ContentScriptContext extends ContentScriptMount {
|
|
226
228
|
nodes: ReadonlySet<ContentScriptNode>;
|
|
229
|
+
/**
|
|
230
|
+
* Whether target belongs to UI mounted by this context, including ShadowRoot descendants.
|
|
231
|
+
* Already-connected site containers and containers wrapping their anchors are excluded.
|
|
232
|
+
* Membership ends at unmount. Traversal does not cross an iframe document into its host.
|
|
233
|
+
*/
|
|
234
|
+
owns(target: Node): boolean;
|
|
227
235
|
/**
|
|
228
236
|
* Registers a callback function that will be invoked when a specific content script context event occurs.
|
|
229
237
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/types/content/common.ts"],"sourcesContent":["import type {ContentScriptPrepareProps} from \"./prepare\";\nimport type {ContentScriptBoundary} from \"./boundary\";\n\nimport type {PageAlias} from \"@typing/page\";\nimport type {Optional} from \"utility-types\";\n\nimport type {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport type {Awaiter, PickNonFunctionProperties} from \"@typing/helpers\";\n\nexport const ContentScriptMatches = [\"http://*/*\", \"https://*/*\"];\n\n/** Shared property used by the bundler plugin and the content script's style runtime getter. */\nexport const ContentScriptStylesRuntimeProperty = \"__adnbnIsolatedStyles\";\n\nexport enum ContentScriptWorld {\n Isolated = \"ISOLATED\",\n Main = \"MAIN\",\n}\n\nexport enum ContentScriptDeclarative {\n Required = \"required\",\n Optional = \"optional\",\n}\n\nexport enum ContentScriptIsolation {\n None = \"none\",\n Shadow = \"shadow\",\n Iframe = \"iframe\",\n}\n\nexport enum ContentScriptShadowMode {\n Open = \"open\",\n Closed = \"closed\",\n}\n\n// Append\nexport enum ContentScriptAppend {\n Last = \"last\",\n First = \"first\",\n Replace = \"replace\",\n Before = \"before\",\n After = \"after\",\n}\n\n// Marker\nexport enum ContentScriptMarker {\n /** In-memory marking (no DOM mutations). */\n Weak = \"weak\",\n /** DOM attribute-based marking. */\n Attribute = \"attribute\",\n}\n\nexport enum ContentScriptMarkerValue {\n Mounted = \"1\",\n Unmounted = \"0\",\n}\n\n// Event\nexport enum ContentScriptEvent {\n Mount = \"mount\",\n Unmount = \"unmount\",\n Add = \"add\",\n Remove = \"remove\",\n}\n\ntype RunAt = chrome.extensionTypes.RunAt;\n\nexport interface ContentScriptStylesRuntime {\n /** Resolves initial stylesheet URLs once, before the first root is registered. */\n initialize(resolveUrl: (file: string) => string): void;\n /** Retry restored styles once on load error; future loads keep the default failure behavior. */\n add(root: ShadowRoot | HTMLElement, target: Element | null, retry?: boolean): void;\n delete(root: ShadowRoot | HTMLElement): void;\n load(url: string): Promise<void>;\n}\n\nexport type ContentScriptWorldValue = ContentScriptWorld | `${chrome.scripting.ExecutionWorld}`;\n\nexport interface ContentScriptConfig {\n matches?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default []\n */\n excludeMatches?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default []\n */\n includeGlobs?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default []\n */\n excludeGlobs?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default false\n */\n allFrames?: boolean;\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default \"documentIdle\"\n */\n runAt?: RunAt;\n /**\n * See https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#isolated_world\n *\n * Dynamic imports keep physical async chunks in ISOLATED. MAIN keeps the same Promise-based\n * execution semantics but includes dynamic dependencies in the initial entrypoint graph.\n * Manifest V2 builds always use ISOLATED. Requesting MAIN emits a build warning and applies\n * ISOLATED grouping and chunk loading rules before generating the manifest.\n */\n world?: ContentScriptWorldValue;\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default false\n */\n matchAboutBlank?: boolean;\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default false\n */\n matchOriginAsFallback?: boolean;\n /**\n * Whether this content script requires explicit host permission declaration in the extension manifest.\n *\n * Accepted values:\n * - ContentScriptDeclarative.Required — adds the corresponding host patterns to manifest.host_permissions.\n * - ContentScriptDeclarative.Optional — adds the corresponding host patterns to manifest.optional_host_permissions.\n *\n * Backward compatibility:\n * - true ≡ ContentScriptDeclarative.Required\n * - false ≡ undefined (as if the value is not set)\n *\n * @see https://developer.chrome.com/docs/extensions/mv3/declare_permissions/\n *\n * @default undefined\n */\n declarative?: boolean | `${ContentScriptDeclarative}` | ContentScriptDeclarative;\n}\n\nexport type ContentScriptOptions = ContentScriptConfig & EntrypointOptions;\n\nexport interface ContentScriptShadowOptions {\n /**\n * Controls access through the host's shadowRoot property, not CSS isolation or UI visibility.\n * @default ContentScriptShadowMode.Open\n */\n mode?: ContentScriptShadowMode | `${ContentScriptShadowMode}`;\n}\n\nexport interface ContentScriptFrameRenderOptions {\n page?: never;\n src?: never;\n}\n\nexport interface ContentScriptFramePageOptions {\n page: PageAlias;\n src?: never;\n}\n\nexport interface ContentScriptFrameSourceOptions {\n src: string;\n page?: never;\n}\n\nexport type ContentScriptFrame =\n | ContentScriptFrameRenderOptions\n | ContentScriptFramePageOptions\n | ContentScriptFrameSourceOptions;\n\nexport interface ContentScriptIsolationNoneOptions {\n type: ContentScriptIsolation.None | \"none\";\n mode?: never;\n page?: never;\n src?: never;\n}\n\nexport interface ContentScriptIsolationShadowOptions extends ContentScriptShadowOptions {\n type: ContentScriptIsolation.Shadow | \"shadow\";\n page?: never;\n src?: never;\n}\n\nexport type ContentScriptIsolationFrameOptions = ContentScriptFrame & {\n type: ContentScriptIsolation.Iframe | \"iframe\";\n mode?: never;\n};\n\n/** Object form of isolation, also used after resolving shorthand values. */\nexport type ContentScriptIsolationOptions =\n | ContentScriptIsolationNoneOptions\n | ContentScriptIsolationShadowOptions\n | ContentScriptIsolationFrameOptions;\n\nexport type ContentScriptIsolationValue =\n | ContentScriptIsolation\n | `${ContentScriptIsolation}`\n | ContentScriptIsolationOptions;\n\n/** Statically resolved configuration; runtime render values are never retained here. */\nexport type ContentScriptEntrypointOptions = Partial<ContentScriptOptions> & {\n isolation?: ContentScriptIsolationOptions;\n};\n\n// Mount\nexport type ContentScriptMountFunction = (anchor: Element, container: Element) => void | (() => void);\n\nexport interface ContentScriptMount {\n mount(): boolean | undefined | void;\n\n unmount(): boolean | undefined | void;\n}\n\n// Props\nexport interface ContentScriptContainerProps<Data = unknown> extends ContentScriptPrepareProps {\n data: Data;\n}\n\nexport interface ContentScriptProps<\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n> extends ContentScriptContainerProps<Data> {\n /** Outer mounted element; the Shadow host or iframe wrapper when isolated. */\n container: Element;\n /** Actual render destination. Use its root/document for portals and DOM operations. */\n target: Element;\n /** ShadowRoot or iframe for the active isolation; undefined without isolation. */\n boundary: ContentScriptBoundary<Isolation>;\n}\n\n// Anchor\nexport type ContentScriptAnchor = string | Element | null | undefined;\n\nexport type ContentScriptAnchorGetter = () => Awaiter<ContentScriptAnchor>;\n\nexport interface ContentScriptMarkerContract {\n for(anchor: ContentScriptAnchor): ContentScriptMarkerContract;\n\n /**\n * Returns elements that are not tracked yet (no marker attribute present).\n * MUST NOT mutate marker state.\n */\n unmarked(): Element[];\n\n marked(): Element[];\n\n mark(element: Element, value: ContentScriptMarkerValue): boolean;\n\n unmark(element: Element): boolean;\n\n isMarked(element: Element): boolean;\n\n value(element: Element): ContentScriptMarkerValue | undefined;\n\n mount(element: Element): boolean;\n\n unmount(element: Element): boolean;\n\n reset(): ContentScriptMarkerContract;\n}\n\nexport type ContentScriptMarkerType =\n | ContentScriptMarker\n | `${ContentScriptMarker}`\n | ContentScriptMarkerContract\n | undefined;\n\nexport type ContentScriptMarkerGetter = (options: ContentScriptOptions) => Awaiter<ContentScriptMarkerType>;\n\nexport type ContentScriptMarkerResolver = (options: ContentScriptOptions) => Awaiter<ContentScriptMarkerContract>;\n\n// Container\nexport type ContentScriptContainerTag = Exclude<keyof HTMLElementTagNameMap, \"html\" | \"body\">;\n\nexport type ContentScriptContainerOptions = {\n [Tag in ContentScriptContainerTag]: {\n tagName: Tag;\n } & Exclude<Optional<PickNonFunctionProperties<HTMLElementTagNameMap[Tag]>>, \"id\">;\n}[ContentScriptContainerTag];\n\nexport type ContentScriptContainerFactory<Data = unknown> = (\n props: ContentScriptContainerProps<Data>\n) => Awaiter<Element | ContentScriptContainerTag | ContentScriptContainerOptions>;\n\nexport type ContentScriptContainerCreator<Data = unknown> = (\n props: ContentScriptContainerProps<Data>\n) => Awaiter<Element>;\n\n// Watch\nexport type ContentScriptWatchStrategy = (update: () => Awaiter<void>, context: ContentScriptContext) => () => void;\n\nexport type ContentScriptEventCallback = (event: ContentScriptEvent, node: ContentScriptNode) => void;\n\nexport interface ContentScriptEventEmitter {\n on(callback: ContentScriptEventCallback): void;\n\n off(callback: ContentScriptEventCallback): void;\n\n emit(event: ContentScriptEvent, node: ContentScriptNode): void;\n\n emitMount(node: ContentScriptNode): void;\n\n emitUnmount(node: ContentScriptNode): void;\n\n emitAdd(node: ContentScriptNode): void;\n\n emitRemove(node: ContentScriptNode): void;\n\n removeAllListeners(): void;\n\n listenerCount(): number;\n\n hasListeners(): boolean;\n}\n\n// Context\nexport interface ContentScriptContext extends ContentScriptMount {\n nodes: ReadonlySet<ContentScriptNode>;\n\n /**\n * Registers a callback function that will be invoked when a specific content script context event occurs.\n *\n * @param {ContentScriptEventCallback} callback - The function to be executed when the event is triggered. Receives event-related data as its argument.\n * @return {Function} A function that can be called to unsubscribe the callback from the event.\n */\n watch(callback: ContentScriptEventCallback): () => void;\n\n /**\n * Stops watching for changes or events that were previously being observed.\n * Unsubscribes from all event listeners that were registered through the watch method.\n *\n * @return {void} No return value.\n */\n unwatch(): void;\n}\n\n// Main\nexport type ContentScriptMainFunction = (context: ContentScriptContext, options: ContentScriptOptions) => Awaiter<void>;\n\n// Node\nexport interface ContentScriptNode extends ContentScriptMount {\n anchor: Element;\n container?: Element;\n\n /** Element used by the active adapter as the destination for rendered UI. */\n target?: Element;\n\n /** Present while isolation is mounted, including navigation-only iframes. */\n boundary?: ContentScriptBoundary;\n}\n\nexport type ContentScriptNodeSet = Set<ContentScriptNode>;\n\n// Builder\nexport interface ContentScriptBuilder extends EntrypointBuilder {\n getContext(): ContentScriptContext;\n}\n"],"mappings":"AASO,MAAM,uBAAuB,CAAC,cAAc,aAAa;AAGzD,MAAM,qCAAqC;AAE3C,IAAK,qBAAL,kBAAKA,wBAAL;AACH,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,UAAO;AAFC,SAAAA;AAAA,GAAA;AAKL,IAAK,2BAAL,kBAAKC,8BAAL;AACH,EAAAA,0BAAA,cAAW;AACX,EAAAA,0BAAA,cAAW;AAFH,SAAAA;AAAA,GAAA;AAKL,IAAK,yBAAL,kBAAKC,4BAAL;AACH,EAAAA,wBAAA,UAAO;AACP,EAAAA,wBAAA,YAAS;AACT,EAAAA,wBAAA,YAAS;AAHD,SAAAA;AAAA,GAAA;AAML,IAAK,0BAAL,kBAAKC,6BAAL;AACH,EAAAA,yBAAA,UAAO;AACP,EAAAA,yBAAA,YAAS;AAFD,SAAAA;AAAA,GAAA;AAML,IAAK,sBAAL,kBAAKC,yBAAL;AACH,EAAAA,qBAAA,UAAO;AACP,EAAAA,qBAAA,WAAQ;AACR,EAAAA,qBAAA,aAAU;AACV,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,WAAQ;AALA,SAAAA;AAAA,GAAA;AASL,IAAK,sBAAL,kBAAKC,yBAAL;AAEH,EAAAA,qBAAA,UAAO;AAEP,EAAAA,qBAAA,eAAY;AAJJ,SAAAA;AAAA,GAAA;AAOL,IAAK,2BAAL,kBAAKC,8BAAL;AACH,EAAAA,0BAAA,aAAU;AACV,EAAAA,0BAAA,eAAY;AAFJ,SAAAA;AAAA,GAAA;AAML,IAAK,qBAAL,kBAAKC,wBAAL;AACH,EAAAA,oBAAA,WAAQ;AACR,EAAAA,oBAAA,aAAU;AACV,EAAAA,oBAAA,SAAM;AACN,EAAAA,oBAAA,YAAS;AAJD,SAAAA;AAAA,GAAA;","names":["ContentScriptWorld","ContentScriptDeclarative","ContentScriptIsolation","ContentScriptShadowMode","ContentScriptAppend","ContentScriptMarker","ContentScriptMarkerValue","ContentScriptEvent"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/types/content/common.ts"],"sourcesContent":["import type {ContentScriptPrepareProps} from \"./prepare\";\nimport type {ContentScriptBoundary} from \"./boundary\";\n\nimport type {PageAlias} from \"@typing/page\";\nimport type {Optional} from \"utility-types\";\n\nimport type {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport type {Awaiter, PickNonFunctionProperties} from \"@typing/helpers\";\n\nexport const ContentScriptMatches = [\"http://*/*\", \"https://*/*\"];\n\n/** Shared property used by the bundler plugin and the content script's style runtime getter. */\nexport const ContentScriptStylesRuntimeProperty = \"__adnbnIsolatedStyles\";\n\nexport enum ContentScriptWorld {\n Isolated = \"ISOLATED\",\n Main = \"MAIN\",\n}\n\nexport enum ContentScriptDeclarative {\n Required = \"required\",\n Optional = \"optional\",\n}\n\nexport enum ContentScriptIsolation {\n None = \"none\",\n Shadow = \"shadow\",\n Iframe = \"iframe\",\n}\n\nexport enum ContentScriptShadowMode {\n Open = \"open\",\n Closed = \"closed\",\n}\n\n// Append\nexport enum ContentScriptAppend {\n Last = \"last\",\n First = \"first\",\n Replace = \"replace\",\n Before = \"before\",\n After = \"after\",\n}\n\n// Marker\nexport enum ContentScriptMarker {\n /** In-memory marking (no DOM mutations). */\n Weak = \"weak\",\n /** DOM attribute-based marking. */\n Attribute = \"attribute\",\n}\n\nexport enum ContentScriptMarkerValue {\n Mounted = \"1\",\n Unmounted = \"0\",\n}\n\n// Event\nexport enum ContentScriptEvent {\n Mount = \"mount\",\n Unmount = \"unmount\",\n Add = \"add\",\n Remove = \"remove\",\n}\n\ntype RunAt = chrome.extensionTypes.RunAt;\n\nexport interface ContentScriptStylesRuntime {\n /** Resolves initial stylesheet URLs once, before the first root is registered. */\n initialize(resolveUrl: (file: string) => string): void;\n /** Retry restored styles once on load error; future loads keep the default failure behavior. */\n add(root: ShadowRoot | HTMLElement, target: Element | null, retry?: boolean): void;\n /** Waits for initial and already requested CSS for this root; retries missing failed links. */\n ready(root: ShadowRoot | HTMLElement): Promise<void>;\n delete(root: ShadowRoot | HTMLElement): void;\n load(url: string): Promise<void>;\n}\n\nexport type ContentScriptWorldValue = ContentScriptWorld | `${chrome.scripting.ExecutionWorld}`;\n\nexport interface ContentScriptConfig {\n matches?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default []\n */\n excludeMatches?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default []\n */\n includeGlobs?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default []\n */\n excludeGlobs?: string[];\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default false\n */\n allFrames?: boolean;\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default \"documentIdle\"\n */\n runAt?: RunAt;\n /**\n * See https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#isolated_world\n *\n * Dynamic imports keep physical async chunks in ISOLATED. MAIN keeps the same Promise-based\n * execution semantics but includes dynamic dependencies in the initial entrypoint graph.\n * Manifest V2 builds always use ISOLATED. Requesting MAIN emits a build warning and applies\n * ISOLATED grouping and chunk loading rules before generating the manifest.\n */\n world?: ContentScriptWorldValue;\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default false\n */\n matchAboutBlank?: boolean;\n /**\n * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/\n * @default false\n */\n matchOriginAsFallback?: boolean;\n /**\n * Whether this content script requires explicit host permission declaration in the extension manifest.\n *\n * Accepted values:\n * - ContentScriptDeclarative.Required — adds the corresponding host patterns to manifest.host_permissions.\n * - ContentScriptDeclarative.Optional — adds the corresponding host patterns to manifest.optional_host_permissions.\n *\n * Backward compatibility:\n * - true ≡ ContentScriptDeclarative.Required\n * - false ≡ undefined (as if the value is not set)\n *\n * @see https://developer.chrome.com/docs/extensions/mv3/declare_permissions/\n *\n * @default undefined\n */\n declarative?: boolean | `${ContentScriptDeclarative}` | ContentScriptDeclarative;\n}\n\nexport type ContentScriptOptions = ContentScriptConfig & EntrypointOptions;\n\nexport interface ContentScriptShadowOptions {\n /**\n * Controls access through the host's shadowRoot property, not CSS isolation or UI visibility.\n * @default ContentScriptShadowMode.Open\n */\n mode?: ContentScriptShadowMode | `${ContentScriptShadowMode}`;\n}\n\nexport interface ContentScriptFrameRenderOptions {\n page?: never;\n src?: never;\n}\n\nexport interface ContentScriptFramePageOptions {\n page: PageAlias;\n src?: never;\n}\n\nexport interface ContentScriptFrameSourceOptions {\n src: string;\n page?: never;\n}\n\nexport type ContentScriptFrame =\n | ContentScriptFrameRenderOptions\n | ContentScriptFramePageOptions\n | ContentScriptFrameSourceOptions;\n\nexport interface ContentScriptIsolationNoneOptions {\n type: ContentScriptIsolation.None | \"none\";\n mode?: never;\n page?: never;\n src?: never;\n}\n\nexport interface ContentScriptIsolationShadowOptions extends ContentScriptShadowOptions {\n type: ContentScriptIsolation.Shadow | \"shadow\";\n page?: never;\n src?: never;\n}\n\nexport type ContentScriptIsolationFrameOptions = ContentScriptFrame & {\n type: ContentScriptIsolation.Iframe | \"iframe\";\n mode?: never;\n};\n\n/** Object form of isolation, also used after resolving shorthand values. */\nexport type ContentScriptIsolationOptions =\n | ContentScriptIsolationNoneOptions\n | ContentScriptIsolationShadowOptions\n | ContentScriptIsolationFrameOptions;\n\nexport type ContentScriptIsolationValue =\n | ContentScriptIsolation\n | `${ContentScriptIsolation}`\n | ContentScriptIsolationOptions;\n\n/** Statically resolved configuration; runtime render values are never retained here. */\nexport type ContentScriptEntrypointOptions = Partial<ContentScriptOptions> & {\n isolation?: ContentScriptIsolationOptions;\n};\n\n// Mount\nexport type ContentScriptMountFunction = (anchor: Element, container: Element) => void | (() => void);\n\nexport interface ContentScriptMount {\n mount(): boolean | undefined | void;\n\n unmount(): boolean | undefined | void;\n}\n\n// Props\nexport interface ContentScriptContainerProps<Data = unknown> extends ContentScriptPrepareProps {\n data: Data;\n}\n\nexport interface ContentScriptProps<\n Data = unknown,\n Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`,\n> extends ContentScriptContainerProps<Data> {\n /** Outer mounted element; the Shadow host or iframe wrapper when isolated. */\n container: Element;\n /** Actual render destination. Use its root/document for portals and DOM operations. */\n target: Element;\n /** ShadowRoot or iframe for the active isolation; undefined without isolation. */\n boundary: ContentScriptBoundary<Isolation>;\n}\n\n// Anchor\nexport type ContentScriptAnchor = string | Element | null | undefined;\n\nexport type ContentScriptAnchorGetter = () => Awaiter<ContentScriptAnchor>;\n\nexport interface ContentScriptMarkerContract {\n for(anchor: ContentScriptAnchor): ContentScriptMarkerContract;\n\n /**\n * Returns elements that are not tracked yet (no marker attribute present).\n * MUST NOT mutate marker state.\n */\n unmarked(): Element[];\n\n marked(): Element[];\n\n mark(element: Element, value: ContentScriptMarkerValue): boolean;\n\n unmark(element: Element): boolean;\n\n isMarked(element: Element): boolean;\n\n value(element: Element): ContentScriptMarkerValue | undefined;\n\n mount(element: Element): boolean;\n\n unmount(element: Element): boolean;\n\n reset(): ContentScriptMarkerContract;\n}\n\nexport type ContentScriptMarkerType =\n | ContentScriptMarker\n | `${ContentScriptMarker}`\n | ContentScriptMarkerContract\n | undefined;\n\nexport type ContentScriptMarkerGetter = (options: ContentScriptOptions) => Awaiter<ContentScriptMarkerType>;\n\nexport type ContentScriptMarkerResolver = (options: ContentScriptOptions) => Awaiter<ContentScriptMarkerContract>;\n\n// Container\nexport type ContentScriptContainerTag = Exclude<keyof HTMLElementTagNameMap, \"html\" | \"body\">;\n\nexport type ContentScriptContainerOptions = {\n [Tag in ContentScriptContainerTag]: {\n tagName: Tag;\n } & Exclude<Optional<PickNonFunctionProperties<HTMLElementTagNameMap[Tag]>>, \"id\">;\n}[ContentScriptContainerTag];\n\nexport type ContentScriptContainerFactory<Data = unknown> = (\n props: ContentScriptContainerProps<Data>\n) => Awaiter<Element | ContentScriptContainerTag | ContentScriptContainerOptions>;\n\nexport type ContentScriptContainerCreator<Data = unknown> = (\n props: ContentScriptContainerProps<Data>\n) => Awaiter<Element>;\n\n// Watch\nexport type ContentScriptWatchStrategy = (update: () => Awaiter<void>, context: ContentScriptContext) => () => void;\n\nexport type ContentScriptEventCallback = (event: ContentScriptEvent, node: ContentScriptNode) => void;\n\nexport interface ContentScriptEventEmitter {\n on(callback: ContentScriptEventCallback): void;\n\n off(callback: ContentScriptEventCallback): void;\n\n emit(event: ContentScriptEvent, node: ContentScriptNode): void;\n\n emitMount(node: ContentScriptNode): void;\n\n emitUnmount(node: ContentScriptNode): void;\n\n emitAdd(node: ContentScriptNode): void;\n\n emitRemove(node: ContentScriptNode): void;\n\n removeAllListeners(): void;\n\n listenerCount(): number;\n\n hasListeners(): boolean;\n}\n\n// Context\nexport interface ContentScriptContext extends ContentScriptMount {\n nodes: ReadonlySet<ContentScriptNode>;\n\n /**\n * Whether target belongs to UI mounted by this context, including ShadowRoot descendants.\n * Already-connected site containers and containers wrapping their anchors are excluded.\n * Membership ends at unmount. Traversal does not cross an iframe document into its host.\n */\n owns(target: Node): boolean;\n\n /**\n * Registers a callback function that will be invoked when a specific content script context event occurs.\n *\n * @param {ContentScriptEventCallback} callback - The function to be executed when the event is triggered. Receives event-related data as its argument.\n * @return {Function} A function that can be called to unsubscribe the callback from the event.\n */\n watch(callback: ContentScriptEventCallback): () => void;\n\n /**\n * Stops watching for changes or events that were previously being observed.\n * Unsubscribes from all event listeners that were registered through the watch method.\n *\n * @return {void} No return value.\n */\n unwatch(): void;\n}\n\n// Main\nexport type ContentScriptMainFunction = (context: ContentScriptContext, options: ContentScriptOptions) => Awaiter<void>;\n\n// Node\nexport interface ContentScriptNode extends ContentScriptMount {\n anchor: Element;\n container?: Element;\n\n /** Element used by the active adapter as the destination for rendered UI. */\n target?: Element;\n\n /** Present while isolation is mounted, including navigation-only iframes. */\n boundary?: ContentScriptBoundary;\n}\n\nexport type ContentScriptNodeSet = Set<ContentScriptNode>;\n\n// Builder\nexport interface ContentScriptBuilder extends EntrypointBuilder {\n getContext(): ContentScriptContext;\n}\n"],"mappings":"AASO,MAAM,uBAAuB,CAAC,cAAc,aAAa;AAGzD,MAAM,qCAAqC;AAE3C,IAAK,qBAAL,kBAAKA,wBAAL;AACH,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,UAAO;AAFC,SAAAA;AAAA,GAAA;AAKL,IAAK,2BAAL,kBAAKC,8BAAL;AACH,EAAAA,0BAAA,cAAW;AACX,EAAAA,0BAAA,cAAW;AAFH,SAAAA;AAAA,GAAA;AAKL,IAAK,yBAAL,kBAAKC,4BAAL;AACH,EAAAA,wBAAA,UAAO;AACP,EAAAA,wBAAA,YAAS;AACT,EAAAA,wBAAA,YAAS;AAHD,SAAAA;AAAA,GAAA;AAML,IAAK,0BAAL,kBAAKC,6BAAL;AACH,EAAAA,yBAAA,UAAO;AACP,EAAAA,yBAAA,YAAS;AAFD,SAAAA;AAAA,GAAA;AAML,IAAK,sBAAL,kBAAKC,yBAAL;AACH,EAAAA,qBAAA,UAAO;AACP,EAAAA,qBAAA,WAAQ;AACR,EAAAA,qBAAA,aAAU;AACV,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,WAAQ;AALA,SAAAA;AAAA,GAAA;AASL,IAAK,sBAAL,kBAAKC,yBAAL;AAEH,EAAAA,qBAAA,UAAO;AAEP,EAAAA,qBAAA,eAAY;AAJJ,SAAAA;AAAA,GAAA;AAOL,IAAK,2BAAL,kBAAKC,8BAAL;AACH,EAAAA,0BAAA,aAAU;AACV,EAAAA,0BAAA,eAAY;AAFJ,SAAAA;AAAA,GAAA;AAML,IAAK,qBAAL,kBAAKC,wBAAL;AACH,EAAAA,oBAAA,WAAQ;AACR,EAAAA,oBAAA,aAAU;AACV,EAAAA,oBAAA,SAAM;AACN,EAAAA,oBAAA,YAAS;AAJD,SAAAA;AAAA,GAAA;","names":["ContentScriptWorld","ContentScriptDeclarative","ContentScriptIsolation","ContentScriptShadowMode","ContentScriptAppend","ContentScriptMarker","ContentScriptMarkerValue","ContentScriptEvent"]}
|
|
@@ -9,6 +9,11 @@ export interface ContentScriptDefinitionBase<Data = unknown> extends Partial<Con
|
|
|
9
9
|
mount?: ContentScriptMountFunction;
|
|
10
10
|
container?: ContentScriptContainerTag | ContentScriptContainerOptions | ContentScriptContainerFactory<NoInfer<Data>>;
|
|
11
11
|
prepare?: ContentScriptPrepareHandler<Data>;
|
|
12
|
+
/**
|
|
13
|
+
* Omit to watch until the first nodes are found; true keeps observing child-list changes.
|
|
14
|
+
* Use a custom strategy to observe attributes or text. Built-in strategies ignore internal
|
|
15
|
+
* changes in owned UI containers unless a container wraps its own anchor.
|
|
16
|
+
*/
|
|
12
17
|
watch?: true | ContentScriptWatchStrategy;
|
|
13
18
|
main?: ContentScriptMainFunction;
|
|
14
19
|
}
|
package/dist/types/locale.d.ts
CHANGED
package/dist/types/locale.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/locale.ts"],"sourcesContent":["import {Language} from \"@typing/language\";\n\nexport {Language};\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([Language.Arabic, Language.Persian, Language.Hebrew]);\n\nexport const LocaleNestedKeysSeparator = \".\";\n\nexport const LocaleKeysSeparator = \"_\";\n\nexport const LocaleValuesSeparator = \"|\";\n\nexport const LocaleCustomKeyForLanguage = \"locale\";\n\nexport const LocaleKeyMarker = \"@\";\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\n/** Native language names, independent of the selected UI language. */\nexport const LanguageNames: Readonly<Record<Language, string>> = Object.freeze({\n [Language.Arabic]: \"العربية\",\n [Language.Amharic]: \"አማርኛ\",\n [Language.Bulgarian]: \"Български\",\n [Language.Bengali]: \"বাংলা\",\n [Language.Catalan]: \"Català\",\n [Language.Czech]: \"Čeština\",\n [Language.Danish]: \"Dansk\",\n [Language.German]: \"Deutsch\",\n [Language.Greek]: \"Ελληνικά\",\n [Language.English]: \"English\",\n [Language.EnglishAustralia]: \"English (Australia)\",\n [Language.EnglishGreatBritain]: \"English (United Kingdom)\",\n [Language.EnglishUSA]: \"English (United States)\",\n [Language.Spanish]: \"Español\",\n [Language.SpanishLatinAmericaAndCaribbean]: \"Español (Latinoamérica y el Caribe)\",\n [Language.Estonian]: \"Eesti\",\n [Language.Persian]: \"فارسی\",\n [Language.Finnish]: \"Suomi\",\n [Language.Filipino]: \"Filipino\",\n [Language.French]: \"Français\",\n [Language.Gujarati]: \"ગુજરાતી\",\n [Language.Hebrew]: \"עברית\",\n [Language.Hindi]: \"हिन्दी\",\n [Language.Croatian]: \"Hrvatski\",\n [Language.Hungarian]: \"Magyar\",\n [Language.Indonesian]: \"Bahasa Indonesia\",\n [Language.Italian]: \"Italiano\",\n [Language.Japanese]: \"日本語\",\n [Language.Kannada]: \"ಕನ್ನಡ\",\n [Language.Korean]: \"한국어\",\n [Language.Lithuanian]: \"Lietuvių\",\n [Language.Latvian]: \"Latviešu\",\n [Language.Malayalam]: \"മലയാളം\",\n [Language.Marathi]: \"मराठी\",\n [Language.Malay]: \"Bahasa Melayu\",\n [Language.Dutch]: \"Nederlands\",\n [Language.Norwegian]: \"Norsk\",\n [Language.Polish]: \"Polski\",\n [Language.PortugueseBrazil]: \"Português (Brasil)\",\n [Language.PortuguesePortugal]: \"Português (Portugal)\",\n [Language.Romanian]: \"Română\",\n [Language.Russian]: \"Русский\",\n [Language.Slovak]: \"Slovenčina\",\n [Language.Slovenian]: \"Slovenščina\",\n [Language.Serbian]: \"Српски\",\n [Language.Swedish]: \"Svenska\",\n [Language.Swahili]: \"Kiswahili\",\n [Language.Tamil]: \"தமிழ்\",\n [Language.Telugu]: \"తెలుగు\",\n [Language.Thai]: \"ไทย\",\n [Language.Turkish]: \"Türkçe\",\n [Language.Ukrainian]: \"Українська\",\n [Language.Vietnamese]: \"Tiếng Việt\",\n [Language.ChineseChina]: \"中文(简体)\",\n [Language.ChineseTaiwan]: \"中文(繁體)\",\n});\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set([\"yaml\", \"yml\", \"json\"]);\n\nexport enum LocaleDir {\n RightToLeft = \"rtl\",\n LeftToRight = \"ltr\",\n}\n\nexport type LocaleValue = string | number | Array<string | number>;\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport type LocaleBuilders = Map<Language, LocaleBuilder>;\n\n/** Completed messages keyed by language and browser-compatible message key. */\nexport type LocaleCatalogue = Partial<Record<Language, Record<string, string>>>;\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport interface LocaleContractValidator {\n isValid(builders: LocaleBuilders): boolean;\n\n validate(builders: LocaleBuilders): this;\n}\n\nexport interface LocaleFutures {\n plural: boolean;\n substitutions: readonly string[];\n}\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\n/**\n * Empty because translation keys and their plural/substitution contracts belong to the consuming application.\n * Generated `.adnbn/locale.d.ts` declarations populate it by augmenting `adnbn/locale`.\n */\nexport interface LocaleRegistry {}\n\nexport type LocaleNonPluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: false} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocalePluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: true} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocaleSubstitutionValue = string | number;\n\nexport type LocaleSubstitutionKeys<T, K extends keyof T> = T[K] extends {substitutions: readonly (infer U)[]}\n ? U & string\n : never;\n\nexport type LocaleSubstitutionsFor<T, K extends keyof T> = [LocaleSubstitutionKeys<T, K>] extends [never]\n ? never\n : Record<LocaleSubstitutionKeys<T, K>, LocaleSubstitutionValue>;\n\nexport type LocaleSubstitutionArgs<T, K extends keyof T> = string extends keyof T\n ? [substitutions?: Record<string, LocaleSubstitutionValue>]\n : [LocaleSubstitutionKeys<T, K>] extends [never]\n ? []\n : [substitutions: LocaleSubstitutionsFor<T, K>];\n\nexport interface LocaleProvider<S> {\n /** Currently selected language code. */\n lang(): Language;\n\n /** Available language codes. */\n langs(): ReadonlySet<Language>;\n\n /** Native names keyed by the available language codes. */\n langNames(): ReadonlyMap<Language, string>;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;\n}\n\nexport interface LocaleDynamicProvider<S> extends LocaleProvider<S> {\n change(lang: Language): Promise<Language>;\n}\n\n/** Read-only message access for one selected language. */\nexport interface LocaleSnapshot<S> {\n readonly lang: () => Language;\n readonly langs: () => ReadonlySet<Language>;\n readonly langNames: () => ReadonlyMap<Language, string>;\n readonly get: <K extends keyof S & string>(key: K) => string;\n}\n\n/** Persists one language selection independently of the application's translation catalogue. */\nexport interface LocaleStorageDriver {\n /** No saved selection leaves the provider's current language unchanged. */\n get(): Promise<Language | undefined>;\n\n set(lang: Language): Promise<void>;\n\n /** Observes valid selections, including own writes; does not emit an initial value or deletions. */\n watch(handler: (lang: Language) => void): () => void;\n}\n"],"mappings":"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","names":["LocaleDir"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/locale.ts"],"sourcesContent":["import {Language} from \"@typing/language\";\n\nexport {Language};\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([Language.Arabic, Language.Persian, Language.Hebrew]);\n\nexport const LocaleNestedKeysSeparator = \".\";\n\nexport const LocaleKeysSeparator = \"_\";\n\nexport const LocaleValuesSeparator = \"|\";\n\nexport const LocaleCustomKeyForLanguage = \"locale\";\n\nexport const LocaleKeyMarker = \"@\";\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\n/** Native language names, independent of the selected UI language. */\nexport const LanguageNames: Readonly<Record<Language, string>> = Object.freeze({\n [Language.Arabic]: \"العربية\",\n [Language.Amharic]: \"አማርኛ\",\n [Language.Bulgarian]: \"Български\",\n [Language.Bengali]: \"বাংলা\",\n [Language.Catalan]: \"Català\",\n [Language.Czech]: \"Čeština\",\n [Language.Danish]: \"Dansk\",\n [Language.German]: \"Deutsch\",\n [Language.Greek]: \"Ελληνικά\",\n [Language.English]: \"English\",\n [Language.EnglishAustralia]: \"English (Australia)\",\n [Language.EnglishGreatBritain]: \"English (United Kingdom)\",\n [Language.EnglishUSA]: \"English (United States)\",\n [Language.Spanish]: \"Español\",\n [Language.SpanishLatinAmericaAndCaribbean]: \"Español (Latinoamérica y el Caribe)\",\n [Language.Estonian]: \"Eesti\",\n [Language.Persian]: \"فارسی\",\n [Language.Finnish]: \"Suomi\",\n [Language.Filipino]: \"Filipino\",\n [Language.French]: \"Français\",\n [Language.Gujarati]: \"ગુજરાતી\",\n [Language.Hebrew]: \"עברית\",\n [Language.Hindi]: \"हिन्दी\",\n [Language.Croatian]: \"Hrvatski\",\n [Language.Hungarian]: \"Magyar\",\n [Language.Indonesian]: \"Bahasa Indonesia\",\n [Language.Italian]: \"Italiano\",\n [Language.Japanese]: \"日本語\",\n [Language.Kannada]: \"ಕನ್ನಡ\",\n [Language.Korean]: \"한국어\",\n [Language.Lithuanian]: \"Lietuvių\",\n [Language.Latvian]: \"Latviešu\",\n [Language.Malayalam]: \"മലയാളം\",\n [Language.Marathi]: \"मराठी\",\n [Language.Malay]: \"Bahasa Melayu\",\n [Language.Dutch]: \"Nederlands\",\n [Language.Norwegian]: \"Norsk\",\n [Language.Polish]: \"Polski\",\n [Language.PortugueseBrazil]: \"Português (Brasil)\",\n [Language.PortuguesePortugal]: \"Português (Portugal)\",\n [Language.Romanian]: \"Română\",\n [Language.Russian]: \"Русский\",\n [Language.Slovak]: \"Slovenčina\",\n [Language.Slovenian]: \"Slovenščina\",\n [Language.Serbian]: \"Српски\",\n [Language.Swedish]: \"Svenska\",\n [Language.Swahili]: \"Kiswahili\",\n [Language.Tamil]: \"தமிழ்\",\n [Language.Telugu]: \"తెలుగు\",\n [Language.Thai]: \"ไทย\",\n [Language.Turkish]: \"Türkçe\",\n [Language.Ukrainian]: \"Українська\",\n [Language.Vietnamese]: \"Tiếng Việt\",\n [Language.ChineseChina]: \"中文(简体)\",\n [Language.ChineseTaiwan]: \"中文(繁體)\",\n});\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set([\"yaml\", \"yml\", \"json\"]);\n\nexport enum LocaleDir {\n RightToLeft = \"rtl\",\n LeftToRight = \"ltr\",\n}\n\nexport type LocaleValue = string | number | Array<string | number>;\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n placeholders?: Record<string, {content: string}>;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport type LocaleBuilders = Map<Language, LocaleBuilder>;\n\n/** Completed messages keyed by language and browser-compatible message key. */\nexport type LocaleCatalogue = Partial<Record<Language, Record<string, string>>>;\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport interface LocaleContractValidator {\n isValid(builders: LocaleBuilders): boolean;\n\n validate(builders: LocaleBuilders): this;\n}\n\nexport interface LocaleFutures {\n plural: boolean;\n substitutions: readonly string[];\n}\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\n/**\n * Empty because translation keys and their plural/substitution contracts belong to the consuming application.\n * Generated `.adnbn/locale.d.ts` declarations populate it by augmenting `adnbn/locale`.\n */\nexport interface LocaleRegistry {}\n\nexport type LocaleNonPluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: false} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocalePluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: true} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocaleSubstitutionValue = string | number;\n\nexport type LocaleSubstitutionKeys<T, K extends keyof T> = T[K] extends {substitutions: readonly (infer U)[]}\n ? U & string\n : never;\n\nexport type LocaleSubstitutionsFor<T, K extends keyof T> = [LocaleSubstitutionKeys<T, K>] extends [never]\n ? never\n : Record<LocaleSubstitutionKeys<T, K>, LocaleSubstitutionValue>;\n\nexport type LocaleSubstitutionArgs<T, K extends keyof T> = string extends keyof T\n ? [substitutions?: Record<string, LocaleSubstitutionValue>]\n : [LocaleSubstitutionKeys<T, K>] extends [never]\n ? []\n : [substitutions: LocaleSubstitutionsFor<T, K>];\n\nexport interface LocaleProvider<S> {\n /** Currently selected language code. */\n lang(): Language;\n\n /** Available language codes. */\n langs(): ReadonlySet<Language>;\n\n /** Native names keyed by the available language codes. */\n langNames(): ReadonlyMap<Language, string>;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;\n}\n\nexport interface LocaleDynamicProvider<S> extends LocaleProvider<S> {\n change(lang: Language): Promise<Language>;\n}\n\n/** Read-only message access for one selected language. */\nexport interface LocaleSnapshot<S> {\n readonly lang: () => Language;\n readonly langs: () => ReadonlySet<Language>;\n readonly langNames: () => ReadonlyMap<Language, string>;\n readonly get: <K extends keyof S & string>(key: K) => string;\n}\n\n/** Persists one language selection independently of the application's translation catalogue. */\nexport interface LocaleStorageDriver {\n /** No saved selection leaves the provider's current language unchanged. */\n get(): Promise<Language | undefined>;\n\n set(lang: Language): Promise<void>;\n\n /** Observes valid selections, including own writes; does not emit an initial value or deletions. */\n watch(handler: (lang: Language) => void): () => void;\n}\n"],"mappings":"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","names":["LocaleDir"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adnbn",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.13.0",
|
|
5
5
|
"description": "Addon Bone - Cross-browser web extension framework with shared code base",
|
|
6
6
|
"homepage": "https://addonbone.com",
|
|
7
7
|
"author": "Anjey Tsibylskij (https://github.com/atldays)",
|
|
@@ -152,12 +152,10 @@
|
|
|
152
152
|
"@rspack/core": "^1.7.5",
|
|
153
153
|
"@rspack/lite-tapable": "^1.1.0",
|
|
154
154
|
"@svgr/webpack": "^8.1.0",
|
|
155
|
-
"await-lock": "^3.0.0",
|
|
156
155
|
"c12": "^3.3.2",
|
|
157
156
|
"cac": "^6.7.14",
|
|
158
157
|
"consola": "^3.4.2",
|
|
159
158
|
"css-loader": "^7.1.2",
|
|
160
|
-
"debounce": "^2.2.0",
|
|
161
159
|
"file-loader": "^6.2.0",
|
|
162
160
|
"get-value": "^4.0.1",
|
|
163
161
|
"html-rspack-tags-plugin": "^0.0.3",
|
package/types/client.d.ts
CHANGED
|
@@ -310,17 +310,17 @@ declare module "*?asis" {
|
|
|
310
310
|
export default src;
|
|
311
311
|
}
|
|
312
312
|
|
|
313
|
-
declare module "*?
|
|
313
|
+
declare module "*?unisolated" {
|
|
314
314
|
const classes: Readonly<Record<string, string>>;
|
|
315
315
|
export default classes;
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
-
declare module "*?
|
|
318
|
+
declare module "*?unisolated&asis" {
|
|
319
319
|
const src: string;
|
|
320
320
|
export default src;
|
|
321
321
|
}
|
|
322
322
|
|
|
323
|
-
declare module "*?asis&
|
|
323
|
+
declare module "*?asis&unisolated" {
|
|
324
324
|
const src: string;
|
|
325
325
|
export default src;
|
|
326
326
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/entry/content/adapters/react/resolvers/definition.ts"],"sourcesContent":["import {isValidElement} from \"react\";\nimport {mergeDefinition} from \"../../../resolvers/definition\";\n\nimport type {ContentScriptDefinition} from \"@typing/content\";\n\nexport const resolveDefinition = (module: object): ContentScriptDefinition => {\n return mergeDefinition(\n module,\n value =>\n typeof value === \"function\" ||\n isValidElement(value) ||\n typeof value === \"number\" ||\n (typeof value === \"string\" && value.length > 0) ||\n value instanceof Element\n );\n};\n"],"mappings":"AAAA,SAAQ,sBAAqB;AAC7B,SAAQ,uBAAsB;AAIvB,MAAM,oBAAoB,CAAC,WAA4C;AAC1E,SAAO;AAAA,IACH;AAAA,IACA,WACI,OAAO,UAAU,cACjB,eAAe,KAAK,KACpB,OAAO,UAAU,YAChB,OAAO,UAAU,YAAY,MAAM,SAAS,KAC7C,iBAAiB;AAAA,EACzB;AACJ;","names":[]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import type { ContentScriptRenderHandler, ContentScriptRenderValue } from "../../../../../types/content/index.js";
|
|
2
|
-
export declare const createRenderResolver: <Data = unknown>(render?: ContentScriptRenderValue<Data> | ContentScriptRenderHandler<Data>) => ContentScriptRenderHandler<Data>;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createElement, isValidElement } from "react";
|
|
2
|
-
const createRenderResolver = (render) => (props) => {
|
|
3
|
-
const value = typeof render === "function" ? createElement(render, props) : render;
|
|
4
|
-
return isValidElement(value) ? value : void 0;
|
|
5
|
-
};
|
|
6
|
-
export {
|
|
7
|
-
createRenderResolver
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=render.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/entry/content/adapters/react/resolvers/render.ts"],"sourcesContent":["import {createElement, isValidElement} from \"react\";\n\nimport type {\n ContentScriptRenderHandler,\n ContentScriptRenderValue,\n ContentScriptRenderReactComponent,\n} from \"@typing/content\";\n\nexport const createRenderResolver =\n <Data = unknown>(\n render?: ContentScriptRenderValue<Data> | ContentScriptRenderHandler<Data>\n ): ContentScriptRenderHandler<Data> =>\n props => {\n // Functions in React entrypoints are components; React owns their invocation and hooks.\n const value =\n typeof render === \"function\"\n ? createElement(render as ContentScriptRenderReactComponent<Data>, props)\n : render;\n\n return isValidElement(value) ? value : undefined;\n };\n"],"mappings":"AAAA,SAAQ,eAAe,sBAAqB;AAQrC,MAAM,uBACT,CACI,WAEJ,WAAS;AAEL,QAAM,QACF,OAAO,WAAW,aACZ,cAAc,QAAmD,KAAK,IACtE;AAEV,SAAO,eAAe,KAAK,IAAI,QAAQ;AAC3C;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/entry/content/adapters/vanilla/resolvers/definition.ts"],"sourcesContent":["import {mergeDefinition} from \"../../../resolvers/definition\";\nimport {isValidRenderValue} from \"./render\";\n\nimport type {ContentScriptDefinition} from \"@typing/content\";\n\nexport const resolveDefinition = (module: object): ContentScriptDefinition => {\n return mergeDefinition(module, value => typeof value === \"function\" || isValidRenderValue(value));\n};\n"],"mappings":"AAAA,SAAQ,uBAAsB;AAC9B,SAAQ,0BAAyB;AAI1B,MAAM,oBAAoB,CAAC,WAA4C;AAC1E,SAAO,gBAAgB,QAAQ,WAAS,OAAO,UAAU,cAAc,mBAAmB,KAAK,CAAC;AACpG;","names":[]}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { ContentScriptRenderHandler, ContentScriptRenderValue } from "../../../../../types/content/index.js";
|
|
2
|
-
export declare const isValidRenderValue: (value: unknown) => value is string | number | Element;
|
|
3
|
-
export declare const createRenderResolver: <Data = unknown>(render?: ContentScriptRenderValue<Data> | ContentScriptRenderHandler<Data>) => ContentScriptRenderHandler<Data>;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const isValidRenderValue = (value) => {
|
|
2
|
-
return typeof value === "string" && value.length > 0 || typeof value === "number" || value instanceof Element;
|
|
3
|
-
};
|
|
4
|
-
const createRenderResolver = (render) => (props) => {
|
|
5
|
-
const resolvedRender = typeof render === "function" ? render(props) : render;
|
|
6
|
-
if (!isValidRenderValue(resolvedRender)) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
return resolvedRender;
|
|
10
|
-
};
|
|
11
|
-
export {
|
|
12
|
-
createRenderResolver,
|
|
13
|
-
isValidRenderValue
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=render.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/entry/content/adapters/vanilla/resolvers/render.ts"],"sourcesContent":["import type {ContentScriptRenderHandler, ContentScriptRenderValue} from \"@typing/content\";\n\nexport const isValidRenderValue = (value: unknown): value is string | number | Element => {\n return (typeof value === \"string\" && value.length > 0) || typeof value === \"number\" || value instanceof Element;\n};\n\n// prettier-ignore\nexport const createRenderResolver =\n <Data = unknown>(render?: ContentScriptRenderValue<Data> | ContentScriptRenderHandler<Data>): ContentScriptRenderHandler<Data> =>\n props => {\n const resolvedRender = typeof render === \"function\" ? render(props) : render;\n\n if (!isValidRenderValue(resolvedRender)) {\n return;\n }\n\n return resolvedRender;\n };\n"],"mappings":"AAEO,MAAM,qBAAqB,CAAC,UAAuD;AACtF,SAAQ,OAAO,UAAU,YAAY,MAAM,SAAS,KAAM,OAAO,UAAU,YAAY,iBAAiB;AAC5G;AAGO,MAAM,uBACT,CAAiB,WACb,WAAS;AACL,QAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,KAAK,IAAI;AAEtE,MAAI,CAAC,mBAAmB,cAAc,GAAG;AACrC;AAAA,EACJ;AAEA,SAAO;AACX;","names":[]}
|
|
File without changes
|
|
File without changes
|