@qpqjs/user-script 0.3.0 → 0.5.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.
Files changed (83) hide show
  1. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessor.js +6 -10
  2. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessor.js.map +1 -1
  3. package/lib/commonjs/actionProcessor/getUserScriptBuildFromZipActionProcessor.js +7 -14
  4. package/lib/commonjs/actionProcessor/getUserScriptBuildFromZipActionProcessor.js.map +1 -1
  5. package/lib/commonjs/actionProcessor/getUserScriptBuilderActionProcessor.d.ts +3 -0
  6. package/lib/commonjs/actionProcessor/{getUserScriptBuildActionProcessors.js → getUserScriptBuilderActionProcessor.js} +5 -5
  7. package/lib/commonjs/actionProcessor/getUserScriptBuilderActionProcessor.js.map +1 -0
  8. package/lib/commonjs/actionProcessor/index.d.ts +1 -1
  9. package/lib/commonjs/actionProcessor/index.js +1 -1
  10. package/lib/commonjs/actionProcessor/index.js.map +1 -1
  11. package/lib/commonjs/actionProcessor/logic/askUserScriptCheckPublishedOutput.js +2 -2
  12. package/lib/commonjs/actionProcessor/logic/askUserScriptCheckPublishedOutput.js.map +1 -1
  13. package/lib/commonjs/actionProcessor/logic/extractUserScriptZip.js +5 -3
  14. package/lib/commonjs/actionProcessor/logic/extractUserScriptZip.js.map +1 -1
  15. package/lib/commonjs/actionProcessor/logic/isUserScriptArchiveError.d.ts +3 -0
  16. package/lib/commonjs/actionProcessor/logic/isUserScriptArchiveError.js +7 -0
  17. package/lib/commonjs/actionProcessor/logic/isUserScriptArchiveError.js.map +1 -0
  18. package/lib/commonjs/build/isUserScriptBuildError.d.ts +3 -0
  19. package/lib/commonjs/build/isUserScriptBuildError.js +7 -0
  20. package/lib/commonjs/build/isUserScriptBuildError.js.map +1 -0
  21. package/lib/commonjs/build/loadRspackModule.js +1 -0
  22. package/lib/commonjs/build/loadRspackModule.js.map +1 -1
  23. package/lib/commonjs/config/defineUserScriptBuilder.js +2 -2
  24. package/lib/commonjs/config/defineUserScriptBuilder.js.map +1 -1
  25. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessor.js +7 -11
  26. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessor.js.map +1 -1
  27. package/lib/esm/actionProcessor/getUserScriptBuildFromZipActionProcessor.js +8 -15
  28. package/lib/esm/actionProcessor/getUserScriptBuildFromZipActionProcessor.js.map +1 -1
  29. package/lib/esm/actionProcessor/getUserScriptBuilderActionProcessor.d.ts +3 -0
  30. package/lib/esm/actionProcessor/{getUserScriptBuildActionProcessors.js → getUserScriptBuilderActionProcessor.js} +3 -3
  31. package/lib/esm/actionProcessor/getUserScriptBuilderActionProcessor.js.map +1 -0
  32. package/lib/esm/actionProcessor/index.d.ts +1 -1
  33. package/lib/esm/actionProcessor/index.js +1 -1
  34. package/lib/esm/actionProcessor/index.js.map +1 -1
  35. package/lib/esm/actionProcessor/logic/askUserScriptCheckPublishedOutput.js +2 -2
  36. package/lib/esm/actionProcessor/logic/askUserScriptCheckPublishedOutput.js.map +1 -1
  37. package/lib/esm/actionProcessor/logic/extractUserScriptZip.js +5 -3
  38. package/lib/esm/actionProcessor/logic/extractUserScriptZip.js.map +1 -1
  39. package/lib/esm/actionProcessor/logic/isUserScriptArchiveError.d.ts +3 -0
  40. package/lib/esm/actionProcessor/logic/isUserScriptArchiveError.js +3 -0
  41. package/lib/esm/actionProcessor/logic/isUserScriptArchiveError.js.map +1 -0
  42. package/lib/esm/build/isUserScriptBuildError.d.ts +3 -0
  43. package/lib/esm/build/isUserScriptBuildError.js +3 -0
  44. package/lib/esm/build/isUserScriptBuildError.js.map +1 -0
  45. package/lib/esm/build/loadRspackModule.js +1 -0
  46. package/lib/esm/build/loadRspackModule.js.map +1 -1
  47. package/lib/esm/config/defineUserScriptBuilder.js +2 -2
  48. package/lib/esm/config/defineUserScriptBuilder.js.map +1 -1
  49. package/package.json +24 -9
  50. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessors.d.ts +0 -3
  51. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessors.js.map +0 -1
  52. package/lib/commonjs/build/__fixtures__/basic/src/helpers/formatSum.d.ts +0 -1
  53. package/lib/commonjs/build/__fixtures__/basic/src/helpers/formatSum.js +0 -6
  54. package/lib/commonjs/build/__fixtures__/basic/src/helpers/formatSum.js.map +0 -1
  55. package/lib/commonjs/build/__fixtures__/basic/src/main.d.ts +0 -4
  56. package/lib/commonjs/build/__fixtures__/basic/src/main.js +0 -17
  57. package/lib/commonjs/build/__fixtures__/basic/src/main.js.map +0 -1
  58. package/lib/commonjs/build/__fixtures__/builtin/src/main.d.ts +0 -1
  59. package/lib/commonjs/build/__fixtures__/builtin/src/main.js +0 -7
  60. package/lib/commonjs/build/__fixtures__/builtin/src/main.js.map +0 -1
  61. package/lib/commonjs/build/__fixtures__/noEntry/src/notMain.d.ts +0 -1
  62. package/lib/commonjs/build/__fixtures__/noEntry/src/notMain.js +0 -6
  63. package/lib/commonjs/build/__fixtures__/noEntry/src/notMain.js.map +0 -1
  64. package/lib/commonjs/build/__fixtures__/nonFunction/src/main.d.ts +0 -2
  65. package/lib/commonjs/build/__fixtures__/nonFunction/src/main.js +0 -7
  66. package/lib/commonjs/build/__fixtures__/nonFunction/src/main.js.map +0 -1
  67. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessors.d.ts +0 -3
  68. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessors.js.map +0 -1
  69. package/lib/esm/build/__fixtures__/basic/src/helpers/formatSum.d.ts +0 -1
  70. package/lib/esm/build/__fixtures__/basic/src/helpers/formatSum.js +0 -2
  71. package/lib/esm/build/__fixtures__/basic/src/helpers/formatSum.js.map +0 -1
  72. package/lib/esm/build/__fixtures__/basic/src/main.d.ts +0 -4
  73. package/lib/esm/build/__fixtures__/basic/src/main.js +0 -11
  74. package/lib/esm/build/__fixtures__/basic/src/main.js.map +0 -1
  75. package/lib/esm/build/__fixtures__/builtin/src/main.d.ts +0 -1
  76. package/lib/esm/build/__fixtures__/builtin/src/main.js +0 -3
  77. package/lib/esm/build/__fixtures__/builtin/src/main.js.map +0 -1
  78. package/lib/esm/build/__fixtures__/noEntry/src/notMain.d.ts +0 -1
  79. package/lib/esm/build/__fixtures__/noEntry/src/notMain.js +0 -2
  80. package/lib/esm/build/__fixtures__/noEntry/src/notMain.js.map +0 -1
  81. package/lib/esm/build/__fixtures__/nonFunction/src/main.d.ts +0 -2
  82. package/lib/esm/build/__fixtures__/nonFunction/src/main.js +0 -3
  83. package/lib/esm/build/__fixtures__/nonFunction/src/main.js.map +0 -1
@@ -1,16 +1,12 @@
1
1
  import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';
2
- import { actionResult, actionResultError, askFileReadBinaryContents, askUserScriptBuildFromZip, createActionProcessor, createNestedRuntime, QpqRuntimeType, } from '@qpqjs/core';
3
- import { randomUUID } from 'crypto';
4
- import { UserScriptBuildError } from '../build/UserScriptBuildError';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, askFileReadBinaryContents, askUserScriptBuildFromZip, createActionProcessor, createNestedRuntime, generateUuid, getDateNow, QpqRuntimeType, storyResultToActionResult, } from '@qpqjs/core';
5
3
  import { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';
6
4
  import { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';
7
5
  import { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';
8
6
  import { extractUserScriptZip } from './logic/extractUserScriptZip';
9
7
  import { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';
10
8
  import { USER_SCRIPT_SOURCE_LIMITS } from './logic/USER_SCRIPT_SOURCE_LIMITS';
11
- import { UserScriptArchiveError } from './logic/UserScriptArchiveError';
12
9
  const { errorType } = askUserScriptBuildFromZip;
13
- const getDateNow = () => new Date().toISOString();
14
10
  // Drive failures while reading the zip, re-labelled into this action's catalog; any other
15
11
  // failure passes through with its own type.
16
12
  const READ_ERROR_TYPES = {
@@ -21,7 +17,7 @@ const READ_ERROR_TYPES = {
21
17
  const getArchiveErrorType = (error) => errorType[error.code];
22
18
  const getProcessBuildFromZip = (qpqConfig) => {
23
19
  return async (payload, session, actionProcessors, logger, updateSession, dynamicModuleLoader, streamRegistry) => {
24
- const resolveStory = createNestedRuntime(qpqConfig, session, actionProcessors, getDateNow, logger, randomUUID, QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
20
+ const resolveStory = createNestedRuntime(qpqConfig, session, actionProcessors, getDateNow, logger, generateUuid, QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
25
21
  const read = await resolveStory(() => askFileReadBinaryContents(payload.drive, payload.zipFilepath, payload.scope), []);
26
22
  if (read.error) {
27
23
  return actionResultError(READ_ERROR_TYPES[read.error.errorType] ?? read.error.errorType, read.error.errorText);
@@ -42,22 +38,19 @@ const getProcessBuildFromZip = (qpqConfig) => {
42
38
  }, payload.sourceMap, hostModules);
43
39
  }
44
40
  catch (error) {
45
- if (error instanceof UserScriptArchiveError) {
46
- return actionResultError(getArchiveErrorType(error), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`);
47
- }
48
- if (error instanceof UserScriptBuildError) {
49
- return actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message);
50
- }
51
- throw error;
41
+ return actionResultErrorFromCaughtError(error, {
42
+ UserScriptArchiveError: (error) => actionResultError(getArchiveErrorType(error), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`),
43
+ UserScriptBuildError: (error) => actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message),
44
+ });
52
45
  }
53
46
  const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);
54
47
  if (published.error) {
55
- return actionResultError(published.error.errorType, published.error.errorText);
48
+ return storyResultToActionResult(published, 'UserScript Build publish');
56
49
  }
57
50
  // The output contract is judged where the script's top-level code cannot reach the host.
58
51
  const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);
59
52
  if (checked.error) {
60
- return actionResultError(checked.error.errorType, checked.error.errorText);
53
+ return storyResultToActionResult(checked, 'UserScript Build check output');
61
54
  }
62
55
  return actionResult({ exports: checked.result });
63
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getUserScriptBuildFromZipActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildFromZipActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n ActionProcessorList,\n actionResult,\n actionResultError,\n askFileReadBinaryContents,\n askUserScriptBuildFromZip,\n createActionProcessor,\n createNestedRuntime,\n DynamicModuleLoader,\n ProcessorFor,\n QPQConfig,\n QpqLogger,\n QpqRuntimeType,\n StorySession,\n StorySessionUpdater,\n StreamRegistry,\n UserScriptBuildFromZipActionPayload,\n} from '@qpqjs/core';\n\nimport { randomUUID } from 'crypto';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { extractUserScriptZip } from './logic/extractUserScriptZip';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './logic/USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError } from './logic/UserScriptArchiveError';\n\nconst { errorType } = askUserScriptBuildFromZip;\n\nconst getDateNow = () => new Date().toISOString();\n\n// Drive failures while reading the zip, re-labelled into this action's catalog; any other\n// failure passes through with its own type.\nconst READ_ERROR_TYPES: Record<string, string> = {\n [askFileReadBinaryContents.errorType.FileNotFound]: errorType.SourceNotFound,\n [askFileReadBinaryContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\n// The archive error codes are named after the action's own catalog.\nconst getArchiveErrorType = (error: UserScriptArchiveError): string => errorType[error.code];\n\nconst getProcessBuildFromZip = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuildFromZip> => {\n return async (\n payload: UserScriptBuildFromZipActionPayload,\n session: StorySession,\n actionProcessors: ActionProcessorList,\n logger: QpqLogger,\n updateSession: StorySessionUpdater,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry: StreamRegistry,\n ) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n randomUUID,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n const read = await resolveStory(() => askFileReadBinaryContents(payload.drive, payload.zipFilepath, payload.scope), []);\n if (read.error) {\n return actionResultError(READ_ERROR_TYPES[read.error.errorType] ?? read.error.errorType, read.error.errorText);\n }\n\n // The file actions give no size without the bytes, so the zip's own cap applies to\n // what came back before anything is unpacked.\n const zip = Buffer.from(read.result.base64Data, 'base64');\n if (zip.length > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n return actionResultError(\n errorType.SourceTooLarge,\n `[${payload.drive}:${payload.zipFilepath}] is larger than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`,\n );\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n async (projectDir) => {\n await extractUserScriptZip(zip, projectDir);\n },\n payload.sourceMap,\n hostModules,\n );\n } catch (error) {\n if (error instanceof UserScriptArchiveError) {\n return actionResultError(getArchiveErrorType(error), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`);\n }\n if (error instanceof UserScriptBuildError) {\n return actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message);\n }\n throw error;\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return actionResultError(published.error.errorType, published.error.errorText);\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return actionResultError(checked.error.errorType, checked.error.errorText);\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildFromZipActionProcessor = createActionProcessor(askUserScriptBuildFromZip, getProcessBuildFromZip);\n"]}
1
+ {"version":3,"file":"getUserScriptBuildFromZipActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildFromZipActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n ActionProcessorList,\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askFileReadBinaryContents,\n askUserScriptBuildFromZip,\n createActionProcessor,\n createNestedRuntime,\n DynamicModuleLoader,\n generateUuid,\n getDateNow,\n ProcessorFor,\n QPQConfig,\n QpqLogger,\n QpqRuntimeType,\n storyResultToActionResult,\n StorySession,\n StorySessionUpdater,\n StreamRegistry,\n UserScriptBuildFromZipActionPayload,\n} from '@qpqjs/core';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { extractUserScriptZip } from './logic/extractUserScriptZip';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './logic/USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError } from './logic/UserScriptArchiveError';\n\nconst { errorType } = askUserScriptBuildFromZip;\n\n// Drive failures while reading the zip, re-labelled into this action's catalog; any other\n// failure passes through with its own type.\nconst READ_ERROR_TYPES: Record<string, string> = {\n [askFileReadBinaryContents.errorType.FileNotFound]: errorType.SourceNotFound,\n [askFileReadBinaryContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\n// The archive error codes are named after the action's own catalog.\nconst getArchiveErrorType = (error: UserScriptArchiveError): string => errorType[error.code];\n\nconst getProcessBuildFromZip = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuildFromZip> => {\n return async (\n payload: UserScriptBuildFromZipActionPayload,\n session: StorySession,\n actionProcessors: ActionProcessorList,\n logger: QpqLogger,\n updateSession: StorySessionUpdater,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry: StreamRegistry,\n ) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n generateUuid,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n const read = await resolveStory(() => askFileReadBinaryContents(payload.drive, payload.zipFilepath, payload.scope), []);\n if (read.error) {\n return actionResultError(READ_ERROR_TYPES[read.error.errorType] ?? read.error.errorType, read.error.errorText);\n }\n\n // The file actions give no size without the bytes, so the zip's own cap applies to\n // what came back before anything is unpacked.\n const zip = Buffer.from(read.result.base64Data, 'base64');\n if (zip.length > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n return actionResultError(\n errorType.SourceTooLarge,\n `[${payload.drive}:${payload.zipFilepath}] is larger than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`,\n );\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n async (projectDir) => {\n await extractUserScriptZip(zip, projectDir);\n },\n payload.sourceMap,\n hostModules,\n );\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n UserScriptArchiveError: (error) =>\n actionResultError(getArchiveErrorType(error as UserScriptArchiveError), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`),\n UserScriptBuildError: (error) =>\n actionResultError(getUserScriptBuildErrorType((error as UserScriptBuildError).code, errorType), error.message),\n });\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return storyResultToActionResult(published, 'UserScript Build publish');\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return storyResultToActionResult(checked, 'UserScript Build check output');\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildFromZipActionProcessor = createActionProcessor(askUserScriptBuildFromZip, getProcessBuildFromZip);\n"]}
@@ -0,0 +1,3 @@
1
+ import { ActionProcessorListResolver } from '@qpqjs/core';
2
+ /** The composer defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
3
+ export declare const getUserScriptBuilderActionProcessor: ActionProcessorListResolver;
@@ -1,8 +1,8 @@
1
1
  import { getUserScriptBuildActionProcessor } from './getUserScriptBuildActionProcessor';
2
2
  import { getUserScriptBuildFromZipActionProcessor } from './getUserScriptBuildFromZipActionProcessor';
3
- /** The resolver defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
4
- export const getUserScriptBuildActionProcessors = async (qpqConfig, dynamicModuleLoader) => ({
3
+ /** The composer defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
4
+ export const getUserScriptBuilderActionProcessor = async (qpqConfig, dynamicModuleLoader) => ({
5
5
  ...(await getUserScriptBuildActionProcessor(qpqConfig, dynamicModuleLoader)),
6
6
  ...(await getUserScriptBuildFromZipActionProcessor(qpqConfig, dynamicModuleLoader)),
7
7
  });
8
- //# sourceMappingURL=getUserScriptBuildActionProcessors.js.map
8
+ //# sourceMappingURL=getUserScriptBuilderActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUserScriptBuilderActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuilderActionProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AAEtG,qHAAqH;AACrH,MAAM,CAAC,MAAM,mCAAmC,GAAgC,KAAK,EACnF,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,iCAAiC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC5E,GAAG,CAAC,MAAM,wCAAwC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CACpF,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from '@qpqjs/core';\n\nimport { getUserScriptBuildActionProcessor } from './getUserScriptBuildActionProcessor';\nimport { getUserScriptBuildFromZipActionProcessor } from './getUserScriptBuildFromZipActionProcessor';\n\n/** The composer defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */\nexport const getUserScriptBuilderActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getUserScriptBuildActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getUserScriptBuildFromZipActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
@@ -1,4 +1,4 @@
1
1
  export * from './getUserScriptBuildActionProcessor';
2
- export * from './getUserScriptBuildActionProcessors';
2
+ export * from './getUserScriptBuilderActionProcessor';
3
3
  export * from './getUserScriptBuildFromZipActionProcessor';
4
4
  export * from './logic';
@@ -1,5 +1,5 @@
1
1
  export * from './getUserScriptBuildActionProcessor';
2
- export * from './getUserScriptBuildActionProcessors';
2
+ export * from './getUserScriptBuilderActionProcessor';
3
3
  export * from './getUserScriptBuildFromZipActionProcessor';
4
4
  export * from './logic';
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actionProcessor/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,SAAS,CAAC","sourcesContent":["export * from './getUserScriptBuildActionProcessor';\nexport * from './getUserScriptBuildActionProcessors';\nexport * from './getUserScriptBuildFromZipActionProcessor';\nexport * from './logic';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actionProcessor/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,SAAS,CAAC","sourcesContent":["export * from './getUserScriptBuildActionProcessor';\nexport * from './getUserScriptBuilderActionProcessor';\nexport * from './getUserScriptBuildFromZipActionProcessor';\nexport * from './logic';\n"]}
@@ -1,6 +1,6 @@
1
1
  import { askCatch, askThrowError, askUserScriptListExports } from '@qpqjs/core';
2
2
  import { assertUserScriptExports } from '../../build/assertUserScriptExports';
3
- import { UserScriptBuildError } from '../../build/UserScriptBuildError';
3
+ import { isUserScriptBuildError } from '../../build/isUserScriptBuildError';
4
4
  /**
5
5
  * The output contract for a platform build, judged inside the sandbox: the runner loads the
6
6
  * published file and reports its exports, and the rule is applied here. A load failure is the
@@ -17,7 +17,7 @@ export function* askUserScriptCheckPublishedOutput(drive, filepath, scope, error
17
17
  return assertUserScriptExports(filepath, listed.result);
18
18
  }
19
19
  catch (error) {
20
- if (error instanceof UserScriptBuildError) {
20
+ if (isUserScriptBuildError(error)) {
21
21
  const code = error.code;
22
22
  return yield* askThrowError(errorType[code], error.message);
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"askUserScriptCheckPublishedOutput.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/askUserScriptCheckPublishedOutput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAA4B,MAAM,kCAAkC,CAAC;AAGlG;;;;GAIG;AACH,MAAM,SAAS,CAAC,CAAC,iCAAiC,CAChD,KAAa,EACb,QAAgB,EAChB,KAAyB,EACzB,SAAsC;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,wBAAwB,CAAC,SAAS,CAAC,cAAc;YAC5E,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,wBAAwB,CAAC,SAAS,CAAC,aAAa,CAAC;QAC9E,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuF,CAAC;YAC3G,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { askCatch, AskResponse, askThrowError, askUserScriptListExports } from '@qpqjs/core';\n\nimport { assertUserScriptExports } from '../../build/assertUserScriptExports';\nimport { UserScriptBuildError, UserScriptBuildErrorCode } from '../../build/UserScriptBuildError';\nimport { UserScriptBuildErrorCatalog } from './getUserScriptBuildErrorType';\n\n/**\n * The output contract for a platform build, judged inside the sandbox: the runner loads the\n * published file and reports its exports, and the rule is applied here. A load failure is the\n * build's fault (BuildFailed); a runner failure keeps its own type.\n */\nexport function* askUserScriptCheckPublishedOutput(\n drive: string,\n filepath: string,\n scope: string | undefined,\n errorType: UserScriptBuildErrorCatalog,\n): AskResponse<string[]> {\n const listed = yield* askCatch(askUserScriptListExports(drive, filepath, scope));\n if (!listed.success) {\n const loadFailed =\n listed.error.errorType === askUserScriptListExports.errorType.ModuleNotFound ||\n listed.error.errorType === askUserScriptListExports.errorType.ScriptInvalid;\n return yield* askThrowError(loadFailed ? errorType.BuildFailed : listed.error.errorType, listed.error.errorText);\n }\n\n try {\n return assertUserScriptExports(filepath, listed.result);\n } catch (error) {\n if (error instanceof UserScriptBuildError) {\n const code = error.code as UserScriptBuildErrorCode.NoExports | UserScriptBuildErrorCode.NonFunctionExport;\n return yield* askThrowError(errorType[code], error.message);\n }\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"askUserScriptCheckPublishedOutput.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/askUserScriptCheckPublishedOutput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAI5E;;;;GAIG;AACH,MAAM,SAAS,CAAC,CAAC,iCAAiC,CAChD,KAAa,EACb,QAAgB,EAChB,KAAyB,EACzB,SAAsC;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,wBAAwB,CAAC,SAAS,CAAC,cAAc;YAC5E,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,wBAAwB,CAAC,SAAS,CAAC,aAAa,CAAC;QAC9E,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuF,CAAC;YAC3G,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { askCatch, AskResponse, askThrowError, askUserScriptListExports } from '@qpqjs/core';\n\nimport { assertUserScriptExports } from '../../build/assertUserScriptExports';\nimport { isUserScriptBuildError } from '../../build/isUserScriptBuildError';\nimport { UserScriptBuildErrorCode } from '../../build/UserScriptBuildError';\nimport { UserScriptBuildErrorCatalog } from './getUserScriptBuildErrorType';\n\n/**\n * The output contract for a platform build, judged inside the sandbox: the runner loads the\n * published file and reports its exports, and the rule is applied here. A load failure is the\n * build's fault (BuildFailed); a runner failure keeps its own type.\n */\nexport function* askUserScriptCheckPublishedOutput(\n drive: string,\n filepath: string,\n scope: string | undefined,\n errorType: UserScriptBuildErrorCatalog,\n): AskResponse<string[]> {\n const listed = yield* askCatch(askUserScriptListExports(drive, filepath, scope));\n if (!listed.success) {\n const loadFailed =\n listed.error.errorType === askUserScriptListExports.errorType.ModuleNotFound ||\n listed.error.errorType === askUserScriptListExports.errorType.ScriptInvalid;\n return yield* askThrowError(loadFailed ? errorType.BuildFailed : listed.error.errorType, listed.error.errorText);\n }\n\n try {\n return assertUserScriptExports(filepath, listed.result);\n } catch (error) {\n if (isUserScriptBuildError(error)) {\n const code = error.code as UserScriptBuildErrorCode.NoExports | UserScriptBuildErrorCode.NonFunctionExport;\n return yield* askThrowError(errorType[code], error.message);\n }\n throw error;\n }\n}\n"]}
@@ -4,6 +4,7 @@ import { pipeline } from 'node:stream/promises';
4
4
  import path from 'path';
5
5
  import yauzl from 'yauzl';
6
6
  import { isSafeProjectPath } from './isSafeProjectPath';
7
+ import { isUserScriptArchiveError } from './isUserScriptArchiveError';
7
8
  import { USER_SCRIPT_SOURCE_LIMITS } from './USER_SCRIPT_SOURCE_LIMITS';
8
9
  import { UserScriptArchiveError, UserScriptArchiveErrorCode } from './UserScriptArchiveError';
9
10
  const REFUSED_DIRECTORY = 'node_modules';
@@ -63,7 +64,8 @@ const stripCommonFolder = (names) => {
63
64
  return 0;
64
65
  const firstSegments = new Set(names.map((name) => name.split('/')[0]));
65
66
  const allNested = names.every((name) => name.includes('/'));
66
- return firstSegments.size === 1 && allNested ? [...firstSegments][0].length + 1 : 0;
67
+ const [firstSegment] = firstSegments;
68
+ return firstSegments.size === 1 && allNested && firstSegment !== undefined ? firstSegment.length + 1 : 0;
67
69
  };
68
70
  const planEntries = async (zip) => {
69
71
  const files = [];
@@ -102,7 +104,7 @@ export const extractUserScriptZip = async (zip, projectDir) => {
102
104
  planned = await planEntries(zip);
103
105
  }
104
106
  catch (error) {
105
- if (error instanceof UserScriptArchiveError)
107
+ if (isUserScriptArchiveError(error))
106
108
  throw error;
107
109
  throw invalid(`cannot read the archive: ${error instanceof Error ? error.message : String(error)}`);
108
110
  }
@@ -123,7 +125,7 @@ export const extractUserScriptZip = async (zip, projectDir) => {
123
125
  });
124
126
  }
125
127
  catch (error) {
126
- if (error instanceof UserScriptArchiveError)
128
+ if (isUserScriptArchiveError(error))
127
129
  throw error;
128
130
  throw invalid(`cannot unpack the archive: ${error instanceof Error ? error.message : String(error)}`);
129
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extractUserScriptZip.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/extractUserScriptZip.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { Readable, Transform } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport path from 'path';\nimport yauzl, { Entry, ZipFile } from 'yauzl';\n\nimport { isSafeProjectPath } from './isSafeProjectPath';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError, UserScriptArchiveErrorCode } from './UserScriptArchiveError';\n\nconst REFUSED_DIRECTORY = 'node_modules';\nconst SYMLINK_MODE = 0o120000;\nconst FILE_TYPE_MASK = 0o170000;\n\n// Unix mode lives in the high 16 bits of the external attributes; zips made on other\n// systems leave it zero, which reads as \"not a symlink\".\nconst isSymlinkEntry = (entry: Entry): boolean => ((entry.externalFileAttributes >>> 16) & FILE_TYPE_MASK) === SYMLINK_MODE;\n\n// With decodeStrings off, yauzl hands names over raw so it does not apply its own path\n// rules before ours.\nconst entryName = (entry: Entry): string => (Buffer.isBuffer(entry.fileName) ? entry.fileName.toString('utf8') : String(entry.fileName));\n\nconst isDirectoryEntry = (name: string): boolean => name.endsWith('/');\n\nconst openZip = (zip: Buffer): Promise<ZipFile> =>\n new Promise((resolve, reject) => {\n // Header sizes are never consulted: the byte cap on the inflated stream is the only\n // authority, so yauzl's own size validation is off rather than a second, trusted, rule.\n yauzl.fromBuffer(zip, { lazyEntries: true, decodeStrings: false, validateEntrySizes: false }, (error, zipFile) =>\n error ? reject(error) : resolve(zipFile),\n );\n });\n\nconst readEntries = (zipFile: ZipFile, onEntry: (entry: Entry) => Promise<void> | void): Promise<void> =>\n new Promise((resolve, reject) => {\n zipFile.on('error', reject);\n zipFile.on('end', resolve);\n zipFile.on('entry', (entry: Entry) => {\n // A rule that throws synchronously must still reject here, not escape yauzl's\n // event emitter where it would be lost and leave the zip hanging.\n Promise.resolve()\n .then(() => onEntry(entry))\n .then(\n () => zipFile.readEntry(),\n (error) => {\n zipFile.close();\n reject(error);\n },\n );\n });\n zipFile.readEntry();\n });\n\nconst openEntryStream = (zipFile: ZipFile, entry: Entry): Promise<Readable> =>\n new Promise((resolve, reject) => {\n zipFile.openReadStream(entry, (error, stream) => (error ? reject(error) : resolve(stream)));\n });\n\nconst tooLarge = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.SourceTooLarge, message);\nconst unsafe = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.UnsafeArchiveEntry, message);\nconst invalid = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.InvalidArchive, message);\n\n// Counts the bytes that really come out of the inflater and fails the pipeline the moment\n// the project cap is crossed, so a zip that lies about its sizes cannot fill the disk.\nconst createByteCap = (counter: { total: number }, onExceeded: () => Error): Transform =>\n new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n counter.total += chunk.length;\n if (counter.total > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n callback(onExceeded());\n return;\n }\n callback(null, chunk);\n },\n });\n\ntype PlannedEntry = { entry: Entry; relativePath: string };\n\n// Accepts the project at the zip root (anything under `src/`), or wrapped in exactly one\n// top-level folder (how most tools zip a directory): when nothing is under `src/` at the\n// root, every file shares the same first segment, and none sits at the root, that segment\n// is stripped. A root `src/` always wins, so a project with only `src/` is never stripped.\nconst stripCommonFolder = (names: string[]): number => {\n if (names.length === 0 || names.some((name) => name.startsWith('src/'))) return 0;\n\n const firstSegments = new Set(names.map((name) => name.split('/')[0]));\n const allNested = names.every((name) => name.includes('/'));\n\n return firstSegments.size === 1 && allNested ? [...firstSegments][0].length + 1 : 0;\n};\n\nconst planEntries = async (zip: Buffer): Promise<PlannedEntry[]> => {\n const files: PlannedEntry[] = [];\n const zipFile = await openZip(zip);\n\n await readEntries(zipFile, (entry) => {\n const name = entryName(entry);\n if (isDirectoryEntry(name)) return;\n\n if (entry.isEncrypted()) throw invalid(`entry [${name}] is encrypted`);\n if (isSymlinkEntry(entry)) throw unsafe(`entry [${name}] is a symlink`);\n if (!isSafeProjectPath(name)) throw unsafe(`entry [${name}] is not a plain relative path inside the project`);\n if (name.split('/').includes(REFUSED_DIRECTORY)) {\n throw tooLarge(`entry [${name}] is inside a ${REFUSED_DIRECTORY} folder; dependencies are not supported in a user script yet`);\n }\n\n files.push({ entry, relativePath: name });\n if (files.length > USER_SCRIPT_SOURCE_LIMITS.maxFiles) {\n throw tooLarge(`the archive holds more than ${USER_SCRIPT_SOURCE_LIMITS.maxFiles} files`);\n }\n });\n\n const strip = stripCommonFolder(files.map((file) => file.relativePath));\n\n return files.map((file) => ({ ...file, relativePath: file.relativePath.slice(strip) }));\n};\n\n/**\n * Unpacks a user-controlled zip into the project directory under the same rules as a\n * directory build: plain relative paths only, no symlinks, no node_modules, at most\n * USER_SCRIPT_SOURCE_LIMITS files and unpacked bytes counted as they are written (the\n * sizes in the zip's headers are never trusted). Directory entries are ignored; folders\n * come from file paths. Returns the project-relative paths written.\n */\nexport const extractUserScriptZip = async (zip: Buffer, projectDir: string): Promise<string[]> => {\n let planned: PlannedEntry[];\n try {\n planned = await planEntries(zip);\n } catch (error) {\n if (error instanceof UserScriptArchiveError) throw error;\n throw invalid(`cannot read the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const counter = { total: 0 };\n const written: string[] = [];\n const zipFile = await openZip(zip);\n const plannedByEntryName = new Map(planned.map((file) => [entryName(file.entry), file.relativePath]));\n\n try {\n await readEntries(zipFile, async (entry) => {\n const relativePath = plannedByEntryName.get(entryName(entry));\n if (relativePath === undefined) return;\n\n const target = path.join(projectDir, ...relativePath.split('/'));\n fs.mkdirSync(path.dirname(target), { recursive: true });\n\n const stream = await openEntryStream(zipFile, entry);\n await pipeline(\n stream,\n createByteCap(counter, () => tooLarge(`the archive unpacks to more than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`)),\n fs.createWriteStream(target),\n );\n written.push(relativePath);\n });\n } catch (error) {\n if (error instanceof UserScriptArchiveError) throw error;\n throw invalid(`cannot unpack the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return written;\n};\n"]}
1
+ {"version":3,"file":"extractUserScriptZip.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/extractUserScriptZip.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { Readable, Transform } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport path from 'path';\nimport yauzl, { Entry, ZipFile } from 'yauzl';\n\nimport { isSafeProjectPath } from './isSafeProjectPath';\nimport { isUserScriptArchiveError } from './isUserScriptArchiveError';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError, UserScriptArchiveErrorCode } from './UserScriptArchiveError';\n\nconst REFUSED_DIRECTORY = 'node_modules';\nconst SYMLINK_MODE = 0o120000;\nconst FILE_TYPE_MASK = 0o170000;\n\n// Unix mode lives in the high 16 bits of the external attributes; zips made on other\n// systems leave it zero, which reads as \"not a symlink\".\nconst isSymlinkEntry = (entry: Entry): boolean => ((entry.externalFileAttributes >>> 16) & FILE_TYPE_MASK) === SYMLINK_MODE;\n\n// With decodeStrings off, yauzl hands names over raw so it does not apply its own path\n// rules before ours.\nconst entryName = (entry: Entry): string => (Buffer.isBuffer(entry.fileName) ? entry.fileName.toString('utf8') : String(entry.fileName));\n\nconst isDirectoryEntry = (name: string): boolean => name.endsWith('/');\n\nconst openZip = (zip: Buffer): Promise<ZipFile> =>\n new Promise((resolve, reject) => {\n // Header sizes are never consulted: the byte cap on the inflated stream is the only\n // authority, so yauzl's own size validation is off rather than a second, trusted, rule.\n yauzl.fromBuffer(zip, { lazyEntries: true, decodeStrings: false, validateEntrySizes: false }, (error, zipFile) =>\n error ? reject(error) : resolve(zipFile),\n );\n });\n\nconst readEntries = (zipFile: ZipFile, onEntry: (entry: Entry) => Promise<void> | void): Promise<void> =>\n new Promise((resolve, reject) => {\n zipFile.on('error', reject);\n zipFile.on('end', resolve);\n zipFile.on('entry', (entry: Entry) => {\n // A rule that throws synchronously must still reject here, not escape yauzl's\n // event emitter where it would be lost and leave the zip hanging.\n Promise.resolve()\n .then(() => onEntry(entry))\n .then(\n () => zipFile.readEntry(),\n (error) => {\n zipFile.close();\n reject(error);\n },\n );\n });\n zipFile.readEntry();\n });\n\nconst openEntryStream = (zipFile: ZipFile, entry: Entry): Promise<Readable> =>\n new Promise((resolve, reject) => {\n zipFile.openReadStream(entry, (error, stream) => (error ? reject(error) : resolve(stream)));\n });\n\nconst tooLarge = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.SourceTooLarge, message);\nconst unsafe = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.UnsafeArchiveEntry, message);\nconst invalid = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.InvalidArchive, message);\n\n// Counts the bytes that really come out of the inflater and fails the pipeline the moment\n// the project cap is crossed, so a zip that lies about its sizes cannot fill the disk.\nconst createByteCap = (counter: { total: number }, onExceeded: () => Error): Transform =>\n new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n counter.total += chunk.length;\n if (counter.total > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n callback(onExceeded());\n return;\n }\n callback(null, chunk);\n },\n });\n\ntype PlannedEntry = { entry: Entry; relativePath: string };\n\n// Accepts the project at the zip root (anything under `src/`), or wrapped in exactly one\n// top-level folder (how most tools zip a directory): when nothing is under `src/` at the\n// root, every file shares the same first segment, and none sits at the root, that segment\n// is stripped. A root `src/` always wins, so a project with only `src/` is never stripped.\nconst stripCommonFolder = (names: string[]): number => {\n if (names.length === 0 || names.some((name) => name.startsWith('src/'))) return 0;\n\n const firstSegments = new Set(names.map((name) => name.split('/')[0]));\n const allNested = names.every((name) => name.includes('/'));\n\n const [firstSegment] = firstSegments;\n return firstSegments.size === 1 && allNested && firstSegment !== undefined ? firstSegment.length + 1 : 0;\n};\n\nconst planEntries = async (zip: Buffer): Promise<PlannedEntry[]> => {\n const files: PlannedEntry[] = [];\n const zipFile = await openZip(zip);\n\n await readEntries(zipFile, (entry) => {\n const name = entryName(entry);\n if (isDirectoryEntry(name)) return;\n\n if (entry.isEncrypted()) throw invalid(`entry [${name}] is encrypted`);\n if (isSymlinkEntry(entry)) throw unsafe(`entry [${name}] is a symlink`);\n if (!isSafeProjectPath(name)) throw unsafe(`entry [${name}] is not a plain relative path inside the project`);\n if (name.split('/').includes(REFUSED_DIRECTORY)) {\n throw tooLarge(`entry [${name}] is inside a ${REFUSED_DIRECTORY} folder; dependencies are not supported in a user script yet`);\n }\n\n files.push({ entry, relativePath: name });\n if (files.length > USER_SCRIPT_SOURCE_LIMITS.maxFiles) {\n throw tooLarge(`the archive holds more than ${USER_SCRIPT_SOURCE_LIMITS.maxFiles} files`);\n }\n });\n\n const strip = stripCommonFolder(files.map((file) => file.relativePath));\n\n return files.map((file) => ({ ...file, relativePath: file.relativePath.slice(strip) }));\n};\n\n/**\n * Unpacks a user-controlled zip into the project directory under the same rules as a\n * directory build: plain relative paths only, no symlinks, no node_modules, at most\n * USER_SCRIPT_SOURCE_LIMITS files and unpacked bytes counted as they are written (the\n * sizes in the zip's headers are never trusted). Directory entries are ignored; folders\n * come from file paths. Returns the project-relative paths written.\n */\nexport const extractUserScriptZip = async (zip: Buffer, projectDir: string): Promise<string[]> => {\n let planned: PlannedEntry[];\n try {\n planned = await planEntries(zip);\n } catch (error) {\n if (isUserScriptArchiveError(error)) throw error;\n throw invalid(`cannot read the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const counter = { total: 0 };\n const written: string[] = [];\n const zipFile = await openZip(zip);\n const plannedByEntryName = new Map(planned.map((file) => [entryName(file.entry), file.relativePath]));\n\n try {\n await readEntries(zipFile, async (entry) => {\n const relativePath = plannedByEntryName.get(entryName(entry));\n if (relativePath === undefined) return;\n\n const target = path.join(projectDir, ...relativePath.split('/'));\n fs.mkdirSync(path.dirname(target), { recursive: true });\n\n const stream = await openEntryStream(zipFile, entry);\n await pipeline(\n stream,\n createByteCap(counter, () => tooLarge(`the archive unpacks to more than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`)),\n fs.createWriteStream(target),\n );\n written.push(relativePath);\n });\n } catch (error) {\n if (isUserScriptArchiveError(error)) throw error;\n throw invalid(`cannot unpack the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return written;\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import { UserScriptArchiveError } from './UserScriptArchiveError';
2
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
3
+ export declare const isUserScriptArchiveError: (error: unknown) => error is UserScriptArchiveError;
@@ -0,0 +1,3 @@
1
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
2
+ export const isUserScriptArchiveError = (error) => error instanceof Error && error.name === 'UserScriptArchiveError';
3
+ //# sourceMappingURL=isUserScriptArchiveError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isUserScriptArchiveError.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/isUserScriptArchiveError.ts"],"names":[],"mappings":"AAEA,4HAA4H;AAC5H,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAc,EAAmC,EAAE,CAC1F,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC","sourcesContent":["import { UserScriptArchiveError } from './UserScriptArchiveError';\n\n/** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */\nexport const isUserScriptArchiveError = (error: unknown): error is UserScriptArchiveError =>\n error instanceof Error && error.name === 'UserScriptArchiveError';\n"]}
@@ -0,0 +1,3 @@
1
+ import { UserScriptBuildError } from './UserScriptBuildError';
2
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
3
+ export declare const isUserScriptBuildError: (error: unknown) => error is UserScriptBuildError;
@@ -0,0 +1,3 @@
1
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
2
+ export const isUserScriptBuildError = (error) => error instanceof Error && error.name === 'UserScriptBuildError';
3
+ //# sourceMappingURL=isUserScriptBuildError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isUserScriptBuildError.js","sourceRoot":"","sources":["../../../src/build/isUserScriptBuildError.ts"],"names":[],"mappings":"AAEA,4HAA4H;AAC5H,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAiC,EAAE,CACtF,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAAC","sourcesContent":["import { UserScriptBuildError } from './UserScriptBuildError';\n\n/** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */\nexport const isUserScriptBuildError = (error: unknown): error is UserScriptBuildError =>\n error instanceof Error && error.name === 'UserScriptBuildError';\n"]}
@@ -17,6 +17,7 @@ const requireOrImport = async () => {
17
17
  return nodeRequire(entry);
18
18
  }
19
19
  catch (error) {
20
+ // Deliberate: an ESM-only rspack cannot be required, so the same entry is imported instead; any other failure propagates.
20
21
  if (!isRequireEsmError(error))
21
22
  throw error;
22
23
  return importByUrl(pathToFileURL(entry).href);
@@ -1 +1 @@
1
- {"version":3,"file":"loadRspackModule.js","sourceRoot":"","sources":["../../../src/build/loadRspackModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAOpC,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,uBAAuB,GAAG,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;AAEhF,0FAA0F;AAC1F,wFAAwF;AACxF,MAAM,cAAc,GAAG,GAAgB,EAAE,CAAC,CAAC,OAAO,uBAAuB,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;AAEhJ,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,WAAW,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAA2C,CAAC;AAExG,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAE,KAA2B,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AAElI,MAAM,eAAe,GAAG,KAAK,IAA2B,EAAE;IACxD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,CAAiB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QAC3C,OAAO,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,OAA0C,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAA0B,EAAE;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,eAAe,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import { createRequire } from 'module';\nimport { pathToFileURL } from 'url';\n\nexport type RspackModule = typeof import('@rspack/core');\n\n// The bundler's escape hatch for the host's real `require`; undefined outside a bundle.\ndeclare const __non_webpack_require__: NodeRequire | undefined;\n\n// Node refuses require() of an ES module on versions before 22.12, or when the module\n// graph awaits at top level; both mean \"use import() instead\".\nconst REQUIRE_ESM_ERROR_CODES = ['ERR_REQUIRE_ESM', 'ERR_REQUIRE_ASYNC_MODULE'];\n\n// Inside a bundle `require` is the bundler's own and cannot see a layer-provided package;\n// Node's real require can, and honours NODE_PATH, which is how a lambda layer is found.\nconst getNodeRequire = (): NodeRequire => (typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : createRequire(__filename));\n\n// Built at run time so neither tsc (which rewrites a literal import() to require() in\n// CommonJS output) nor the bundler can turn it into a require.\nconst importByUrl = new Function('url', 'return import(url)') as (url: string) => Promise<RspackModule>;\n\nconst isRequireEsmError = (error: unknown): boolean => REQUIRE_ESM_ERROR_CODES.includes((error as { code?: string })?.code ?? '');\n\nconst requireOrImport = async (): Promise<RspackModule> => {\n const nodeRequire = getNodeRequire();\n const entry = nodeRequire.resolve('@rspack/core');\n\n try {\n return nodeRequire(entry) as RspackModule;\n } catch (error) {\n if (!isRequireEsmError(error)) throw error;\n return importByUrl(pathToFileURL(entry).href);\n }\n};\n\nlet loading: Promise<RspackModule> | undefined;\n\n/**\n * Loads @rspack/core, which ships as ES modules only, from CommonJS code that may be\n * bundled and running on a lambda with rspack on a layer: resolve the entry with Node's\n * require (NODE_PATH aware), require it where Node allows that, otherwise import it by\n * file URL. Loaded once per process.\n */\nexport const loadRspackModule = (): Promise<RspackModule> => {\n if (!loading) {\n loading = requireOrImport();\n }\n return loading;\n};\n"]}
1
+ {"version":3,"file":"loadRspackModule.js","sourceRoot":"","sources":["../../../src/build/loadRspackModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAOpC,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,uBAAuB,GAAG,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;AAEhF,0FAA0F;AAC1F,wFAAwF;AACxF,MAAM,cAAc,GAAG,GAAgB,EAAE,CAAC,CAAC,OAAO,uBAAuB,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;AAEhJ,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,WAAW,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAA2C,CAAC;AAExG,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAE,KAA2B,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AAElI,MAAM,eAAe,GAAG,KAAK,IAA2B,EAAE;IACxD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,CAAiB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0HAA0H;QAC1H,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QAC3C,OAAO,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,OAA0C,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAA0B,EAAE;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,eAAe,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import { createRequire } from 'module';\nimport { pathToFileURL } from 'url';\n\nexport type RspackModule = typeof import('@rspack/core');\n\n// The bundler's escape hatch for the host's real `require`; undefined outside a bundle.\ndeclare const __non_webpack_require__: NodeRequire | undefined;\n\n// Node refuses require() of an ES module on versions before 22.12, or when the module\n// graph awaits at top level; both mean \"use import() instead\".\nconst REQUIRE_ESM_ERROR_CODES = ['ERR_REQUIRE_ESM', 'ERR_REQUIRE_ASYNC_MODULE'];\n\n// Inside a bundle `require` is the bundler's own and cannot see a layer-provided package;\n// Node's real require can, and honours NODE_PATH, which is how a lambda layer is found.\nconst getNodeRequire = (): NodeRequire => (typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : createRequire(__filename));\n\n// Built at run time so neither tsc (which rewrites a literal import() to require() in\n// CommonJS output) nor the bundler can turn it into a require.\nconst importByUrl = new Function('url', 'return import(url)') as (url: string) => Promise<RspackModule>;\n\nconst isRequireEsmError = (error: unknown): boolean => REQUIRE_ESM_ERROR_CODES.includes((error as { code?: string })?.code ?? '');\n\nconst requireOrImport = async (): Promise<RspackModule> => {\n const nodeRequire = getNodeRequire();\n const entry = nodeRequire.resolve('@rspack/core');\n\n try {\n return nodeRequire(entry) as RspackModule;\n } catch (error) {\n // Deliberate: an ESM-only rspack cannot be required, so the same entry is imported instead; any other failure propagates.\n if (!isRequireEsmError(error)) throw error;\n return importByUrl(pathToFileURL(entry).href);\n }\n};\n\nlet loading: Promise<RspackModule> | undefined;\n\n/**\n * Loads @rspack/core, which ships as ES modules only, from CommonJS code that may be\n * bundled and running on a lambda with rspack on a layer: resolve the entry with Node's\n * require (NODE_PATH aware), require it where Node allows that, otherwise import it by\n * file URL. Loaded once per process.\n */\nexport const loadRspackModule = (): Promise<RspackModule> => {\n if (!loading) {\n loading = requireOrImport();\n }\n return loading;\n};\n"]}
@@ -6,7 +6,7 @@ import { defineActionProcessors } from '@qpqjs/core';
6
6
  */
7
7
  export const defineUserScriptBuilder = () => defineActionProcessors({
8
8
  basePath: __dirname,
9
- relativePath: '../actionProcessor/getUserScriptBuildActionProcessors',
10
- functionName: 'getUserScriptBuildActionProcessors',
9
+ relativePath: '../actionProcessor/getUserScriptBuilderActionProcessor',
10
+ functionName: 'getUserScriptBuilderActionProcessor',
11
11
  });
12
12
  //# sourceMappingURL=defineUserScriptBuilder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defineUserScriptBuilder.js","sourceRoot":"","sources":["../../../src/config/defineUserScriptBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEvF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAqC,EAAE,CAC5E,sBAAsB,CAAC;IACrB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,uDAAuD;IACrE,YAAY,EAAE,oCAAoC;CACnD,CAAC,CAAC","sourcesContent":["import { ActionProcessorsQPQConfigSetting, defineActionProcessors } from '@qpqjs/core';\n\n/**\n * Registers the askUserScriptBuild processor on a service. Only services that call this\n * can build user scripts, and only they load rspack; on lambda they also need the layer\n * from getUserScriptBuilderApiLayer.\n */\nexport const defineUserScriptBuilder = (): ActionProcessorsQPQConfigSetting =>\n defineActionProcessors({\n basePath: __dirname,\n relativePath: '../actionProcessor/getUserScriptBuildActionProcessors',\n functionName: 'getUserScriptBuildActionProcessors',\n });\n"]}
1
+ {"version":3,"file":"defineUserScriptBuilder.js","sourceRoot":"","sources":["../../../src/config/defineUserScriptBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEvF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAqC,EAAE,CAC5E,sBAAsB,CAAC;IACrB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,wDAAwD;IACtE,YAAY,EAAE,qCAAqC;CACpD,CAAC,CAAC","sourcesContent":["import { ActionProcessorsQPQConfigSetting, defineActionProcessors } from '@qpqjs/core';\n\n/**\n * Registers the askUserScriptBuild processor on a service. Only services that call this\n * can build user scripts, and only they load rspack; on lambda they also need the layer\n * from getUserScriptBuilderApiLayer.\n */\nexport const defineUserScriptBuilder = (): ActionProcessorsQPQConfigSetting =>\n defineActionProcessors({\n basePath: __dirname,\n relativePath: '../actionProcessor/getUserScriptBuilderActionProcessor',\n functionName: 'getUserScriptBuilderActionProcessor',\n });\n"]}
package/package.json CHANGED
@@ -1,13 +1,22 @@
1
1
  {
2
2
  "name": "@qpqjs/user-script",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Build user-written scripts into one loadable file, on a developer machine, the dev server or lambda",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/esm/index.js",
7
7
  "types": "./lib/commonjs/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/commonjs/index.d.ts",
11
+ "module": "./lib/esm/index.js",
12
+ "default": "./lib/commonjs/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
8
16
  "sideEffects": false,
9
17
  "files": [
10
- "lib/**/*"
18
+ "lib/**/*",
19
+ "!lib/**/__fixtures__/**"
11
20
  ],
12
21
  "publishConfig": {
13
22
  "access": "public"
@@ -21,11 +30,13 @@
21
30
  "build:esm": "tsc -p tsconfig.esm.json",
22
31
  "lint": "npx eslint .",
23
32
  "lint:fix": "npx eslint . --fix",
24
- "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,scss,md}\""
33
+ "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,scss,md}\"",
34
+ "test:watch": "vitest"
25
35
  },
26
36
  "repository": {
27
37
  "type": "git",
28
- "url": "git+https://github.com/qpqjs/quidproquo.git"
38
+ "url": "git+https://github.com/qpqjs/quidproquo.git",
39
+ "directory": "packages/user-script"
29
40
  },
30
41
  "keywords": [],
31
42
  "author": "",
@@ -36,17 +47,21 @@
36
47
  "homepage": "https://github.com/qpqjs/quidproquo#readme",
37
48
  "dependencies": {
38
49
  "@rspack/core": "^2.1.2",
39
- "@qpqjs/actionprocessor-node": "0.3.0",
40
- "@qpqjs/config-aws": "0.3.0",
41
- "@qpqjs/core": "0.3.0",
50
+ "@qpqjs/actionprocessor-node": "0.5.0",
51
+ "@qpqjs/config-aws": "0.5.0",
52
+ "@qpqjs/core": "0.5.0",
42
53
  "yauzl": "^3.4.0"
43
54
  },
44
55
  "devDependencies": {
56
+ "@qpqjs/actionprocessor-js": "0.5.0",
57
+ "@qpqjs/testing": "0.5.0",
58
+ "@qpqjs/tsconfig": "0.5.0",
45
59
  "@types/node": "^22.13.13",
46
60
  "@types/yauzl": "^3.4.0",
47
61
  "fflate": "^0.8.3",
48
- "@qpqjs/actionprocessor-js": "0.3.0",
49
- "@qpqjs/tsconfig": "0.3.0",
50
62
  "typescript": "^5.8.2"
63
+ },
64
+ "engines": {
65
+ "node": ">=24"
51
66
  }
52
67
  }
@@ -1,3 +0,0 @@
1
- import { ActionProcessorListResolver } from '@qpqjs/core';
2
- /** The resolver defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
3
- export declare const getUserScriptBuildActionProcessors: ActionProcessorListResolver;
@@ -1 +0,0 @@
1
- {"version":3,"file":"getUserScriptBuildActionProcessors.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildActionProcessors.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2FAAwF;AACxF,yGAAsG;AAEtG,qHAAqH;AAC9G,MAAM,kCAAkC,GAAgC,CAC7E,SAAoB,EACpB,mBAAwC,EACV,EAAE;IAAC,OAAA,iCAC9B,CAAC,MAAM,IAAA,qEAAiC,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,GACzE,CAAC,MAAM,IAAA,mFAAwC,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,EACnF,CAAA;EAAA,CAAC;AANU,QAAA,kCAAkC,sCAM5C","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from '@qpqjs/core';\n\nimport { getUserScriptBuildActionProcessor } from './getUserScriptBuildActionProcessor';\nimport { getUserScriptBuildFromZipActionProcessor } from './getUserScriptBuildFromZipActionProcessor';\n\n/** The resolver defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */\nexport const getUserScriptBuildActionProcessors: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getUserScriptBuildActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getUserScriptBuildFromZipActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
@@ -1 +0,0 @@
1
- export declare const formatSum: (sum: number) => string;
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatSum = void 0;
4
- const formatSum = (sum) => `added ${sum}`;
5
- exports.formatSum = formatSum;
6
- //# sourceMappingURL=formatSum.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatSum.js","sourceRoot":"","sources":["../../../../../../../src/build/__fixtures__/basic/src/helpers/formatSum.ts"],"names":[],"mappings":";;;AAAO,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC;AAApD,QAAA,SAAS,aAA2C","sourcesContent":["export const formatSum = (sum: number): string => `added ${sum}`;\n"]}
@@ -1,4 +0,0 @@
1
- import { AskResponse } from '@qpqjs/core';
2
- export declare function add(drive: string, filepath: string, a: number, b: number): AskResponse<number>;
3
- export declare const greet: (name: string) => string;
4
- export declare const makeId: () => string;
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeId = exports.greet = void 0;
4
- exports.add = add;
5
- const core_1 = require("@qpqjs/core");
6
- const uuidv7_1 = require("uuidv7");
7
- const formatSum_1 = require("./helpers/formatSum");
8
- function* add(drive, filepath, a, b) {
9
- const sum = a + b;
10
- yield* (0, core_1.askFileWriteTextContents)(drive, filepath, (0, formatSum_1.formatSum)(sum));
11
- return sum;
12
- }
13
- const greet = (name) => `hello ${name}`;
14
- exports.greet = greet;
15
- const makeId = () => (0, uuidv7_1.uuidv7)();
16
- exports.makeId = makeId;
17
- //# sourceMappingURL=main.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../../src/build/__fixtures__/basic/src/main.ts"],"names":[],"mappings":";;;AAMA,kBAIC;AAVD,sCAAoE;AAEpE,mCAAgC;AAEhC,mDAAgD;AAEhD,QAAe,CAAC,CAAC,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,CAAS,EAAE,CAAS;IACxE,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,CAAC,CAAC,IAAA,+BAAwB,EAAC,KAAK,EAAE,QAAQ,EAAE,IAAA,qBAAS,EAAC,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC;AACb,CAAC;AAEM,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;AAAlD,QAAA,KAAK,SAA6C;AAExD,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAA,eAAM,GAAE,CAAC;AAAhC,QAAA,MAAM,UAA0B","sourcesContent":["import { askFileWriteTextContents, AskResponse } from '@qpqjs/core';\n\nimport { uuidv7 } from 'uuidv7';\n\nimport { formatSum } from './helpers/formatSum';\n\nexport function* add(drive: string, filepath: string, a: number, b: number): AskResponse<number> {\n const sum = a + b;\n yield* askFileWriteTextContents(drive, filepath, formatSum(sum));\n return sum;\n}\n\nexport const greet = (name: string): string => `hello ${name}`;\n\nexport const makeId = (): string => uuidv7();\n"]}
@@ -1 +0,0 @@
1
- export declare const readIt: () => string;
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readIt = void 0;
4
- const fs_1 = require("fs");
5
- const readIt = () => (0, fs_1.readFileSync)('/etc/hostname', 'utf8');
6
- exports.readIt = readIt;
7
- //# sourceMappingURL=main.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../../src/build/__fixtures__/builtin/src/main.ts"],"names":[],"mappings":";;;AAAA,2BAAkC;AAE3B,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAA,iBAAY,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAA7D,QAAA,MAAM,UAAuD","sourcesContent":["import { readFileSync } from 'fs';\n\nexport const readIt = (): string => readFileSync('/etc/hostname', 'utf8');\n"]}
@@ -1 +0,0 @@
1
- export declare const nothing: () => void;
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.nothing = void 0;
4
- const nothing = () => { };
5
- exports.nothing = nothing;
6
- //# sourceMappingURL=notMain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notMain.js","sourceRoot":"","sources":["../../../../../../src/build/__fixtures__/noEntry/src/notMain.ts"],"names":[],"mappings":";;;AAAO,MAAM,OAAO,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;AAAzB,QAAA,OAAO,WAAkB","sourcesContent":["export const nothing = (): void => {};\n"]}
@@ -1,2 +0,0 @@
1
- export declare const greet: (name: string) => string;
2
- export declare const version = 3;
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.version = exports.greet = void 0;
4
- const greet = (name) => `hello ${name}`;
5
- exports.greet = greet;
6
- exports.version = 3;
7
- //# sourceMappingURL=main.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../../src/build/__fixtures__/nonFunction/src/main.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;AAAlD,QAAA,KAAK,SAA6C;AAClD,QAAA,OAAO,GAAG,CAAC,CAAC","sourcesContent":["export const greet = (name: string): string => `hello ${name}`;\nexport const version = 3;\n"]}
@@ -1,3 +0,0 @@
1
- import { ActionProcessorListResolver } from '@qpqjs/core';
2
- /** The resolver defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
3
- export declare const getUserScriptBuildActionProcessors: ActionProcessorListResolver;
@@ -1 +0,0 @@
1
- {"version":3,"file":"getUserScriptBuildActionProcessors.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildActionProcessors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AAEtG,qHAAqH;AACrH,MAAM,CAAC,MAAM,kCAAkC,GAAgC,KAAK,EAClF,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,iCAAiC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC5E,GAAG,CAAC,MAAM,wCAAwC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CACpF,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from '@qpqjs/core';\n\nimport { getUserScriptBuildActionProcessor } from './getUserScriptBuildActionProcessor';\nimport { getUserScriptBuildFromZipActionProcessor } from './getUserScriptBuildFromZipActionProcessor';\n\n/** The resolver defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */\nexport const getUserScriptBuildActionProcessors: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getUserScriptBuildActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getUserScriptBuildFromZipActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
@@ -1 +0,0 @@
1
- export declare const formatSum: (sum: number) => string;
@@ -1,2 +0,0 @@
1
- export const formatSum = (sum) => `added ${sum}`;
2
- //# sourceMappingURL=formatSum.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatSum.js","sourceRoot":"","sources":["../../../../../../../src/build/__fixtures__/basic/src/helpers/formatSum.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC","sourcesContent":["export const formatSum = (sum: number): string => `added ${sum}`;\n"]}
@@ -1,4 +0,0 @@
1
- import { AskResponse } from '@qpqjs/core';
2
- export declare function add(drive: string, filepath: string, a: number, b: number): AskResponse<number>;
3
- export declare const greet: (name: string) => string;
4
- export declare const makeId: () => string;
@@ -1,11 +0,0 @@
1
- import { askFileWriteTextContents } from '@qpqjs/core';
2
- import { uuidv7 } from 'uuidv7';
3
- import { formatSum } from './helpers/formatSum';
4
- export function* add(drive, filepath, a, b) {
5
- const sum = a + b;
6
- yield* askFileWriteTextContents(drive, filepath, formatSum(sum));
7
- return sum;
8
- }
9
- export const greet = (name) => `hello ${name}`;
10
- export const makeId = () => uuidv7();
11
- //# sourceMappingURL=main.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../../src/build/__fixtures__/basic/src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAe,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,SAAS,CAAC,CAAC,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,CAAS,EAAE,CAAS;IACxE,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,CAAC,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;AAE/D,MAAM,CAAC,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,MAAM,EAAE,CAAC","sourcesContent":["import { askFileWriteTextContents, AskResponse } from '@qpqjs/core';\n\nimport { uuidv7 } from 'uuidv7';\n\nimport { formatSum } from './helpers/formatSum';\n\nexport function* add(drive: string, filepath: string, a: number, b: number): AskResponse<number> {\n const sum = a + b;\n yield* askFileWriteTextContents(drive, filepath, formatSum(sum));\n return sum;\n}\n\nexport const greet = (name: string): string => `hello ${name}`;\n\nexport const makeId = (): string => uuidv7();\n"]}