@player-ui/async-node-plugin 0.14.0-next.0 → 0.14.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AsyncNodePlugin.native.js +143 -154
- package/dist/AsyncNodePlugin.native.js.map +1 -1
- package/dist/cjs/index.cjs +34 -16
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +29 -11
- package/dist/index.mjs +29 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/createAsyncTransform.test.ts +192 -2
- package/src/createAsyncTransform.ts +14 -4
- package/src/utils/__tests__/requiresAssetWrapper.test.ts +63 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/requiresAssetWrapper.ts +14 -0
- package/types/utils/index.d.ts +1 -0
- package/types/utils/requiresAssetWrapper.d.ts +3 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -37,7 +37,7 @@ __export(src_exports, {
|
|
|
37
37
|
createAsyncTransform: () => createAsyncTransform
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(src_exports);
|
|
40
|
-
var
|
|
40
|
+
var import_player6 = require("@player-ui/player");
|
|
41
41
|
var import_tapable_ts = require("tapable-ts");
|
|
42
42
|
var import_queue_microtask = __toESM(require("queue-microtask"));
|
|
43
43
|
|
|
@@ -63,7 +63,7 @@ var asyncTransform = (assetId, wrapperAssetType, asset, flatten, path = ["values
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts
|
|
66
|
-
var
|
|
66
|
+
var import_player5 = require("@player-ui/player");
|
|
67
67
|
|
|
68
68
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/extractNodeFromPath.ts
|
|
69
69
|
var getMatchValue = (pathA, pathB) => {
|
|
@@ -148,6 +148,18 @@ var unwrapAsset = (node) => {
|
|
|
148
148
|
return child.value;
|
|
149
149
|
};
|
|
150
150
|
|
|
151
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/requiresAssetWrapper.ts
|
|
152
|
+
var import_player4 = require("@player-ui/player");
|
|
153
|
+
var requiresAssetWrapper = (node) => {
|
|
154
|
+
if (node.type === import_player4.NodeType.Asset) {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
if (node.type !== import_player4.NodeType.Applicability) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
return node.value.type === import_player4.NodeType.Asset;
|
|
161
|
+
};
|
|
162
|
+
|
|
151
163
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts
|
|
152
164
|
var defaultGetNodeId = (node) => {
|
|
153
165
|
return `async-${node.value.id}`;
|
|
@@ -163,7 +175,7 @@ var createAsyncTransform = (options) => {
|
|
|
163
175
|
} = options;
|
|
164
176
|
const replaceNode = (node) => {
|
|
165
177
|
const unwrapped = unwrapAsset(node);
|
|
166
|
-
if (unwrapped.type !==
|
|
178
|
+
if (unwrapped.type !== import_player5.NodeType.Asset || unwrapped.value.type !== transformAssetType) {
|
|
167
179
|
return node;
|
|
168
180
|
}
|
|
169
181
|
const transformed = asyncTransform2(unwrapped);
|
|
@@ -174,19 +186,25 @@ var createAsyncTransform = (options) => {
|
|
|
174
186
|
const id = getAsyncNodeId(node);
|
|
175
187
|
const asset = getNestedAsset?.(node);
|
|
176
188
|
const replaceFunction = flatten ? replacer : void 0;
|
|
177
|
-
const asyncNode =
|
|
189
|
+
const asyncNode = import_player5.Builder.asyncNode(id, flatten, replaceFunction);
|
|
178
190
|
let multiNode;
|
|
179
191
|
if (asset) {
|
|
180
|
-
|
|
181
|
-
|
|
192
|
+
if (requiresAssetWrapper(asset)) {
|
|
193
|
+
const assetWrappedNode = import_player5.Builder.assetWrapper(asset);
|
|
194
|
+
multiNode = import_player5.Builder.multiNode(assetWrappedNode, asyncNode);
|
|
195
|
+
} else if (asset.type === import_player5.NodeType.MultiNode) {
|
|
196
|
+
multiNode = import_player5.Builder.multiNode(...asset.values, asyncNode);
|
|
197
|
+
} else {
|
|
198
|
+
multiNode = import_player5.Builder.multiNode(asset, asyncNode);
|
|
199
|
+
}
|
|
182
200
|
} else {
|
|
183
|
-
multiNode =
|
|
201
|
+
multiNode = import_player5.Builder.multiNode(asyncNode);
|
|
184
202
|
}
|
|
185
|
-
const wrapperAsset =
|
|
203
|
+
const wrapperAsset = import_player5.Builder.asset({
|
|
186
204
|
id: wrapperAssetType + "-" + id,
|
|
187
205
|
type: wrapperAssetType
|
|
188
206
|
});
|
|
189
|
-
|
|
207
|
+
import_player5.Builder.addChild(wrapperAsset, path, multiNode);
|
|
190
208
|
return wrapperAsset;
|
|
191
209
|
};
|
|
192
210
|
return asyncTransform2;
|
|
@@ -307,17 +325,17 @@ var AsyncNodePluginPlugin = class {
|
|
|
307
325
|
resolveAsyncChildren(node, context) {
|
|
308
326
|
const asyncNodesResolved = node.asyncNodesResolved ?? [];
|
|
309
327
|
node.asyncNodesResolved = asyncNodesResolved;
|
|
310
|
-
if (node.type ===
|
|
328
|
+
if (node.type === import_player6.NodeType.MultiNode) {
|
|
311
329
|
let index = 0;
|
|
312
330
|
while (index < node.values.length) {
|
|
313
331
|
const childNode = node.values[index];
|
|
314
|
-
if (childNode?.type !==
|
|
332
|
+
if (childNode?.type !== import_player6.NodeType.Async || !this.hasValidMapping(childNode, context)) {
|
|
315
333
|
index++;
|
|
316
334
|
continue;
|
|
317
335
|
}
|
|
318
336
|
const mappedNode = context.nodeResolveCache.get(childNode.id);
|
|
319
337
|
asyncNodesResolved.push(childNode.id);
|
|
320
|
-
if (mappedNode.type ===
|
|
338
|
+
if (mappedNode.type === import_player6.NodeType.MultiNode && childNode.flatten) {
|
|
321
339
|
mappedNode.values.forEach((v) => v.parent = node);
|
|
322
340
|
node.values = [
|
|
323
341
|
...node.values.slice(0, index),
|
|
@@ -331,7 +349,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
331
349
|
}
|
|
332
350
|
} else if ("children" in node) {
|
|
333
351
|
node.children?.forEach((c) => {
|
|
334
|
-
while (c.value.type ===
|
|
352
|
+
while (c.value.type === import_player6.NodeType.Async && this.hasValidMapping(c.value, context)) {
|
|
335
353
|
asyncNodesResolved.push(c.value.id);
|
|
336
354
|
c.value = context.nodeResolveCache.get(c.value.id);
|
|
337
355
|
c.value.parent = node;
|
|
@@ -369,7 +387,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
369
387
|
}
|
|
370
388
|
}
|
|
371
389
|
isAsync(node) {
|
|
372
|
-
return node?.type ===
|
|
390
|
+
return node?.type === import_player6.NodeType.Async;
|
|
373
391
|
}
|
|
374
392
|
isDeterminedAsync(obj) {
|
|
375
393
|
return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, "async");
|
|
@@ -381,14 +399,14 @@ var AsyncNodePluginPlugin = class {
|
|
|
381
399
|
if (this.isDeterminedAsync(obj)) {
|
|
382
400
|
const { async, flatten, ...rest } = obj;
|
|
383
401
|
const parsedAsync = parser.parseObject(rest, nodeType, options);
|
|
384
|
-
const parsedNodeId = (0,
|
|
402
|
+
const parsedNodeId = (0, import_player6.getNodeID)(parsedAsync);
|
|
385
403
|
if (parsedAsync === null || !parsedNodeId) {
|
|
386
404
|
return childOptions ? [] : null;
|
|
387
405
|
}
|
|
388
406
|
const asyncAST = parser.createASTNode(
|
|
389
407
|
{
|
|
390
408
|
id: parsedNodeId,
|
|
391
|
-
type:
|
|
409
|
+
type: import_player6.NodeType.Async,
|
|
392
410
|
value: parsedAsync,
|
|
393
411
|
flatten
|
|
394
412
|
},
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/transform.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/extractNodeFromPath.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/traverseAndReplace.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/unwrapAsset.ts"],"sourcesContent":["import { NodeType, getNodeID } from \"@player-ui/player\";\nimport type {\n Player,\n PlayerPlugin,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n ViewInstance,\n Parser,\n ViewPlugin,\n Resolver,\n Resolve,\n} from \"@player-ui/player\";\nimport { AsyncParallelBailHook, SyncBailHook } from \"tapable-ts\";\nimport queueMicrotask from \"queue-microtask\";\n\nexport * from \"./types\";\nexport * from \"./transform\";\nexport * from \"./createAsyncTransform\";\n\n/** Object type for storing data related to a single `apply` of the `AsyncNodePluginPlugin`\n * This object should be setup once per ViewInstance to keep any cached info just for that view to avoid conflicts of shared async node ids across different view states.\n */\ntype AsyncPluginContext = {\n /** Map of async node id to resolved content */\n nodeResolveCache: Map<string, any>;\n /** The view instance this context is attached to. */\n view: ViewInstance;\n /** Map of async node id to promises being used to resolve them */\n inProgressNodes: Set<string>;\n};\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, (result: any) => void], any>;\n}\nexport type AsyncHandler = (\n node: Node.Async,\n callback?: (result: any) => void,\n) => Promise<any>;\n\nexport type AsyncContent = {\n async: true;\n flatten?: boolean;\n [key: string]: unknown;\n};\n\n/** Hook declaration for the AsyncNodePlugin */\nexport type AsyncNodeHooks = {\n /** Async hook to get content for an async node */\n onAsyncNode: AsyncParallelBailHook<[Node.Async, (result: any) => void], any>;\n /** Sync hook to manage errors coming from the onAsyncNode hook. Return a fallback node or null to render a fallback. The first argument of passed in the call is the error thrown. */\n onAsyncNodeError: SyncBailHook<[Error, Node.Async], any>;\n};\n\nexport const AsyncNodePluginSymbol: symbol = Symbol.for(\"AsyncNodePlugin\");\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 private playerInstance: Player | undefined;\n\n static Symbol: symbol = AsyncNodePluginSymbol;\n public readonly symbol: symbol = AsyncNodePlugin.Symbol;\n\n constructor(options: AsyncNodePluginOptions, asyncHandler?: AsyncHandler) {\n if (options?.plugins) {\n this.plugins = options.plugins;\n options.plugins.forEach((plugin) => {\n plugin.applyPlugin(this);\n });\n }\n\n if (asyncHandler) {\n this.hooks.onAsyncNode.tap(\n \"async\",\n async (node: Node.Async, callback) => {\n return await asyncHandler(node, callback);\n },\n );\n }\n }\n\n public readonly hooks: AsyncNodeHooks = {\n onAsyncNode: new AsyncParallelBailHook(),\n onAsyncNodeError: new SyncBailHook(),\n };\n\n getPlayerInstance(): Player | undefined {\n return this.playerInstance;\n }\n\n name = \"AsyncNode\";\n\n apply(player: Player): void {\n this.playerInstance = player;\n\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: AsyncParallelBailHook<\n [Node.Async, (result: any) => void],\n any\n > = new AsyncParallelBailHook();\n private basePlugin: AsyncNodePlugin | undefined;\n\n name = \"AsyncNode\";\n\n /**\n * Parses the node from the result and triggers an asynchronous view update if necessary.\n * @param node The asynchronous node that might be updated.\n * @param result The result obtained from resolving the async node. This could be any data structure or value.\n * @param options Options provided for node resolution, including a potential parseNode function to process the result.\n * @param view The view instance where the node resides. This can be undefined if the view is not currently active.\n */\n private parseNodeAndUpdate(\n node: Node.Async,\n context: AsyncPluginContext,\n result: any,\n options: Resolve.NodeResolveOptions,\n ) {\n let parsedNode =\n options.parseNode && result ? options.parseNode(result) : undefined;\n\n if (parsedNode && node.onValueReceived) {\n parsedNode = node.onValueReceived(parsedNode);\n }\n\n this.handleAsyncUpdate(node, context, parsedNode);\n }\n\n /**\n * Updates the node asynchronously based on the result provided.\n * This method is responsible for handling the update logic of asynchronous nodes.\n * It checks if the node needs to be updated based on the new result and updates the mapping accordingly.\n * If an update is necessary, it triggers an asynchronous update on the view.\n * @param node The asynchronous node that might be updated.\n * @param newNode The new node to replace the async node.\n * @param view The view instance where the node resides. This can be undefined if the view is not currently active.\n */\n private handleAsyncUpdate(\n node: Node.Async,\n context: AsyncPluginContext,\n newNode?: Node.Node | null,\n ) {\n const { nodeResolveCache, view } = context;\n if (nodeResolveCache.get(node.id) !== newNode) {\n nodeResolveCache.set(node.id, newNode ? newNode : node);\n view.updateAsync(node.id);\n }\n }\n\n private hasValidMapping(\n node: Node.Async,\n context: AsyncPluginContext,\n ): boolean {\n const { nodeResolveCache } = context;\n return (\n nodeResolveCache.has(node.id) && nodeResolveCache.get(node.id) !== node\n );\n }\n\n /**\n * Handles the asynchronous API integration for resolving nodes.\n * This method sets up a hook on the resolver's `beforeResolve` event to process async nodes.\n * @param resolver The resolver instance to attach the hook to.\n * @param view\n */\n applyResolver(resolver: Resolver, context: AsyncPluginContext): void {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (!this.isAsync(node)) {\n return node === null ? node : this.resolveAsyncChildren(node, context);\n }\n\n const resolvedNode = context.nodeResolveCache.get(node.id);\n if (resolvedNode !== undefined) {\n return this.resolveAsyncChildren(resolvedNode, context);\n }\n\n if (context.inProgressNodes.has(node.id)) {\n return node;\n }\n\n // Track that the node is in progress.\n context.inProgressNodes.add(node.id);\n queueMicrotask(() => {\n this.runAsyncNode(node, context, options).finally();\n });\n\n return node;\n });\n }\n\n /**\n * Replaces child async nodes with their resolved content and flattens when necessary. Resolving the children directly helps manage the `parent` reference without needing as much work within the resolver itself.\n * Handles async node chains as well to make sure all applicable nodes can get flattened.\n * @param node - The node whose children need to be resolved.\n * @param context - the async plugin context needed to reach into the cache\n * @returns The same node but with async node children mapped to their resolved AST.\n */\n private resolveAsyncChildren(\n node: Node.Node,\n context: AsyncPluginContext,\n ): Node.Node {\n const asyncNodesResolved: string[] = node.asyncNodesResolved ?? [];\n node.asyncNodesResolved = asyncNodesResolved;\n if (node.type === NodeType.MultiNode) {\n // Using a while loop lets us catch when async nodes produce more async nodes that need to be flattened further\n let index = 0;\n while (index < node.values.length) {\n const childNode = node.values[index];\n if (\n childNode?.type !== NodeType.Async ||\n !this.hasValidMapping(childNode, context)\n ) {\n index++;\n continue;\n }\n\n const mappedNode = context.nodeResolveCache.get(childNode.id);\n asyncNodesResolved.push(childNode.id);\n if (mappedNode.type === NodeType.MultiNode && childNode.flatten) {\n mappedNode.values.forEach((v: Node.Node) => (v.parent = node));\n node.values = [\n ...node.values.slice(0, index),\n ...mappedNode.values,\n ...node.values.slice(index + 1),\n ];\n } else {\n node.values[index] = mappedNode;\n mappedNode.parent = node;\n }\n }\n } else if (\"children\" in node) {\n node.children?.forEach((c) => {\n // Similar to above, using a while loop lets us handle when async nodes produce more async nodes.\n while (\n c.value.type === NodeType.Async &&\n this.hasValidMapping(c.value, context)\n ) {\n asyncNodesResolved.push(c.value.id);\n c.value = context.nodeResolveCache.get(c.value.id);\n c.value.parent = node;\n }\n });\n }\n\n return node;\n }\n\n private async runAsyncNode(\n node: Node.Async,\n context: AsyncPluginContext,\n options: Resolve.NodeResolveOptions,\n ) {\n try {\n const result = await this.basePlugin?.hooks.onAsyncNode.call(\n node,\n (result) => {\n this.parseNodeAndUpdate(node, context, result, options);\n },\n );\n\n // Stop tracking before the next update is triggered\n context.inProgressNodes.delete(node.id);\n this.parseNodeAndUpdate(node, context, result, options);\n } catch (e: unknown) {\n const error = e instanceof Error ? e : new Error(String(e));\n const result = this.basePlugin?.hooks.onAsyncNodeError.call(error, node);\n\n if (result === undefined) {\n const playerState = this.basePlugin?.getPlayerInstance()?.getState();\n\n if (playerState?.status === \"in-progress\") {\n playerState.fail(error);\n }\n\n return;\n }\n\n options.logger?.error(\n \"Async node handling failed and resolved with a fallback. Error:\",\n error,\n );\n\n // Stop tracking before the next update is triggered\n context.inProgressNodes.delete(node.id);\n this.parseNodeAndUpdate(node, context, result, options);\n }\n }\n\n private isAsync(node: Node.Node | null): node is Node.Async {\n return node?.type === NodeType.Async;\n }\n\n private isDeterminedAsync(obj: unknown): obj is AsyncContent {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n Object.prototype.hasOwnProperty.call(obj, \"async\")\n );\n }\n\n applyParser(parser: Parser): void {\n parser.hooks.parseNode.tap(\n this.name,\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (this.isDeterminedAsync(obj)) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { async, flatten, ...rest } = obj;\n const parsedAsync = parser.parseObject(rest, nodeType, options);\n const parsedNodeId = getNodeID(parsedAsync);\n\n if (parsedAsync === null || !parsedNodeId) {\n return childOptions ? [] : null;\n }\n\n const asyncAST = parser.createASTNode(\n {\n id: parsedNodeId,\n type: NodeType.Async,\n value: parsedAsync,\n flatten,\n },\n obj,\n );\n\n if (childOptions) {\n return asyncAST\n ? [\n {\n path: [...childOptions.path, childOptions.key],\n value: asyncAST,\n },\n ]\n : [];\n }\n\n return asyncAST;\n }\n },\n );\n }\n\n apply(view: ViewInstance): void {\n const context: AsyncPluginContext = {\n nodeResolveCache: new Map(),\n inProgressNodes: new Set(),\n view,\n };\n\n view.hooks.parser.tap(\"async\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"async\", (resolver) => {\n this.applyResolver(resolver, context);\n });\n }\n\n applyPlugin(asyncNodePlugin: AsyncNodePlugin): void {\n this.basePlugin = asyncNodePlugin;\n }\n}\n","import { Builder } from \"@player-ui/player\";\nimport type { AsyncTransformFunc } from \"./types\";\n\n/**\n * @deprecated Use {@link createAsyncTransform} to create your before transform function.\n * Util function to generate transform function for async asset\n * @param asset - async asset to apply beforeResolve transform\n * @param wrapperAssetType: container asset type\n * @param flatten: flatten the streamed in content\n * @param path: property path to add the multinode containing the next async node to\n * @returns - wrapper asset with children of transformed asset and async node\n */\n\nexport const asyncTransform: AsyncTransformFunc = (\n assetId,\n wrapperAssetType,\n asset,\n flatten,\n path = [\"values\"],\n) => {\n const id = \"async-\" + assetId;\n\n const asyncNode = Builder.asyncNode(id, flatten);\n\n let multiNode;\n let assetNode;\n\n if (asset) {\n assetNode = Builder.assetWrapper(asset);\n multiNode = Builder.multiNode(assetNode, asyncNode);\n } else {\n multiNode = Builder.multiNode(asyncNode);\n }\n\n const wrapperAsset = Builder.asset({\n id: wrapperAssetType + \"-\" + id,\n type: wrapperAssetType,\n });\n\n Builder.addChild(wrapperAsset, path, multiNode);\n\n return wrapperAsset;\n};\n","import {\n BeforeTransformFunction,\n Builder,\n Node,\n NodeType,\n} from \"@player-ui/player\";\nimport { extractNodeFromPath, traverseAndReplace, unwrapAsset } from \"./utils\";\n\nexport type AsyncTransformOptions = {\n /** Whether or not to flatten the results into its container. Defaults to true */\n flatten?: boolean;\n /** The path to the array within the `wrapperAssetType` that will contain the async content. Defaults to [\"values\"] */\n path?: string[];\n /** The asset type that the transform is matching against. */\n transformAssetType: string;\n /** The asset type that will contain the async content. */\n wrapperAssetType: string;\n /** Function to get any nested asset that will need to be extracted and kept when creating the wrapper asset. */\n getNestedAsset?: (node: Node.ViewOrAsset) => Node.Node | undefined;\n /** Function to get the id for the async node being generated. Defaults to creating an id with the format of async-<ASSET.ID> */\n getAsyncNodeId?: (node: Node.ViewOrAsset) => string;\n};\n\nconst defaultGetNodeId = (node: Node.ViewOrAsset): string => {\n return `async-${node.value.id}`;\n};\n\n/** Creates a BeforeTransformFunction that turns the given asset into a wrapper asset with an async node in it.\n * By setting {@link AsyncTransformOptions.flatten} to true, you can chain multiple of the same asset type to create a flow of async content that\n * exists within a single collection.\n *\n * @param options - Options for managing the transform\n * @returns The {@link BeforeTransformFunction} that can be used for your asset.\n */\nexport const createAsyncTransform = (\n options: AsyncTransformOptions,\n): BeforeTransformFunction => {\n const {\n transformAssetType,\n wrapperAssetType,\n getNestedAsset,\n getAsyncNodeId = defaultGetNodeId,\n path = [\"values\"],\n flatten = true,\n } = options;\n\n const replaceNode = (node: Node.Node): Node.Node => {\n const unwrapped = unwrapAsset(node);\n\n if (\n unwrapped.type !== NodeType.Asset ||\n unwrapped.value.type !== transformAssetType\n ) {\n return node;\n }\n\n const transformed = asyncTransform(unwrapped);\n return extractNodeFromPath(transformed, path) ?? node;\n };\n\n const replacer = (node: Node.Node) => traverseAndReplace(node, replaceNode);\n\n const asyncTransform = (node: Node.ViewOrAsset) => {\n const id = getAsyncNodeId(node);\n const asset = getNestedAsset?.(node);\n\n // If flattening is disabled, don't need to extract the multi-node when async node is resolved.\n const replaceFunction = flatten ? replacer : undefined;\n const asyncNode = Builder.asyncNode(id, flatten, replaceFunction);\n\n let multiNode: Node.MultiNode | undefined;\n\n if (asset) {\n const assetNode = Builder.assetWrapper(asset);\n multiNode = Builder.multiNode(assetNode, asyncNode);\n } else {\n multiNode = Builder.multiNode(asyncNode);\n }\n\n const wrapperAsset: Node.ViewOrAsset = Builder.asset({\n id: wrapperAssetType + \"-\" + id,\n type: wrapperAssetType,\n });\n\n Builder.addChild(wrapperAsset, path, multiNode);\n\n return wrapperAsset;\n };\n\n return asyncTransform;\n};\n","import type { Node } from \"@player-ui/player\";\n\n/** Matches 2 segments where pathA matches or is a subset of pathB. Returns the number of matching segments */\nconst getMatchValue = (\n pathA: Node.PathSegment[],\n pathB: Node.PathSegment[],\n): number => {\n if (pathA.length > pathB.length) {\n return 0;\n }\n\n let matchCount = 0;\n for (let i = 0; i < pathA.length; i++) {\n if (pathA[i] === pathB[i]) {\n matchCount++;\n } else {\n return 0;\n }\n }\n\n return matchCount;\n};\n\n/** Follows the given path and returns the node. If there is no match, returns undefined */\nexport const extractNodeFromPath = (\n node: Node.Node,\n path?: string[],\n): Node.Node | undefined => {\n if (path === undefined || path.length === 0) {\n return node;\n }\n\n if (!(\"children\" in node && node.children)) {\n return undefined;\n }\n\n let matchResult = 0;\n let bestMatch: Node.Child | undefined;\n for (const child of node.children) {\n const matchValue = getMatchValue(child.path, path);\n if (matchValue > matchResult) {\n matchResult = matchValue;\n bestMatch = child;\n }\n }\n\n if (!bestMatch) {\n return undefined;\n }\n\n if (matchResult >= path.length) {\n return bestMatch.value;\n }\n\n return extractNodeFromPath(bestMatch.value, path.slice(matchResult));\n};\n","import { NodeType, Node } from \"@player-ui/player\";\n\n/** Replaces a node using the given replace function. If the node is a multi-node it does this transformation to all of its values. */\nexport const traverseAndReplace = (\n node: Node.Node,\n replaceFn: (node: Node.Node) => Node.Node,\n): Node.Node => {\n if (node.type === NodeType.MultiNode) {\n let index = 0;\n while (index < node.values.length) {\n const child = node.values[index];\n if (!child) {\n index++;\n continue;\n }\n\n const result = replaceFn(child);\n if (result.type === NodeType.MultiNode) {\n node.values = [\n ...node.values.slice(0, index),\n ...result.values,\n ...node.values.slice(index + 1),\n ];\n } else {\n node.values[index] = result;\n index++;\n }\n }\n\n return node;\n }\n\n return replaceFn(node);\n};\n","import { NodeType, Node } from \"@player-ui/player\";\n\nexport const unwrapAsset = (node: Node.Node): Node.Node => {\n if (node.type !== NodeType.Value) {\n return node;\n }\n const child = node.children?.find(\n (x) => x.path.length === 1 && x.path[0] === \"asset\",\n );\n\n if (!child) {\n return node;\n }\n\n return child.value;\n};\n"],"mappings":"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","names":["import_player","import_player","import_player","import_player","asyncTransform","queueMicrotask","result"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/transform.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/extractNodeFromPath.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/traverseAndReplace.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/unwrapAsset.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/requiresAssetWrapper.ts"],"sourcesContent":["import { NodeType, getNodeID } from \"@player-ui/player\";\nimport type {\n Player,\n PlayerPlugin,\n Node,\n ParseObjectOptions,\n ParseObjectChildOptions,\n ViewInstance,\n Parser,\n ViewPlugin,\n Resolver,\n Resolve,\n} from \"@player-ui/player\";\nimport { AsyncParallelBailHook, SyncBailHook } from \"tapable-ts\";\nimport queueMicrotask from \"queue-microtask\";\n\nexport * from \"./types\";\nexport * from \"./transform\";\nexport * from \"./createAsyncTransform\";\n\n/** Object type for storing data related to a single `apply` of the `AsyncNodePluginPlugin`\n * This object should be setup once per ViewInstance to keep any cached info just for that view to avoid conflicts of shared async node ids across different view states.\n */\ntype AsyncPluginContext = {\n /** Map of async node id to resolved content */\n nodeResolveCache: Map<string, any>;\n /** The view instance this context is attached to. */\n view: ViewInstance;\n /** Map of async node id to promises being used to resolve them */\n inProgressNodes: Set<string>;\n};\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, (result: any) => void], any>;\n}\nexport type AsyncHandler = (\n node: Node.Async,\n callback?: (result: any) => void,\n) => Promise<any>;\n\nexport type AsyncContent = {\n async: true;\n flatten?: boolean;\n [key: string]: unknown;\n};\n\n/** Hook declaration for the AsyncNodePlugin */\nexport type AsyncNodeHooks = {\n /** Async hook to get content for an async node */\n onAsyncNode: AsyncParallelBailHook<[Node.Async, (result: any) => void], any>;\n /** Sync hook to manage errors coming from the onAsyncNode hook. Return a fallback node or null to render a fallback. The first argument of passed in the call is the error thrown. */\n onAsyncNodeError: SyncBailHook<[Error, Node.Async], any>;\n};\n\nexport const AsyncNodePluginSymbol: symbol = Symbol.for(\"AsyncNodePlugin\");\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 private playerInstance: Player | undefined;\n\n static Symbol: symbol = AsyncNodePluginSymbol;\n public readonly symbol: symbol = AsyncNodePlugin.Symbol;\n\n constructor(options: AsyncNodePluginOptions, asyncHandler?: AsyncHandler) {\n if (options?.plugins) {\n this.plugins = options.plugins;\n options.plugins.forEach((plugin) => {\n plugin.applyPlugin(this);\n });\n }\n\n if (asyncHandler) {\n this.hooks.onAsyncNode.tap(\n \"async\",\n async (node: Node.Async, callback) => {\n return await asyncHandler(node, callback);\n },\n );\n }\n }\n\n public readonly hooks: AsyncNodeHooks = {\n onAsyncNode: new AsyncParallelBailHook(),\n onAsyncNodeError: new SyncBailHook(),\n };\n\n getPlayerInstance(): Player | undefined {\n return this.playerInstance;\n }\n\n name = \"AsyncNode\";\n\n apply(player: Player): void {\n this.playerInstance = player;\n\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: AsyncParallelBailHook<\n [Node.Async, (result: any) => void],\n any\n > = new AsyncParallelBailHook();\n private basePlugin: AsyncNodePlugin | undefined;\n\n name = \"AsyncNode\";\n\n /**\n * Parses the node from the result and triggers an asynchronous view update if necessary.\n * @param node The asynchronous node that might be updated.\n * @param result The result obtained from resolving the async node. This could be any data structure or value.\n * @param options Options provided for node resolution, including a potential parseNode function to process the result.\n * @param view The view instance where the node resides. This can be undefined if the view is not currently active.\n */\n private parseNodeAndUpdate(\n node: Node.Async,\n context: AsyncPluginContext,\n result: any,\n options: Resolve.NodeResolveOptions,\n ) {\n let parsedNode =\n options.parseNode && result ? options.parseNode(result) : undefined;\n\n if (parsedNode && node.onValueReceived) {\n parsedNode = node.onValueReceived(parsedNode);\n }\n\n this.handleAsyncUpdate(node, context, parsedNode);\n }\n\n /**\n * Updates the node asynchronously based on the result provided.\n * This method is responsible for handling the update logic of asynchronous nodes.\n * It checks if the node needs to be updated based on the new result and updates the mapping accordingly.\n * If an update is necessary, it triggers an asynchronous update on the view.\n * @param node The asynchronous node that might be updated.\n * @param newNode The new node to replace the async node.\n * @param view The view instance where the node resides. This can be undefined if the view is not currently active.\n */\n private handleAsyncUpdate(\n node: Node.Async,\n context: AsyncPluginContext,\n newNode?: Node.Node | null,\n ) {\n const { nodeResolveCache, view } = context;\n if (nodeResolveCache.get(node.id) !== newNode) {\n nodeResolveCache.set(node.id, newNode ? newNode : node);\n view.updateAsync(node.id);\n }\n }\n\n private hasValidMapping(\n node: Node.Async,\n context: AsyncPluginContext,\n ): boolean {\n const { nodeResolveCache } = context;\n return (\n nodeResolveCache.has(node.id) && nodeResolveCache.get(node.id) !== node\n );\n }\n\n /**\n * Handles the asynchronous API integration for resolving nodes.\n * This method sets up a hook on the resolver's `beforeResolve` event to process async nodes.\n * @param resolver The resolver instance to attach the hook to.\n * @param view\n */\n applyResolver(resolver: Resolver, context: AsyncPluginContext): void {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (!this.isAsync(node)) {\n return node === null ? node : this.resolveAsyncChildren(node, context);\n }\n\n const resolvedNode = context.nodeResolveCache.get(node.id);\n if (resolvedNode !== undefined) {\n return this.resolveAsyncChildren(resolvedNode, context);\n }\n\n if (context.inProgressNodes.has(node.id)) {\n return node;\n }\n\n // Track that the node is in progress.\n context.inProgressNodes.add(node.id);\n queueMicrotask(() => {\n this.runAsyncNode(node, context, options).finally();\n });\n\n return node;\n });\n }\n\n /**\n * Replaces child async nodes with their resolved content and flattens when necessary. Resolving the children directly helps manage the `parent` reference without needing as much work within the resolver itself.\n * Handles async node chains as well to make sure all applicable nodes can get flattened.\n * @param node - The node whose children need to be resolved.\n * @param context - the async plugin context needed to reach into the cache\n * @returns The same node but with async node children mapped to their resolved AST.\n */\n private resolveAsyncChildren(\n node: Node.Node,\n context: AsyncPluginContext,\n ): Node.Node {\n const asyncNodesResolved: string[] = node.asyncNodesResolved ?? [];\n node.asyncNodesResolved = asyncNodesResolved;\n if (node.type === NodeType.MultiNode) {\n // Using a while loop lets us catch when async nodes produce more async nodes that need to be flattened further\n let index = 0;\n while (index < node.values.length) {\n const childNode = node.values[index];\n if (\n childNode?.type !== NodeType.Async ||\n !this.hasValidMapping(childNode, context)\n ) {\n index++;\n continue;\n }\n\n const mappedNode = context.nodeResolveCache.get(childNode.id);\n asyncNodesResolved.push(childNode.id);\n if (mappedNode.type === NodeType.MultiNode && childNode.flatten) {\n mappedNode.values.forEach((v: Node.Node) => (v.parent = node));\n node.values = [\n ...node.values.slice(0, index),\n ...mappedNode.values,\n ...node.values.slice(index + 1),\n ];\n } else {\n node.values[index] = mappedNode;\n mappedNode.parent = node;\n }\n }\n } else if (\"children\" in node) {\n node.children?.forEach((c) => {\n // Similar to above, using a while loop lets us handle when async nodes produce more async nodes.\n while (\n c.value.type === NodeType.Async &&\n this.hasValidMapping(c.value, context)\n ) {\n asyncNodesResolved.push(c.value.id);\n c.value = context.nodeResolveCache.get(c.value.id);\n c.value.parent = node;\n }\n });\n }\n\n return node;\n }\n\n private async runAsyncNode(\n node: Node.Async,\n context: AsyncPluginContext,\n options: Resolve.NodeResolveOptions,\n ) {\n try {\n const result = await this.basePlugin?.hooks.onAsyncNode.call(\n node,\n (result) => {\n this.parseNodeAndUpdate(node, context, result, options);\n },\n );\n\n // Stop tracking before the next update is triggered\n context.inProgressNodes.delete(node.id);\n this.parseNodeAndUpdate(node, context, result, options);\n } catch (e: unknown) {\n const error = e instanceof Error ? e : new Error(String(e));\n const result = this.basePlugin?.hooks.onAsyncNodeError.call(error, node);\n\n if (result === undefined) {\n const playerState = this.basePlugin?.getPlayerInstance()?.getState();\n\n if (playerState?.status === \"in-progress\") {\n playerState.fail(error);\n }\n\n return;\n }\n\n options.logger?.error(\n \"Async node handling failed and resolved with a fallback. Error:\",\n error,\n );\n\n // Stop tracking before the next update is triggered\n context.inProgressNodes.delete(node.id);\n this.parseNodeAndUpdate(node, context, result, options);\n }\n }\n\n private isAsync(node: Node.Node | null): node is Node.Async {\n return node?.type === NodeType.Async;\n }\n\n private isDeterminedAsync(obj: unknown): obj is AsyncContent {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n Object.prototype.hasOwnProperty.call(obj, \"async\")\n );\n }\n\n applyParser(parser: Parser): void {\n parser.hooks.parseNode.tap(\n this.name,\n (\n obj: any,\n nodeType: Node.ChildrenTypes,\n options: ParseObjectOptions,\n childOptions?: ParseObjectChildOptions,\n ) => {\n if (this.isDeterminedAsync(obj)) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { async, flatten, ...rest } = obj;\n const parsedAsync = parser.parseObject(rest, nodeType, options);\n const parsedNodeId = getNodeID(parsedAsync);\n\n if (parsedAsync === null || !parsedNodeId) {\n return childOptions ? [] : null;\n }\n\n const asyncAST = parser.createASTNode(\n {\n id: parsedNodeId,\n type: NodeType.Async,\n value: parsedAsync,\n flatten,\n },\n obj,\n );\n\n if (childOptions) {\n return asyncAST\n ? [\n {\n path: [...childOptions.path, childOptions.key],\n value: asyncAST,\n },\n ]\n : [];\n }\n\n return asyncAST;\n }\n },\n );\n }\n\n apply(view: ViewInstance): void {\n const context: AsyncPluginContext = {\n nodeResolveCache: new Map(),\n inProgressNodes: new Set(),\n view,\n };\n\n view.hooks.parser.tap(\"async\", this.applyParser.bind(this));\n view.hooks.resolver.tap(\"async\", (resolver) => {\n this.applyResolver(resolver, context);\n });\n }\n\n applyPlugin(asyncNodePlugin: AsyncNodePlugin): void {\n this.basePlugin = asyncNodePlugin;\n }\n}\n","import { Builder } from \"@player-ui/player\";\nimport type { AsyncTransformFunc } from \"./types\";\n\n/**\n * @deprecated Use {@link createAsyncTransform} to create your before transform function.\n * Util function to generate transform function for async asset\n * @param asset - async asset to apply beforeResolve transform\n * @param wrapperAssetType: container asset type\n * @param flatten: flatten the streamed in content\n * @param path: property path to add the multinode containing the next async node to\n * @returns - wrapper asset with children of transformed asset and async node\n */\n\nexport const asyncTransform: AsyncTransformFunc = (\n assetId,\n wrapperAssetType,\n asset,\n flatten,\n path = [\"values\"],\n) => {\n const id = \"async-\" + assetId;\n\n const asyncNode = Builder.asyncNode(id, flatten);\n\n let multiNode;\n let assetNode;\n\n if (asset) {\n assetNode = Builder.assetWrapper(asset);\n multiNode = Builder.multiNode(assetNode, asyncNode);\n } else {\n multiNode = Builder.multiNode(asyncNode);\n }\n\n const wrapperAsset = Builder.asset({\n id: wrapperAssetType + \"-\" + id,\n type: wrapperAssetType,\n });\n\n Builder.addChild(wrapperAsset, path, multiNode);\n\n return wrapperAsset;\n};\n","import {\n BeforeTransformFunction,\n Builder,\n Node,\n NodeType,\n} from \"@player-ui/player\";\nimport {\n extractNodeFromPath,\n requiresAssetWrapper,\n traverseAndReplace,\n unwrapAsset,\n} from \"./utils\";\n\nexport type AsyncTransformOptions = {\n /** Whether or not to flatten the results into its container. Defaults to true */\n flatten?: boolean;\n /** The path to the array within the `wrapperAssetType` that will contain the async content. Defaults to [\"values\"] */\n path?: string[];\n /** The asset type that the transform is matching against. */\n transformAssetType: string;\n /** The asset type that will contain the async content. */\n wrapperAssetType: string;\n /** Function to get any nested asset that will need to be extracted and kept when creating the wrapper asset. */\n getNestedAsset?: (node: Node.ViewOrAsset) => Node.Node | undefined;\n /** Function to get the id for the async node being generated. Defaults to creating an id with the format of async-<ASSET.ID> */\n getAsyncNodeId?: (node: Node.ViewOrAsset) => string;\n};\n\nconst defaultGetNodeId = (node: Node.ViewOrAsset): string => {\n return `async-${node.value.id}`;\n};\n\n/** Creates a BeforeTransformFunction that turns the given asset into a wrapper asset with an async node in it.\n * By setting {@link AsyncTransformOptions.flatten} to true, you can chain multiple of the same asset type to create a flow of async content that\n * exists within a single collection.\n *\n * @param options - Options for managing the transform\n * @returns The {@link BeforeTransformFunction} that can be used for your asset.\n */\nexport const createAsyncTransform = (\n options: AsyncTransformOptions,\n): BeforeTransformFunction => {\n const {\n transformAssetType,\n wrapperAssetType,\n getNestedAsset,\n getAsyncNodeId = defaultGetNodeId,\n path = [\"values\"],\n flatten = true,\n } = options;\n\n const replaceNode = (node: Node.Node): Node.Node => {\n const unwrapped = unwrapAsset(node);\n\n if (\n unwrapped.type !== NodeType.Asset ||\n unwrapped.value.type !== transformAssetType\n ) {\n return node;\n }\n\n const transformed = asyncTransform(unwrapped);\n return extractNodeFromPath(transformed, path) ?? node;\n };\n\n const replacer = (node: Node.Node) => traverseAndReplace(node, replaceNode);\n\n const asyncTransform = (node: Node.ViewOrAsset) => {\n const id = getAsyncNodeId(node);\n const asset = getNestedAsset?.(node);\n\n // If flattening is disabled, don't need to extract the multi-node when async node is resolved.\n const replaceFunction = flatten ? replacer : undefined;\n const asyncNode = Builder.asyncNode(id, flatten, replaceFunction);\n\n let multiNode: Node.MultiNode | undefined;\n if (asset) {\n if (requiresAssetWrapper(asset)) {\n const assetWrappedNode = Builder.assetWrapper(asset);\n multiNode = Builder.multiNode(assetWrappedNode, asyncNode);\n } else if (asset.type === NodeType.MultiNode) {\n multiNode = Builder.multiNode(...(asset.values as any[]), asyncNode);\n } else {\n multiNode = Builder.multiNode(asset as any, asyncNode);\n }\n } else {\n multiNode = Builder.multiNode(asyncNode);\n }\n\n const wrapperAsset: Node.ViewOrAsset = Builder.asset({\n id: wrapperAssetType + \"-\" + id,\n type: wrapperAssetType,\n });\n\n Builder.addChild(wrapperAsset, path, multiNode);\n\n return wrapperAsset;\n };\n\n return asyncTransform;\n};\n","import type { Node } from \"@player-ui/player\";\n\n/** Matches 2 segments where pathA matches or is a subset of pathB. Returns the number of matching segments */\nconst getMatchValue = (\n pathA: Node.PathSegment[],\n pathB: Node.PathSegment[],\n): number => {\n if (pathA.length > pathB.length) {\n return 0;\n }\n\n let matchCount = 0;\n for (let i = 0; i < pathA.length; i++) {\n if (pathA[i] === pathB[i]) {\n matchCount++;\n } else {\n return 0;\n }\n }\n\n return matchCount;\n};\n\n/** Follows the given path and returns the node. If there is no match, returns undefined */\nexport const extractNodeFromPath = (\n node: Node.Node,\n path?: string[],\n): Node.Node | undefined => {\n if (path === undefined || path.length === 0) {\n return node;\n }\n\n if (!(\"children\" in node && node.children)) {\n return undefined;\n }\n\n let matchResult = 0;\n let bestMatch: Node.Child | undefined;\n for (const child of node.children) {\n const matchValue = getMatchValue(child.path, path);\n if (matchValue > matchResult) {\n matchResult = matchValue;\n bestMatch = child;\n }\n }\n\n if (!bestMatch) {\n return undefined;\n }\n\n if (matchResult >= path.length) {\n return bestMatch.value;\n }\n\n return extractNodeFromPath(bestMatch.value, path.slice(matchResult));\n};\n","import { NodeType, Node } from \"@player-ui/player\";\n\n/** Replaces a node using the given replace function. If the node is a multi-node it does this transformation to all of its values. */\nexport const traverseAndReplace = (\n node: Node.Node,\n replaceFn: (node: Node.Node) => Node.Node,\n): Node.Node => {\n if (node.type === NodeType.MultiNode) {\n let index = 0;\n while (index < node.values.length) {\n const child = node.values[index];\n if (!child) {\n index++;\n continue;\n }\n\n const result = replaceFn(child);\n if (result.type === NodeType.MultiNode) {\n node.values = [\n ...node.values.slice(0, index),\n ...result.values,\n ...node.values.slice(index + 1),\n ];\n } else {\n node.values[index] = result;\n index++;\n }\n }\n\n return node;\n }\n\n return replaceFn(node);\n};\n","import { NodeType, Node } from \"@player-ui/player\";\n\nexport const unwrapAsset = (node: Node.Node): Node.Node => {\n if (node.type !== NodeType.Value) {\n return node;\n }\n const child = node.children?.find(\n (x) => x.path.length === 1 && x.path[0] === \"asset\",\n );\n\n if (!child) {\n return node;\n }\n\n return child.value;\n};\n","import { NodeType } from \"@player-ui/player\";\nimport type { Node } from \"@player-ui/player\";\n\nexport const requiresAssetWrapper = (node: Node.Node): boolean => {\n if (node.type === NodeType.Asset) {\n return true;\n }\n\n if (node.type !== NodeType.Applicability) {\n return false;\n }\n\n return node.value.type === NodeType.Asset;\n};\n"],"mappings":"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","names":["import_player","import_player","import_player","import_player","import_player","asyncTransform","queueMicrotask","result"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts
|
|
2
|
-
import { NodeType as
|
|
2
|
+
import { NodeType as NodeType5, getNodeID } from "@player-ui/player";
|
|
3
3
|
import { AsyncParallelBailHook, SyncBailHook } from "tapable-ts";
|
|
4
4
|
import queueMicrotask from "queue-microtask";
|
|
5
5
|
|
|
@@ -27,7 +27,7 @@ var asyncTransform = (assetId, wrapperAssetType, asset, flatten, path = ["values
|
|
|
27
27
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts
|
|
28
28
|
import {
|
|
29
29
|
Builder as Builder2,
|
|
30
|
-
NodeType as
|
|
30
|
+
NodeType as NodeType4
|
|
31
31
|
} from "@player-ui/player";
|
|
32
32
|
|
|
33
33
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/extractNodeFromPath.ts
|
|
@@ -113,6 +113,18 @@ var unwrapAsset = (node) => {
|
|
|
113
113
|
return child.value;
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/requiresAssetWrapper.ts
|
|
117
|
+
import { NodeType as NodeType3 } from "@player-ui/player";
|
|
118
|
+
var requiresAssetWrapper = (node) => {
|
|
119
|
+
if (node.type === NodeType3.Asset) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (node.type !== NodeType3.Applicability) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
return node.value.type === NodeType3.Asset;
|
|
126
|
+
};
|
|
127
|
+
|
|
116
128
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts
|
|
117
129
|
var defaultGetNodeId = (node) => {
|
|
118
130
|
return `async-${node.value.id}`;
|
|
@@ -128,7 +140,7 @@ var createAsyncTransform = (options) => {
|
|
|
128
140
|
} = options;
|
|
129
141
|
const replaceNode = (node) => {
|
|
130
142
|
const unwrapped = unwrapAsset(node);
|
|
131
|
-
if (unwrapped.type !==
|
|
143
|
+
if (unwrapped.type !== NodeType4.Asset || unwrapped.value.type !== transformAssetType) {
|
|
132
144
|
return node;
|
|
133
145
|
}
|
|
134
146
|
const transformed = asyncTransform2(unwrapped);
|
|
@@ -142,8 +154,14 @@ var createAsyncTransform = (options) => {
|
|
|
142
154
|
const asyncNode = Builder2.asyncNode(id, flatten, replaceFunction);
|
|
143
155
|
let multiNode;
|
|
144
156
|
if (asset) {
|
|
145
|
-
|
|
146
|
-
|
|
157
|
+
if (requiresAssetWrapper(asset)) {
|
|
158
|
+
const assetWrappedNode = Builder2.assetWrapper(asset);
|
|
159
|
+
multiNode = Builder2.multiNode(assetWrappedNode, asyncNode);
|
|
160
|
+
} else if (asset.type === NodeType4.MultiNode) {
|
|
161
|
+
multiNode = Builder2.multiNode(...asset.values, asyncNode);
|
|
162
|
+
} else {
|
|
163
|
+
multiNode = Builder2.multiNode(asset, asyncNode);
|
|
164
|
+
}
|
|
147
165
|
} else {
|
|
148
166
|
multiNode = Builder2.multiNode(asyncNode);
|
|
149
167
|
}
|
|
@@ -272,17 +290,17 @@ var AsyncNodePluginPlugin = class {
|
|
|
272
290
|
resolveAsyncChildren(node, context) {
|
|
273
291
|
const asyncNodesResolved = node.asyncNodesResolved ?? [];
|
|
274
292
|
node.asyncNodesResolved = asyncNodesResolved;
|
|
275
|
-
if (node.type ===
|
|
293
|
+
if (node.type === NodeType5.MultiNode) {
|
|
276
294
|
let index = 0;
|
|
277
295
|
while (index < node.values.length) {
|
|
278
296
|
const childNode = node.values[index];
|
|
279
|
-
if (childNode?.type !==
|
|
297
|
+
if (childNode?.type !== NodeType5.Async || !this.hasValidMapping(childNode, context)) {
|
|
280
298
|
index++;
|
|
281
299
|
continue;
|
|
282
300
|
}
|
|
283
301
|
const mappedNode = context.nodeResolveCache.get(childNode.id);
|
|
284
302
|
asyncNodesResolved.push(childNode.id);
|
|
285
|
-
if (mappedNode.type ===
|
|
303
|
+
if (mappedNode.type === NodeType5.MultiNode && childNode.flatten) {
|
|
286
304
|
mappedNode.values.forEach((v) => v.parent = node);
|
|
287
305
|
node.values = [
|
|
288
306
|
...node.values.slice(0, index),
|
|
@@ -296,7 +314,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
296
314
|
}
|
|
297
315
|
} else if ("children" in node) {
|
|
298
316
|
node.children?.forEach((c) => {
|
|
299
|
-
while (c.value.type ===
|
|
317
|
+
while (c.value.type === NodeType5.Async && this.hasValidMapping(c.value, context)) {
|
|
300
318
|
asyncNodesResolved.push(c.value.id);
|
|
301
319
|
c.value = context.nodeResolveCache.get(c.value.id);
|
|
302
320
|
c.value.parent = node;
|
|
@@ -334,7 +352,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
334
352
|
}
|
|
335
353
|
}
|
|
336
354
|
isAsync(node) {
|
|
337
|
-
return node?.type ===
|
|
355
|
+
return node?.type === NodeType5.Async;
|
|
338
356
|
}
|
|
339
357
|
isDeterminedAsync(obj) {
|
|
340
358
|
return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, "async");
|
|
@@ -353,7 +371,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
353
371
|
const asyncAST = parser.createASTNode(
|
|
354
372
|
{
|
|
355
373
|
id: parsedNodeId,
|
|
356
|
-
type:
|
|
374
|
+
type: NodeType5.Async,
|
|
357
375
|
value: parsedAsync,
|
|
358
376
|
flatten
|
|
359
377
|
},
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/index.ts
|
|
2
|
-
import { NodeType as
|
|
2
|
+
import { NodeType as NodeType5, getNodeID } from "@player-ui/player";
|
|
3
3
|
import { AsyncParallelBailHook, SyncBailHook } from "tapable-ts";
|
|
4
4
|
import queueMicrotask from "queue-microtask";
|
|
5
5
|
|
|
@@ -27,7 +27,7 @@ var asyncTransform = (assetId, wrapperAssetType, asset, flatten, path = ["values
|
|
|
27
27
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts
|
|
28
28
|
import {
|
|
29
29
|
Builder as Builder2,
|
|
30
|
-
NodeType as
|
|
30
|
+
NodeType as NodeType4
|
|
31
31
|
} from "@player-ui/player";
|
|
32
32
|
|
|
33
33
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/extractNodeFromPath.ts
|
|
@@ -113,6 +113,18 @@ var unwrapAsset = (node) => {
|
|
|
113
113
|
return child.value;
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/utils/requiresAssetWrapper.ts
|
|
117
|
+
import { NodeType as NodeType3 } from "@player-ui/player";
|
|
118
|
+
var requiresAssetWrapper = (node) => {
|
|
119
|
+
if (node.type === NodeType3.Asset) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (node.type !== NodeType3.Applicability) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
return node.value.type === NodeType3.Asset;
|
|
126
|
+
};
|
|
127
|
+
|
|
116
128
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/async-node/core/src/createAsyncTransform.ts
|
|
117
129
|
var defaultGetNodeId = (node) => {
|
|
118
130
|
return `async-${node.value.id}`;
|
|
@@ -128,7 +140,7 @@ var createAsyncTransform = (options) => {
|
|
|
128
140
|
} = options;
|
|
129
141
|
const replaceNode = (node) => {
|
|
130
142
|
const unwrapped = unwrapAsset(node);
|
|
131
|
-
if (unwrapped.type !==
|
|
143
|
+
if (unwrapped.type !== NodeType4.Asset || unwrapped.value.type !== transformAssetType) {
|
|
132
144
|
return node;
|
|
133
145
|
}
|
|
134
146
|
const transformed = asyncTransform2(unwrapped);
|
|
@@ -142,8 +154,14 @@ var createAsyncTransform = (options) => {
|
|
|
142
154
|
const asyncNode = Builder2.asyncNode(id, flatten, replaceFunction);
|
|
143
155
|
let multiNode;
|
|
144
156
|
if (asset) {
|
|
145
|
-
|
|
146
|
-
|
|
157
|
+
if (requiresAssetWrapper(asset)) {
|
|
158
|
+
const assetWrappedNode = Builder2.assetWrapper(asset);
|
|
159
|
+
multiNode = Builder2.multiNode(assetWrappedNode, asyncNode);
|
|
160
|
+
} else if (asset.type === NodeType4.MultiNode) {
|
|
161
|
+
multiNode = Builder2.multiNode(...asset.values, asyncNode);
|
|
162
|
+
} else {
|
|
163
|
+
multiNode = Builder2.multiNode(asset, asyncNode);
|
|
164
|
+
}
|
|
147
165
|
} else {
|
|
148
166
|
multiNode = Builder2.multiNode(asyncNode);
|
|
149
167
|
}
|
|
@@ -272,17 +290,17 @@ var AsyncNodePluginPlugin = class {
|
|
|
272
290
|
resolveAsyncChildren(node, context) {
|
|
273
291
|
const asyncNodesResolved = node.asyncNodesResolved ?? [];
|
|
274
292
|
node.asyncNodesResolved = asyncNodesResolved;
|
|
275
|
-
if (node.type ===
|
|
293
|
+
if (node.type === NodeType5.MultiNode) {
|
|
276
294
|
let index = 0;
|
|
277
295
|
while (index < node.values.length) {
|
|
278
296
|
const childNode = node.values[index];
|
|
279
|
-
if (childNode?.type !==
|
|
297
|
+
if (childNode?.type !== NodeType5.Async || !this.hasValidMapping(childNode, context)) {
|
|
280
298
|
index++;
|
|
281
299
|
continue;
|
|
282
300
|
}
|
|
283
301
|
const mappedNode = context.nodeResolveCache.get(childNode.id);
|
|
284
302
|
asyncNodesResolved.push(childNode.id);
|
|
285
|
-
if (mappedNode.type ===
|
|
303
|
+
if (mappedNode.type === NodeType5.MultiNode && childNode.flatten) {
|
|
286
304
|
mappedNode.values.forEach((v) => v.parent = node);
|
|
287
305
|
node.values = [
|
|
288
306
|
...node.values.slice(0, index),
|
|
@@ -296,7 +314,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
296
314
|
}
|
|
297
315
|
} else if ("children" in node) {
|
|
298
316
|
node.children?.forEach((c) => {
|
|
299
|
-
while (c.value.type ===
|
|
317
|
+
while (c.value.type === NodeType5.Async && this.hasValidMapping(c.value, context)) {
|
|
300
318
|
asyncNodesResolved.push(c.value.id);
|
|
301
319
|
c.value = context.nodeResolveCache.get(c.value.id);
|
|
302
320
|
c.value.parent = node;
|
|
@@ -334,7 +352,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
334
352
|
}
|
|
335
353
|
}
|
|
336
354
|
isAsync(node) {
|
|
337
|
-
return node?.type ===
|
|
355
|
+
return node?.type === NodeType5.Async;
|
|
338
356
|
}
|
|
339
357
|
isDeterminedAsync(obj) {
|
|
340
358
|
return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, "async");
|
|
@@ -353,7 +371,7 @@ var AsyncNodePluginPlugin = class {
|
|
|
353
371
|
const asyncAST = parser.createASTNode(
|
|
354
372
|
{
|
|
355
373
|
id: parsedNodeId,
|
|
356
|
-
type:
|
|
374
|
+
type: NodeType5.Async,
|
|
357
375
|
value: parsedAsync,
|
|
358
376
|
flatten
|
|
359
377
|
},
|