@next-core/runtime 1.57.5 → 1.58.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.
@@ -7,6 +7,7 @@ exports.StoryboardFunctionRegistryFactory = StoryboardFunctionRegistryFactory;
7
7
  var _cook = require("@next-core/cook");
8
8
  var _supply = require("@next-core/supply");
9
9
  var _storyboard = require("@next-core/utils/storyboard");
10
+ var _general = require("@next-core/utils/general");
10
11
  var _getGeneralGlobals = require("./internal/compute/getGeneralGlobals.js");
11
12
  /** @internal */
12
13
 
@@ -59,12 +60,23 @@ function StoryboardFunctionRegistryFactory({
59
60
  registeredFunctions.set(fn.name, {
60
61
  source: fn.source,
61
62
  typescript: fn.typescript,
63
+ transformed: fn.transformed,
62
64
  deps,
63
65
  hasPermissionsCheck
64
66
  });
65
67
  }
66
68
  }
67
69
  }
70
+ function getGlobalVariables(globals) {
71
+ return (0, _supply.supply)(globals, (0, _getGeneralGlobals.getGeneralGlobals)(globals, {
72
+ collectCoverage,
73
+ widgetId,
74
+ widgetVersion,
75
+ app: currentApp,
76
+ storyboardFunctions,
77
+ isStoryboardFunction: true
78
+ }), !!collectCoverage);
79
+ }
68
80
  function getStoryboardFunction(name) {
69
81
  const fn = registeredFunctions.get(name);
70
82
  if (!fn) {
@@ -77,51 +89,55 @@ function StoryboardFunctionRegistryFactory({
77
89
  if (collectCoverage) {
78
90
  collector = collectCoverage.createCollector(name);
79
91
  }
80
- const precooked = (0, _cook.precookFunction)(fn.source, {
81
- typescript: fn.typescript,
82
- hooks: collector && {
83
- beforeVisit: collector.beforeVisit
84
- },
85
- cacheKey: fn
86
- });
87
- const globalVariables = (0, _supply.supply)(precooked.attemptToVisitGlobals, (0, _getGeneralGlobals.getGeneralGlobals)(precooked.attemptToVisitGlobals, {
88
- collectCoverage,
89
- widgetId,
90
- widgetVersion,
91
- app: currentApp,
92
- storyboardFunctions,
93
- isStoryboardFunction: true
94
- }), !!collectCoverage);
95
- fn.cooked = (0, _cook.cook)(precooked.function, fn.source, {
96
- rules: {
97
- noVar: true
98
- },
99
- globalVariables: overrides ? {
100
- ...globalVariables,
101
- ...(overrides !== null && overrides !== void 0 && overrides.LodashWithStaticFields && precooked.attemptToVisitGlobals.has("_") ? {
102
- _: {
103
- ...globalVariables._,
104
- ...overrides.LodashWithStaticFields
105
- }
106
- } : null),
107
- ...(overrides !== null && overrides !== void 0 && overrides.ArrayConstructor && precooked.attemptToVisitGlobals.has("Array") ? {
108
- Array: overrides.ArrayConstructor
109
- } : null),
110
- ...(overrides !== null && overrides !== void 0 && overrides.ObjectWithStaticFields && precooked.attemptToVisitGlobals.has("Object") ? {
111
- Object: {
112
- ...globalVariables.Object,
113
- ...overrides.ObjectWithStaticFields
114
- }
115
- } : null)
116
- } : globalVariables,
117
- ArrayConstructor: overrides === null || overrides === void 0 ? void 0 : overrides.ArrayConstructor,
118
- hooks: collector && {
119
- beforeEvaluate: collector.beforeEvaluate,
120
- beforeCall: collector.beforeCall,
121
- beforeBranch: collector.beforeBranch
122
- },
123
- debug: !!debuggerOverrides
124
- });
92
+
93
+ // Do not use transformed functions when debugging.
94
+ const transformed = !overrides && !collector && fn.transformed;
95
+ if (transformed) {
96
+ const globalVariables = getGlobalVariables(transformed.globals);
97
+ // Spread globals as params to prevent accessing forbidden globals.
98
+ // NOTE: in native mode, forbidden globals are declared as `undefined`,
99
+ // thus accessing them will not throw a ReferenceError.
100
+ fn.cooked = new Function(...transformed.globals, `"use strict";return (${transformed.source})`)(...transformed.globals.map(key => (0, _general.hasOwnProperty)(globalVariables, key) ? globalVariables[key] : undefined));
101
+ } else {
102
+ const precooked = (0, _cook.precookFunction)(fn.source, {
103
+ typescript: fn.typescript,
104
+ hooks: collector && {
105
+ beforeVisit: collector.beforeVisit
106
+ },
107
+ cacheKey: fn
108
+ });
109
+ const globalVariables = getGlobalVariables(precooked.attemptToVisitGlobals);
110
+ fn.cooked = (0, _cook.cook)(precooked.function, fn.source, {
111
+ rules: {
112
+ noVar: true
113
+ },
114
+ globalVariables: overrides ? {
115
+ ...globalVariables,
116
+ ...(overrides !== null && overrides !== void 0 && overrides.LodashWithStaticFields && precooked.attemptToVisitGlobals.has("_") ? {
117
+ _: {
118
+ ...globalVariables._,
119
+ ...overrides.LodashWithStaticFields
120
+ }
121
+ } : null),
122
+ ...(overrides !== null && overrides !== void 0 && overrides.ArrayConstructor && precooked.attemptToVisitGlobals.has("Array") ? {
123
+ Array: overrides.ArrayConstructor
124
+ } : null),
125
+ ...(overrides !== null && overrides !== void 0 && overrides.ObjectWithStaticFields && precooked.attemptToVisitGlobals.has("Object") ? {
126
+ Object: {
127
+ ...globalVariables.Object,
128
+ ...overrides.ObjectWithStaticFields
129
+ }
130
+ } : null)
131
+ } : globalVariables,
132
+ ArrayConstructor: overrides === null || overrides === void 0 ? void 0 : overrides.ArrayConstructor,
133
+ hooks: collector && {
134
+ beforeEvaluate: collector.beforeEvaluate,
135
+ beforeCall: collector.beforeCall,
136
+ beforeBranch: collector.beforeBranch
137
+ },
138
+ debug: !!debuggerOverrides
139
+ });
140
+ }
125
141
  fn.processed = true;
126
142
  return fn.cooked;
127
143
  }
@@ -138,6 +154,7 @@ function StoryboardFunctionRegistryFactory({
138
154
  registeredFunctions.set(name, {
139
155
  source: data.source,
140
156
  typescript: data.typescript,
157
+ transformed: data.transformed,
141
158
  deps,
142
159
  hasPermissionsCheck
143
160
  });
@@ -1 +1 @@
1
- {"version":3,"file":"StoryboardFunctionRegistry.js","names":["_cook","require","_supply","_storyboard","_getGeneralGlobals","StoryboardFunctionRegistryFactory","widgetId","widgetVersion","collectCoverage","debuggerOverrides","registeredFunctions","Map","overrides","precookFunction","cook","supply","storyboardFunctions","Proxy","Object","freeze","get","_target","key","getStoryboardFunction","currentApp","registerStoryboardFunctions","functions","app","clear","Array","isArray","fn","deps","collectMemberUsageInFunction","delete","name","hasPermissionsCheck","perm","has","set","source","typescript","undefined","processed","cooked","collector","createCollector","precooked","hooks","beforeVisit","cacheKey","globalVariables","attemptToVisitGlobals","getGeneralGlobals","isStoryboardFunction","function","rules","noVar","LodashWithStaticFields","_","ArrayConstructor","ObjectWithStaticFields","beforeEvaluate","beforeCall","beforeBranch","debug","updateStoryboardFunction","data","newFn","checkPermissionsUsage","functionNames","checkedFunctions","Set","add","some","clearGlobalExecutionContextStack","__dev_only_clearGlobalExecutionContextStack","getGlobalExecutionContextStack","__dev_only_getGlobalExecutionContextStack"],"sources":["../../src/StoryboardFunctionRegistry.ts"],"sourcesContent":["import type { MicroApp, StoryboardFunction } from \"@next-core/types\";\nimport {\n cook,\n precookFunction,\n EstreeNode,\n __dev_only_clearGlobalExecutionContextStack,\n __dev_only_getGlobalExecutionContextStack,\n} from \"@next-core/cook\";\nimport { supply } from \"@next-core/supply\";\nimport { collectMemberUsageInFunction } from \"@next-core/utils/storyboard\";\nimport type _ from \"lodash\";\nimport { getGeneralGlobals } from \"./internal/compute/getGeneralGlobals.js\";\n\n/** @internal */\nexport type ReadonlyStoryboardFunctions = Readonly<Record<string, Function>>;\n\n/** @internal */\nexport type StoryboardFunctionPatch = Pick<\n StoryboardFunction,\n \"source\" | \"typescript\"\n>;\n\n/** @internal */\nexport interface StoryboardFunctionRegistry {\n /** A readonly proxy for accessing cooked storyboard functions. */\n storyboardFunctions: ReadonlyStoryboardFunctions;\n\n /** Register storyboard functions. */\n registerStoryboardFunctions(\n functions: StoryboardFunction[] | undefined,\n app?: PartialMicroApp\n ): void;\n\n /** Update a storyboard function during debugging. */\n updateStoryboardFunction(name: string, data: StoryboardFunctionPatch): void;\n\n checkPermissionsUsage(functionNames: string[]): boolean;\n\n clearGlobalExecutionContextStack(): void;\n getGlobalExecutionContextStack(): ReturnType<\n typeof __dev_only_getGlobalExecutionContextStack\n >;\n}\n\n/** @internal */\nexport interface RuntimeStoryboardFunction {\n source: string;\n typescript?: boolean;\n processed?: boolean;\n cooked?: Function;\n deps: Set<string> | string[];\n hasPermissionsCheck: boolean;\n}\n\n/** @internal */\nexport interface FunctionCoverageCollector {\n beforeVisit(node: EstreeNode): void;\n beforeEvaluate(node: EstreeNode): void;\n beforeCall(node: EstreeNode): void;\n beforeBranch(node: EstreeNode, branch: string): void;\n}\n\n/** @internal */\nexport interface FunctionCoverageSettings {\n createCollector(name: string): FunctionCoverageCollector;\n}\n\n/** @internal */\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\">;\n\n/** @internal */\nexport function StoryboardFunctionRegistryFactory({\n widgetId,\n widgetVersion,\n collectCoverage,\n debuggerOverrides,\n}: {\n widgetId?: string;\n widgetVersion?: string;\n collectCoverage?: FunctionCoverageSettings;\n debuggerOverrides?: (ctx: {\n precookFunction: typeof precookFunction;\n cook: typeof cook;\n supply: typeof supply;\n }) => {\n LodashWithStaticFields?: Partial<typeof _>;\n ArrayConstructor?: typeof Array;\n ObjectWithStaticFields?: Partial<typeof Object>;\n };\n} = {}): StoryboardFunctionRegistry {\n const registeredFunctions = new Map<string, RuntimeStoryboardFunction>();\n\n const overrides = debuggerOverrides?.({\n precookFunction,\n cook,\n supply,\n });\n\n // Use `Proxy` with a frozen target, to make a readonly function registry.\n const storyboardFunctions = new Proxy(Object.freeze({}), {\n get(_target, key) {\n return getStoryboardFunction(key as string);\n },\n }) as ReadonlyStoryboardFunctions;\n\n let currentApp: PartialMicroApp | undefined;\n\n function registerStoryboardFunctions(\n functions: StoryboardFunction[],\n app?: PartialMicroApp\n ): void {\n if (app) {\n currentApp = app;\n }\n registeredFunctions.clear();\n if (Array.isArray(functions)) {\n for (const fn of functions) {\n let deps: Set<string> | string[] | undefined = fn.deps;\n if (deps == null) {\n deps = collectMemberUsageInFunction(fn, \"FN\", !!collectCoverage);\n (deps as Set<string>).delete(fn.name);\n }\n const hasPermissionsCheck =\n fn.perm ??\n collectMemberUsageInFunction(\n fn,\n \"PERMISSIONS\",\n !!collectCoverage\n ).has(\"check\");\n registeredFunctions.set(fn.name, {\n source: fn.source,\n typescript: fn.typescript,\n deps,\n hasPermissionsCheck,\n });\n }\n }\n }\n\n function getStoryboardFunction(name: string): Function | undefined {\n const fn = registeredFunctions.get(name);\n if (!fn) {\n return undefined;\n }\n if (fn.processed) {\n return fn.cooked;\n }\n let collector: FunctionCoverageCollector | undefined;\n if (collectCoverage) {\n collector = collectCoverage.createCollector(name);\n }\n const precooked = precookFunction(fn.source, {\n typescript: fn.typescript,\n hooks: collector && {\n beforeVisit: collector.beforeVisit,\n },\n cacheKey: fn,\n });\n const globalVariables = supply(\n precooked.attemptToVisitGlobals,\n getGeneralGlobals(precooked.attemptToVisitGlobals, {\n collectCoverage,\n widgetId,\n widgetVersion,\n app: currentApp,\n storyboardFunctions,\n isStoryboardFunction: true,\n }),\n !!collectCoverage\n );\n\n fn.cooked = cook(precooked.function, fn.source, {\n rules: {\n noVar: true,\n },\n globalVariables: overrides\n ? {\n ...globalVariables,\n ...(overrides?.LodashWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"_\")\n ? {\n _: {\n ...(globalVariables._ as typeof _),\n ...overrides.LodashWithStaticFields,\n },\n }\n : null),\n ...(overrides?.ArrayConstructor &&\n precooked.attemptToVisitGlobals.has(\"Array\")\n ? {\n Array: overrides.ArrayConstructor,\n }\n : null),\n ...(overrides?.ObjectWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"Object\")\n ? {\n Object: {\n ...(globalVariables.Object as typeof Object),\n ...overrides.ObjectWithStaticFields,\n },\n }\n : null),\n }\n : globalVariables,\n ArrayConstructor: overrides?.ArrayConstructor,\n hooks: collector && {\n beforeEvaluate: collector.beforeEvaluate,\n beforeCall: collector.beforeCall,\n beforeBranch: collector.beforeBranch,\n },\n debug: !!debuggerOverrides,\n }) as Function;\n fn.processed = true;\n return fn.cooked;\n }\n\n return {\n storyboardFunctions,\n registerStoryboardFunctions,\n updateStoryboardFunction(\n name: string,\n data: StoryboardFunctionPatch\n ): void {\n const newFn = {\n ...data,\n name,\n };\n const deps = collectMemberUsageInFunction(newFn, \"FN\", true);\n const hasPermissionsCheck = collectMemberUsageInFunction(\n newFn,\n \"PERMISSIONS\",\n true\n ).has(\"check\");\n registeredFunctions.set(name, {\n source: data.source,\n typescript: data.typescript,\n deps,\n hasPermissionsCheck,\n });\n },\n /**\n * Check whether listed functions attempt to call `PERMISSIONS.check()`,\n * includes in nested `FN.*()` calls.\n */\n checkPermissionsUsage(functionNames) {\n const checkedFunctions = new Set<string>();\n const hasPermissionsCheck = (name: string): boolean => {\n if (!checkedFunctions.has(name)) {\n checkedFunctions.add(name);\n const fn = registeredFunctions.get(name);\n return (\n !!fn &&\n (fn.hasPermissionsCheck || [...fn.deps].some(hasPermissionsCheck))\n );\n }\n return false;\n };\n return functionNames.some(hasPermissionsCheck);\n },\n clearGlobalExecutionContextStack() {\n __dev_only_clearGlobalExecutionContextStack();\n },\n getGlobalExecutionContextStack() {\n return __dev_only_getGlobalExecutionContextStack();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"StoryboardFunctionRegistry.js","names":["_cook","require","_supply","_storyboard","_general","_getGeneralGlobals","StoryboardFunctionRegistryFactory","widgetId","widgetVersion","collectCoverage","debuggerOverrides","registeredFunctions","Map","overrides","precookFunction","cook","supply","storyboardFunctions","Proxy","Object","freeze","get","_target","key","getStoryboardFunction","currentApp","registerStoryboardFunctions","functions","app","clear","Array","isArray","fn","deps","collectMemberUsageInFunction","delete","name","hasPermissionsCheck","perm","has","set","source","typescript","transformed","getGlobalVariables","globals","getGeneralGlobals","isStoryboardFunction","undefined","processed","cooked","collector","createCollector","globalVariables","Function","map","hasOwnProperty","precooked","hooks","beforeVisit","cacheKey","attemptToVisitGlobals","function","rules","noVar","LodashWithStaticFields","_","ArrayConstructor","ObjectWithStaticFields","beforeEvaluate","beforeCall","beforeBranch","debug","updateStoryboardFunction","data","newFn","checkPermissionsUsage","functionNames","checkedFunctions","Set","add","some","clearGlobalExecutionContextStack","__dev_only_clearGlobalExecutionContextStack","getGlobalExecutionContextStack","__dev_only_getGlobalExecutionContextStack"],"sources":["../../src/StoryboardFunctionRegistry.ts"],"sourcesContent":["import type {\n MicroApp,\n StoryboardFunction,\n TransformedFunction,\n} from \"@next-core/types\";\nimport {\n cook,\n precookFunction,\n EstreeNode,\n __dev_only_clearGlobalExecutionContextStack,\n __dev_only_getGlobalExecutionContextStack,\n} from \"@next-core/cook\";\nimport { supply } from \"@next-core/supply\";\nimport { collectMemberUsageInFunction } from \"@next-core/utils/storyboard\";\nimport { hasOwnProperty } from \"@next-core/utils/general\";\nimport type _ from \"lodash\";\nimport { getGeneralGlobals } from \"./internal/compute/getGeneralGlobals.js\";\n\n/** @internal */\nexport type ReadonlyStoryboardFunctions = Readonly<Record<string, Function>>;\n\n/** @internal */\nexport type StoryboardFunctionPatch = Pick<\n StoryboardFunction,\n \"source\" | \"typescript\" | \"transformed\"\n>;\n\n/** @internal */\nexport interface StoryboardFunctionRegistry {\n /** A readonly proxy for accessing cooked storyboard functions. */\n storyboardFunctions: ReadonlyStoryboardFunctions;\n\n /** Register storyboard functions. */\n registerStoryboardFunctions(\n functions: StoryboardFunction[] | undefined,\n app?: PartialMicroApp\n ): void;\n\n /** Update a storyboard function during debugging. */\n updateStoryboardFunction(name: string, data: StoryboardFunctionPatch): void;\n\n checkPermissionsUsage(functionNames: string[]): boolean;\n\n clearGlobalExecutionContextStack(): void;\n getGlobalExecutionContextStack(): ReturnType<\n typeof __dev_only_getGlobalExecutionContextStack\n >;\n}\n\n/** @internal */\nexport interface RuntimeStoryboardFunction {\n source: string;\n typescript?: boolean;\n processed?: boolean;\n cooked?: Function;\n deps: Set<string> | string[];\n hasPermissionsCheck: boolean;\n transformed?: TransformedFunction;\n}\n\n/** @internal */\nexport interface FunctionCoverageCollector {\n beforeVisit(node: EstreeNode): void;\n beforeEvaluate(node: EstreeNode): void;\n beforeCall(node: EstreeNode): void;\n beforeBranch(node: EstreeNode, branch: string): void;\n}\n\n/** @internal */\nexport interface FunctionCoverageSettings {\n createCollector(name: string): FunctionCoverageCollector;\n}\n\n/** @internal */\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\" | \"config\">;\n\n/** @internal */\nexport function StoryboardFunctionRegistryFactory({\n widgetId,\n widgetVersion,\n collectCoverage,\n debuggerOverrides,\n}: {\n widgetId?: string;\n widgetVersion?: string;\n collectCoverage?: FunctionCoverageSettings;\n debuggerOverrides?: (ctx: {\n precookFunction: typeof precookFunction;\n cook: typeof cook;\n supply: typeof supply;\n }) => {\n LodashWithStaticFields?: Partial<typeof _>;\n ArrayConstructor?: typeof Array;\n ObjectWithStaticFields?: Partial<typeof Object>;\n };\n} = {}): StoryboardFunctionRegistry {\n const registeredFunctions = new Map<string, RuntimeStoryboardFunction>();\n\n const overrides = debuggerOverrides?.({\n precookFunction,\n cook,\n supply,\n });\n\n // Use `Proxy` with a frozen target, to make a readonly function registry.\n const storyboardFunctions = new Proxy(Object.freeze({}), {\n get(_target, key) {\n return getStoryboardFunction(key as string);\n },\n }) as ReadonlyStoryboardFunctions;\n\n let currentApp: PartialMicroApp | undefined;\n\n function registerStoryboardFunctions(\n functions: StoryboardFunction[],\n app?: PartialMicroApp\n ): void {\n if (app) {\n currentApp = app;\n }\n registeredFunctions.clear();\n if (Array.isArray(functions)) {\n for (const fn of functions) {\n let deps: Set<string> | string[] | undefined = fn.deps;\n if (deps == null) {\n deps = collectMemberUsageInFunction(fn, \"FN\", !!collectCoverage);\n (deps as Set<string>).delete(fn.name);\n }\n const hasPermissionsCheck =\n fn.perm ??\n collectMemberUsageInFunction(\n fn,\n \"PERMISSIONS\",\n !!collectCoverage\n ).has(\"check\");\n registeredFunctions.set(fn.name, {\n source: fn.source,\n typescript: fn.typescript,\n transformed: fn.transformed,\n deps,\n hasPermissionsCheck,\n });\n }\n }\n }\n\n function getGlobalVariables(globals: Set<string> | string[]) {\n return supply(\n globals,\n getGeneralGlobals(globals, {\n collectCoverage,\n widgetId,\n widgetVersion,\n app: currentApp,\n storyboardFunctions,\n isStoryboardFunction: true,\n }),\n !!collectCoverage\n );\n }\n\n function getStoryboardFunction(name: string): Function | undefined {\n const fn = registeredFunctions.get(name);\n if (!fn) {\n return undefined;\n }\n if (fn.processed) {\n return fn.cooked;\n }\n let collector: FunctionCoverageCollector | undefined;\n if (collectCoverage) {\n collector = collectCoverage.createCollector(name);\n }\n\n // Do not use transformed functions when debugging.\n const transformed = !overrides && !collector && fn.transformed;\n if (transformed) {\n const globalVariables = getGlobalVariables(transformed.globals);\n // Spread globals as params to prevent accessing forbidden globals.\n // NOTE: in native mode, forbidden globals are declared as `undefined`,\n // thus accessing them will not throw a ReferenceError.\n fn.cooked = new Function(\n ...transformed.globals,\n `\"use strict\";return (${transformed.source})`\n )(\n ...transformed.globals.map((key) =>\n hasOwnProperty(globalVariables, key)\n ? globalVariables[key]\n : undefined\n )\n );\n } else {\n const precooked = precookFunction(fn.source, {\n typescript: fn.typescript,\n hooks: collector && {\n beforeVisit: collector.beforeVisit,\n },\n cacheKey: fn,\n });\n const globalVariables = getGlobalVariables(\n precooked.attemptToVisitGlobals\n );\n fn.cooked = cook(precooked.function, fn.source, {\n rules: {\n noVar: true,\n },\n globalVariables: overrides\n ? {\n ...globalVariables,\n ...(overrides?.LodashWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"_\")\n ? {\n _: {\n ...(globalVariables._ as typeof _),\n ...overrides.LodashWithStaticFields,\n },\n }\n : null),\n ...(overrides?.ArrayConstructor &&\n precooked.attemptToVisitGlobals.has(\"Array\")\n ? {\n Array: overrides.ArrayConstructor,\n }\n : null),\n ...(overrides?.ObjectWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"Object\")\n ? {\n Object: {\n ...(globalVariables.Object as typeof Object),\n ...overrides.ObjectWithStaticFields,\n },\n }\n : null),\n }\n : globalVariables,\n ArrayConstructor: overrides?.ArrayConstructor,\n hooks: collector && {\n beforeEvaluate: collector.beforeEvaluate,\n beforeCall: collector.beforeCall,\n beforeBranch: collector.beforeBranch,\n },\n debug: !!debuggerOverrides,\n }) as Function;\n }\n fn.processed = true;\n return fn.cooked;\n }\n\n return {\n storyboardFunctions,\n registerStoryboardFunctions,\n updateStoryboardFunction(\n name: string,\n data: StoryboardFunctionPatch\n ): void {\n const newFn = {\n ...data,\n name,\n };\n const deps = collectMemberUsageInFunction(newFn, \"FN\", true);\n const hasPermissionsCheck = collectMemberUsageInFunction(\n newFn,\n \"PERMISSIONS\",\n true\n ).has(\"check\");\n registeredFunctions.set(name, {\n source: data.source,\n typescript: data.typescript,\n transformed: data.transformed,\n deps,\n hasPermissionsCheck,\n });\n },\n /**\n * Check whether listed functions attempt to call `PERMISSIONS.check()`,\n * includes in nested `FN.*()` calls.\n */\n checkPermissionsUsage(functionNames) {\n const checkedFunctions = new Set<string>();\n const hasPermissionsCheck = (name: string): boolean => {\n if (!checkedFunctions.has(name)) {\n checkedFunctions.add(name);\n const fn = registeredFunctions.get(name);\n return (\n !!fn &&\n (fn.hasPermissionsCheck || [...fn.deps].some(hasPermissionsCheck))\n );\n }\n return false;\n };\n return functionNames.some(hasPermissionsCheck);\n },\n clearGlobalExecutionContextStack() {\n __dev_only_clearGlobalExecutionContextStack();\n },\n getGlobalExecutionContextStack() {\n return __dev_only_getGlobalExecutionContextStack();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"getGeneralGlobals.js","names":["_lodash","require","_i18n","_WidgetI18n","_proxyFactories","_themeAndMode","_getBasePath","_registerAppI18n","_Runtime","getGeneralGlobals","attemptToVisitGlobals","options","globalVariables","variableName","variable","getIndividualGlobal","undefined","collectCoverage","widgetId","widgetVersion","app","appendI18nNamespace","storyboardFunctions","isStoryboardFunction","_hooks$images","_hooks$images2","_hooks$checkPermissio","getBasePath","replace","fakeImageFactory","hooks","images","widgetImagesFactory","imagesFactory","id","isBuildPush","currentVersion","identity","widgetI18nFactory","i18n","getFixedT","getI18nNamespace","filter","Boolean","fakeI18nText","i18nText","getReadOnlyProxy","check","fakeCheckPermissions","checkPermissions","getTheme","getCssPropertyValue","console","href","origin","host","hostname","location","data","en","get","name"],"sources":["../../../../src/internal/compute/getGeneralGlobals.ts"],"sourcesContent":["import { identity } from \"lodash\";\nimport type { MicroApp } from \"@next-core/types\";\nimport { i18n, i18nText } from \"@next-core/i18n\";\nimport { widgetI18nFactory } from \"./WidgetI18n.js\";\nimport { getReadOnlyProxy } from \"../proxyFactories.js\";\nimport { getCssPropertyValue, getTheme } from \"../../themeAndMode.js\";\nimport { getBasePath } from \"../../getBasePath.js\";\nimport { getI18nNamespace } from \"../registerAppI18n.js\";\nimport { ImagesFactory, hooks } from \"../Runtime.js\";\n\nexport interface GeneralGlobalsOptions {\n collectCoverage?: unknown;\n widgetId?: string;\n widgetVersion?: string;\n app?: PartialMicroApp;\n appendI18nNamespace?: string;\n storyboardFunctions?: unknown;\n isStoryboardFunction?: boolean;\n}\n\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\">;\n\n// `GeneralGlobals` are globals which are page-state-agnostic,\n// thus they can be used both in storyboard expressions and functions.\nexport function getGeneralGlobals(\n attemptToVisitGlobals: Set<string>,\n options: GeneralGlobalsOptions\n): Record<string, unknown> {\n const globalVariables: Record<string, unknown> = {};\n for (const variableName of attemptToVisitGlobals) {\n const variable = getIndividualGlobal(variableName, options);\n if (variable !== undefined) {\n globalVariables[variableName] = variable;\n }\n }\n return globalVariables;\n}\n\nfunction getIndividualGlobal(\n variableName: string,\n {\n collectCoverage,\n widgetId,\n widgetVersion,\n app,\n appendI18nNamespace,\n storyboardFunctions,\n isStoryboardFunction,\n }: GeneralGlobalsOptions\n): unknown {\n switch (variableName) {\n case \"BASE_URL\":\n return collectCoverage ? \"/next\" : getBasePath().replace(/\\/$/, \"\");\n case \"FN\":\n return storyboardFunctions;\n case \"IMG\":\n return collectCoverage\n ? fakeImageFactory()\n : widgetId\n ? hooks?.images?.widgetImagesFactory(widgetId, widgetVersion)\n : hooks?.images?.imagesFactory(\n app!.id,\n app!.isBuildPush,\n (app as { currentVersion?: string }).currentVersion\n );\n case \"I18N\":\n return collectCoverage\n ? identity\n : widgetId\n ? widgetI18nFactory(widgetId)\n : i18n.getFixedT(\n null,\n [appendI18nNamespace, getI18nNamespace(\"app\", app!.id)].filter(\n Boolean\n ) as string[]\n );\n case \"I18N_TEXT\":\n return collectCoverage ? fakeI18nText : i18nText;\n case \"PERMISSIONS\":\n return getReadOnlyProxy({\n check: collectCoverage\n ? fakeCheckPermissions\n : hooks?.checkPermissions?.checkPermissions,\n });\n case \"THEME\":\n return getReadOnlyProxy({\n getTheme: collectCoverage ? () => \"light\" : getTheme,\n getCssPropertyValue: collectCoverage ? () => \"\" : getCssPropertyValue,\n });\n case \"console\":\n return isStoryboardFunction ? getReadOnlyProxy(console) : undefined;\n case \"location\":\n return collectCoverage\n ? {\n href: \"http://localhost:3000/functions/test\",\n origin: \"http://localhost:3000\",\n host: \"localhost:3000\",\n hostname: \"localhost\",\n }\n : {\n href: location.href,\n origin: location.origin,\n host: location.host,\n hostname: location.hostname,\n };\n }\n}\n\nfunction fakeI18nText(data: Record<string, string>): string {\n return data?.en;\n}\n\nfunction fakeImageFactory(): ImagesFactory {\n return {\n get(name: string) {\n return `mock/images/${name}`;\n },\n };\n}\n\nfunction fakeCheckPermissions(): boolean {\n return true;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"getGeneralGlobals.js","names":["_lodash","require","_i18n","_WidgetI18n","_proxyFactories","_themeAndMode","_getBasePath","_registerAppI18n","_Runtime","getGeneralGlobals","attemptToVisitGlobals","options","globalVariables","variableName","variable","getIndividualGlobal","undefined","collectCoverage","widgetId","widgetVersion","app","appendI18nNamespace","storyboardFunctions","isStoryboardFunction","_hooks$images","_hooks$images2","_hooks$checkPermissio","getBasePath","replace","fakeImageFactory","hooks","images","widgetImagesFactory","imagesFactory","id","isBuildPush","currentVersion","identity","widgetI18nFactory","i18n","getFixedT","getI18nNamespace","filter","Boolean","fakeI18nText","i18nText","getReadOnlyProxy","check","fakeCheckPermissions","checkPermissions","getTheme","getCssPropertyValue","console","href","origin","host","hostname","location","data","en","get","name"],"sources":["../../../../src/internal/compute/getGeneralGlobals.ts"],"sourcesContent":["import { identity } from \"lodash\";\nimport type { MicroApp } from \"@next-core/types\";\nimport { i18n, i18nText } from \"@next-core/i18n\";\nimport { widgetI18nFactory } from \"./WidgetI18n.js\";\nimport { getReadOnlyProxy } from \"../proxyFactories.js\";\nimport { getCssPropertyValue, getTheme } from \"../../themeAndMode.js\";\nimport { getBasePath } from \"../../getBasePath.js\";\nimport { getI18nNamespace } from \"../registerAppI18n.js\";\nimport { ImagesFactory, hooks } from \"../Runtime.js\";\n\nexport interface GeneralGlobalsOptions {\n collectCoverage?: unknown;\n widgetId?: string;\n widgetVersion?: string;\n app?: PartialMicroApp;\n appendI18nNamespace?: string;\n storyboardFunctions?: unknown;\n isStoryboardFunction?: boolean;\n}\n\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\">;\n\n// `GeneralGlobals` are globals which are page-state-agnostic,\n// thus they can be used both in storyboard expressions and functions.\nexport function getGeneralGlobals(\n attemptToVisitGlobals: Set<string> | string[],\n options: GeneralGlobalsOptions\n): Record<string, unknown> {\n const globalVariables: Record<string, unknown> = {};\n for (const variableName of attemptToVisitGlobals) {\n const variable = getIndividualGlobal(variableName, options);\n if (variable !== undefined) {\n globalVariables[variableName] = variable;\n }\n }\n return globalVariables;\n}\n\nfunction getIndividualGlobal(\n variableName: string,\n {\n collectCoverage,\n widgetId,\n widgetVersion,\n app,\n appendI18nNamespace,\n storyboardFunctions,\n isStoryboardFunction,\n }: GeneralGlobalsOptions\n): unknown {\n switch (variableName) {\n case \"BASE_URL\":\n return collectCoverage ? \"/next\" : getBasePath().replace(/\\/$/, \"\");\n case \"FN\":\n return storyboardFunctions;\n case \"IMG\":\n return collectCoverage\n ? fakeImageFactory()\n : widgetId\n ? hooks?.images?.widgetImagesFactory(widgetId, widgetVersion)\n : hooks?.images?.imagesFactory(\n app!.id,\n app!.isBuildPush,\n (app as { currentVersion?: string }).currentVersion\n );\n case \"I18N\":\n return collectCoverage\n ? identity\n : widgetId\n ? widgetI18nFactory(widgetId)\n : i18n.getFixedT(\n null,\n [appendI18nNamespace, getI18nNamespace(\"app\", app!.id)].filter(\n Boolean\n ) as string[]\n );\n case \"I18N_TEXT\":\n return collectCoverage ? fakeI18nText : i18nText;\n case \"PERMISSIONS\":\n return getReadOnlyProxy({\n check: collectCoverage\n ? fakeCheckPermissions\n : hooks?.checkPermissions?.checkPermissions,\n });\n case \"THEME\":\n return getReadOnlyProxy({\n getTheme: collectCoverage ? () => \"light\" : getTheme,\n getCssPropertyValue: collectCoverage ? () => \"\" : getCssPropertyValue,\n });\n case \"console\":\n return isStoryboardFunction ? getReadOnlyProxy(console) : undefined;\n case \"location\":\n return collectCoverage\n ? {\n href: \"http://localhost:3000/functions/test\",\n origin: \"http://localhost:3000\",\n host: \"localhost:3000\",\n hostname: \"localhost\",\n }\n : {\n href: location.href,\n origin: location.origin,\n host: location.host,\n hostname: location.hostname,\n };\n }\n}\n\nfunction fakeI18nText(data: Record<string, string>): string {\n return data?.en;\n}\n\nfunction fakeImageFactory(): ImagesFactory {\n return {\n get(name: string) {\n return `mock/images/${name}`;\n },\n };\n}\n\nfunction fakeCheckPermissions(): boolean {\n return true;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  import { cook, precookFunction, __dev_only_clearGlobalExecutionContextStack, __dev_only_getGlobalExecutionContextStack } from "@next-core/cook";
2
2
  import { supply } from "@next-core/supply";
3
3
  import { collectMemberUsageInFunction } from "@next-core/utils/storyboard";
4
+ import { hasOwnProperty } from "@next-core/utils/general";
4
5
  import { getGeneralGlobals } from "./internal/compute/getGeneralGlobals.js";
5
6
 
6
7
  /** @internal */
@@ -56,12 +57,23 @@ export function StoryboardFunctionRegistryFactory() {
56
57
  registeredFunctions.set(fn.name, {
57
58
  source: fn.source,
58
59
  typescript: fn.typescript,
60
+ transformed: fn.transformed,
59
61
  deps,
60
62
  hasPermissionsCheck
61
63
  });
62
64
  }
63
65
  }
64
66
  }
67
+ function getGlobalVariables(globals) {
68
+ return supply(globals, getGeneralGlobals(globals, {
69
+ collectCoverage,
70
+ widgetId,
71
+ widgetVersion,
72
+ app: currentApp,
73
+ storyboardFunctions,
74
+ isStoryboardFunction: true
75
+ }), !!collectCoverage);
76
+ }
65
77
  function getStoryboardFunction(name) {
66
78
  const fn = registeredFunctions.get(name);
67
79
  if (!fn) {
@@ -74,51 +86,55 @@ export function StoryboardFunctionRegistryFactory() {
74
86
  if (collectCoverage) {
75
87
  collector = collectCoverage.createCollector(name);
76
88
  }
77
- const precooked = precookFunction(fn.source, {
78
- typescript: fn.typescript,
79
- hooks: collector && {
80
- beforeVisit: collector.beforeVisit
81
- },
82
- cacheKey: fn
83
- });
84
- const globalVariables = supply(precooked.attemptToVisitGlobals, getGeneralGlobals(precooked.attemptToVisitGlobals, {
85
- collectCoverage,
86
- widgetId,
87
- widgetVersion,
88
- app: currentApp,
89
- storyboardFunctions,
90
- isStoryboardFunction: true
91
- }), !!collectCoverage);
92
- fn.cooked = cook(precooked.function, fn.source, {
93
- rules: {
94
- noVar: true
95
- },
96
- globalVariables: overrides ? {
97
- ...globalVariables,
98
- ...(overrides !== null && overrides !== void 0 && overrides.LodashWithStaticFields && precooked.attemptToVisitGlobals.has("_") ? {
99
- _: {
100
- ...globalVariables._,
101
- ...overrides.LodashWithStaticFields
102
- }
103
- } : null),
104
- ...(overrides !== null && overrides !== void 0 && overrides.ArrayConstructor && precooked.attemptToVisitGlobals.has("Array") ? {
105
- Array: overrides.ArrayConstructor
106
- } : null),
107
- ...(overrides !== null && overrides !== void 0 && overrides.ObjectWithStaticFields && precooked.attemptToVisitGlobals.has("Object") ? {
108
- Object: {
109
- ...globalVariables.Object,
110
- ...overrides.ObjectWithStaticFields
111
- }
112
- } : null)
113
- } : globalVariables,
114
- ArrayConstructor: overrides === null || overrides === void 0 ? void 0 : overrides.ArrayConstructor,
115
- hooks: collector && {
116
- beforeEvaluate: collector.beforeEvaluate,
117
- beforeCall: collector.beforeCall,
118
- beforeBranch: collector.beforeBranch
119
- },
120
- debug: !!debuggerOverrides
121
- });
89
+
90
+ // Do not use transformed functions when debugging.
91
+ const transformed = !overrides && !collector && fn.transformed;
92
+ if (transformed) {
93
+ const globalVariables = getGlobalVariables(transformed.globals);
94
+ // Spread globals as params to prevent accessing forbidden globals.
95
+ // NOTE: in native mode, forbidden globals are declared as `undefined`,
96
+ // thus accessing them will not throw a ReferenceError.
97
+ fn.cooked = new Function(...transformed.globals, `"use strict";return (${transformed.source})`)(...transformed.globals.map(key => hasOwnProperty(globalVariables, key) ? globalVariables[key] : undefined));
98
+ } else {
99
+ const precooked = precookFunction(fn.source, {
100
+ typescript: fn.typescript,
101
+ hooks: collector && {
102
+ beforeVisit: collector.beforeVisit
103
+ },
104
+ cacheKey: fn
105
+ });
106
+ const globalVariables = getGlobalVariables(precooked.attemptToVisitGlobals);
107
+ fn.cooked = cook(precooked.function, fn.source, {
108
+ rules: {
109
+ noVar: true
110
+ },
111
+ globalVariables: overrides ? {
112
+ ...globalVariables,
113
+ ...(overrides !== null && overrides !== void 0 && overrides.LodashWithStaticFields && precooked.attemptToVisitGlobals.has("_") ? {
114
+ _: {
115
+ ...globalVariables._,
116
+ ...overrides.LodashWithStaticFields
117
+ }
118
+ } : null),
119
+ ...(overrides !== null && overrides !== void 0 && overrides.ArrayConstructor && precooked.attemptToVisitGlobals.has("Array") ? {
120
+ Array: overrides.ArrayConstructor
121
+ } : null),
122
+ ...(overrides !== null && overrides !== void 0 && overrides.ObjectWithStaticFields && precooked.attemptToVisitGlobals.has("Object") ? {
123
+ Object: {
124
+ ...globalVariables.Object,
125
+ ...overrides.ObjectWithStaticFields
126
+ }
127
+ } : null)
128
+ } : globalVariables,
129
+ ArrayConstructor: overrides === null || overrides === void 0 ? void 0 : overrides.ArrayConstructor,
130
+ hooks: collector && {
131
+ beforeEvaluate: collector.beforeEvaluate,
132
+ beforeCall: collector.beforeCall,
133
+ beforeBranch: collector.beforeBranch
134
+ },
135
+ debug: !!debuggerOverrides
136
+ });
137
+ }
122
138
  fn.processed = true;
123
139
  return fn.cooked;
124
140
  }
@@ -135,6 +151,7 @@ export function StoryboardFunctionRegistryFactory() {
135
151
  registeredFunctions.set(name, {
136
152
  source: data.source,
137
153
  typescript: data.typescript,
154
+ transformed: data.transformed,
138
155
  deps,
139
156
  hasPermissionsCheck
140
157
  });
@@ -1 +1 @@
1
- {"version":3,"file":"StoryboardFunctionRegistry.js","names":["cook","precookFunction","__dev_only_clearGlobalExecutionContextStack","__dev_only_getGlobalExecutionContextStack","supply","collectMemberUsageInFunction","getGeneralGlobals","StoryboardFunctionRegistryFactory","widgetId","widgetVersion","collectCoverage","debuggerOverrides","arguments","length","undefined","registeredFunctions","Map","overrides","storyboardFunctions","Proxy","Object","freeze","get","_target","key","getStoryboardFunction","currentApp","registerStoryboardFunctions","functions","app","clear","Array","isArray","fn","_fn$perm","deps","delete","name","hasPermissionsCheck","perm","has","set","source","typescript","processed","cooked","collector","createCollector","precooked","hooks","beforeVisit","cacheKey","globalVariables","attemptToVisitGlobals","isStoryboardFunction","function","rules","noVar","LodashWithStaticFields","_","ArrayConstructor","ObjectWithStaticFields","beforeEvaluate","beforeCall","beforeBranch","debug","updateStoryboardFunction","data","newFn","checkPermissionsUsage","functionNames","checkedFunctions","Set","add","some","clearGlobalExecutionContextStack","getGlobalExecutionContextStack"],"sources":["../../src/StoryboardFunctionRegistry.ts"],"sourcesContent":["import type { MicroApp, StoryboardFunction } from \"@next-core/types\";\nimport {\n cook,\n precookFunction,\n EstreeNode,\n __dev_only_clearGlobalExecutionContextStack,\n __dev_only_getGlobalExecutionContextStack,\n} from \"@next-core/cook\";\nimport { supply } from \"@next-core/supply\";\nimport { collectMemberUsageInFunction } from \"@next-core/utils/storyboard\";\nimport type _ from \"lodash\";\nimport { getGeneralGlobals } from \"./internal/compute/getGeneralGlobals.js\";\n\n/** @internal */\nexport type ReadonlyStoryboardFunctions = Readonly<Record<string, Function>>;\n\n/** @internal */\nexport type StoryboardFunctionPatch = Pick<\n StoryboardFunction,\n \"source\" | \"typescript\"\n>;\n\n/** @internal */\nexport interface StoryboardFunctionRegistry {\n /** A readonly proxy for accessing cooked storyboard functions. */\n storyboardFunctions: ReadonlyStoryboardFunctions;\n\n /** Register storyboard functions. */\n registerStoryboardFunctions(\n functions: StoryboardFunction[] | undefined,\n app?: PartialMicroApp\n ): void;\n\n /** Update a storyboard function during debugging. */\n updateStoryboardFunction(name: string, data: StoryboardFunctionPatch): void;\n\n checkPermissionsUsage(functionNames: string[]): boolean;\n\n clearGlobalExecutionContextStack(): void;\n getGlobalExecutionContextStack(): ReturnType<\n typeof __dev_only_getGlobalExecutionContextStack\n >;\n}\n\n/** @internal */\nexport interface RuntimeStoryboardFunction {\n source: string;\n typescript?: boolean;\n processed?: boolean;\n cooked?: Function;\n deps: Set<string> | string[];\n hasPermissionsCheck: boolean;\n}\n\n/** @internal */\nexport interface FunctionCoverageCollector {\n beforeVisit(node: EstreeNode): void;\n beforeEvaluate(node: EstreeNode): void;\n beforeCall(node: EstreeNode): void;\n beforeBranch(node: EstreeNode, branch: string): void;\n}\n\n/** @internal */\nexport interface FunctionCoverageSettings {\n createCollector(name: string): FunctionCoverageCollector;\n}\n\n/** @internal */\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\">;\n\n/** @internal */\nexport function StoryboardFunctionRegistryFactory({\n widgetId,\n widgetVersion,\n collectCoverage,\n debuggerOverrides,\n}: {\n widgetId?: string;\n widgetVersion?: string;\n collectCoverage?: FunctionCoverageSettings;\n debuggerOverrides?: (ctx: {\n precookFunction: typeof precookFunction;\n cook: typeof cook;\n supply: typeof supply;\n }) => {\n LodashWithStaticFields?: Partial<typeof _>;\n ArrayConstructor?: typeof Array;\n ObjectWithStaticFields?: Partial<typeof Object>;\n };\n} = {}): StoryboardFunctionRegistry {\n const registeredFunctions = new Map<string, RuntimeStoryboardFunction>();\n\n const overrides = debuggerOverrides?.({\n precookFunction,\n cook,\n supply,\n });\n\n // Use `Proxy` with a frozen target, to make a readonly function registry.\n const storyboardFunctions = new Proxy(Object.freeze({}), {\n get(_target, key) {\n return getStoryboardFunction(key as string);\n },\n }) as ReadonlyStoryboardFunctions;\n\n let currentApp: PartialMicroApp | undefined;\n\n function registerStoryboardFunctions(\n functions: StoryboardFunction[],\n app?: PartialMicroApp\n ): void {\n if (app) {\n currentApp = app;\n }\n registeredFunctions.clear();\n if (Array.isArray(functions)) {\n for (const fn of functions) {\n let deps: Set<string> | string[] | undefined = fn.deps;\n if (deps == null) {\n deps = collectMemberUsageInFunction(fn, \"FN\", !!collectCoverage);\n (deps as Set<string>).delete(fn.name);\n }\n const hasPermissionsCheck =\n fn.perm ??\n collectMemberUsageInFunction(\n fn,\n \"PERMISSIONS\",\n !!collectCoverage\n ).has(\"check\");\n registeredFunctions.set(fn.name, {\n source: fn.source,\n typescript: fn.typescript,\n deps,\n hasPermissionsCheck,\n });\n }\n }\n }\n\n function getStoryboardFunction(name: string): Function | undefined {\n const fn = registeredFunctions.get(name);\n if (!fn) {\n return undefined;\n }\n if (fn.processed) {\n return fn.cooked;\n }\n let collector: FunctionCoverageCollector | undefined;\n if (collectCoverage) {\n collector = collectCoverage.createCollector(name);\n }\n const precooked = precookFunction(fn.source, {\n typescript: fn.typescript,\n hooks: collector && {\n beforeVisit: collector.beforeVisit,\n },\n cacheKey: fn,\n });\n const globalVariables = supply(\n precooked.attemptToVisitGlobals,\n getGeneralGlobals(precooked.attemptToVisitGlobals, {\n collectCoverage,\n widgetId,\n widgetVersion,\n app: currentApp,\n storyboardFunctions,\n isStoryboardFunction: true,\n }),\n !!collectCoverage\n );\n\n fn.cooked = cook(precooked.function, fn.source, {\n rules: {\n noVar: true,\n },\n globalVariables: overrides\n ? {\n ...globalVariables,\n ...(overrides?.LodashWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"_\")\n ? {\n _: {\n ...(globalVariables._ as typeof _),\n ...overrides.LodashWithStaticFields,\n },\n }\n : null),\n ...(overrides?.ArrayConstructor &&\n precooked.attemptToVisitGlobals.has(\"Array\")\n ? {\n Array: overrides.ArrayConstructor,\n }\n : null),\n ...(overrides?.ObjectWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"Object\")\n ? {\n Object: {\n ...(globalVariables.Object as typeof Object),\n ...overrides.ObjectWithStaticFields,\n },\n }\n : null),\n }\n : globalVariables,\n ArrayConstructor: overrides?.ArrayConstructor,\n hooks: collector && {\n beforeEvaluate: collector.beforeEvaluate,\n beforeCall: collector.beforeCall,\n beforeBranch: collector.beforeBranch,\n },\n debug: !!debuggerOverrides,\n }) as Function;\n fn.processed = true;\n return fn.cooked;\n }\n\n return {\n storyboardFunctions,\n registerStoryboardFunctions,\n updateStoryboardFunction(\n name: string,\n data: StoryboardFunctionPatch\n ): void {\n const newFn = {\n ...data,\n name,\n };\n const deps = collectMemberUsageInFunction(newFn, \"FN\", true);\n const hasPermissionsCheck = collectMemberUsageInFunction(\n newFn,\n \"PERMISSIONS\",\n true\n ).has(\"check\");\n registeredFunctions.set(name, {\n source: data.source,\n typescript: data.typescript,\n deps,\n hasPermissionsCheck,\n });\n },\n /**\n * Check whether listed functions attempt to call `PERMISSIONS.check()`,\n * includes in nested `FN.*()` calls.\n */\n checkPermissionsUsage(functionNames) {\n const checkedFunctions = new Set<string>();\n const hasPermissionsCheck = (name: string): boolean => {\n if (!checkedFunctions.has(name)) {\n checkedFunctions.add(name);\n const fn = registeredFunctions.get(name);\n return (\n !!fn &&\n (fn.hasPermissionsCheck || [...fn.deps].some(hasPermissionsCheck))\n );\n }\n return false;\n };\n return functionNames.some(hasPermissionsCheck);\n },\n clearGlobalExecutionContextStack() {\n __dev_only_clearGlobalExecutionContextStack();\n },\n getGlobalExecutionContextStack() {\n return __dev_only_getGlobalExecutionContextStack();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"StoryboardFunctionRegistry.js","names":["cook","precookFunction","__dev_only_clearGlobalExecutionContextStack","__dev_only_getGlobalExecutionContextStack","supply","collectMemberUsageInFunction","hasOwnProperty","getGeneralGlobals","StoryboardFunctionRegistryFactory","widgetId","widgetVersion","collectCoverage","debuggerOverrides","arguments","length","undefined","registeredFunctions","Map","overrides","storyboardFunctions","Proxy","Object","freeze","get","_target","key","getStoryboardFunction","currentApp","registerStoryboardFunctions","functions","app","clear","Array","isArray","fn","_fn$perm","deps","delete","name","hasPermissionsCheck","perm","has","set","source","typescript","transformed","getGlobalVariables","globals","isStoryboardFunction","processed","cooked","collector","createCollector","globalVariables","Function","map","precooked","hooks","beforeVisit","cacheKey","attemptToVisitGlobals","function","rules","noVar","LodashWithStaticFields","_","ArrayConstructor","ObjectWithStaticFields","beforeEvaluate","beforeCall","beforeBranch","debug","updateStoryboardFunction","data","newFn","checkPermissionsUsage","functionNames","checkedFunctions","Set","add","some","clearGlobalExecutionContextStack","getGlobalExecutionContextStack"],"sources":["../../src/StoryboardFunctionRegistry.ts"],"sourcesContent":["import type {\n MicroApp,\n StoryboardFunction,\n TransformedFunction,\n} from \"@next-core/types\";\nimport {\n cook,\n precookFunction,\n EstreeNode,\n __dev_only_clearGlobalExecutionContextStack,\n __dev_only_getGlobalExecutionContextStack,\n} from \"@next-core/cook\";\nimport { supply } from \"@next-core/supply\";\nimport { collectMemberUsageInFunction } from \"@next-core/utils/storyboard\";\nimport { hasOwnProperty } from \"@next-core/utils/general\";\nimport type _ from \"lodash\";\nimport { getGeneralGlobals } from \"./internal/compute/getGeneralGlobals.js\";\n\n/** @internal */\nexport type ReadonlyStoryboardFunctions = Readonly<Record<string, Function>>;\n\n/** @internal */\nexport type StoryboardFunctionPatch = Pick<\n StoryboardFunction,\n \"source\" | \"typescript\" | \"transformed\"\n>;\n\n/** @internal */\nexport interface StoryboardFunctionRegistry {\n /** A readonly proxy for accessing cooked storyboard functions. */\n storyboardFunctions: ReadonlyStoryboardFunctions;\n\n /** Register storyboard functions. */\n registerStoryboardFunctions(\n functions: StoryboardFunction[] | undefined,\n app?: PartialMicroApp\n ): void;\n\n /** Update a storyboard function during debugging. */\n updateStoryboardFunction(name: string, data: StoryboardFunctionPatch): void;\n\n checkPermissionsUsage(functionNames: string[]): boolean;\n\n clearGlobalExecutionContextStack(): void;\n getGlobalExecutionContextStack(): ReturnType<\n typeof __dev_only_getGlobalExecutionContextStack\n >;\n}\n\n/** @internal */\nexport interface RuntimeStoryboardFunction {\n source: string;\n typescript?: boolean;\n processed?: boolean;\n cooked?: Function;\n deps: Set<string> | string[];\n hasPermissionsCheck: boolean;\n transformed?: TransformedFunction;\n}\n\n/** @internal */\nexport interface FunctionCoverageCollector {\n beforeVisit(node: EstreeNode): void;\n beforeEvaluate(node: EstreeNode): void;\n beforeCall(node: EstreeNode): void;\n beforeBranch(node: EstreeNode, branch: string): void;\n}\n\n/** @internal */\nexport interface FunctionCoverageSettings {\n createCollector(name: string): FunctionCoverageCollector;\n}\n\n/** @internal */\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\" | \"config\">;\n\n/** @internal */\nexport function StoryboardFunctionRegistryFactory({\n widgetId,\n widgetVersion,\n collectCoverage,\n debuggerOverrides,\n}: {\n widgetId?: string;\n widgetVersion?: string;\n collectCoverage?: FunctionCoverageSettings;\n debuggerOverrides?: (ctx: {\n precookFunction: typeof precookFunction;\n cook: typeof cook;\n supply: typeof supply;\n }) => {\n LodashWithStaticFields?: Partial<typeof _>;\n ArrayConstructor?: typeof Array;\n ObjectWithStaticFields?: Partial<typeof Object>;\n };\n} = {}): StoryboardFunctionRegistry {\n const registeredFunctions = new Map<string, RuntimeStoryboardFunction>();\n\n const overrides = debuggerOverrides?.({\n precookFunction,\n cook,\n supply,\n });\n\n // Use `Proxy` with a frozen target, to make a readonly function registry.\n const storyboardFunctions = new Proxy(Object.freeze({}), {\n get(_target, key) {\n return getStoryboardFunction(key as string);\n },\n }) as ReadonlyStoryboardFunctions;\n\n let currentApp: PartialMicroApp | undefined;\n\n function registerStoryboardFunctions(\n functions: StoryboardFunction[],\n app?: PartialMicroApp\n ): void {\n if (app) {\n currentApp = app;\n }\n registeredFunctions.clear();\n if (Array.isArray(functions)) {\n for (const fn of functions) {\n let deps: Set<string> | string[] | undefined = fn.deps;\n if (deps == null) {\n deps = collectMemberUsageInFunction(fn, \"FN\", !!collectCoverage);\n (deps as Set<string>).delete(fn.name);\n }\n const hasPermissionsCheck =\n fn.perm ??\n collectMemberUsageInFunction(\n fn,\n \"PERMISSIONS\",\n !!collectCoverage\n ).has(\"check\");\n registeredFunctions.set(fn.name, {\n source: fn.source,\n typescript: fn.typescript,\n transformed: fn.transformed,\n deps,\n hasPermissionsCheck,\n });\n }\n }\n }\n\n function getGlobalVariables(globals: Set<string> | string[]) {\n return supply(\n globals,\n getGeneralGlobals(globals, {\n collectCoverage,\n widgetId,\n widgetVersion,\n app: currentApp,\n storyboardFunctions,\n isStoryboardFunction: true,\n }),\n !!collectCoverage\n );\n }\n\n function getStoryboardFunction(name: string): Function | undefined {\n const fn = registeredFunctions.get(name);\n if (!fn) {\n return undefined;\n }\n if (fn.processed) {\n return fn.cooked;\n }\n let collector: FunctionCoverageCollector | undefined;\n if (collectCoverage) {\n collector = collectCoverage.createCollector(name);\n }\n\n // Do not use transformed functions when debugging.\n const transformed = !overrides && !collector && fn.transformed;\n if (transformed) {\n const globalVariables = getGlobalVariables(transformed.globals);\n // Spread globals as params to prevent accessing forbidden globals.\n // NOTE: in native mode, forbidden globals are declared as `undefined`,\n // thus accessing them will not throw a ReferenceError.\n fn.cooked = new Function(\n ...transformed.globals,\n `\"use strict\";return (${transformed.source})`\n )(\n ...transformed.globals.map((key) =>\n hasOwnProperty(globalVariables, key)\n ? globalVariables[key]\n : undefined\n )\n );\n } else {\n const precooked = precookFunction(fn.source, {\n typescript: fn.typescript,\n hooks: collector && {\n beforeVisit: collector.beforeVisit,\n },\n cacheKey: fn,\n });\n const globalVariables = getGlobalVariables(\n precooked.attemptToVisitGlobals\n );\n fn.cooked = cook(precooked.function, fn.source, {\n rules: {\n noVar: true,\n },\n globalVariables: overrides\n ? {\n ...globalVariables,\n ...(overrides?.LodashWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"_\")\n ? {\n _: {\n ...(globalVariables._ as typeof _),\n ...overrides.LodashWithStaticFields,\n },\n }\n : null),\n ...(overrides?.ArrayConstructor &&\n precooked.attemptToVisitGlobals.has(\"Array\")\n ? {\n Array: overrides.ArrayConstructor,\n }\n : null),\n ...(overrides?.ObjectWithStaticFields &&\n precooked.attemptToVisitGlobals.has(\"Object\")\n ? {\n Object: {\n ...(globalVariables.Object as typeof Object),\n ...overrides.ObjectWithStaticFields,\n },\n }\n : null),\n }\n : globalVariables,\n ArrayConstructor: overrides?.ArrayConstructor,\n hooks: collector && {\n beforeEvaluate: collector.beforeEvaluate,\n beforeCall: collector.beforeCall,\n beforeBranch: collector.beforeBranch,\n },\n debug: !!debuggerOverrides,\n }) as Function;\n }\n fn.processed = true;\n return fn.cooked;\n }\n\n return {\n storyboardFunctions,\n registerStoryboardFunctions,\n updateStoryboardFunction(\n name: string,\n data: StoryboardFunctionPatch\n ): void {\n const newFn = {\n ...data,\n name,\n };\n const deps = collectMemberUsageInFunction(newFn, \"FN\", true);\n const hasPermissionsCheck = collectMemberUsageInFunction(\n newFn,\n \"PERMISSIONS\",\n true\n ).has(\"check\");\n registeredFunctions.set(name, {\n source: data.source,\n typescript: data.typescript,\n transformed: data.transformed,\n deps,\n hasPermissionsCheck,\n });\n },\n /**\n * Check whether listed functions attempt to call `PERMISSIONS.check()`,\n * includes in nested `FN.*()` calls.\n */\n checkPermissionsUsage(functionNames) {\n const checkedFunctions = new Set<string>();\n const hasPermissionsCheck = (name: string): boolean => {\n if (!checkedFunctions.has(name)) {\n checkedFunctions.add(name);\n const fn = registeredFunctions.get(name);\n return (\n !!fn &&\n (fn.hasPermissionsCheck || [...fn.deps].some(hasPermissionsCheck))\n );\n }\n return false;\n };\n return functionNames.some(hasPermissionsCheck);\n },\n clearGlobalExecutionContextStack() {\n __dev_only_clearGlobalExecutionContextStack();\n },\n getGlobalExecutionContextStack() {\n return __dev_only_getGlobalExecutionContextStack();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"getGeneralGlobals.js","names":["identity","i18n","i18nText","widgetI18nFactory","getReadOnlyProxy","getCssPropertyValue","getTheme","getBasePath","getI18nNamespace","hooks","getGeneralGlobals","attemptToVisitGlobals","options","globalVariables","variableName","variable","getIndividualGlobal","undefined","_ref","_hooks$images","_hooks$images2","_hooks$checkPermissio","collectCoverage","widgetId","widgetVersion","app","appendI18nNamespace","storyboardFunctions","isStoryboardFunction","replace","fakeImageFactory","images","widgetImagesFactory","imagesFactory","id","isBuildPush","currentVersion","getFixedT","filter","Boolean","fakeI18nText","check","fakeCheckPermissions","checkPermissions","console","href","origin","host","hostname","location","data","en","get","name"],"sources":["../../../../src/internal/compute/getGeneralGlobals.ts"],"sourcesContent":["import { identity } from \"lodash\";\nimport type { MicroApp } from \"@next-core/types\";\nimport { i18n, i18nText } from \"@next-core/i18n\";\nimport { widgetI18nFactory } from \"./WidgetI18n.js\";\nimport { getReadOnlyProxy } from \"../proxyFactories.js\";\nimport { getCssPropertyValue, getTheme } from \"../../themeAndMode.js\";\nimport { getBasePath } from \"../../getBasePath.js\";\nimport { getI18nNamespace } from \"../registerAppI18n.js\";\nimport { ImagesFactory, hooks } from \"../Runtime.js\";\n\nexport interface GeneralGlobalsOptions {\n collectCoverage?: unknown;\n widgetId?: string;\n widgetVersion?: string;\n app?: PartialMicroApp;\n appendI18nNamespace?: string;\n storyboardFunctions?: unknown;\n isStoryboardFunction?: boolean;\n}\n\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\">;\n\n// `GeneralGlobals` are globals which are page-state-agnostic,\n// thus they can be used both in storyboard expressions and functions.\nexport function getGeneralGlobals(\n attemptToVisitGlobals: Set<string>,\n options: GeneralGlobalsOptions\n): Record<string, unknown> {\n const globalVariables: Record<string, unknown> = {};\n for (const variableName of attemptToVisitGlobals) {\n const variable = getIndividualGlobal(variableName, options);\n if (variable !== undefined) {\n globalVariables[variableName] = variable;\n }\n }\n return globalVariables;\n}\n\nfunction getIndividualGlobal(\n variableName: string,\n {\n collectCoverage,\n widgetId,\n widgetVersion,\n app,\n appendI18nNamespace,\n storyboardFunctions,\n isStoryboardFunction,\n }: GeneralGlobalsOptions\n): unknown {\n switch (variableName) {\n case \"BASE_URL\":\n return collectCoverage ? \"/next\" : getBasePath().replace(/\\/$/, \"\");\n case \"FN\":\n return storyboardFunctions;\n case \"IMG\":\n return collectCoverage\n ? fakeImageFactory()\n : widgetId\n ? hooks?.images?.widgetImagesFactory(widgetId, widgetVersion)\n : hooks?.images?.imagesFactory(\n app!.id,\n app!.isBuildPush,\n (app as { currentVersion?: string }).currentVersion\n );\n case \"I18N\":\n return collectCoverage\n ? identity\n : widgetId\n ? widgetI18nFactory(widgetId)\n : i18n.getFixedT(\n null,\n [appendI18nNamespace, getI18nNamespace(\"app\", app!.id)].filter(\n Boolean\n ) as string[]\n );\n case \"I18N_TEXT\":\n return collectCoverage ? fakeI18nText : i18nText;\n case \"PERMISSIONS\":\n return getReadOnlyProxy({\n check: collectCoverage\n ? fakeCheckPermissions\n : hooks?.checkPermissions?.checkPermissions,\n });\n case \"THEME\":\n return getReadOnlyProxy({\n getTheme: collectCoverage ? () => \"light\" : getTheme,\n getCssPropertyValue: collectCoverage ? () => \"\" : getCssPropertyValue,\n });\n case \"console\":\n return isStoryboardFunction ? getReadOnlyProxy(console) : undefined;\n case \"location\":\n return collectCoverage\n ? {\n href: \"http://localhost:3000/functions/test\",\n origin: \"http://localhost:3000\",\n host: \"localhost:3000\",\n hostname: \"localhost\",\n }\n : {\n href: location.href,\n origin: location.origin,\n host: location.host,\n hostname: location.hostname,\n };\n }\n}\n\nfunction fakeI18nText(data: Record<string, string>): string {\n return data?.en;\n}\n\nfunction fakeImageFactory(): ImagesFactory {\n return {\n get(name: string) {\n return `mock/images/${name}`;\n },\n };\n}\n\nfunction fakeCheckPermissions(): boolean {\n return true;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"getGeneralGlobals.js","names":["identity","i18n","i18nText","widgetI18nFactory","getReadOnlyProxy","getCssPropertyValue","getTheme","getBasePath","getI18nNamespace","hooks","getGeneralGlobals","attemptToVisitGlobals","options","globalVariables","variableName","variable","getIndividualGlobal","undefined","_ref","_hooks$images","_hooks$images2","_hooks$checkPermissio","collectCoverage","widgetId","widgetVersion","app","appendI18nNamespace","storyboardFunctions","isStoryboardFunction","replace","fakeImageFactory","images","widgetImagesFactory","imagesFactory","id","isBuildPush","currentVersion","getFixedT","filter","Boolean","fakeI18nText","check","fakeCheckPermissions","checkPermissions","console","href","origin","host","hostname","location","data","en","get","name"],"sources":["../../../../src/internal/compute/getGeneralGlobals.ts"],"sourcesContent":["import { identity } from \"lodash\";\nimport type { MicroApp } from \"@next-core/types\";\nimport { i18n, i18nText } from \"@next-core/i18n\";\nimport { widgetI18nFactory } from \"./WidgetI18n.js\";\nimport { getReadOnlyProxy } from \"../proxyFactories.js\";\nimport { getCssPropertyValue, getTheme } from \"../../themeAndMode.js\";\nimport { getBasePath } from \"../../getBasePath.js\";\nimport { getI18nNamespace } from \"../registerAppI18n.js\";\nimport { ImagesFactory, hooks } from \"../Runtime.js\";\n\nexport interface GeneralGlobalsOptions {\n collectCoverage?: unknown;\n widgetId?: string;\n widgetVersion?: string;\n app?: PartialMicroApp;\n appendI18nNamespace?: string;\n storyboardFunctions?: unknown;\n isStoryboardFunction?: boolean;\n}\n\nexport type PartialMicroApp = Pick<MicroApp, \"id\" | \"isBuildPush\">;\n\n// `GeneralGlobals` are globals which are page-state-agnostic,\n// thus they can be used both in storyboard expressions and functions.\nexport function getGeneralGlobals(\n attemptToVisitGlobals: Set<string> | string[],\n options: GeneralGlobalsOptions\n): Record<string, unknown> {\n const globalVariables: Record<string, unknown> = {};\n for (const variableName of attemptToVisitGlobals) {\n const variable = getIndividualGlobal(variableName, options);\n if (variable !== undefined) {\n globalVariables[variableName] = variable;\n }\n }\n return globalVariables;\n}\n\nfunction getIndividualGlobal(\n variableName: string,\n {\n collectCoverage,\n widgetId,\n widgetVersion,\n app,\n appendI18nNamespace,\n storyboardFunctions,\n isStoryboardFunction,\n }: GeneralGlobalsOptions\n): unknown {\n switch (variableName) {\n case \"BASE_URL\":\n return collectCoverage ? \"/next\" : getBasePath().replace(/\\/$/, \"\");\n case \"FN\":\n return storyboardFunctions;\n case \"IMG\":\n return collectCoverage\n ? fakeImageFactory()\n : widgetId\n ? hooks?.images?.widgetImagesFactory(widgetId, widgetVersion)\n : hooks?.images?.imagesFactory(\n app!.id,\n app!.isBuildPush,\n (app as { currentVersion?: string }).currentVersion\n );\n case \"I18N\":\n return collectCoverage\n ? identity\n : widgetId\n ? widgetI18nFactory(widgetId)\n : i18n.getFixedT(\n null,\n [appendI18nNamespace, getI18nNamespace(\"app\", app!.id)].filter(\n Boolean\n ) as string[]\n );\n case \"I18N_TEXT\":\n return collectCoverage ? fakeI18nText : i18nText;\n case \"PERMISSIONS\":\n return getReadOnlyProxy({\n check: collectCoverage\n ? fakeCheckPermissions\n : hooks?.checkPermissions?.checkPermissions,\n });\n case \"THEME\":\n return getReadOnlyProxy({\n getTheme: collectCoverage ? () => \"light\" : getTheme,\n getCssPropertyValue: collectCoverage ? () => \"\" : getCssPropertyValue,\n });\n case \"console\":\n return isStoryboardFunction ? getReadOnlyProxy(console) : undefined;\n case \"location\":\n return collectCoverage\n ? {\n href: \"http://localhost:3000/functions/test\",\n origin: \"http://localhost:3000\",\n host: \"localhost:3000\",\n hostname: \"localhost\",\n }\n : {\n href: location.href,\n origin: location.origin,\n host: location.host,\n hostname: location.hostname,\n };\n }\n}\n\nfunction fakeI18nText(data: Record<string, string>): string {\n return data?.en;\n}\n\nfunction fakeImageFactory(): ImagesFactory {\n return {\n get(name: string) {\n return `mock/images/${name}`;\n },\n };\n}\n\nfunction fakeCheckPermissions(): boolean {\n return true;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,11 @@
1
- import type { MicroApp, StoryboardFunction } from "@next-core/types";
1
+ import type { MicroApp, StoryboardFunction, TransformedFunction } from "@next-core/types";
2
2
  import { cook, precookFunction, EstreeNode, __dev_only_getGlobalExecutionContextStack } from "@next-core/cook";
3
3
  import { supply } from "@next-core/supply";
4
4
  import type _ from "lodash";
5
5
  /** @internal */
6
6
  export type ReadonlyStoryboardFunctions = Readonly<Record<string, Function>>;
7
7
  /** @internal */
8
- export type StoryboardFunctionPatch = Pick<StoryboardFunction, "source" | "typescript">;
8
+ export type StoryboardFunctionPatch = Pick<StoryboardFunction, "source" | "typescript" | "transformed">;
9
9
  /** @internal */
10
10
  export interface StoryboardFunctionRegistry {
11
11
  /** A readonly proxy for accessing cooked storyboard functions. */
@@ -26,6 +26,7 @@ export interface RuntimeStoryboardFunction {
26
26
  cooked?: Function;
27
27
  deps: Set<string> | string[];
28
28
  hasPermissionsCheck: boolean;
29
+ transformed?: TransformedFunction;
29
30
  }
30
31
  /** @internal */
31
32
  export interface FunctionCoverageCollector {
@@ -39,7 +40,7 @@ export interface FunctionCoverageSettings {
39
40
  createCollector(name: string): FunctionCoverageCollector;
40
41
  }
41
42
  /** @internal */
42
- export type PartialMicroApp = Pick<MicroApp, "id" | "isBuildPush">;
43
+ export type PartialMicroApp = Pick<MicroApp, "id" | "isBuildPush" | "config">;
43
44
  /** @internal */
44
45
  export declare function StoryboardFunctionRegistryFactory({ widgetId, widgetVersion, collectCoverage, debuggerOverrides, }?: {
45
46
  widgetId?: string;
@@ -9,4 +9,4 @@ export interface GeneralGlobalsOptions {
9
9
  isStoryboardFunction?: boolean;
10
10
  }
11
11
  export type PartialMicroApp = Pick<MicroApp, "id" | "isBuildPush">;
12
- export declare function getGeneralGlobals(attemptToVisitGlobals: Set<string>, options: GeneralGlobalsOptions): Record<string, unknown>;
12
+ export declare function getGeneralGlobals(attemptToVisitGlobals: Set<string> | string[], options: GeneralGlobalsOptions): Record<string, unknown>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-core/runtime",
3
- "version": "1.57.5",
3
+ "version": "1.58.0",
4
4
  "homepage": "https://github.com/easyops-cn/next-core/tree/v3/packages/runtime",
5
5
  "license": "GPL-3.0",
6
6
  "repository": {
@@ -45,14 +45,14 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@next-core/color-theme": "^0.4.8",
48
- "@next-core/cook": "^2.5.2",
48
+ "@next-core/cook": "^2.5.3",
49
49
  "@next-core/http": "^1.2.8",
50
- "@next-core/i18n": "^1.0.69",
51
- "@next-core/inject": "^1.0.47",
50
+ "@next-core/i18n": "^1.0.70",
51
+ "@next-core/inject": "^1.0.48",
52
52
  "@next-core/loader": "^1.6.11",
53
- "@next-core/supply": "^2.2.2",
54
- "@next-core/types": "^1.13.0",
55
- "@next-core/utils": "^1.7.27",
53
+ "@next-core/supply": "^2.3.0",
54
+ "@next-core/types": "^1.14.0",
55
+ "@next-core/utils": "^1.7.28",
56
56
  "@ungap/event-target": "^0.2.4",
57
57
  "compare-versions": "^6.1.1",
58
58
  "history": "^4.10.1",
@@ -67,5 +67,5 @@
67
67
  "@next-core/build-next-libs": "^1.0.20",
68
68
  "@next-core/test-next": "^1.1.7"
69
69
  },
70
- "gitHead": "3c932b7a7f6c68f4cd749fdb1ffadb6abcc2c2eb"
70
+ "gitHead": "88b6d23b476b970add53676df48b89137ba668f2"
71
71
  }