@player-ui/async-node-plugin 0.8.0--canary.307.9645 → 0.8.0-next.1

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.
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ AsyncNodePlugin: () => AsyncNodePlugin,
34
+ AsyncNodePluginPlugin: () => AsyncNodePluginPlugin
35
+ });
36
+ module.exports = __toCommonJS(src_exports);
37
+ var import_player = require("@player-ui/player");
38
+ var import_tapable_ts = require("tapable-ts");
39
+ var import_queue_microtask = __toESM(require("queue-microtask"));
40
+ var import_timm = require("timm");
41
+ var AsyncNodePlugin = class {
42
+ constructor(options) {
43
+ this.hooks = {
44
+ onAsyncNode: new import_tapable_ts.AsyncParallelBailHook()
45
+ };
46
+ this.name = "AsyncNode";
47
+ if (options?.plugins) {
48
+ this.plugins = options.plugins;
49
+ options.plugins.forEach((plugin) => {
50
+ plugin.applyPlugin(this);
51
+ });
52
+ }
53
+ }
54
+ apply(player) {
55
+ player.hooks.viewController.tap(this.name, (viewController) => {
56
+ viewController.hooks.view.tap(this.name, (view) => {
57
+ this.plugins?.forEach((plugin) => {
58
+ plugin.apply(view);
59
+ });
60
+ });
61
+ });
62
+ }
63
+ };
64
+ var AsyncNodePluginPlugin = class {
65
+ constructor() {
66
+ this.asyncNode = new import_tapable_ts.AsyncParallelBailHook();
67
+ this.name = "AsyncNode";
68
+ this.resolvedMapping = /* @__PURE__ */ new Map();
69
+ }
70
+ isAsync(node) {
71
+ return node?.type === import_player.NodeType.Async;
72
+ }
73
+ applyParser(parser) {
74
+ parser.hooks.determineNodeType.tap(this.name, (obj) => {
75
+ if (Object.prototype.hasOwnProperty.call(obj, "async")) {
76
+ return import_player.NodeType.Async;
77
+ }
78
+ });
79
+ parser.hooks.parseNode.tap(
80
+ this.name,
81
+ (obj, nodeType, options, determinedNodeType) => {
82
+ if (determinedNodeType === import_player.NodeType.Async) {
83
+ const parsedAsync = parser.parseObject(
84
+ (0, import_timm.omit)(obj, "async"),
85
+ nodeType,
86
+ options
87
+ );
88
+ const parsedNodeId = (0, import_player.getNodeID)(parsedAsync);
89
+ if (parsedAsync !== null && parsedNodeId) {
90
+ return parser.createASTNode(
91
+ {
92
+ id: parsedNodeId,
93
+ type: import_player.NodeType.Async,
94
+ value: parsedAsync
95
+ },
96
+ obj
97
+ );
98
+ }
99
+ return null;
100
+ }
101
+ }
102
+ );
103
+ }
104
+ applyResolverHooks(resolver) {
105
+ resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
106
+ let resolvedNode;
107
+ if (this.isAsync(node)) {
108
+ const mappedValue = this.resolvedMapping.get(node.id);
109
+ if (mappedValue) {
110
+ resolvedNode = mappedValue;
111
+ }
112
+ } else {
113
+ resolvedNode = null;
114
+ }
115
+ const newNode = resolvedNode || node;
116
+ if (!resolvedNode && node?.type === import_player.NodeType.Async) {
117
+ (0, import_queue_microtask.default)(async () => {
118
+ const result = await this.basePlugin?.hooks.onAsyncNode.call(node);
119
+ const parsedNode = options.parseNode && result ? options.parseNode(result) : void 0;
120
+ if (parsedNode) {
121
+ this.resolvedMapping.set(node.id, parsedNode);
122
+ this.currentView?.updateAsync();
123
+ }
124
+ });
125
+ return node;
126
+ }
127
+ return newNode;
128
+ });
129
+ }
130
+ apply(view) {
131
+ view.hooks.parser.tap("template", this.applyParser.bind(this));
132
+ view.hooks.resolver.tap("template", (resolver) => {
133
+ resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
134
+ let resolvedNode;
135
+ if (this.isAsync(node)) {
136
+ const mappedValue = this.resolvedMapping.get(node.id);
137
+ if (mappedValue) {
138
+ resolvedNode = mappedValue;
139
+ }
140
+ } else {
141
+ resolvedNode = null;
142
+ }
143
+ const newNode = resolvedNode || node;
144
+ if (!resolvedNode && node?.type === import_player.NodeType.Async) {
145
+ (0, import_queue_microtask.default)(async () => {
146
+ const result = await this.basePlugin?.hooks.onAsyncNode.call(node);
147
+ const parsedNode = options.parseNode && result ? options.parseNode(result) : void 0;
148
+ this.resolvedMapping.set(node.id, parsedNode ? parsedNode : node);
149
+ view.updateAsync();
150
+ });
151
+ return node;
152
+ }
153
+ return newNode;
154
+ });
155
+ });
156
+ }
157
+ applyPlugin(asyncNodePlugin) {
158
+ this.basePlugin = asyncNodePlugin;
159
+ }
160
+ };
161
+ // Annotate the CommonJS export names for ESM import in node:
162
+ 0 && (module.exports = {
163
+ AsyncNodePlugin,
164
+ AsyncNodePluginPlugin
165
+ });
166
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts"],"sourcesContent":["import { NodeType, getNodeID } from \"@player-ui/player\";\nimport type {\n Player,\n PlayerPlugin,\n Node,\n ParseObjectOptions,\n ViewInstance,\n Parser,\n ViewPlugin,\n Resolver,\n} from \"@player-ui/player\";\nimport { AsyncParallelBailHook } from \"tapable-ts\";\nimport queueMicrotask from \"queue-microtask\";\nimport { omit } from \"timm\";\n\nexport * from \"./types\";\n\nexport interface AsyncNodePluginOptions {\n /** A set of plugins to load */\n plugins?: AsyncNodeViewPlugin[];\n}\n\nexport interface AsyncNodeViewPlugin extends ViewPlugin {\n /** Use this to tap into the async node plugin hooks */\n applyPlugin: (asyncNodePlugin: AsyncNodePlugin) => void;\n\n asyncNode: AsyncParallelBailHook<[Node.Async], any>;\n}\n\n/**\n * Async node plugin used to resolve async nodes in the content\n * If an async node is present, allow users to provide a replacement node to be rendered when ready\n */\nexport class AsyncNodePlugin implements PlayerPlugin {\n private plugins: AsyncNodeViewPlugin[] | undefined;\n\n constructor(options: AsyncNodePluginOptions) {\n if (options?.plugins) {\n this.plugins = options.plugins;\n options.plugins.forEach((plugin) => {\n plugin.applyPlugin(this);\n });\n }\n }\n\n public readonly hooks = {\n onAsyncNode: new AsyncParallelBailHook<[Node.Async], any>(),\n };\n\n name = \"AsyncNode\";\n\n apply(player: Player) {\n player.hooks.viewController.tap(this.name, (viewController) => {\n viewController.hooks.view.tap(this.name, (view) => {\n this.plugins?.forEach((plugin) => {\n plugin.apply(view);\n });\n });\n });\n }\n}\n\nexport class AsyncNodePluginPlugin implements AsyncNodeViewPlugin {\n public asyncNode = new AsyncParallelBailHook<[Node.Async], any>();\n private basePlugin: AsyncNodePlugin | undefined;\n\n name = \"AsyncNode\";\n\n private resolvedMapping = new Map<string, any>();\n\n private currentView: ViewInstance | undefined;\n\n private isAsync(node: Node.Node | null): node is Node.Async {\n return node?.type === NodeType.Async;\n }\n\n applyParser(parser: Parser) {\n parser.hooks.determineNodeType.tap(this.name, (obj) => {\n if (Object.prototype.hasOwnProperty.call(obj, \"async\")) {\n return NodeType.Async;\n }\n });\n parser.hooks.parseNode.tap(\n this.name,\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n determinedNodeType: null | NodeType,\n ) => {\n if (determinedNodeType === NodeType.Async) {\n const parsedAsync = parser.parseObject(\n omit(obj, \"async\"),\n nodeType,\n options,\n );\n const parsedNodeId = getNodeID(parsedAsync);\n if (parsedAsync !== null && parsedNodeId) {\n return parser.createASTNode(\n {\n id: parsedNodeId,\n type: NodeType.Async,\n value: parsedAsync,\n },\n obj,\n );\n }\n\n return null;\n }\n },\n );\n }\n\n applyResolverHooks(resolver: Resolver) {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n let resolvedNode;\n if (this.isAsync(node)) {\n const mappedValue = this.resolvedMapping.get(node.id);\n if (mappedValue) {\n resolvedNode = mappedValue;\n }\n } else {\n resolvedNode = null;\n }\n\n const newNode = resolvedNode || node;\n if (!resolvedNode && node?.type === NodeType.Async) {\n queueMicrotask(async () => {\n const result = await this.basePlugin?.hooks.onAsyncNode.call(node);\n const parsedNode =\n options.parseNode && result ? options.parseNode(result) : undefined;\n\n if (parsedNode) {\n this.resolvedMapping.set(node.id, parsedNode);\n this.currentView?.updateAsync();\n }\n });\n\n return node;\n }\n\n return newNode;\n });\n }\n\n apply(view: ViewInstance): void {\n view.hooks.parser.tap(\"template\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"template\", (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n let resolvedNode;\n if (this.isAsync(node)) {\n const mappedValue = this.resolvedMapping.get(node.id);\n if (mappedValue) {\n resolvedNode = mappedValue;\n }\n } else {\n resolvedNode = null;\n }\n\n const newNode = resolvedNode || node;\n if (!resolvedNode && node?.type === NodeType.Async) {\n queueMicrotask(async () => {\n const result = await this.basePlugin?.hooks.onAsyncNode.call(node);\n const parsedNode =\n options.parseNode && result\n ? options.parseNode(result)\n : undefined;\n\n this.resolvedMapping.set(node.id, parsedNode ? parsedNode : node);\n view.updateAsync();\n });\n\n return node;\n }\n\n return newNode;\n });\n });\n }\n\n applyPlugin(asyncNodePlugin: AsyncNodePlugin): void {\n this.basePlugin = asyncNodePlugin;\n }\n}\n"],"mappings":"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","names":["queueMicrotask"]}
@@ -0,0 +1,130 @@
1
+ // ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts
2
+ import { NodeType, getNodeID } from "@player-ui/player";
3
+ import { AsyncParallelBailHook } from "tapable-ts";
4
+ import queueMicrotask from "queue-microtask";
5
+ import { omit } from "timm";
6
+ var AsyncNodePlugin = class {
7
+ constructor(options) {
8
+ this.hooks = {
9
+ onAsyncNode: new AsyncParallelBailHook()
10
+ };
11
+ this.name = "AsyncNode";
12
+ if (options?.plugins) {
13
+ this.plugins = options.plugins;
14
+ options.plugins.forEach((plugin) => {
15
+ plugin.applyPlugin(this);
16
+ });
17
+ }
18
+ }
19
+ apply(player) {
20
+ player.hooks.viewController.tap(this.name, (viewController) => {
21
+ viewController.hooks.view.tap(this.name, (view) => {
22
+ this.plugins?.forEach((plugin) => {
23
+ plugin.apply(view);
24
+ });
25
+ });
26
+ });
27
+ }
28
+ };
29
+ var AsyncNodePluginPlugin = class {
30
+ constructor() {
31
+ this.asyncNode = new AsyncParallelBailHook();
32
+ this.name = "AsyncNode";
33
+ this.resolvedMapping = /* @__PURE__ */ new Map();
34
+ }
35
+ isAsync(node) {
36
+ return node?.type === NodeType.Async;
37
+ }
38
+ applyParser(parser) {
39
+ parser.hooks.determineNodeType.tap(this.name, (obj) => {
40
+ if (Object.prototype.hasOwnProperty.call(obj, "async")) {
41
+ return NodeType.Async;
42
+ }
43
+ });
44
+ parser.hooks.parseNode.tap(
45
+ this.name,
46
+ (obj, nodeType, options, determinedNodeType) => {
47
+ if (determinedNodeType === NodeType.Async) {
48
+ const parsedAsync = parser.parseObject(
49
+ omit(obj, "async"),
50
+ nodeType,
51
+ options
52
+ );
53
+ const parsedNodeId = getNodeID(parsedAsync);
54
+ if (parsedAsync !== null && parsedNodeId) {
55
+ return parser.createASTNode(
56
+ {
57
+ id: parsedNodeId,
58
+ type: NodeType.Async,
59
+ value: parsedAsync
60
+ },
61
+ obj
62
+ );
63
+ }
64
+ return null;
65
+ }
66
+ }
67
+ );
68
+ }
69
+ applyResolverHooks(resolver) {
70
+ resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
71
+ let resolvedNode;
72
+ if (this.isAsync(node)) {
73
+ const mappedValue = this.resolvedMapping.get(node.id);
74
+ if (mappedValue) {
75
+ resolvedNode = mappedValue;
76
+ }
77
+ } else {
78
+ resolvedNode = null;
79
+ }
80
+ const newNode = resolvedNode || node;
81
+ if (!resolvedNode && node?.type === NodeType.Async) {
82
+ queueMicrotask(async () => {
83
+ const result = await this.basePlugin?.hooks.onAsyncNode.call(node);
84
+ const parsedNode = options.parseNode && result ? options.parseNode(result) : void 0;
85
+ if (parsedNode) {
86
+ this.resolvedMapping.set(node.id, parsedNode);
87
+ this.currentView?.updateAsync();
88
+ }
89
+ });
90
+ return node;
91
+ }
92
+ return newNode;
93
+ });
94
+ }
95
+ apply(view) {
96
+ view.hooks.parser.tap("template", this.applyParser.bind(this));
97
+ view.hooks.resolver.tap("template", (resolver) => {
98
+ resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
99
+ let resolvedNode;
100
+ if (this.isAsync(node)) {
101
+ const mappedValue = this.resolvedMapping.get(node.id);
102
+ if (mappedValue) {
103
+ resolvedNode = mappedValue;
104
+ }
105
+ } else {
106
+ resolvedNode = null;
107
+ }
108
+ const newNode = resolvedNode || node;
109
+ if (!resolvedNode && node?.type === NodeType.Async) {
110
+ queueMicrotask(async () => {
111
+ const result = await this.basePlugin?.hooks.onAsyncNode.call(node);
112
+ const parsedNode = options.parseNode && result ? options.parseNode(result) : void 0;
113
+ this.resolvedMapping.set(node.id, parsedNode ? parsedNode : node);
114
+ view.updateAsync();
115
+ });
116
+ return node;
117
+ }
118
+ return newNode;
119
+ });
120
+ });
121
+ }
122
+ applyPlugin(asyncNodePlugin) {
123
+ this.basePlugin = asyncNodePlugin;
124
+ }
125
+ };
126
+ export {
127
+ AsyncNodePlugin,
128
+ AsyncNodePluginPlugin
129
+ };
130
+ //# sourceMappingURL=index.mjs.map
package/dist/index.mjs ADDED
@@ -0,0 +1,130 @@
1
+ // ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts
2
+ import { NodeType, getNodeID } from "@player-ui/player";
3
+ import { AsyncParallelBailHook } from "tapable-ts";
4
+ import queueMicrotask from "queue-microtask";
5
+ import { omit } from "timm";
6
+ var AsyncNodePlugin = class {
7
+ constructor(options) {
8
+ this.hooks = {
9
+ onAsyncNode: new AsyncParallelBailHook()
10
+ };
11
+ this.name = "AsyncNode";
12
+ if (options?.plugins) {
13
+ this.plugins = options.plugins;
14
+ options.plugins.forEach((plugin) => {
15
+ plugin.applyPlugin(this);
16
+ });
17
+ }
18
+ }
19
+ apply(player) {
20
+ player.hooks.viewController.tap(this.name, (viewController) => {
21
+ viewController.hooks.view.tap(this.name, (view) => {
22
+ this.plugins?.forEach((plugin) => {
23
+ plugin.apply(view);
24
+ });
25
+ });
26
+ });
27
+ }
28
+ };
29
+ var AsyncNodePluginPlugin = class {
30
+ constructor() {
31
+ this.asyncNode = new AsyncParallelBailHook();
32
+ this.name = "AsyncNode";
33
+ this.resolvedMapping = /* @__PURE__ */ new Map();
34
+ }
35
+ isAsync(node) {
36
+ return node?.type === NodeType.Async;
37
+ }
38
+ applyParser(parser) {
39
+ parser.hooks.determineNodeType.tap(this.name, (obj) => {
40
+ if (Object.prototype.hasOwnProperty.call(obj, "async")) {
41
+ return NodeType.Async;
42
+ }
43
+ });
44
+ parser.hooks.parseNode.tap(
45
+ this.name,
46
+ (obj, nodeType, options, determinedNodeType) => {
47
+ if (determinedNodeType === NodeType.Async) {
48
+ const parsedAsync = parser.parseObject(
49
+ omit(obj, "async"),
50
+ nodeType,
51
+ options
52
+ );
53
+ const parsedNodeId = getNodeID(parsedAsync);
54
+ if (parsedAsync !== null && parsedNodeId) {
55
+ return parser.createASTNode(
56
+ {
57
+ id: parsedNodeId,
58
+ type: NodeType.Async,
59
+ value: parsedAsync
60
+ },
61
+ obj
62
+ );
63
+ }
64
+ return null;
65
+ }
66
+ }
67
+ );
68
+ }
69
+ applyResolverHooks(resolver) {
70
+ resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
71
+ let resolvedNode;
72
+ if (this.isAsync(node)) {
73
+ const mappedValue = this.resolvedMapping.get(node.id);
74
+ if (mappedValue) {
75
+ resolvedNode = mappedValue;
76
+ }
77
+ } else {
78
+ resolvedNode = null;
79
+ }
80
+ const newNode = resolvedNode || node;
81
+ if (!resolvedNode && node?.type === NodeType.Async) {
82
+ queueMicrotask(async () => {
83
+ const result = await this.basePlugin?.hooks.onAsyncNode.call(node);
84
+ const parsedNode = options.parseNode && result ? options.parseNode(result) : void 0;
85
+ if (parsedNode) {
86
+ this.resolvedMapping.set(node.id, parsedNode);
87
+ this.currentView?.updateAsync();
88
+ }
89
+ });
90
+ return node;
91
+ }
92
+ return newNode;
93
+ });
94
+ }
95
+ apply(view) {
96
+ view.hooks.parser.tap("template", this.applyParser.bind(this));
97
+ view.hooks.resolver.tap("template", (resolver) => {
98
+ resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
99
+ let resolvedNode;
100
+ if (this.isAsync(node)) {
101
+ const mappedValue = this.resolvedMapping.get(node.id);
102
+ if (mappedValue) {
103
+ resolvedNode = mappedValue;
104
+ }
105
+ } else {
106
+ resolvedNode = null;
107
+ }
108
+ const newNode = resolvedNode || node;
109
+ if (!resolvedNode && node?.type === NodeType.Async) {
110
+ queueMicrotask(async () => {
111
+ const result = await this.basePlugin?.hooks.onAsyncNode.call(node);
112
+ const parsedNode = options.parseNode && result ? options.parseNode(result) : void 0;
113
+ this.resolvedMapping.set(node.id, parsedNode ? parsedNode : node);
114
+ view.updateAsync();
115
+ });
116
+ return node;
117
+ }
118
+ return newNode;
119
+ });
120
+ });
121
+ }
122
+ applyPlugin(asyncNodePlugin) {
123
+ this.basePlugin = asyncNodePlugin;
124
+ }
125
+ };
126
+ export {
127
+ AsyncNodePlugin,
128
+ AsyncNodePluginPlugin
129
+ };
130
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts"],"sourcesContent":["import { NodeType, getNodeID } from \"@player-ui/player\";\nimport type {\n Player,\n PlayerPlugin,\n Node,\n ParseObjectOptions,\n ViewInstance,\n Parser,\n ViewPlugin,\n Resolver,\n} from \"@player-ui/player\";\nimport { AsyncParallelBailHook } from \"tapable-ts\";\nimport queueMicrotask from \"queue-microtask\";\nimport { omit } from \"timm\";\n\nexport * from \"./types\";\n\nexport interface AsyncNodePluginOptions {\n /** A set of plugins to load */\n plugins?: AsyncNodeViewPlugin[];\n}\n\nexport interface AsyncNodeViewPlugin extends ViewPlugin {\n /** Use this to tap into the async node plugin hooks */\n applyPlugin: (asyncNodePlugin: AsyncNodePlugin) => void;\n\n asyncNode: AsyncParallelBailHook<[Node.Async], any>;\n}\n\n/**\n * Async node plugin used to resolve async nodes in the content\n * If an async node is present, allow users to provide a replacement node to be rendered when ready\n */\nexport class AsyncNodePlugin implements PlayerPlugin {\n private plugins: AsyncNodeViewPlugin[] | undefined;\n\n constructor(options: AsyncNodePluginOptions) {\n if (options?.plugins) {\n this.plugins = options.plugins;\n options.plugins.forEach((plugin) => {\n plugin.applyPlugin(this);\n });\n }\n }\n\n public readonly hooks = {\n onAsyncNode: new AsyncParallelBailHook<[Node.Async], any>(),\n };\n\n name = \"AsyncNode\";\n\n apply(player: Player) {\n player.hooks.viewController.tap(this.name, (viewController) => {\n viewController.hooks.view.tap(this.name, (view) => {\n this.plugins?.forEach((plugin) => {\n plugin.apply(view);\n });\n });\n });\n }\n}\n\nexport class AsyncNodePluginPlugin implements AsyncNodeViewPlugin {\n public asyncNode = new AsyncParallelBailHook<[Node.Async], any>();\n private basePlugin: AsyncNodePlugin | undefined;\n\n name = \"AsyncNode\";\n\n private resolvedMapping = new Map<string, any>();\n\n private currentView: ViewInstance | undefined;\n\n private isAsync(node: Node.Node | null): node is Node.Async {\n return node?.type === NodeType.Async;\n }\n\n applyParser(parser: Parser) {\n parser.hooks.determineNodeType.tap(this.name, (obj) => {\n if (Object.prototype.hasOwnProperty.call(obj, \"async\")) {\n return NodeType.Async;\n }\n });\n parser.hooks.parseNode.tap(\n this.name,\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n determinedNodeType: null | NodeType,\n ) => {\n if (determinedNodeType === NodeType.Async) {\n const parsedAsync = parser.parseObject(\n omit(obj, \"async\"),\n nodeType,\n options,\n );\n const parsedNodeId = getNodeID(parsedAsync);\n if (parsedAsync !== null && parsedNodeId) {\n return parser.createASTNode(\n {\n id: parsedNodeId,\n type: NodeType.Async,\n value: parsedAsync,\n },\n obj,\n );\n }\n\n return null;\n }\n },\n );\n }\n\n applyResolverHooks(resolver: Resolver) {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n let resolvedNode;\n if (this.isAsync(node)) {\n const mappedValue = this.resolvedMapping.get(node.id);\n if (mappedValue) {\n resolvedNode = mappedValue;\n }\n } else {\n resolvedNode = null;\n }\n\n const newNode = resolvedNode || node;\n if (!resolvedNode && node?.type === NodeType.Async) {\n queueMicrotask(async () => {\n const result = await this.basePlugin?.hooks.onAsyncNode.call(node);\n const parsedNode =\n options.parseNode && result ? options.parseNode(result) : undefined;\n\n if (parsedNode) {\n this.resolvedMapping.set(node.id, parsedNode);\n this.currentView?.updateAsync();\n }\n });\n\n return node;\n }\n\n return newNode;\n });\n }\n\n apply(view: ViewInstance): void {\n view.hooks.parser.tap(\"template\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"template\", (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n let resolvedNode;\n if (this.isAsync(node)) {\n const mappedValue = this.resolvedMapping.get(node.id);\n if (mappedValue) {\n resolvedNode = mappedValue;\n }\n } else {\n resolvedNode = null;\n }\n\n const newNode = resolvedNode || node;\n if (!resolvedNode && node?.type === NodeType.Async) {\n queueMicrotask(async () => {\n const result = await this.basePlugin?.hooks.onAsyncNode.call(node);\n const parsedNode =\n options.parseNode && result\n ? options.parseNode(result)\n : undefined;\n\n this.resolvedMapping.set(node.id, parsedNode ? parsedNode : node);\n view.updateAsync();\n });\n\n return node;\n }\n\n return newNode;\n });\n });\n }\n\n applyPlugin(asyncNodePlugin: AsyncNodePlugin): void {\n this.basePlugin = asyncNodePlugin;\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,68 +1,32 @@
1
1
  {
2
2
  "name": "@player-ui/async-node-plugin",
3
- "version": "0.8.0--canary.307.9645",
4
- "private": false,
5
- "publishConfig": {
6
- "registry": "https://registry.npmjs.org"
7
- },
3
+ "version": "0.8.0-next.1",
4
+ "main": "dist/cjs/index.cjs",
8
5
  "peerDependencies": {
9
- "@player-ui/player": "0.8.0--canary.307.9645"
10
- },
11
- "dependencies": {
12
- "tapable-ts": "^0.2.3",
13
- "queue-microtask": "^1.2.3",
14
- "@babel/runtime": "7.15.4"
6
+ "@player-ui/player": "0.8.0-next.1"
15
7
  },
16
- "main": "dist/index.cjs.js",
17
- "module": "dist/index.esm.js",
18
- "typings": "dist/index.d.ts",
8
+ "module": "dist/index.legacy-esm.js",
9
+ "types": "types/index.d.ts",
10
+ "bundle": "dist/AsyncNodePlugin.native.js",
19
11
  "sideEffects": false,
20
- "license": "MIT",
21
- "repository": {
22
- "type": "git",
23
- "url": "https://github.com/player-ui/player-ui"
24
- },
25
- "bugs": {
26
- "url": "https://github.com/player-ui/player-ui/issues"
27
- },
28
- "homepage": "https://player-ui.github.io",
29
- "contributors": [
30
- {
31
- "name": "Adam Dierkens",
32
- "url": "https://github.com/adierkens"
33
- },
34
- {
35
- "name": "Spencer Hamm",
36
- "url": "https://github.com/spentacular"
37
- },
38
- {
39
- "name": "Harris Borawski",
40
- "url": "https://github.com/hborawski"
41
- },
42
- {
43
- "name": "Jeremiah Zucker",
44
- "url": "https://github.com/sugarmanz"
45
- },
46
- {
47
- "name": "Ketan Reddy",
48
- "url": "https://github.com/KetanReddy"
49
- },
50
- {
51
- "name": "Brocollie08",
52
- "url": "https://github.com/brocollie08"
53
- },
54
- {
55
- "name": "Kelly Harrop",
56
- "url": "https://github.com/kharrop"
57
- },
58
- {
59
- "name": "Alejandro Fimbres",
60
- "url": "https://github.com/lexfm"
61
- },
62
- {
63
- "name": "Rafael Campos",
64
- "url": "https://github.com/rafbcampos"
12
+ "exports": {
13
+ "./package.json": "./package.json",
14
+ "./dist/index.css": "./dist/index.css",
15
+ ".": {
16
+ "types": "./types/index.d.ts",
17
+ "import": "./dist/index.mjs",
18
+ "default": "./dist/cjs/index.cjs"
65
19
  }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "src",
24
+ "types"
66
25
  ],
67
- "bundle": "./dist/async-node-plugin.prod.js"
26
+ "dependencies": {
27
+ "queue-microtask": "^1.2.3",
28
+ "tapable-ts": "^0.2.3",
29
+ "timm": "^1.6.2",
30
+ "tslib": "^2.6.2"
31
+ }
68
32
  }