@jspsych/config 3.3.2 → 3.3.3

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 (3) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/gulp.js +64 -37
  3. package/package.json +1 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @jspsych/config
2
2
 
3
+ ## 3.3.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#3660](https://github.com/jspsych/jsPsych/pull/3660) [`181d0068b7ec8fcd76de94f78cec9526b0415ce2`](https://github.com/jspsych/jsPsych/commit/181d0068b7ec8fcd76de94f78cec9526b0415ce2) Thanks [@jodeleeuw](https://github.com/jodeleeuw)! - Fix `createCoreDistArchive` dropping plugins from `dist.zip`. Recent release archives were missing the alphabetical tail of `dist/*.js` (e.g. `plugin-survey-multi-*`, `plugin-video-*`, `plugin-virtual-chinrest`, `plugin-visual-search-circle`, the `plugin-webgazer-*` plugins) along with some `examples/*.html` files. Under gulp 5's streamx-based Vinyl, `merge-stream` would race with `gulp-zip` and finalize the archive before slow upstreams (notably the 3 MB `plugin-survey/dist/index.browser.js`) had finished flushing. The task now drains every substream first and feeds the collected files into `gulp-zip` from a single ordered stream.
8
+
3
9
  ## 3.3.2
4
10
 
5
11
  ### Patch Changes
package/gulp.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { readFileSync } from "fs";
2
2
  import { sep as pathSeparator } from "path";
3
+ import { Readable } from "stream";
3
4
 
4
5
  import glob from "glob";
5
6
  import gulp from "gulp";
@@ -7,10 +8,21 @@ import file from "gulp-file";
7
8
  import rename from "gulp-rename";
8
9
  import replace from "gulp-replace";
9
10
  import zip from "gulp-zip";
10
- import merge from "merge-stream";
11
11
 
12
12
  const { dest, src } = gulp;
13
13
 
14
+ // Drains a Vinyl object stream and resolves with the emitted files. We collect
15
+ // every substream up front instead of feeding `gulp-zip` through `merge-stream`
16
+ // because under gulp 5 (streamx-based Vinyl) the zip sink can finalize before
17
+ // slow upstreams flush, silently dropping files from `dist.zip`.
18
+ const collectFiles = (stream) =>
19
+ new Promise((resolve, reject) => {
20
+ const files = [];
21
+ stream.on("data", (vinylFile) => files.push(vinylFile));
22
+ stream.on("end", () => resolve(files));
23
+ stream.on("error", reject);
24
+ });
25
+
14
26
  const readJsonFile = (filename) => JSON.parse(readFileSync(filename, "utf8"));
15
27
 
16
28
  const getAllPackages = () =>
@@ -63,60 +75,75 @@ const getVersionFileContents = () =>
63
75
  "",
64
76
  ].join("\n");
65
77
 
66
- export const createCoreDistArchive = () =>
67
- merge(
78
+ export const createCoreDistArchive = async () => {
79
+ const fileGroups = await Promise.all([
68
80
  // index.browser.js files
69
- src("packages/*/dist/index.browser.js", { root: "packages/" })
70
- // Rename dist files
71
- .pipe(
72
- rename((path) => {
73
- const packageName = path.dirname.split(pathSeparator)[0];
74
-
75
- path.dirname = "/dist";
76
- path.basename = packageName;
77
- })
78
- )
79
- // Remove sourceMappingURL comments
80
- .pipe(replace(/\/\/# sourceMappingURL=.*\n/g, "")),
81
+ collectFiles(
82
+ src("packages/*/dist/index.browser.js", { root: "packages/" })
83
+ // Rename dist files
84
+ .pipe(
85
+ rename((path) => {
86
+ const packageName = path.dirname.split(pathSeparator)[0];
87
+
88
+ path.dirname = "/dist";
89
+ path.basename = packageName;
90
+ })
91
+ )
92
+ // Remove sourceMappingURL comments
93
+ .pipe(replace(/\/\/# sourceMappingURL=.*\n/g, ""))
94
+ ),
81
95
 
82
96
  // jspsych.css
83
- src("packages/jspsych/css/jspsych.css").pipe(rename("/dist/jspsych.css")),
97
+ collectFiles(src("packages/jspsych/css/jspsych.css").pipe(rename("/dist/jspsych.css"))),
84
98
 
85
99
  // survey.css
86
- src("packages/plugin-survey/css/survey.css").pipe(rename("/dist/survey.css")),
87
- src("packages/plugin-survey/css/survey.min.css").pipe(rename("/dist/survey.min.css")),
100
+ collectFiles(src("packages/plugin-survey/css/survey.css").pipe(rename("/dist/survey.css"))),
101
+ collectFiles(
102
+ src("packages/plugin-survey/css/survey.min.css").pipe(rename("/dist/survey.min.css"))
103
+ ),
88
104
 
89
105
  // Examples HTML files
90
- src(["examples/**/*.html"], { base: "." })
91
- // Rewrite script source paths
92
- .pipe(
93
- replace(
94
- /<script src="(.*)\/packages\/(.*)\/dist\/index\.browser\.js"/g,
95
- '<script src="$1/dist/$2.js"'
106
+ collectFiles(
107
+ src(["examples/**/*.html"], { base: "." })
108
+ // Rewrite script source paths
109
+ .pipe(
110
+ replace(
111
+ /<script src="(.*)\/packages\/(.*)\/dist\/index\.browser\.js"/g,
112
+ '<script src="$1/dist/$2.js"'
113
+ )
96
114
  )
97
- )
98
- // Rewrite jspsych css source paths
99
- .pipe(
100
- replace(
101
- /<link rel="stylesheet" href="(.*)\/packages\/jspsych\/css\/(.*)"/g,
102
- '<link rel="stylesheet" href="$1/dist/$2"'
115
+ // Rewrite jspsych css source paths
116
+ .pipe(
117
+ replace(
118
+ /<link rel="stylesheet" href="(.*)\/packages\/jspsych\/css\/(.*)"/g,
119
+ '<link rel="stylesheet" href="$1/dist/$2"'
120
+ )
103
121
  )
104
- ),
122
+ ),
105
123
 
106
124
  // Examples files other than HTML (e.g. media files)
107
125
  // Note: `encoding: false` means that the files contents are treated as binary.
108
126
  // This prevents Gulp from corrupting binary files such as images when it reads them.
109
127
  // Needed since Gulp v5.
110
- src(["examples/**/*", "!examples/**/*.html"], { base: ".", encoding: false }),
128
+ collectFiles(src(["examples/**/*", "!examples/**/*.html"], { base: ".", encoding: false })),
111
129
 
112
130
  // VERSION.md
113
- file("VERSION.md", getVersionFileContents(), { src: true }),
131
+ collectFiles(file("VERSION.md", getVersionFileContents(), { src: true })),
114
132
 
115
133
  // Other files
116
- src(["*.md", "license.txt"])
117
- )
118
- .pipe(zip("dist.zip"))
119
- .pipe(dest("."));
134
+ collectFiles(src(["*.md", "license.txt"])),
135
+ ]);
136
+
137
+ // Await the destination's `finish` so gulp doesn't mark this task complete
138
+ // before `dist.zip` is fully written (async-done resolves a returned Promise
139
+ // by its resolved value, not by re-handling a stream the Promise resolves to).
140
+ const writeStream = Readable.from(fileGroups.flat()).pipe(zip("dist.zip")).pipe(dest("."));
141
+ await new Promise((resolve, reject) => {
142
+ writeStream.on("finish", resolve);
143
+ writeStream.on("end", resolve);
144
+ writeStream.on("error", reject);
145
+ });
146
+ };
120
147
 
121
148
  /**
122
149
  * Updates each unpkg link with a precise version number to the corresponding package's current
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jspsych/config",
3
- "version": "3.3.2",
3
+ "version": "3.3.3",
4
4
  "description": "Shared (build) configuration for jsPsych packages",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -63,7 +63,6 @@
63
63
  "jest": "29.7.0",
64
64
  "jest-canvas-mock": "2.5.0",
65
65
  "jest-environment-jsdom": "29.7.0",
66
- "merge-stream": "2.0.0",
67
66
  "rollup": "^4.22.4",
68
67
  "rollup-plugin-dts": "6.1.1",
69
68
  "rollup-plugin-esbuild": "6.1.1",