@qiankunjs/shared 0.0.1-rc.3 → 0.0.1-rc.4

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.
Files changed (32) hide show
  1. package/dist/cjs/assets-transpilers/index.d.ts +1 -0
  2. package/dist/cjs/assets-transpilers/index.js +7 -0
  3. package/dist/cjs/assets-transpilers/index.js.map +1 -1
  4. package/dist/cjs/assets-transpilers/script.js +6 -5
  5. package/dist/cjs/assets-transpilers/script.js.map +1 -1
  6. package/dist/cjs/assets-transpilers/types.d.ts +3 -2
  7. package/dist/cjs/assets-transpilers/types.js.map +1 -1
  8. package/dist/cjs/assets-transpilers/utils.d.ts +1 -0
  9. package/dist/cjs/assets-transpilers/utils.js +6 -1
  10. package/dist/cjs/assets-transpilers/utils.js.map +1 -1
  11. package/dist/cjs/utils.d.ts +1 -0
  12. package/dist/cjs/utils.js +9 -2
  13. package/dist/cjs/utils.js.map +1 -1
  14. package/dist/esm/assets-transpilers/index.d.ts +1 -0
  15. package/dist/esm/assets-transpilers/index.js +1 -0
  16. package/dist/esm/assets-transpilers/index.js.map +1 -1
  17. package/dist/esm/assets-transpilers/script.js +6 -5
  18. package/dist/esm/assets-transpilers/script.js.map +1 -1
  19. package/dist/esm/assets-transpilers/types.d.ts +3 -2
  20. package/dist/esm/assets-transpilers/types.js.map +1 -1
  21. package/dist/esm/assets-transpilers/utils.d.ts +1 -0
  22. package/dist/esm/assets-transpilers/utils.js +4 -0
  23. package/dist/esm/assets-transpilers/utils.js.map +1 -1
  24. package/dist/esm/utils.d.ts +1 -0
  25. package/dist/esm/utils.js +9 -2
  26. package/dist/esm/utils.js.map +1 -1
  27. package/package.json +2 -3
  28. package/src/assets-transpilers/index.ts +2 -0
  29. package/src/assets-transpilers/script.ts +6 -12
  30. package/src/assets-transpilers/types.ts +3 -3
  31. package/src/assets-transpilers/utils.ts +11 -0
  32. package/src/utils.ts +10 -2
@@ -1,3 +1,4 @@
1
1
  import type { AssetsTranspilerOpts } from './types';
2
2
  export declare function transpileAssets<T extends Node>(node: T, baseURI: string, opts: AssetsTranspilerOpts): T;
3
3
  export type * from './types';
4
+ export { isValidJavaScriptType } from './utils';
@@ -4,9 +4,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ Object.defineProperty(exports, "isValidJavaScriptType", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _utils.isValidJavaScriptType;
11
+ }
12
+ });
7
13
  exports.transpileAssets = transpileAssets;
8
14
  var _link = _interopRequireDefault(require("./link"));
9
15
  var _script = _interopRequireDefault(require("./script"));
16
+ var _utils = require("./utils");
10
17
  /**
11
18
  * @author Kuitos
12
19
  * @since 2023-03-14
@@ -1 +1 @@
1
- {"version":3,"names":["_link","_interopRequireDefault","require","_script","transpileAssets","node","baseURI","opts","htmlElement","tagName","transpileScript","transpileLink"],"sources":["../../../src/assets-transpilers/index.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-14\n */\nimport transpileLink from './link';\nimport transpileScript from './script';\nimport type { AssetsTranspilerOpts } from './types';\n\nexport function transpileAssets<T extends Node>(node: T, baseURI: string, opts: AssetsTranspilerOpts): T {\n const htmlElement = node as unknown as HTMLElement;\n const { tagName } = htmlElement;\n\n switch (tagName) {\n case 'SCRIPT': {\n return transpileScript(htmlElement as HTMLScriptElement, baseURI, opts) as unknown as T;\n }\n\n case 'LINK': {\n return transpileLink(htmlElement as HTMLLinkElement, baseURI, opts) as unknown as T;\n }\n\n default:\n break;\n }\n\n // TODO need to deal with the text scenario of script\n // const { nodeType } = node;\n // switch (nodeType) {\n // case Node.TEXT_NODE: {\n // if (node.parentNode?.nodeName === 'script') {\n // break;\n // }\n // }\n //\n // }\n // }\n return node;\n}\n\nexport type * from './types';\n"],"mappings":";;;;;;;AAIA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AALA;AACA;AACA;AACA;;AAKO,SAASE,eAAeA,CAAiBC,IAAO,EAAEC,OAAe,EAAEC,IAA0B,EAAK;EACvG,IAAMC,WAAW,GAAGH,IAA8B;EAClD,IAAQI,OAAO,GAAKD,WAAW,CAAvBC,OAAO;EAEf,QAAQA,OAAO;IACb,KAAK,QAAQ;MAAE;QACb,OAAO,IAAAC,eAAe,EAACF,WAAW,EAAuBF,OAAO,EAAEC,IAAI,CAAC;MACzE;IAEA,KAAK,MAAM;MAAE;QACX,OAAO,IAAAI,aAAa,EAACH,WAAW,EAAqBF,OAAO,EAAEC,IAAI,CAAC;MACrE;IAEA;MACE;EACJ;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAOF,IAAI;AACb"}
1
+ {"version":3,"names":["_link","_interopRequireDefault","require","_script","_utils","transpileAssets","node","baseURI","opts","htmlElement","tagName","transpileScript","transpileLink"],"sources":["../../../src/assets-transpilers/index.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-14\n */\nimport transpileLink from './link';\nimport transpileScript from './script';\nimport type { AssetsTranspilerOpts } from './types';\n\nexport function transpileAssets<T extends Node>(node: T, baseURI: string, opts: AssetsTranspilerOpts): T {\n const htmlElement = node as unknown as HTMLElement;\n const { tagName } = htmlElement;\n\n switch (tagName) {\n case 'SCRIPT': {\n return transpileScript(htmlElement as HTMLScriptElement, baseURI, opts) as unknown as T;\n }\n\n case 'LINK': {\n return transpileLink(htmlElement as HTMLLinkElement, baseURI, opts) as unknown as T;\n }\n\n default:\n break;\n }\n\n // TODO need to deal with the text scenario of script\n // const { nodeType } = node;\n // switch (nodeType) {\n // case Node.TEXT_NODE: {\n // if (node.parentNode?.nodeName === 'script') {\n // break;\n // }\n // }\n //\n // }\n // }\n return node;\n}\n\nexport type * from './types';\n\nexport { isValidJavaScriptType } from './utils';\n"],"mappings":";;;;;;;;;;;;;AAIA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAoCA,IAAAE,MAAA,GAAAF,OAAA;AAzCA;AACA;AACA;AACA;;AAKO,SAASG,eAAeA,CAAiBC,IAAO,EAAEC,OAAe,EAAEC,IAA0B,EAAK;EACvG,IAAMC,WAAW,GAAGH,IAA8B;EAClD,IAAQI,OAAO,GAAKD,WAAW,CAAvBC,OAAO;EAEf,QAAQA,OAAO;IACb,KAAK,QAAQ;MAAE;QACb,OAAO,IAAAC,eAAe,EAACF,WAAW,EAAuBF,OAAO,EAAEC,IAAI,CAAC;MACzE;IAEA,KAAK,MAAM;MAAE;QACX,OAAO,IAAAI,aAAa,EAACH,WAAW,EAAqBF,OAAO,EAAEC,IAAI,CAAC;MACrE;IAEA;MACE;EACJ;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAOF,IAAI;AACb"}
@@ -15,10 +15,6 @@ var _utils2 = require("./utils");
15
15
  * @since 2023-03-16
16
16
  */
17
17
 
18
- var isValidJavaScriptType = function isValidJavaScriptType(type) {
19
- var handleTypes = ['text/javascript', 'module', 'application/javascript', 'text/ecmascript', 'application/ecmascript'];
20
- return !type || handleTypes.indexOf(type) !== -1;
21
- };
22
18
  var getCredentials = function getCredentials(crossOrigin) {
23
19
  switch (crossOrigin) {
24
20
  case 'anonymous':
@@ -53,7 +49,7 @@ var preTranspile = function preTranspile(script, baseURI, opts) {
53
49
  }
54
50
  };
55
51
  }
56
- if (isValidJavaScriptType(type)) {
52
+ if ((0, _utils2.isValidJavaScriptType)(type)) {
57
53
  var rawNode = opts.rawNode;
58
54
  var scriptNode = script.textContent ? script : rawNode.childNodes[0];
59
55
  var code = scriptNode.textContent;
@@ -78,6 +74,11 @@ function transpileScript(script, baseURI, opts) {
78
74
  var srcAttribute = script.getAttribute('src');
79
75
  var sandbox = opts.sandbox,
80
76
  fetch = opts.fetch;
77
+
78
+ // To prevent webpack from skipping reload logic and causing the js not to re-execute when a micro app is loaded multiple times, the data-webpack attribute of the script must be removed.
79
+ // see https://github.com/webpack/webpack/blob/1f13ff9fe587e094df59d660b4611b1bd19aed4c/lib/runtime/LoadScriptRuntimeModule.js#L131-L136
80
+ // FIXME We should determine whether the current micro application is being loaded for the second time. If not, this removal should not be performed.
81
+ script.removeAttribute('data-webpack');
81
82
  var _preTranspile = preTranspile({
82
83
  src: srcAttribute || undefined,
83
84
  type: script.type,
@@ -1 +1 @@
1
- {"version":3,"names":["_utils","require","_types","_utils2","isValidJavaScriptType","type","handleTypes","indexOf","getCredentials","crossOrigin","undefined","preTranspile","script","baseURI","opts","sandbox","moduleResolver","src","entireUrl","getEntireUrl","matchedScript","mode","Mode","REUSED_DEP_IN_SANDBOX","result","_objectSpread2","default","REMOTE_ASSETS_IN_SANDBOX","rawNode","scriptNode","textContent","childNodes","code","INLINE_CODE_IN_SANDBOX","NONE","exports","transpileScript","srcAttribute","getAttribute","fetch","_preTranspile","removeAttribute","dataset","syncMode","hasAttribute","priority","credentials","then","res","text","codeFactory","makeEvaluateFactory","fetchPriority","URL","createObjectURL","Blob","consumed","url","version","createReusingObjectUrl"],"sources":["../../../src/assets-transpilers/script.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-16\n */\n\nimport type { MatchResult } from '../module-resolver';\nimport { getEntireUrl } from '../utils';\nimport type { AssetsTranspilerOpts } from './types';\nimport { Mode } from './types';\nimport { createReusingObjectUrl } from './utils';\n\nconst isValidJavaScriptType = (type?: string): boolean => {\n const handleTypes = [\n 'text/javascript',\n 'module',\n 'application/javascript',\n 'text/ecmascript',\n 'application/ecmascript',\n ];\n return !type || handleTypes.indexOf(type) !== -1;\n};\n\nconst getCredentials = (crossOrigin: string | null): RequestInit['credentials'] | undefined => {\n switch (crossOrigin) {\n case 'anonymous':\n return 'same-origin';\n case 'use-credentials':\n return 'include';\n default:\n return undefined;\n }\n};\n\ntype PreTranspileResult =\n | { mode: Mode.REMOTE_ASSETS_IN_SANDBOX; result: { src: string } }\n | { mode: Mode.REUSED_DEP_IN_SANDBOX; result: { src: string } & MatchResult }\n | { mode: Mode.INLINE_CODE_IN_SANDBOX; result: { code: string } }\n | { mode: Mode.NONE; result?: never };\n\nexport const preTranspile = (\n script: Partial<Pick<HTMLScriptElement, 'src' | 'type' | 'textContent'>>,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): PreTranspileResult => {\n const { sandbox, moduleResolver } = opts;\n\n const { src, type } = script;\n\n if (sandbox) {\n if (src) {\n const entireUrl = getEntireUrl(src, baseURI);\n const matchedScript = moduleResolver?.(entireUrl);\n if (matchedScript) {\n return {\n mode: Mode.REUSED_DEP_IN_SANDBOX,\n result: { src: entireUrl, ...matchedScript },\n };\n }\n\n return {\n mode: Mode.REMOTE_ASSETS_IN_SANDBOX,\n result: { src: entireUrl },\n };\n }\n\n if (isValidJavaScriptType(type)) {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n\n const code = scriptNode.textContent;\n if (code) {\n return {\n mode: Mode.INLINE_CODE_IN_SANDBOX,\n result: {\n code,\n },\n };\n }\n }\n }\n\n return { mode: Mode.NONE };\n};\n\nexport default function transpileScript(\n script: HTMLScriptElement,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): HTMLScriptElement {\n // Can't use script.src directly, because it will be resolved to absolute path by browser with Node.baseURI\n // Such as <script src=\"./foo.js\"></script> will be resolved to http://localhost:8000/foo.js while read script.src\n const srcAttribute = script.getAttribute('src');\n const { sandbox, fetch } = opts;\n\n const { mode, result } = preTranspile(\n {\n src: srcAttribute || undefined,\n type: script.type,\n textContent: script.textContent,\n },\n baseURI,\n opts,\n );\n\n switch (mode) {\n case Mode.REMOTE_ASSETS_IN_SANDBOX: {\n const { src } = result;\n\n // We must remove script src to avoid self execution as we need to fetch the script content and transpile it\n script.removeAttribute('src');\n script.dataset.src = src;\n\n const syncMode = !script.hasAttribute('async');\n const priority: Priority = syncMode ? 'high' : 'low';\n const credentials = getCredentials(script.crossOrigin);\n\n void fetch(src, { credentials, priority })\n .then((res) => res.text())\n .then((code) => {\n const codeFactory = sandbox!.makeEvaluateFactory(code, src);\n\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n script.src = URL.createObjectURL(new Blob([codeFactory], { type: 'text/javascript' }));\n });\n\n return script;\n }\n\n case Mode.INLINE_CODE_IN_SANDBOX: {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n const { code } = result;\n\n scriptNode.textContent = sandbox!.makeEvaluateFactory(code, baseURI);\n // mark the script have consumed\n script.dataset.consumed = 'true';\n\n return script;\n }\n\n case Mode.REUSED_DEP_IN_SANDBOX: {\n const { url, version, src } = result;\n\n script.dataset.src = src;\n script.dataset.version = version;\n\n const syncMode = !script.getAttribute('async');\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n // When the script hits the dependency reuse logic, the current script is not executed, and an empty script is returned directly\n script.src = createReusingObjectUrl(src, url, 'text/javascript');\n\n return script;\n }\n\n case Mode.NONE:\n default: {\n if (srcAttribute) {\n script.src = getEntireUrl(srcAttribute, baseURI);\n return script;\n }\n\n return script;\n }\n }\n\n // TODO find entry exports\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_utils","require","_types","_utils2","getCredentials","crossOrigin","undefined","preTranspile","script","baseURI","opts","sandbox","moduleResolver","src","type","entireUrl","getEntireUrl","matchedScript","mode","Mode","REUSED_DEP_IN_SANDBOX","result","_objectSpread2","default","REMOTE_ASSETS_IN_SANDBOX","isValidJavaScriptType","rawNode","scriptNode","textContent","childNodes","code","INLINE_CODE_IN_SANDBOX","NONE","exports","transpileScript","srcAttribute","getAttribute","fetch","removeAttribute","_preTranspile","dataset","syncMode","hasAttribute","priority","credentials","then","res","text","codeFactory","makeEvaluateFactory","fetchPriority","URL","createObjectURL","Blob","consumed","url","version","createReusingObjectUrl"],"sources":["../../../src/assets-transpilers/script.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-16\n */\n\nimport type { MatchResult } from '../module-resolver';\nimport { getEntireUrl } from '../utils';\nimport type { AssetsTranspilerOpts } from './types';\nimport { Mode } from './types';\nimport { createReusingObjectUrl, isValidJavaScriptType } from './utils';\n\nconst getCredentials = (crossOrigin: string | null): RequestInit['credentials'] | undefined => {\n switch (crossOrigin) {\n case 'anonymous':\n return 'same-origin';\n case 'use-credentials':\n return 'include';\n default:\n return undefined;\n }\n};\n\ntype PreTranspileResult =\n | { mode: Mode.REMOTE_ASSETS_IN_SANDBOX; result: { src: string } }\n | { mode: Mode.REUSED_DEP_IN_SANDBOX; result: { src: string } & MatchResult }\n | { mode: Mode.INLINE_CODE_IN_SANDBOX; result: { code: string } }\n | { mode: Mode.NONE; result?: never };\n\nexport const preTranspile = (\n script: Partial<Pick<HTMLScriptElement, 'src' | 'type' | 'textContent'>>,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): PreTranspileResult => {\n const { sandbox, moduleResolver } = opts;\n\n const { src, type } = script;\n\n if (sandbox) {\n if (src) {\n const entireUrl = getEntireUrl(src, baseURI);\n const matchedScript = moduleResolver?.(entireUrl);\n if (matchedScript) {\n return {\n mode: Mode.REUSED_DEP_IN_SANDBOX,\n result: { src: entireUrl, ...matchedScript },\n };\n }\n\n return {\n mode: Mode.REMOTE_ASSETS_IN_SANDBOX,\n result: { src: entireUrl },\n };\n }\n\n if (isValidJavaScriptType(type)) {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n\n const code = scriptNode.textContent;\n if (code) {\n return {\n mode: Mode.INLINE_CODE_IN_SANDBOX,\n result: {\n code,\n },\n };\n }\n }\n }\n\n return { mode: Mode.NONE };\n};\n\nexport default function transpileScript(\n script: HTMLScriptElement,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): HTMLScriptElement {\n // Can't use script.src directly, because it will be resolved to absolute path by browser with Node.baseURI\n // Such as <script src=\"./foo.js\"></script> will be resolved to http://localhost:8000/foo.js while read script.src\n const srcAttribute = script.getAttribute('src');\n const { sandbox, fetch } = opts;\n\n // To prevent webpack from skipping reload logic and causing the js not to re-execute when a micro app is loaded multiple times, the data-webpack attribute of the script must be removed.\n // see https://github.com/webpack/webpack/blob/1f13ff9fe587e094df59d660b4611b1bd19aed4c/lib/runtime/LoadScriptRuntimeModule.js#L131-L136\n // FIXME We should determine whether the current micro application is being loaded for the second time. If not, this removal should not be performed.\n script.removeAttribute('data-webpack');\n\n const { mode, result } = preTranspile(\n {\n src: srcAttribute || undefined,\n type: script.type,\n textContent: script.textContent,\n },\n baseURI,\n opts,\n );\n\n switch (mode) {\n case Mode.REMOTE_ASSETS_IN_SANDBOX: {\n const { src } = result;\n\n // We must remove script src to avoid self execution as we need to fetch the script content and transpile it\n script.removeAttribute('src');\n script.dataset.src = src;\n\n const syncMode = !script.hasAttribute('async');\n const priority: Priority = syncMode ? 'high' : 'low';\n const credentials = getCredentials(script.crossOrigin);\n\n void fetch(src, { credentials, priority })\n .then((res) => res.text())\n .then((code) => {\n const codeFactory = sandbox!.makeEvaluateFactory(code, src);\n\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n script.src = URL.createObjectURL(new Blob([codeFactory], { type: 'text/javascript' }));\n });\n\n return script;\n }\n\n case Mode.INLINE_CODE_IN_SANDBOX: {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n const { code } = result;\n\n scriptNode.textContent = sandbox!.makeEvaluateFactory(code, baseURI);\n // mark the script have consumed\n script.dataset.consumed = 'true';\n\n return script;\n }\n\n case Mode.REUSED_DEP_IN_SANDBOX: {\n const { url, version, src } = result;\n\n script.dataset.src = src;\n script.dataset.version = version;\n\n const syncMode = !script.getAttribute('async');\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n // When the script hits the dependency reuse logic, the current script is not executed, and an empty script is returned directly\n script.src = createReusingObjectUrl(src, url, 'text/javascript');\n\n return script;\n }\n\n case Mode.NONE:\n default: {\n if (srcAttribute) {\n script.src = getEntireUrl(srcAttribute, baseURI);\n return script;\n }\n\n return script;\n }\n }\n\n // TODO find entry exports\n}\n"],"mappings":"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"}
@@ -2,12 +2,13 @@
2
2
  * @author Kuitos
3
3
  * @since 2023-08-26
4
4
  */
5
- import type { Sandbox } from '@qiankunjs/sandbox';
6
5
  import type { BaseLoaderOpts } from '../common';
7
6
  import type { MatchResult } from '../module-resolver';
8
7
  export type BaseTranspilerOpts = BaseLoaderOpts & {
9
8
  moduleResolver?: (url: string) => MatchResult | undefined;
10
- sandbox?: Sandbox;
9
+ sandbox?: {
10
+ makeEvaluateFactory(source: string, sourceURL?: string): string;
11
+ };
11
12
  };
12
13
  export type AssetsTranspilerOpts = BaseTranspilerOpts & {
13
14
  rawNode: Node;
@@ -1 +1 @@
1
- {"version":3,"names":["Mode","exports"],"sources":["../../../src/assets-transpilers/types.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-08-26\n */\nimport type { Sandbox } from '@qiankunjs/sandbox';\nimport type { BaseLoaderOpts } from '../common';\n\nimport type { MatchResult } from '../module-resolver';\n\nexport type BaseTranspilerOpts = BaseLoaderOpts & {\n moduleResolver?: (url: string) => MatchResult | undefined;\n sandbox?: Sandbox;\n};\n\nexport type AssetsTranspilerOpts = BaseTranspilerOpts & { rawNode: Node };\n\nexport enum Mode {\n REMOTE_ASSETS_IN_SANDBOX = 'RAIS',\n REUSED_DEP_IN_SANDBOX = 'RDIS',\n INLINE_CODE_IN_SANDBOX = 'ICIS',\n NONE = 'NONE',\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AAHA,IAgBYA,IAAI,0BAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAA,OAAJA,IAAI;AAAA;AAAAC,OAAA,CAAAD,IAAA,GAAAA,IAAA"}
1
+ {"version":3,"names":["Mode","exports"],"sources":["../../../src/assets-transpilers/types.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-08-26\n */\nimport type { BaseLoaderOpts } from '../common';\nimport type { MatchResult } from '../module-resolver';\n\nexport type BaseTranspilerOpts = BaseLoaderOpts & {\n moduleResolver?: (url: string) => MatchResult | undefined;\n sandbox?: {\n makeEvaluateFactory(source: string, sourceURL?: string): string;\n };\n};\n\nexport type AssetsTranspilerOpts = BaseTranspilerOpts & { rawNode: Node };\n\nexport enum Mode {\n REMOTE_ASSETS_IN_SANDBOX = 'RAIS',\n REUSED_DEP_IN_SANDBOX = 'RDIS',\n INLINE_CODE_IN_SANDBOX = 'ICIS',\n NONE = 'NONE',\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AAHA,IAgBYA,IAAI,0BAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAA,OAAJA,IAAI;AAAA;AAAAC,OAAA,CAAAD,IAAA,GAAAA,IAAA"}
@@ -1 +1,2 @@
1
1
  export declare const createReusingObjectUrl: ((src: string, url: string, type: 'text/javascript' | 'text/css') => string) & import("lodash").MemoizedFunction;
2
+ export declare const isValidJavaScriptType: (type?: string) => boolean;
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.createReusingObjectUrl = void 0;
7
+ exports.isValidJavaScriptType = exports.createReusingObjectUrl = void 0;
8
8
  var _memoize2 = _interopRequireDefault(require("lodash/memoize"));
9
9
  /**
10
10
  * @author Kuitos
@@ -19,4 +19,9 @@ var createReusingObjectUrl = (0, _memoize2.default)(function (src, url, type) {
19
19
  return "".concat(src, "#").concat(url, "#").concat(type);
20
20
  });
21
21
  exports.createReusingObjectUrl = createReusingObjectUrl;
22
+ var isValidJavaScriptType = function isValidJavaScriptType(type) {
23
+ var handleTypes = ['text/javascript', 'module', 'application/javascript', 'text/ecmascript', 'application/ecmascript'];
24
+ return !type || handleTypes.indexOf(type) !== -1;
25
+ };
26
+ exports.isValidJavaScriptType = isValidJavaScriptType;
22
27
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createReusingObjectUrl","_memoize2","default","src","url","type","URL","createObjectURL","Blob","concat","exports"],"sources":["../../../src/assets-transpilers/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-10-09\n */\nimport { memoize } from 'lodash';\n\nexport const createReusingObjectUrl = memoize(\n (src: string, url: string, type: 'text/javascript' | 'text/css'): string => {\n return URL.createObjectURL(\n new Blob([`/* ${src} is reusing the execution result of ${url} */`], {\n type,\n }),\n );\n },\n (src, url, type) => `${src}#${url}#${type}`,\n);\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;;AAGO,IAAMA,sBAAsB,GAAG,IAAAC,SAAA,CAAAC,OAAA,EACpC,UAACC,GAAW,EAAEC,GAAW,EAAEC,IAAoC,EAAa;EAC1E,OAAOC,GAAG,CAACC,eAAe,CACxB,IAAIC,IAAI,CAAC,OAAAC,MAAA,CAAON,GAAG,0CAAAM,MAAA,CAAuCL,GAAG,SAAM,EAAE;IACnEC,IAAI,EAAJA;EACF,CAAC,CACH,CAAC;AACH,CAAC,EACD,UAACF,GAAG,EAAEC,GAAG,EAAEC,IAAI;EAAA,UAAAI,MAAA,CAAQN,GAAG,OAAAM,MAAA,CAAIL,GAAG,OAAAK,MAAA,CAAIJ,IAAI;AAAA,CAC3C,CAAC;AAACK,OAAA,CAAAV,sBAAA,GAAAA,sBAAA"}
1
+ {"version":3,"names":["createReusingObjectUrl","_memoize2","default","src","url","type","URL","createObjectURL","Blob","concat","exports","isValidJavaScriptType","handleTypes","indexOf"],"sources":["../../../src/assets-transpilers/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-10-09\n */\nimport { memoize } from 'lodash';\n\nexport const createReusingObjectUrl = memoize(\n (src: string, url: string, type: 'text/javascript' | 'text/css'): string => {\n return URL.createObjectURL(\n new Blob([`/* ${src} is reusing the execution result of ${url} */`], {\n type,\n }),\n );\n },\n (src, url, type) => `${src}#${url}#${type}`,\n);\n\nexport const isValidJavaScriptType = (type?: string): boolean => {\n const handleTypes = [\n 'text/javascript',\n 'module',\n 'application/javascript',\n 'text/ecmascript',\n 'application/ecmascript',\n ];\n return !type || handleTypes.indexOf(type) !== -1;\n};\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;;AAGO,IAAMA,sBAAsB,GAAG,IAAAC,SAAA,CAAAC,OAAA,EACpC,UAACC,GAAW,EAAEC,GAAW,EAAEC,IAAoC,EAAa;EAC1E,OAAOC,GAAG,CAACC,eAAe,CACxB,IAAIC,IAAI,CAAC,OAAAC,MAAA,CAAON,GAAG,0CAAAM,MAAA,CAAuCL,GAAG,SAAM,EAAE;IACnEC,IAAI,EAAJA;EACF,CAAC,CACH,CAAC;AACH,CAAC,EACD,UAACF,GAAG,EAAEC,GAAG,EAAEC,IAAI;EAAA,UAAAI,MAAA,CAAQN,GAAG,OAAAM,MAAA,CAAIL,GAAG,OAAAK,MAAA,CAAIJ,IAAI;AAAA,CAC3C,CAAC;AAACK,OAAA,CAAAV,sBAAA,GAAAA,sBAAA;AAEK,IAAMW,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAIN,IAAa,EAAc;EAC/D,IAAMO,WAAW,GAAG,CAClB,iBAAiB,EACjB,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,CACzB;EACD,OAAO,CAACP,IAAI,IAAIO,WAAW,CAACC,OAAO,CAACR,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAACK,OAAA,CAAAC,qBAAA,GAAAA,qBAAA"}
@@ -18,6 +18,7 @@ export declare const create: {
18
18
  export declare const hasOwnProperty: (caller: unknown, p: PropertyKey) => boolean;
19
19
  export declare class Deferred<T> {
20
20
  promise: Promise<T>;
21
+ status: 'pending' | 'fulfilled' | 'rejected';
21
22
  resolve: (value: T | PromiseLike<T>) => void;
22
23
  reject: (reason?: unknown) => void;
23
24
  constructor();
package/dist/cjs/utils.js CHANGED
@@ -36,11 +36,18 @@ var Deferred = /*#__PURE__*/(0, _createClass2.default)(function Deferred() {
36
36
  var _this = this;
37
37
  (0, _classCallCheck2.default)(this, Deferred);
38
38
  (0, _defineProperty2.default)(this, "promise", void 0);
39
+ (0, _defineProperty2.default)(this, "status", 'pending');
39
40
  (0, _defineProperty2.default)(this, "resolve", void 0);
40
41
  (0, _defineProperty2.default)(this, "reject", void 0);
41
42
  this.promise = new Promise(function (resolve, reject) {
42
- _this.resolve = resolve;
43
- _this.reject = reject;
43
+ _this.resolve = function (value) {
44
+ _this.status = 'fulfilled';
45
+ resolve(value);
46
+ };
47
+ _this.reject = function (reason) {
48
+ _this.status = 'rejected';
49
+ reject(reason);
50
+ };
44
51
  });
45
52
  });
46
53
  exports.Deferred = Deferred;
@@ -1 +1 @@
1
- {"version":3,"names":["create","Object","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","freeze","keys","exports","hasOwnProperty","caller","p","prototype","call","Deferred","_createClass2","default","_this","_classCallCheck2","_defineProperty2","promise","Promise","resolve","reject","getEntireUrl","uri","baseURI","publicPath","URL","window","location","href","entireUrl","toString"],"sources":["../../src/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-04-26\n */\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nexport const { create, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, freeze, keys } = Object;\nexport const hasOwnProperty = (caller: unknown, p: PropertyKey) => Object.prototype.hasOwnProperty.call(caller, p);\n\nexport class Deferred<T> {\n promise: Promise<T>;\n\n resolve!: (value: T | PromiseLike<T>) => void;\n\n reject!: (reason?: unknown) => void;\n\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n\nexport function getEntireUrl(uri: string, baseURI: string): string {\n const publicPath = new URL(baseURI, window.location.href);\n const entireUrl = new URL(uri, publicPath.toString());\n return entireUrl.toString();\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAEA;AACO,IAAQA,MAAM,GAAkFC,MAAM,CAA9FD,MAAM;EAAEE,cAAc,GAAkED,MAAM,CAAtFC,cAAc;EAAEC,wBAAwB,GAAwCF,MAAM,CAAtEE,wBAAwB;EAAEC,mBAAmB,GAAmBH,MAAM,CAA5CG,mBAAmB;EAAEC,MAAM,GAAWJ,MAAM,CAAvBI,MAAM;EAAEC,IAAI,GAAKL,MAAM,CAAfK,IAAI;AAAYC,OAAA,CAAAD,IAAA,GAAAA,IAAA;AAAAC,OAAA,CAAAF,MAAA,GAAAA,MAAA;AAAAE,OAAA,CAAAH,mBAAA,GAAAA,mBAAA;AAAAG,OAAA,CAAAJ,wBAAA,GAAAA,wBAAA;AAAAI,OAAA,CAAAL,cAAA,GAAAA,cAAA;AAAAK,OAAA,CAAAP,MAAA,GAAAA,MAAA;AACvG,IAAMQ,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,MAAe,EAAEC,CAAc;EAAA,OAAKT,MAAM,CAACU,SAAS,CAACH,cAAc,CAACI,IAAI,CAACH,MAAM,EAAEC,CAAC,CAAC;AAAA;AAACH,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAAA,IAEtGK,QAAQ,oBAAAC,aAAA,CAAAC,OAAA,EAOnB,SAAAF,SAAA,EAAc;EAAA,IAAAG,KAAA;EAAA,IAAAC,gBAAA,CAAAF,OAAA,QAAAF,QAAA;EAAA,IAAAK,gBAAA,CAAAH,OAAA;EAAA,IAAAG,gBAAA,CAAAH,OAAA;EAAA,IAAAG,gBAAA,CAAAH,OAAA;EACZ,IAAI,CAACI,OAAO,GAAG,IAAIC,OAAO,CAAC,UAACC,OAAO,EAAEC,MAAM,EAAK;IAC9CN,KAAI,CAACK,OAAO,GAAGA,OAAO;IACtBL,KAAI,CAACM,MAAM,GAAGA,MAAM;EACtB,CAAC,CAAC;AACJ,CAAC;AAAAf,OAAA,CAAAM,QAAA,GAAAA,QAAA;AAGI,SAASU,YAAYA,CAACC,GAAW,EAAEC,OAAe,EAAU;EACjE,IAAMC,UAAU,GAAG,IAAIC,GAAG,CAACF,OAAO,EAAEG,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC;EACzD,IAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACH,GAAG,EAAEE,UAAU,CAACM,QAAQ,CAAC,CAAC,CAAC;EACrD,OAAOD,SAAS,CAACC,QAAQ,CAAC,CAAC;AAC7B"}
1
+ {"version":3,"names":["create","Object","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","freeze","keys","exports","hasOwnProperty","caller","p","prototype","call","Deferred","_createClass2","default","_this","_classCallCheck2","_defineProperty2","promise","Promise","resolve","reject","value","status","reason","getEntireUrl","uri","baseURI","publicPath","URL","window","location","href","entireUrl","toString"],"sources":["../../src/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-04-26\n */\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nexport const { create, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, freeze, keys } = Object;\nexport const hasOwnProperty = (caller: unknown, p: PropertyKey) => Object.prototype.hasOwnProperty.call(caller, p);\n\nexport class Deferred<T> {\n promise: Promise<T>;\n\n status: 'pending' | 'fulfilled' | 'rejected' = 'pending';\n\n resolve!: (value: T | PromiseLike<T>) => void;\n\n reject!: (reason?: unknown) => void;\n\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = (value: T | PromiseLike<T>) => {\n this.status = 'fulfilled';\n resolve(value);\n };\n this.reject = (reason?: unknown) => {\n this.status = 'rejected';\n reject(reason);\n };\n });\n }\n}\n\nexport function getEntireUrl(uri: string, baseURI: string): string {\n const publicPath = new URL(baseURI, window.location.href);\n const entireUrl = new URL(uri, publicPath.toString());\n return entireUrl.toString();\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAEA;AACO,IAAQA,MAAM,GAAkFC,MAAM,CAA9FD,MAAM;EAAEE,cAAc,GAAkED,MAAM,CAAtFC,cAAc;EAAEC,wBAAwB,GAAwCF,MAAM,CAAtEE,wBAAwB;EAAEC,mBAAmB,GAAmBH,MAAM,CAA5CG,mBAAmB;EAAEC,MAAM,GAAWJ,MAAM,CAAvBI,MAAM;EAAEC,IAAI,GAAKL,MAAM,CAAfK,IAAI;AAAYC,OAAA,CAAAD,IAAA,GAAAA,IAAA;AAAAC,OAAA,CAAAF,MAAA,GAAAA,MAAA;AAAAE,OAAA,CAAAH,mBAAA,GAAAA,mBAAA;AAAAG,OAAA,CAAAJ,wBAAA,GAAAA,wBAAA;AAAAI,OAAA,CAAAL,cAAA,GAAAA,cAAA;AAAAK,OAAA,CAAAP,MAAA,GAAAA,MAAA;AACvG,IAAMQ,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,MAAe,EAAEC,CAAc;EAAA,OAAKT,MAAM,CAACU,SAAS,CAACH,cAAc,CAACI,IAAI,CAACH,MAAM,EAAEC,CAAC,CAAC;AAAA;AAACH,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAAA,IAEtGK,QAAQ,oBAAAC,aAAA,CAAAC,OAAA,EASnB,SAAAF,SAAA,EAAc;EAAA,IAAAG,KAAA;EAAA,IAAAC,gBAAA,CAAAF,OAAA,QAAAF,QAAA;EAAA,IAAAK,gBAAA,CAAAH,OAAA;EAAA,IAAAG,gBAAA,CAAAH,OAAA,kBANiC,SAAS;EAAA,IAAAG,gBAAA,CAAAH,OAAA;EAAA,IAAAG,gBAAA,CAAAH,OAAA;EAOtD,IAAI,CAACI,OAAO,GAAG,IAAIC,OAAO,CAAC,UAACC,OAAO,EAAEC,MAAM,EAAK;IAC9CN,KAAI,CAACK,OAAO,GAAG,UAACE,KAAyB,EAAK;MAC5CP,KAAI,CAACQ,MAAM,GAAG,WAAW;MACzBH,OAAO,CAACE,KAAK,CAAC;IAChB,CAAC;IACDP,KAAI,CAACM,MAAM,GAAG,UAACG,MAAgB,EAAK;MAClCT,KAAI,CAACQ,MAAM,GAAG,UAAU;MACxBF,MAAM,CAACG,MAAM,CAAC;IAChB,CAAC;EACH,CAAC,CAAC;AACJ,CAAC;AAAAlB,OAAA,CAAAM,QAAA,GAAAA,QAAA;AAGI,SAASa,YAAYA,CAACC,GAAW,EAAEC,OAAe,EAAU;EACjE,IAAMC,UAAU,GAAG,IAAIC,GAAG,CAACF,OAAO,EAAEG,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC;EACzD,IAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACH,GAAG,EAAEE,UAAU,CAACM,QAAQ,CAAC,CAAC,CAAC;EACrD,OAAOD,SAAS,CAACC,QAAQ,CAAC,CAAC;AAC7B"}
@@ -1,3 +1,4 @@
1
1
  import type { AssetsTranspilerOpts } from './types';
2
2
  export declare function transpileAssets<T extends Node>(node: T, baseURI: string, opts: AssetsTranspilerOpts): T;
3
3
  export type * from './types';
4
+ export { isValidJavaScriptType } from './utils';
@@ -33,4 +33,5 @@ export function transpileAssets(node, baseURI, opts) {
33
33
  // }
34
34
  return node;
35
35
  }
36
+ export { isValidJavaScriptType } from "./utils";
36
37
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["transpileLink","transpileScript","transpileAssets","node","baseURI","opts","htmlElement","tagName"],"sources":["../../../src/assets-transpilers/index.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-14\n */\nimport transpileLink from './link';\nimport transpileScript from './script';\nimport type { AssetsTranspilerOpts } from './types';\n\nexport function transpileAssets<T extends Node>(node: T, baseURI: string, opts: AssetsTranspilerOpts): T {\n const htmlElement = node as unknown as HTMLElement;\n const { tagName } = htmlElement;\n\n switch (tagName) {\n case 'SCRIPT': {\n return transpileScript(htmlElement as HTMLScriptElement, baseURI, opts) as unknown as T;\n }\n\n case 'LINK': {\n return transpileLink(htmlElement as HTMLLinkElement, baseURI, opts) as unknown as T;\n }\n\n default:\n break;\n }\n\n // TODO need to deal with the text scenario of script\n // const { nodeType } = node;\n // switch (nodeType) {\n // case Node.TEXT_NODE: {\n // if (node.parentNode?.nodeName === 'script') {\n // break;\n // }\n // }\n //\n // }\n // }\n return node;\n}\n\nexport type * from './types';\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA,OAAOA,aAAa;AACpB,OAAOC,eAAe;AAGtB,OAAO,SAASC,eAAeA,CAAiBC,IAAO,EAAEC,OAAe,EAAEC,IAA0B,EAAK;EACvG,IAAMC,WAAW,GAAGH,IAA8B;EAClD,IAAQI,OAAO,GAAKD,WAAW,CAAvBC,OAAO;EAEf,QAAQA,OAAO;IACb,KAAK,QAAQ;MAAE;QACb,OAAON,eAAe,CAACK,WAAW,EAAuBF,OAAO,EAAEC,IAAI,CAAC;MACzE;IAEA,KAAK,MAAM;MAAE;QACX,OAAOL,aAAa,CAACM,WAAW,EAAqBF,OAAO,EAAEC,IAAI,CAAC;MACrE;IAEA;MACE;EACJ;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAOF,IAAI;AACb"}
1
+ {"version":3,"names":["transpileLink","transpileScript","transpileAssets","node","baseURI","opts","htmlElement","tagName","isValidJavaScriptType"],"sources":["../../../src/assets-transpilers/index.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-14\n */\nimport transpileLink from './link';\nimport transpileScript from './script';\nimport type { AssetsTranspilerOpts } from './types';\n\nexport function transpileAssets<T extends Node>(node: T, baseURI: string, opts: AssetsTranspilerOpts): T {\n const htmlElement = node as unknown as HTMLElement;\n const { tagName } = htmlElement;\n\n switch (tagName) {\n case 'SCRIPT': {\n return transpileScript(htmlElement as HTMLScriptElement, baseURI, opts) as unknown as T;\n }\n\n case 'LINK': {\n return transpileLink(htmlElement as HTMLLinkElement, baseURI, opts) as unknown as T;\n }\n\n default:\n break;\n }\n\n // TODO need to deal with the text scenario of script\n // const { nodeType } = node;\n // switch (nodeType) {\n // case Node.TEXT_NODE: {\n // if (node.parentNode?.nodeName === 'script') {\n // break;\n // }\n // }\n //\n // }\n // }\n return node;\n}\n\nexport type * from './types';\n\nexport { isValidJavaScriptType } from './utils';\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA,OAAOA,aAAa;AACpB,OAAOC,eAAe;AAGtB,OAAO,SAASC,eAAeA,CAAiBC,IAAO,EAAEC,OAAe,EAAEC,IAA0B,EAAK;EACvG,IAAMC,WAAW,GAAGH,IAA8B;EAClD,IAAQI,OAAO,GAAKD,WAAW,CAAvBC,OAAO;EAEf,QAAQA,OAAO;IACb,KAAK,QAAQ;MAAE;QACb,OAAON,eAAe,CAACK,WAAW,EAAuBF,OAAO,EAAEC,IAAI,CAAC;MACzE;IAEA,KAAK,MAAM;MAAE;QACX,OAAOL,aAAa,CAACM,WAAW,EAAqBF,OAAO,EAAEC,IAAI,CAAC;MACrE;IAEA;MACE;EACJ;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAOF,IAAI;AACb;AAIA,SAASK,qBAAqB"}
@@ -6,11 +6,7 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
6
6
 
7
7
  import { getEntireUrl } from "../utils";
8
8
  import { Mode } from "./types";
9
- import { createReusingObjectUrl } from "./utils";
10
- var isValidJavaScriptType = function isValidJavaScriptType(type) {
11
- var handleTypes = ['text/javascript', 'module', 'application/javascript', 'text/ecmascript', 'application/ecmascript'];
12
- return !type || handleTypes.indexOf(type) !== -1;
13
- };
9
+ import { createReusingObjectUrl, isValidJavaScriptType } from "./utils";
14
10
  var getCredentials = function getCredentials(crossOrigin) {
15
11
  switch (crossOrigin) {
16
12
  case 'anonymous':
@@ -69,6 +65,11 @@ export default function transpileScript(script, baseURI, opts) {
69
65
  var srcAttribute = script.getAttribute('src');
70
66
  var sandbox = opts.sandbox,
71
67
  fetch = opts.fetch;
68
+
69
+ // To prevent webpack from skipping reload logic and causing the js not to re-execute when a micro app is loaded multiple times, the data-webpack attribute of the script must be removed.
70
+ // see https://github.com/webpack/webpack/blob/1f13ff9fe587e094df59d660b4611b1bd19aed4c/lib/runtime/LoadScriptRuntimeModule.js#L131-L136
71
+ // FIXME We should determine whether the current micro application is being loaded for the second time. If not, this removal should not be performed.
72
+ script.removeAttribute('data-webpack');
72
73
  var _preTranspile = preTranspile({
73
74
  src: srcAttribute || undefined,
74
75
  type: script.type,
@@ -1 +1 @@
1
- {"version":3,"names":["getEntireUrl","Mode","createReusingObjectUrl","isValidJavaScriptType","type","handleTypes","indexOf","getCredentials","crossOrigin","undefined","preTranspile","script","baseURI","opts","sandbox","moduleResolver","src","entireUrl","matchedScript","mode","REUSED_DEP_IN_SANDBOX","result","_objectSpread","REMOTE_ASSETS_IN_SANDBOX","rawNode","scriptNode","textContent","childNodes","code","INLINE_CODE_IN_SANDBOX","NONE","transpileScript","srcAttribute","getAttribute","fetch","_preTranspile","removeAttribute","dataset","syncMode","hasAttribute","priority","credentials","then","res","text","codeFactory","makeEvaluateFactory","fetchPriority","URL","createObjectURL","Blob","consumed","url","version"],"sources":["../../../src/assets-transpilers/script.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-16\n */\n\nimport type { MatchResult } from '../module-resolver';\nimport { getEntireUrl } from '../utils';\nimport type { AssetsTranspilerOpts } from './types';\nimport { Mode } from './types';\nimport { createReusingObjectUrl } from './utils';\n\nconst isValidJavaScriptType = (type?: string): boolean => {\n const handleTypes = [\n 'text/javascript',\n 'module',\n 'application/javascript',\n 'text/ecmascript',\n 'application/ecmascript',\n ];\n return !type || handleTypes.indexOf(type) !== -1;\n};\n\nconst getCredentials = (crossOrigin: string | null): RequestInit['credentials'] | undefined => {\n switch (crossOrigin) {\n case 'anonymous':\n return 'same-origin';\n case 'use-credentials':\n return 'include';\n default:\n return undefined;\n }\n};\n\ntype PreTranspileResult =\n | { mode: Mode.REMOTE_ASSETS_IN_SANDBOX; result: { src: string } }\n | { mode: Mode.REUSED_DEP_IN_SANDBOX; result: { src: string } & MatchResult }\n | { mode: Mode.INLINE_CODE_IN_SANDBOX; result: { code: string } }\n | { mode: Mode.NONE; result?: never };\n\nexport const preTranspile = (\n script: Partial<Pick<HTMLScriptElement, 'src' | 'type' | 'textContent'>>,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): PreTranspileResult => {\n const { sandbox, moduleResolver } = opts;\n\n const { src, type } = script;\n\n if (sandbox) {\n if (src) {\n const entireUrl = getEntireUrl(src, baseURI);\n const matchedScript = moduleResolver?.(entireUrl);\n if (matchedScript) {\n return {\n mode: Mode.REUSED_DEP_IN_SANDBOX,\n result: { src: entireUrl, ...matchedScript },\n };\n }\n\n return {\n mode: Mode.REMOTE_ASSETS_IN_SANDBOX,\n result: { src: entireUrl },\n };\n }\n\n if (isValidJavaScriptType(type)) {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n\n const code = scriptNode.textContent;\n if (code) {\n return {\n mode: Mode.INLINE_CODE_IN_SANDBOX,\n result: {\n code,\n },\n };\n }\n }\n }\n\n return { mode: Mode.NONE };\n};\n\nexport default function transpileScript(\n script: HTMLScriptElement,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): HTMLScriptElement {\n // Can't use script.src directly, because it will be resolved to absolute path by browser with Node.baseURI\n // Such as <script src=\"./foo.js\"></script> will be resolved to http://localhost:8000/foo.js while read script.src\n const srcAttribute = script.getAttribute('src');\n const { sandbox, fetch } = opts;\n\n const { mode, result } = preTranspile(\n {\n src: srcAttribute || undefined,\n type: script.type,\n textContent: script.textContent,\n },\n baseURI,\n opts,\n );\n\n switch (mode) {\n case Mode.REMOTE_ASSETS_IN_SANDBOX: {\n const { src } = result;\n\n // We must remove script src to avoid self execution as we need to fetch the script content and transpile it\n script.removeAttribute('src');\n script.dataset.src = src;\n\n const syncMode = !script.hasAttribute('async');\n const priority: Priority = syncMode ? 'high' : 'low';\n const credentials = getCredentials(script.crossOrigin);\n\n void fetch(src, { credentials, priority })\n .then((res) => res.text())\n .then((code) => {\n const codeFactory = sandbox!.makeEvaluateFactory(code, src);\n\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n script.src = URL.createObjectURL(new Blob([codeFactory], { type: 'text/javascript' }));\n });\n\n return script;\n }\n\n case Mode.INLINE_CODE_IN_SANDBOX: {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n const { code } = result;\n\n scriptNode.textContent = sandbox!.makeEvaluateFactory(code, baseURI);\n // mark the script have consumed\n script.dataset.consumed = 'true';\n\n return script;\n }\n\n case Mode.REUSED_DEP_IN_SANDBOX: {\n const { url, version, src } = result;\n\n script.dataset.src = src;\n script.dataset.version = version;\n\n const syncMode = !script.getAttribute('async');\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n // When the script hits the dependency reuse logic, the current script is not executed, and an empty script is returned directly\n script.src = createReusingObjectUrl(src, url, 'text/javascript');\n\n return script;\n }\n\n case Mode.NONE:\n default: {\n if (srcAttribute) {\n script.src = getEntireUrl(srcAttribute, baseURI);\n return script;\n }\n\n return script;\n }\n }\n\n // TODO find entry exports\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["getEntireUrl","Mode","createReusingObjectUrl","isValidJavaScriptType","getCredentials","crossOrigin","undefined","preTranspile","script","baseURI","opts","sandbox","moduleResolver","src","type","entireUrl","matchedScript","mode","REUSED_DEP_IN_SANDBOX","result","_objectSpread","REMOTE_ASSETS_IN_SANDBOX","rawNode","scriptNode","textContent","childNodes","code","INLINE_CODE_IN_SANDBOX","NONE","transpileScript","srcAttribute","getAttribute","fetch","removeAttribute","_preTranspile","dataset","syncMode","hasAttribute","priority","credentials","then","res","text","codeFactory","makeEvaluateFactory","fetchPriority","URL","createObjectURL","Blob","consumed","url","version"],"sources":["../../../src/assets-transpilers/script.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-03-16\n */\n\nimport type { MatchResult } from '../module-resolver';\nimport { getEntireUrl } from '../utils';\nimport type { AssetsTranspilerOpts } from './types';\nimport { Mode } from './types';\nimport { createReusingObjectUrl, isValidJavaScriptType } from './utils';\n\nconst getCredentials = (crossOrigin: string | null): RequestInit['credentials'] | undefined => {\n switch (crossOrigin) {\n case 'anonymous':\n return 'same-origin';\n case 'use-credentials':\n return 'include';\n default:\n return undefined;\n }\n};\n\ntype PreTranspileResult =\n | { mode: Mode.REMOTE_ASSETS_IN_SANDBOX; result: { src: string } }\n | { mode: Mode.REUSED_DEP_IN_SANDBOX; result: { src: string } & MatchResult }\n | { mode: Mode.INLINE_CODE_IN_SANDBOX; result: { code: string } }\n | { mode: Mode.NONE; result?: never };\n\nexport const preTranspile = (\n script: Partial<Pick<HTMLScriptElement, 'src' | 'type' | 'textContent'>>,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): PreTranspileResult => {\n const { sandbox, moduleResolver } = opts;\n\n const { src, type } = script;\n\n if (sandbox) {\n if (src) {\n const entireUrl = getEntireUrl(src, baseURI);\n const matchedScript = moduleResolver?.(entireUrl);\n if (matchedScript) {\n return {\n mode: Mode.REUSED_DEP_IN_SANDBOX,\n result: { src: entireUrl, ...matchedScript },\n };\n }\n\n return {\n mode: Mode.REMOTE_ASSETS_IN_SANDBOX,\n result: { src: entireUrl },\n };\n }\n\n if (isValidJavaScriptType(type)) {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n\n const code = scriptNode.textContent;\n if (code) {\n return {\n mode: Mode.INLINE_CODE_IN_SANDBOX,\n result: {\n code,\n },\n };\n }\n }\n }\n\n return { mode: Mode.NONE };\n};\n\nexport default function transpileScript(\n script: HTMLScriptElement,\n baseURI: string,\n opts: AssetsTranspilerOpts,\n): HTMLScriptElement {\n // Can't use script.src directly, because it will be resolved to absolute path by browser with Node.baseURI\n // Such as <script src=\"./foo.js\"></script> will be resolved to http://localhost:8000/foo.js while read script.src\n const srcAttribute = script.getAttribute('src');\n const { sandbox, fetch } = opts;\n\n // To prevent webpack from skipping reload logic and causing the js not to re-execute when a micro app is loaded multiple times, the data-webpack attribute of the script must be removed.\n // see https://github.com/webpack/webpack/blob/1f13ff9fe587e094df59d660b4611b1bd19aed4c/lib/runtime/LoadScriptRuntimeModule.js#L131-L136\n // FIXME We should determine whether the current micro application is being loaded for the second time. If not, this removal should not be performed.\n script.removeAttribute('data-webpack');\n\n const { mode, result } = preTranspile(\n {\n src: srcAttribute || undefined,\n type: script.type,\n textContent: script.textContent,\n },\n baseURI,\n opts,\n );\n\n switch (mode) {\n case Mode.REMOTE_ASSETS_IN_SANDBOX: {\n const { src } = result;\n\n // We must remove script src to avoid self execution as we need to fetch the script content and transpile it\n script.removeAttribute('src');\n script.dataset.src = src;\n\n const syncMode = !script.hasAttribute('async');\n const priority: Priority = syncMode ? 'high' : 'low';\n const credentials = getCredentials(script.crossOrigin);\n\n void fetch(src, { credentials, priority })\n .then((res) => res.text())\n .then((code) => {\n const codeFactory = sandbox!.makeEvaluateFactory(code, src);\n\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n script.src = URL.createObjectURL(new Blob([codeFactory], { type: 'text/javascript' }));\n });\n\n return script;\n }\n\n case Mode.INLINE_CODE_IN_SANDBOX: {\n const rawNode = opts.rawNode as HTMLScriptElement;\n const scriptNode = script.textContent ? script : rawNode.childNodes[0];\n const { code } = result;\n\n scriptNode.textContent = sandbox!.makeEvaluateFactory(code, baseURI);\n // mark the script have consumed\n script.dataset.consumed = 'true';\n\n return script;\n }\n\n case Mode.REUSED_DEP_IN_SANDBOX: {\n const { url, version, src } = result;\n\n script.dataset.src = src;\n script.dataset.version = version;\n\n const syncMode = !script.getAttribute('async');\n // HTMLScriptElement default fetchPriority is 'auto', we should set it to 'high' to make it execute earlier while it's not async script\n if (syncMode) {\n script.fetchPriority = 'high';\n }\n\n // When the script hits the dependency reuse logic, the current script is not executed, and an empty script is returned directly\n script.src = createReusingObjectUrl(src, url, 'text/javascript');\n\n return script;\n }\n\n case Mode.NONE:\n default: {\n if (srcAttribute) {\n script.src = getEntireUrl(srcAttribute, baseURI);\n return script;\n }\n\n return script;\n }\n }\n\n // TODO find entry exports\n}\n"],"mappings":"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"}
@@ -2,12 +2,13 @@
2
2
  * @author Kuitos
3
3
  * @since 2023-08-26
4
4
  */
5
- import type { Sandbox } from '@qiankunjs/sandbox';
6
5
  import type { BaseLoaderOpts } from '../common';
7
6
  import type { MatchResult } from '../module-resolver';
8
7
  export type BaseTranspilerOpts = BaseLoaderOpts & {
9
8
  moduleResolver?: (url: string) => MatchResult | undefined;
10
- sandbox?: Sandbox;
9
+ sandbox?: {
10
+ makeEvaluateFactory(source: string, sourceURL?: string): string;
11
+ };
11
12
  };
12
13
  export type AssetsTranspilerOpts = BaseTranspilerOpts & {
13
14
  rawNode: Node;
@@ -1 +1 @@
1
- {"version":3,"names":["Mode"],"sources":["../../../src/assets-transpilers/types.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-08-26\n */\nimport type { Sandbox } from '@qiankunjs/sandbox';\nimport type { BaseLoaderOpts } from '../common';\n\nimport type { MatchResult } from '../module-resolver';\n\nexport type BaseTranspilerOpts = BaseLoaderOpts & {\n moduleResolver?: (url: string) => MatchResult | undefined;\n sandbox?: Sandbox;\n};\n\nexport type AssetsTranspilerOpts = BaseTranspilerOpts & { rawNode: Node };\n\nexport enum Mode {\n REMOTE_ASSETS_IN_SANDBOX = 'RAIS',\n REUSED_DEP_IN_SANDBOX = 'RDIS',\n INLINE_CODE_IN_SANDBOX = 'ICIS',\n NONE = 'NONE',\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAaA,WAAYA,IAAI,0BAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAA,OAAJA,IAAI;AAAA"}
1
+ {"version":3,"names":["Mode"],"sources":["../../../src/assets-transpilers/types.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-08-26\n */\nimport type { BaseLoaderOpts } from '../common';\nimport type { MatchResult } from '../module-resolver';\n\nexport type BaseTranspilerOpts = BaseLoaderOpts & {\n moduleResolver?: (url: string) => MatchResult | undefined;\n sandbox?: {\n makeEvaluateFactory(source: string, sourceURL?: string): string;\n };\n};\n\nexport type AssetsTranspilerOpts = BaseTranspilerOpts & { rawNode: Node };\n\nexport enum Mode {\n REMOTE_ASSETS_IN_SANDBOX = 'RAIS',\n REUSED_DEP_IN_SANDBOX = 'RDIS',\n INLINE_CODE_IN_SANDBOX = 'ICIS',\n NONE = 'NONE',\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAaA,WAAYA,IAAI,0BAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAJA,IAAI;EAAA,OAAJA,IAAI;AAAA"}
@@ -1 +1,2 @@
1
1
  export declare const createReusingObjectUrl: ((src: string, url: string, type: 'text/javascript' | 'text/css') => string) & import("lodash").MemoizedFunction;
2
+ export declare const isValidJavaScriptType: (type?: string) => boolean;
@@ -10,4 +10,8 @@ export var createReusingObjectUrl = _memoize(function (src, url, type) {
10
10
  }, function (src, url, type) {
11
11
  return "".concat(src, "#").concat(url, "#").concat(type);
12
12
  });
13
+ export var isValidJavaScriptType = function isValidJavaScriptType(type) {
14
+ var handleTypes = ['text/javascript', 'module', 'application/javascript', 'text/ecmascript', 'application/ecmascript'];
15
+ return !type || handleTypes.indexOf(type) !== -1;
16
+ };
13
17
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createReusingObjectUrl","_memoize","src","url","type","URL","createObjectURL","Blob","concat"],"sources":["../../../src/assets-transpilers/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-10-09\n */\nimport { memoize } from 'lodash';\n\nexport const createReusingObjectUrl = memoize(\n (src: string, url: string, type: 'text/javascript' | 'text/css'): string => {\n return URL.createObjectURL(\n new Blob([`/* ${src} is reusing the execution result of ${url} */`], {\n type,\n }),\n );\n },\n (src, url, type) => `${src}#${url}#${type}`,\n);\n"],"mappings":";AAAA;AACA;AACA;AACA;AAGA,OAAO,IAAMA,sBAAsB,GAAGC,QAAA,CACpC,UAACC,GAAW,EAAEC,GAAW,EAAEC,IAAoC,EAAa;EAC1E,OAAOC,GAAG,CAACC,eAAe,CACxB,IAAIC,IAAI,CAAC,OAAAC,MAAA,CAAON,GAAG,0CAAAM,MAAA,CAAuCL,GAAG,SAAM,EAAE;IACnEC,IAAI,EAAJA;EACF,CAAC,CACH,CAAC;AACH,CAAC,EACD,UAACF,GAAG,EAAEC,GAAG,EAAEC,IAAI;EAAA,UAAAI,MAAA,CAAQN,GAAG,OAAAM,MAAA,CAAIL,GAAG,OAAAK,MAAA,CAAIJ,IAAI;AAAA,CAC3C,CAAC"}
1
+ {"version":3,"names":["createReusingObjectUrl","_memoize","src","url","type","URL","createObjectURL","Blob","concat","isValidJavaScriptType","handleTypes","indexOf"],"sources":["../../../src/assets-transpilers/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-10-09\n */\nimport { memoize } from 'lodash';\n\nexport const createReusingObjectUrl = memoize(\n (src: string, url: string, type: 'text/javascript' | 'text/css'): string => {\n return URL.createObjectURL(\n new Blob([`/* ${src} is reusing the execution result of ${url} */`], {\n type,\n }),\n );\n },\n (src, url, type) => `${src}#${url}#${type}`,\n);\n\nexport const isValidJavaScriptType = (type?: string): boolean => {\n const handleTypes = [\n 'text/javascript',\n 'module',\n 'application/javascript',\n 'text/ecmascript',\n 'application/ecmascript',\n ];\n return !type || handleTypes.indexOf(type) !== -1;\n};\n"],"mappings":";AAAA;AACA;AACA;AACA;AAGA,OAAO,IAAMA,sBAAsB,GAAGC,QAAA,CACpC,UAACC,GAAW,EAAEC,GAAW,EAAEC,IAAoC,EAAa;EAC1E,OAAOC,GAAG,CAACC,eAAe,CACxB,IAAIC,IAAI,CAAC,OAAAC,MAAA,CAAON,GAAG,0CAAAM,MAAA,CAAuCL,GAAG,SAAM,EAAE;IACnEC,IAAI,EAAJA;EACF,CAAC,CACH,CAAC;AACH,CAAC,EACD,UAACF,GAAG,EAAEC,GAAG,EAAEC,IAAI;EAAA,UAAAI,MAAA,CAAQN,GAAG,OAAAM,MAAA,CAAIL,GAAG,OAAAK,MAAA,CAAIJ,IAAI;AAAA,CAC3C,CAAC;AAED,OAAO,IAAMK,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAIL,IAAa,EAAc;EAC/D,IAAMM,WAAW,GAAG,CAClB,iBAAiB,EACjB,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,CACzB;EACD,OAAO,CAACN,IAAI,IAAIM,WAAW,CAACC,OAAO,CAACP,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC"}
@@ -18,6 +18,7 @@ export declare const create: {
18
18
  export declare const hasOwnProperty: (caller: unknown, p: PropertyKey) => boolean;
19
19
  export declare class Deferred<T> {
20
20
  promise: Promise<T>;
21
+ status: 'pending' | 'fulfilled' | 'rejected';
21
22
  resolve: (value: T | PromiseLike<T>) => void;
22
23
  reject: (reason?: unknown) => void;
23
24
  constructor();
package/dist/esm/utils.js CHANGED
@@ -21,11 +21,18 @@ export var Deferred = /*#__PURE__*/_createClass(function Deferred() {
21
21
  var _this = this;
22
22
  _classCallCheck(this, Deferred);
23
23
  _defineProperty(this, "promise", void 0);
24
+ _defineProperty(this, "status", 'pending');
24
25
  _defineProperty(this, "resolve", void 0);
25
26
  _defineProperty(this, "reject", void 0);
26
27
  this.promise = new Promise(function (resolve, reject) {
27
- _this.resolve = resolve;
28
- _this.reject = reject;
28
+ _this.resolve = function (value) {
29
+ _this.status = 'fulfilled';
30
+ resolve(value);
31
+ };
32
+ _this.reject = function (reason) {
33
+ _this.status = 'rejected';
34
+ reject(reason);
35
+ };
29
36
  });
30
37
  });
31
38
  export function getEntireUrl(uri, baseURI) {
@@ -1 +1 @@
1
- {"version":3,"names":["create","Object","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","freeze","keys","hasOwnProperty","caller","p","prototype","call","Deferred","_createClass","_this","_classCallCheck","_defineProperty","promise","Promise","resolve","reject","getEntireUrl","uri","baseURI","publicPath","URL","window","location","href","entireUrl","toString"],"sources":["../../src/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-04-26\n */\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nexport const { create, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, freeze, keys } = Object;\nexport const hasOwnProperty = (caller: unknown, p: PropertyKey) => Object.prototype.hasOwnProperty.call(caller, p);\n\nexport class Deferred<T> {\n promise: Promise<T>;\n\n resolve!: (value: T | PromiseLike<T>) => void;\n\n reject!: (reason?: unknown) => void;\n\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n\nexport function getEntireUrl(uri: string, baseURI: string): string {\n const publicPath = new URL(baseURI, window.location.href);\n const entireUrl = new URL(uri, publicPath.toString());\n return entireUrl.toString();\n}\n"],"mappings":";;;AAAA;AACA;AACA;AACA;;AAEA;AACO,IAAQA,MAAM,GAAkFC,MAAM,CAA9FD,MAAM;EAAEE,cAAc,GAAkED,MAAM,CAAtFC,cAAc;EAAEC,wBAAwB,GAAwCF,MAAM,CAAtEE,wBAAwB;EAAEC,mBAAmB,GAAmBH,MAAM,CAA5CG,mBAAmB;EAAEC,MAAM,GAAWJ,MAAM,CAAvBI,MAAM;EAAEC,IAAI,GAAKL,MAAM,CAAfK,IAAI;AAAY,SAAAN,MAAA,EAAAE,cAAA,EAAAC,wBAAA,EAAAC,mBAAA,EAAAC,MAAA,EAAAC,IAAA;AAC9G,OAAO,IAAMC,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,MAAe,EAAEC,CAAc;EAAA,OAAKR,MAAM,CAACS,SAAS,CAACH,cAAc,CAACI,IAAI,CAACH,MAAM,EAAEC,CAAC,CAAC;AAAA;AAElH,WAAaG,QAAQ,gBAAAC,YAAA,CAOnB,SAAAD,SAAA,EAAc;EAAA,IAAAE,KAAA;EAAAC,eAAA,OAAAH,QAAA;EAAAI,eAAA;EAAAA,eAAA;EAAAA,eAAA;EACZ,IAAI,CAACC,OAAO,GAAG,IAAIC,OAAO,CAAC,UAACC,OAAO,EAAEC,MAAM,EAAK;IAC9CN,KAAI,CAACK,OAAO,GAAGA,OAAO;IACtBL,KAAI,CAACM,MAAM,GAAGA,MAAM;EACtB,CAAC,CAAC;AACJ,CAAC;AAGH,OAAO,SAASC,YAAYA,CAACC,GAAW,EAAEC,OAAe,EAAU;EACjE,IAAMC,UAAU,GAAG,IAAIC,GAAG,CAACF,OAAO,EAAEG,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC;EACzD,IAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACH,GAAG,EAAEE,UAAU,CAACM,QAAQ,CAAC,CAAC,CAAC;EACrD,OAAOD,SAAS,CAACC,QAAQ,CAAC,CAAC;AAC7B"}
1
+ {"version":3,"names":["create","Object","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","freeze","keys","hasOwnProperty","caller","p","prototype","call","Deferred","_createClass","_this","_classCallCheck","_defineProperty","promise","Promise","resolve","reject","value","status","reason","getEntireUrl","uri","baseURI","publicPath","URL","window","location","href","entireUrl","toString"],"sources":["../../src/utils.ts"],"sourcesContent":["/**\n * @author Kuitos\n * @since 2023-04-26\n */\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nexport const { create, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, freeze, keys } = Object;\nexport const hasOwnProperty = (caller: unknown, p: PropertyKey) => Object.prototype.hasOwnProperty.call(caller, p);\n\nexport class Deferred<T> {\n promise: Promise<T>;\n\n status: 'pending' | 'fulfilled' | 'rejected' = 'pending';\n\n resolve!: (value: T | PromiseLike<T>) => void;\n\n reject!: (reason?: unknown) => void;\n\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = (value: T | PromiseLike<T>) => {\n this.status = 'fulfilled';\n resolve(value);\n };\n this.reject = (reason?: unknown) => {\n this.status = 'rejected';\n reject(reason);\n };\n });\n }\n}\n\nexport function getEntireUrl(uri: string, baseURI: string): string {\n const publicPath = new URL(baseURI, window.location.href);\n const entireUrl = new URL(uri, publicPath.toString());\n return entireUrl.toString();\n}\n"],"mappings":";;;AAAA;AACA;AACA;AACA;;AAEA;AACO,IAAQA,MAAM,GAAkFC,MAAM,CAA9FD,MAAM;EAAEE,cAAc,GAAkED,MAAM,CAAtFC,cAAc;EAAEC,wBAAwB,GAAwCF,MAAM,CAAtEE,wBAAwB;EAAEC,mBAAmB,GAAmBH,MAAM,CAA5CG,mBAAmB;EAAEC,MAAM,GAAWJ,MAAM,CAAvBI,MAAM;EAAEC,IAAI,GAAKL,MAAM,CAAfK,IAAI;AAAY,SAAAN,MAAA,EAAAE,cAAA,EAAAC,wBAAA,EAAAC,mBAAA,EAAAC,MAAA,EAAAC,IAAA;AAC9G,OAAO,IAAMC,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,MAAe,EAAEC,CAAc;EAAA,OAAKR,MAAM,CAACS,SAAS,CAACH,cAAc,CAACI,IAAI,CAACH,MAAM,EAAEC,CAAC,CAAC;AAAA;AAElH,WAAaG,QAAQ,gBAAAC,YAAA,CASnB,SAAAD,SAAA,EAAc;EAAA,IAAAE,KAAA;EAAAC,eAAA,OAAAH,QAAA;EAAAI,eAAA;EAAAA,eAAA,iBANiC,SAAS;EAAAA,eAAA;EAAAA,eAAA;EAOtD,IAAI,CAACC,OAAO,GAAG,IAAIC,OAAO,CAAC,UAACC,OAAO,EAAEC,MAAM,EAAK;IAC9CN,KAAI,CAACK,OAAO,GAAG,UAACE,KAAyB,EAAK;MAC5CP,KAAI,CAACQ,MAAM,GAAG,WAAW;MACzBH,OAAO,CAACE,KAAK,CAAC;IAChB,CAAC;IACDP,KAAI,CAACM,MAAM,GAAG,UAACG,MAAgB,EAAK;MAClCT,KAAI,CAACQ,MAAM,GAAG,UAAU;MACxBF,MAAM,CAACG,MAAM,CAAC;IAChB,CAAC;EACH,CAAC,CAAC;AACJ,CAAC;AAGH,OAAO,SAASC,YAAYA,CAACC,GAAW,EAAEC,OAAe,EAAU;EACjE,IAAMC,UAAU,GAAG,IAAIC,GAAG,CAACF,OAAO,EAAEG,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC;EACzD,IAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACH,GAAG,EAAEE,UAAU,CAACM,QAAQ,CAAC,CAAC,CAAC;EACrD,OAAOD,SAAS,CAACC,QAAQ,CAAC,CAAC;AAC7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qiankunjs/shared",
3
- "version": "0.0.1-rc.3",
3
+ "version": "0.0.1-rc.4",
4
4
  "description": "",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -11,8 +11,7 @@
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.10.5",
13
13
  "lodash": "^4.17.11",
14
- "semver": "^7.5.3",
15
- "@qiankunjs/sandbox": "^0.0.1-rc.3"
14
+ "semver": "^7.5.3"
16
15
  },
17
16
  "files": [
18
17
  "dist",
@@ -38,3 +38,5 @@ export function transpileAssets<T extends Node>(node: T, baseURI: string, opts:
38
38
  }
39
39
 
40
40
  export type * from './types';
41
+
42
+ export { isValidJavaScriptType } from './utils';
@@ -7,18 +7,7 @@ import type { MatchResult } from '../module-resolver';
7
7
  import { getEntireUrl } from '../utils';
8
8
  import type { AssetsTranspilerOpts } from './types';
9
9
  import { Mode } from './types';
10
- import { createReusingObjectUrl } from './utils';
11
-
12
- const isValidJavaScriptType = (type?: string): boolean => {
13
- const handleTypes = [
14
- 'text/javascript',
15
- 'module',
16
- 'application/javascript',
17
- 'text/ecmascript',
18
- 'application/ecmascript',
19
- ];
20
- return !type || handleTypes.indexOf(type) !== -1;
21
- };
10
+ import { createReusingObjectUrl, isValidJavaScriptType } from './utils';
22
11
 
23
12
  const getCredentials = (crossOrigin: string | null): RequestInit['credentials'] | undefined => {
24
13
  switch (crossOrigin) {
@@ -92,6 +81,11 @@ export default function transpileScript(
92
81
  const srcAttribute = script.getAttribute('src');
93
82
  const { sandbox, fetch } = opts;
94
83
 
84
+ // To prevent webpack from skipping reload logic and causing the js not to re-execute when a micro app is loaded multiple times, the data-webpack attribute of the script must be removed.
85
+ // see https://github.com/webpack/webpack/blob/1f13ff9fe587e094df59d660b4611b1bd19aed4c/lib/runtime/LoadScriptRuntimeModule.js#L131-L136
86
+ // FIXME We should determine whether the current micro application is being loaded for the second time. If not, this removal should not be performed.
87
+ script.removeAttribute('data-webpack');
88
+
95
89
  const { mode, result } = preTranspile(
96
90
  {
97
91
  src: srcAttribute || undefined,
@@ -2,14 +2,14 @@
2
2
  * @author Kuitos
3
3
  * @since 2023-08-26
4
4
  */
5
- import type { Sandbox } from '@qiankunjs/sandbox';
6
5
  import type { BaseLoaderOpts } from '../common';
7
-
8
6
  import type { MatchResult } from '../module-resolver';
9
7
 
10
8
  export type BaseTranspilerOpts = BaseLoaderOpts & {
11
9
  moduleResolver?: (url: string) => MatchResult | undefined;
12
- sandbox?: Sandbox;
10
+ sandbox?: {
11
+ makeEvaluateFactory(source: string, sourceURL?: string): string;
12
+ };
13
13
  };
14
14
 
15
15
  export type AssetsTranspilerOpts = BaseTranspilerOpts & { rawNode: Node };
@@ -14,3 +14,14 @@ export const createReusingObjectUrl = memoize(
14
14
  },
15
15
  (src, url, type) => `${src}#${url}#${type}`,
16
16
  );
17
+
18
+ export const isValidJavaScriptType = (type?: string): boolean => {
19
+ const handleTypes = [
20
+ 'text/javascript',
21
+ 'module',
22
+ 'application/javascript',
23
+ 'text/ecmascript',
24
+ 'application/ecmascript',
25
+ ];
26
+ return !type || handleTypes.indexOf(type) !== -1;
27
+ };
package/src/utils.ts CHANGED
@@ -10,14 +10,22 @@ export const hasOwnProperty = (caller: unknown, p: PropertyKey) => Object.protot
10
10
  export class Deferred<T> {
11
11
  promise: Promise<T>;
12
12
 
13
+ status: 'pending' | 'fulfilled' | 'rejected' = 'pending';
14
+
13
15
  resolve!: (value: T | PromiseLike<T>) => void;
14
16
 
15
17
  reject!: (reason?: unknown) => void;
16
18
 
17
19
  constructor() {
18
20
  this.promise = new Promise((resolve, reject) => {
19
- this.resolve = resolve;
20
- this.reject = reject;
21
+ this.resolve = (value: T | PromiseLike<T>) => {
22
+ this.status = 'fulfilled';
23
+ resolve(value);
24
+ };
25
+ this.reject = (reason?: unknown) => {
26
+ this.status = 'rejected';
27
+ reject(reason);
28
+ };
21
29
  });
22
30
  }
23
31
  }