@swipt/cli 0.1.0-nightly.42 → 0.1.0-nightly.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/metro.mjs CHANGED
@@ -12,21 +12,72 @@ const cliDirectory = path.dirname(fileURLToPath(import.meta.url));
12
12
 
13
13
  const sourceExtensions = ["js", "jsx", "json", "ts", "tsx", "cjs", "mjs"];
14
14
  const assetExtensions = [
15
- "bmp", "gif", "jpg", "jpeg", "png", "psd", "svg", "webp", "xml", "m4v", "mov", "mp4", "mpeg", "mpg", "webm", "aac", "aiff", "caf",
16
- "m4a", "mp3", "wav", "html", "pdf", "yaml", "yml", "otf", "ttf", "zip",
15
+ "bmp",
16
+ "gif",
17
+ "jpg",
18
+ "jpeg",
19
+ "png",
20
+ "psd",
21
+ "svg",
22
+ "webp",
23
+ "xml",
24
+ "m4v",
25
+ "mov",
26
+ "mp4",
27
+ "mpeg",
28
+ "mpg",
29
+ "webm",
30
+ "aac",
31
+ "aiff",
32
+ "caf",
33
+ "m4a",
34
+ "mp3",
35
+ "wav",
36
+ "html",
37
+ "pdf",
38
+ "yaml",
39
+ "yml",
40
+ "otf",
41
+ "ttf",
42
+ "zip",
43
+ "db",
44
+ "sqlite",
45
+ "sqlite3",
17
46
  ];
18
- const imageExtensions = new Set(["png", "jpg", "jpeg", "bmp", "gif", "webp", "psd", "svg", "tiff", "ktx"]);
47
+ const imageExtensions = new Set([
48
+ "png",
49
+ "jpg",
50
+ "jpeg",
51
+ "bmp",
52
+ "gif",
53
+ "webp",
54
+ "psd",
55
+ "svg",
56
+ "tiff",
57
+ "ktx",
58
+ ]);
19
59
  const babelConfigNames = [
20
- ".babelrc", ".babelrc.js", ".babelrc.cjs", ".babelrc.mjs", ".babelrc.json", ".babelrc.cts",
21
- "babel.config.js", "babel.config.cjs", "babel.config.mjs", "babel.config.json", "babel.config.cts", "babel.config.ts", "babel.config.mts",
60
+ ".babelrc",
61
+ ".babelrc.js",
62
+ ".babelrc.cjs",
63
+ ".babelrc.mjs",
64
+ ".babelrc.json",
65
+ ".babelrc.cts",
66
+ "babel.config.js",
67
+ "babel.config.cjs",
68
+ "babel.config.mjs",
69
+ "babel.config.json",
70
+ "babel.config.cts",
71
+ "babel.config.ts",
72
+ "babel.config.mts",
22
73
  ];
23
74
  const contextModes = ["sync", "eager", "lazy", "lazy-once"];
24
75
  const scaleSuffixes = ["", "@1x", "@1.5x", "@2x", "@3x", "@4x"];
25
76
  const platformSuffixes = ["", ".ios", ".native"];
26
77
  const platformRank = { ios: 2, native: 1 };
27
78
 
28
- const posix = file => file.split(path.sep).join("/");
29
- const escape = text => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
79
+ const posix = (file) => file.split(path.sep).join("/");
80
+ const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
30
81
 
31
82
  export function loadEnvironment(root) {
32
83
  loadProjectEnv(root, { mode: "production", silent: true });
@@ -35,7 +86,9 @@ export function loadEnvironment(root) {
35
86
 
36
87
  function defaultPreset(root) {
37
88
  try {
38
- return createRequire(path.join(root, "package.json")).resolve("expo/internal/babel-preset");
89
+ return createRequire(path.join(root, "package.json")).resolve(
90
+ "expo/internal/babel-preset",
91
+ );
39
92
  } catch {
40
93
  return require.resolve("babel-preset-expo");
41
94
  }
@@ -46,9 +99,14 @@ function contextFiles(directory, recursive) {
46
99
  return [];
47
100
  }
48
101
  const extensions = new Set([...sourceExtensions, ...assetExtensions]);
49
- return fs.readdirSync(directory, { recursive })
102
+ return fs
103
+ .readdirSync(directory, { recursive })
50
104
  .map(posix)
51
- .filter(file => extensions.has(path.extname(file).slice(1)) && fs.statSync(path.join(directory, file)).isFile())
105
+ .filter(
106
+ (file) =>
107
+ extensions.has(path.extname(file).slice(1)) &&
108
+ fs.statSync(path.join(directory, file)).isFile(),
109
+ )
52
110
  .sort();
53
111
  }
54
112
 
@@ -64,7 +122,9 @@ function requireContext({ types: t, template }) {
64
122
  return value;
65
123
  }
66
124
  }
67
- throw call.buildCodeFrameError(`argument ${index + 1} of require.context must be ${expected}`);
125
+ throw call.buildCodeFrameError(
126
+ `argument ${index + 1} of require.context must be ${expected}`,
127
+ );
68
128
  };
69
129
  const pattern = (call, index) => {
70
130
  const node = call.node.arguments[index];
@@ -72,7 +132,9 @@ function requireContext({ types: t, template }) {
72
132
  return /^\.\/.*$/;
73
133
  }
74
134
  if (!t.isRegExpLiteral(node)) {
75
- throw call.buildCodeFrameError(`argument ${index + 1} of require.context must be a regular expression literal`);
135
+ throw call.buildCodeFrameError(
136
+ `argument ${index + 1} of require.context must be a regular expression literal`,
137
+ );
76
138
  }
77
139
  return new RegExp(node.pattern, node.flags.replace(/[gy]/g, ""));
78
140
  };
@@ -82,24 +144,52 @@ function requireContext({ types: t, template }) {
82
144
  CallExpression(call, state) {
83
145
  const { callee } = call.node;
84
146
  if (
85
- !t.isMemberExpression(callee) || !t.isIdentifier(callee.object, { name: "require" }) || call.scope.hasBinding("require")
86
- || !(callee.computed ? t.isStringLiteral(callee.property, { value: "context" }) : t.isIdentifier(callee.property, { name: "context" }))
147
+ !t.isMemberExpression(callee) ||
148
+ !t.isIdentifier(callee.object, { name: "require" }) ||
149
+ call.scope.hasBinding("require") ||
150
+ !(callee.computed
151
+ ? t.isStringLiteral(callee.property, { value: "context" })
152
+ : t.isIdentifier(callee.property, { name: "context" }))
87
153
  ) {
88
154
  return;
89
155
  }
90
156
  const from = path.dirname(state.filename);
91
- const directory = path.resolve(from, argument(call, 0, undefined, "a string", value => typeof value === "string"));
92
- const recursive = argument(call, 1, true, "a boolean", value => typeof value === "boolean");
157
+ const directory = path.resolve(
158
+ from,
159
+ argument(
160
+ call,
161
+ 0,
162
+ undefined,
163
+ "a string",
164
+ (value) => typeof value === "string",
165
+ ),
166
+ );
167
+ const recursive = argument(
168
+ call,
169
+ 1,
170
+ true,
171
+ "a boolean",
172
+ (value) => typeof value === "boolean",
173
+ );
93
174
  const filter = pattern(call, 2);
94
- const mode = argument(call, 3, "sync", `one of ${contextModes.join(", ")}`, value => contextModes.includes(value));
175
+ const mode = argument(
176
+ call,
177
+ 3,
178
+ "sync",
179
+ `one of ${contextModes.join(", ")}`,
180
+ (value) => contextModes.includes(value),
181
+ );
95
182
  const entries = contextFiles(directory, recursive)
96
- .map(file => `./${file}`)
97
- .filter(key => filter.test(key))
98
- .map(key => {
99
- const target = posix(path.relative(from, path.join(directory, key)));
183
+ .map((file) => `./${file}`)
184
+ .filter((key) => filter.test(key))
185
+ .map((key) => {
186
+ const target = posix(
187
+ path.relative(from, path.join(directory, key)),
188
+ );
100
189
  return `${JSON.stringify(key)}: () => require(${JSON.stringify(target.startsWith(".") ? target : `./${target}`)})`;
101
190
  });
102
- call.replaceWith(template.expression.ast(`(() => {
191
+ call.replaceWith(
192
+ template.expression.ast(`(() => {
103
193
  const modules = { ${entries.join(", ")} };
104
194
  const context = key => {
105
195
  if (!Object.prototype.hasOwnProperty.call(modules, key)) {
@@ -111,27 +201,42 @@ function requireContext({ types: t, template }) {
111
201
  context.resolve = key => key;
112
202
  context.id = ${JSON.stringify(posix(path.relative(state.cwd, directory)) || ".")};
113
203
  return context;
114
- })()`));
204
+ })()`),
205
+ );
115
206
  },
116
207
  },
117
208
  };
118
209
  }
119
210
 
120
- const loaderOf = file => {
211
+ const loaderOf = (file) => {
121
212
  const extension = path.extname(file);
122
- return extension === ".tsx" ? "tsx" : [".ts", ".mts", ".cts"].includes(extension) ? "ts" : "jsx";
213
+ return extension === ".tsx"
214
+ ? "tsx"
215
+ : [".ts", ".mts", ".cts"].includes(extension)
216
+ ? "ts"
217
+ : "jsx";
123
218
  };
124
219
 
125
220
  function archivedAsset(root, file) {
126
221
  const relative = path.relative(root, file).split(path.sep);
127
- return relative[0] === "assets" ? { path: relative.slice(1).join("/"), bundled: false } : { path: relative.map(part => (part === ".." ? "__" : part)).join("/"), bundled: true };
222
+ return relative[0] === "assets"
223
+ ? { path: relative.slice(1).join("/"), bundled: false }
224
+ : {
225
+ path: relative.map((part) => (part === ".." ? "__" : part)).join("/"),
226
+ bundled: true,
227
+ };
128
228
  }
129
229
 
130
230
  function assetVariants(resolved) {
131
231
  const directory = path.dirname(resolved);
132
232
  const extension = path.extname(resolved);
133
- const stem = path.basename(resolved, extension).replace(/(\.(ios|native))$/, "").replace(/@[\d.]+x$/, "");
134
- const pattern = new RegExp(`^${escape(stem)}(?:@([\\d.]+)x)?(?:\\.(ios|native))?${escape(extension)}$`);
233
+ const stem = path
234
+ .basename(resolved, extension)
235
+ .replace(/(\.(ios|native))$/, "")
236
+ .replace(/@[\d.]+x$/, "");
237
+ const pattern = new RegExp(
238
+ `^${escape(stem)}(?:@([\\d.]+)x)?(?:\\.(ios|native))?${escape(extension)}$`,
239
+ );
135
240
  const scales = new Map();
136
241
  for (const name of fs.readdirSync(directory)) {
137
242
  const match = pattern.exec(name);
@@ -144,13 +249,17 @@ function assetVariants(resolved) {
144
249
  scales.set(scale, { rank, file: path.join(directory, name) });
145
250
  }
146
251
  }
147
- return [...scales].sort(([a], [b]) => a - b).map(([scale, { file }]) => ({ scale, file }));
252
+ return [...scales]
253
+ .sort(([a], [b]) => a - b)
254
+ .map(([scale, { file }]) => ({ scale, file }));
148
255
  }
149
256
 
150
257
  function assetModule(root, variants, assets) {
151
258
  const [first] = variants;
152
259
  const extension = path.extname(first.file).slice(1);
153
- const size = imageExtensions.has(extension) ? imageSize(fs.readFileSync(first.file)) : undefined;
260
+ const size = imageExtensions.has(extension)
261
+ ? imageSize(fs.readFileSync(first.file))
262
+ : undefined;
154
263
  const files = variants.map(({ scale, file }) => {
155
264
  const archived = archivedAsset(root, file);
156
265
  if (archived.bundled) {
@@ -174,16 +283,25 @@ function checkWorklets(root) {
174
283
  } catch {
175
284
  return;
176
285
  }
177
- const { version } = JSON.parse(fs.readFileSync(path.join(path.dirname(plugin), "..", "package.json"), "utf8"));
286
+ const { version } = JSON.parse(
287
+ fs.readFileSync(
288
+ path.join(path.dirname(plugin), "..", "package.json"),
289
+ "utf8",
290
+ ),
291
+ );
178
292
  const { version: expected } = require("react-native-worklets/package.json");
179
293
  if (version !== expected) {
180
- throw new Error(`the project has react-native-worklets ${version}, but Swipt runs ${expected}; install react-native-worklets@${expected} or remove it`);
294
+ throw new Error(
295
+ `the project has react-native-worklets ${version}, but Swipt runs ${expected}; install react-native-worklets@${expected} or remove it`,
296
+ );
181
297
  }
182
298
  }
183
299
 
184
300
  export function metro(root, { assets, sourcemap }) {
185
301
  checkWorklets(root);
186
- const configName = babelConfigNames.find(name => fs.existsSync(path.join(root, name)));
302
+ const configName = babelConfigNames.find((name) =>
303
+ fs.existsSync(path.join(root, name)),
304
+ );
187
305
  const babel = {
188
306
  cwd: root,
189
307
  root,
@@ -194,58 +312,110 @@ export function metro(root, { assets, sourcemap }) {
194
312
  compact: false,
195
313
  retainLines: true,
196
314
  sourceMaps: sourcemap ? "inline" : false,
197
- ...(configName ? { extends: path.join(root, configName) } : { presets: [defaultPreset(root)] }),
315
+ ...(configName
316
+ ? { extends: path.join(root, configName) }
317
+ : { presets: [defaultPreset(root)] }),
198
318
  plugins: [requireContext],
199
319
  };
200
320
  const caller = {
201
- name: "metro", bundler: "metro", platform: "ios", engine: "hermes", isDev: false, isServer: false, isReactServer: false, baseUrl: "",
202
- routerRoot: "app", projectRoot: root, isHMREnabled: true, metroSourceType: "module", supportsStaticESM: true,
321
+ name: "metro",
322
+ bundler: "metro",
323
+ platform: "ios",
324
+ engine: "hermes",
325
+ isDev: false,
326
+ isServer: false,
327
+ isReactServer: false,
328
+ baseUrl: "",
329
+ routerRoot: "app",
330
+ projectRoot: root,
331
+ isHMREnabled: true,
332
+ metroSourceType: "module",
333
+ supportsStaticESM: true,
203
334
  };
204
335
  const internal = Symbol("internal");
205
336
  return {
206
337
  name: "swiplet-metro",
207
338
  setup(build) {
208
- build.onResolve({ filter: /^@babel\/runtime\// }, async args => {
339
+ build.onResolve({ filter: /^@babel\/runtime\// }, async (args) => {
209
340
  if (args.pluginData === internal) {
210
341
  return undefined;
211
342
  }
212
- const options = { kind: args.kind, importer: args.importer, pluginData: internal };
213
- const found = await build.resolve(args.path, { ...options, resolveDir: args.resolveDir });
214
- return found.errors.length === 0 ? found : build.resolve(args.path, { ...options, resolveDir: cliDirectory });
343
+ const options = {
344
+ kind: args.kind,
345
+ importer: args.importer,
346
+ pluginData: internal,
347
+ };
348
+ const found = await build.resolve(args.path, {
349
+ ...options,
350
+ resolveDir: args.resolveDir,
351
+ });
352
+ return found.errors.length === 0
353
+ ? found
354
+ : build.resolve(args.path, { ...options, resolveDir: cliDirectory });
215
355
  });
216
356
  if (assets) {
217
- build.onResolve({ filter: new RegExp(`\\.(${assetExtensions.join("|")})$`) }, async args => {
218
- if (args.pluginData === internal) {
219
- return undefined;
220
- }
221
- const extension = path.extname(args.path);
222
- const stem = args.path.slice(0, -extension.length);
223
- let first;
224
- for (const scale of scaleSuffixes) {
225
- for (const platform of platformSuffixes) {
226
- const found = await build.resolve(`${stem}${scale}${platform}${extension}`, { kind: args.kind, importer: args.importer, resolveDir: args.resolveDir, pluginData: internal });
227
- if (found.errors.length === 0) {
228
- return { path: found.path, namespace: "swiplet-asset", pluginData: assetVariants(found.path) };
357
+ build.onResolve(
358
+ { filter: new RegExp(`\\.(${assetExtensions.join("|")})$`) },
359
+ async (args) => {
360
+ if (args.pluginData === internal) {
361
+ return undefined;
362
+ }
363
+ const extension = path.extname(args.path);
364
+ const stem = args.path.slice(0, -extension.length);
365
+ let first;
366
+ for (const scale of scaleSuffixes) {
367
+ for (const platform of platformSuffixes) {
368
+ const found = await build.resolve(
369
+ `${stem}${scale}${platform}${extension}`,
370
+ {
371
+ kind: args.kind,
372
+ importer: args.importer,
373
+ resolveDir: args.resolveDir,
374
+ pluginData: internal,
375
+ },
376
+ );
377
+ if (found.errors.length === 0) {
378
+ return {
379
+ path: found.path,
380
+ namespace: "swiplet-asset",
381
+ pluginData: assetVariants(found.path),
382
+ };
383
+ }
384
+ first ??= found;
229
385
  }
230
- first ??= found;
231
386
  }
232
- }
233
- return { errors: first.errors };
234
- });
235
- build.onLoad({ filter: /.*/, namespace: "swiplet-asset" }, args => ({
387
+ return { errors: first.errors };
388
+ },
389
+ );
390
+ build.onLoad({ filter: /.*/, namespace: "swiplet-asset" }, (args) => ({
236
391
  contents: assetModule(root, args.pluginData, assets),
237
392
  loader: "js",
238
393
  resolveDir: root,
239
394
  }));
240
395
  }
241
- build.onLoad({ filter: /\.[cm]?[jt]sx?$/, namespace: "file" }, async args => {
242
- const result = await transformAsync(await fs.promises.readFile(args.path, "utf8"), {
243
- ...babel,
244
- filename: args.path,
245
- caller: { ...caller, isNodeModule: args.path.includes("node_modules") },
246
- });
247
- return result === null ? undefined : { contents: result.code, loader: loaderOf(args.path), resolveDir: path.dirname(args.path) };
248
- });
396
+ build.onLoad(
397
+ { filter: /\.[cm]?[jt]sx?$/, namespace: "file" },
398
+ async (args) => {
399
+ const result = await transformAsync(
400
+ await fs.promises.readFile(args.path, "utf8"),
401
+ {
402
+ ...babel,
403
+ filename: args.path,
404
+ caller: {
405
+ ...caller,
406
+ isNodeModule: args.path.includes("node_modules"),
407
+ },
408
+ },
409
+ );
410
+ return result === null
411
+ ? undefined
412
+ : {
413
+ contents: result.code,
414
+ loader: loaderOf(args.path),
415
+ resolveDir: path.dirname(args.path),
416
+ };
417
+ },
418
+ );
249
419
  },
250
420
  };
251
421
  }
package/output.mjs CHANGED
@@ -5,9 +5,16 @@ import { ServiceStatus, ServiceStatusSchema } from "./proto/swiplets_pb.js";
5
5
 
6
6
  export class FalseResult extends Error {}
7
7
 
8
- export const enumText = (schema, value, prefix) => schema.value[value].name.slice(prefix.length).toLowerCase().replaceAll("_", " ");
8
+ export const enumText = (schema, value, prefix) =>
9
+ schema.value[value].name
10
+ .slice(prefix.length)
11
+ .toLowerCase()
12
+ .replaceAll("_", " ");
9
13
 
10
- const levelName = level => (level === LogLevel.UNSPECIFIED ? "info" : enumText(LogLevelSchema, level, "LOG_LEVEL_"));
14
+ const levelName = (level) =>
15
+ level === LogLevel.UNSPECIFIED
16
+ ? "info"
17
+ : enumText(LogLevelSchema, level, "LOG_LEVEL_");
11
18
 
12
19
  const pad = (value, width) => String(value).padStart(width, "0");
13
20
 
@@ -28,15 +35,28 @@ export function columns(rows) {
28
35
  widths[index] = Math.max(widths[index] ?? 0, cell.length);
29
36
  });
30
37
  }
31
- return rows.map(row => row.map((cell, index) => (index === row.length - 1 ? cell : cell.padEnd(widths[index] + 2))).join("").trimEnd()).join("\n");
38
+ return rows
39
+ .map((row) =>
40
+ row
41
+ .map((cell, index) =>
42
+ index === row.length - 1 ? cell : cell.padEnd(widths[index] + 2),
43
+ )
44
+ .join("")
45
+ .trimEnd(),
46
+ )
47
+ .join("\n");
32
48
  }
33
49
 
34
- const frameText = frame => {
50
+ const frameText = (frame) => {
35
51
  const position = `${frame.file}:${frame.line}:${frame.column}`;
36
52
  return frame.function === "" ? position : `${frame.function} (${position})`;
37
53
  };
38
54
 
39
- export const failureText = failure => [`${failure.name}: ${failure.message}`, ...failure.stack.map(frame => ` at ${frameText(frame)}`)].join("\n");
55
+ export const failureText = (failure) =>
56
+ [
57
+ `${failure.name}: ${failure.message}`,
58
+ ...failure.stack.map((frame) => ` at ${frameText(frame)}`),
59
+ ].join("\n");
40
60
 
41
61
  export function printScriptError(failure) {
42
62
  console.error(`error: ${failureText(failure)}`);
@@ -44,8 +64,13 @@ export function printScriptError(failure) {
44
64
  }
45
65
 
46
66
  export function printLog(entry, toStdout) {
47
- const message = entry.tag === "" ? entry.message : `${entry.tag}: ${entry.message}`;
48
- (toStdout ? console.log : console.error)(clockTime(entry.time), levelName(entry.level).toUpperCase(), message);
67
+ const message =
68
+ entry.tag === "" ? entry.message : `${entry.tag}: ${entry.message}`;
69
+ (toStdout ? console.log : console.error)(
70
+ clockTime(entry.time),
71
+ levelName(entry.level).toUpperCase(),
72
+ message,
73
+ );
49
74
  }
50
75
 
51
76
  export function serviceText(id, state) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swipt/cli",
3
- "version": "0.1.0-nightly.42",
3
+ "version": "0.1.0-nightly.44",
4
4
  "license": "GPL-3.0-or-later",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,6 +20,7 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@babel/core": "^7.29.7",
23
+ "@babel/plugin-transform-block-scoping": "^7.29.12",
23
24
  "@babel/runtime": "^7.29.10",
24
25
  "@bufbuild/protobuf": "^2.16.0",
25
26
  "@expo/env": "^2.5.3",
@@ -30,7 +31,7 @@
30
31
  "react-native-worklets": "0.13.0"
31
32
  },
32
33
  "peerDependencies": {
33
- "@swipt/api": "0.1.0-nightly.42"
34
+ "@swipt/api": "0.1.0-nightly.44"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@bufbuild/protoc-gen-es": "^2.16.0"