@backtickjs/builds 0.1.9 → 0.1.10

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/README.md CHANGED
@@ -10,21 +10,25 @@ npm install @backtickjs/builds
10
10
 
11
11
  ## How it works
12
12
 
13
- 1. **The app declares what it offers to screens** in a module map, one per platform as Metro picks files: `moduleMap.ts` for iOS and Android, and `moduleMap.web.ts` for the web. A module map is a table and nothing else, so it can be read without running it:
13
+ 1. **The app declares what it offers to screens** in a module map, one per platform as Metro picks files: `moduleMap.ts` for iOS and Android, and `moduleMap.web.ts` for the web. A module map is imports and a table, nothing else, so it can be read without running it:
14
14
 
15
15
  ```ts
16
16
  // moduleMap.ts
17
17
  import type { ModuleMap } from "@backtickjs/react-native-client";
18
+ import * as React from "react";
19
+ import * as JSXRuntime from "react/jsx-runtime";
20
+ import * as ReactNative from "react-native";
21
+ import * as Facebook from "react-native-fbsdk-next";
18
22
 
19
23
  export const moduleMap = {
20
- react: () => require("react"),
21
- "react/jsx-runtime": () => require("react/jsx-runtime"),
22
- "react-native": () => require("react-native"),
23
- "react-native-fbsdk-next": () => require("react-native-fbsdk-next"),
24
+ react: React,
25
+ "react/jsx-runtime": JSXRuntime,
26
+ "react-native": ReactNative,
27
+ "react-native-fbsdk-next": Facebook,
24
28
  } satisfies ModuleMap;
25
29
  ```
26
30
 
27
- An entry that decides at runtime, like `native() ? require("…") : {}`, is an error. What a platform lacks, its map leaves out.
31
+ Each entry is `"specifier": Name`, with `Name` imported above. An entry that decides at runtime, like `native ? Facebook : {}`, is an error. What a platform lacks, its map leaves out.
28
32
 
29
33
  2. **Each build gets an id:** a hash of the modules its platform's map offers, each at the installed version of its package. `app.config.ts` puts the ids in the app config:
30
34
 
@@ -91,7 +95,7 @@ npm install @backtickjs/builds
91
95
  `modulesOf` throws for a build its server can't draw for:
92
96
 
93
97
  - **`UnknownBuild`**: no id, or one that isn't registered. Every build is registered before it ships, so this means the server or the build was deployed wrong, as when a server is rolled back past a build in users' hands. Answer it as a server error.
94
- - **`DeprecatedBuild`**: a build you retired by setting `"deprecated": true` in its file. Answer it with something your app shell recognises and turns into "update the app", such as HTTP 426. The shell has to know that answer before the build is retired, so ship it in your first build.
98
+ - **`DeprecatedBuild`**: a build you retired by setting `"deprecated": true` in its file. It carries the build's `modules`, so your server can still draw that build one screen, bundled for what it has: one asking its users to update. Answer every path with it.
95
99
 
96
100
  ## API
97
101
 
package/dist/builds.d.ts CHANGED
@@ -15,10 +15,15 @@ export declare class UnknownBuild extends Error {
15
15
  readonly buildId: string | null;
16
16
  constructor(buildId: string | null);
17
17
  }
18
- /** A build its server no longer draws for, on purpose: its users are asked to update. */
18
+ /**
19
+ * A build its server no longer draws its screens for, on purpose. It carries
20
+ * the build's modules, so the server can still draw it one screen, built for
21
+ * what the build has: one asking its users to update.
22
+ */
19
23
  export declare class DeprecatedBuild extends Error {
20
24
  readonly buildId: string;
21
- constructor(buildId: string);
25
+ readonly modules: Modules;
26
+ constructor(buildId: string, modules: Modules);
22
27
  }
23
28
  /** Where an app keeps its registered builds, one file each: `builds/`. */
24
29
  export declare function buildsDirectory(projectRoot: string): string;
package/dist/builds.js CHANGED
@@ -17,12 +17,18 @@ export class UnknownBuild extends Error {
17
17
  this.buildId = buildId;
18
18
  }
19
19
  }
20
- /** A build its server no longer draws for, on purpose: its users are asked to update. */
20
+ /**
21
+ * A build its server no longer draws its screens for, on purpose. It carries
22
+ * the build's modules, so the server can still draw it one screen, built for
23
+ * what the build has: one asking its users to update.
24
+ */
21
25
  export class DeprecatedBuild extends Error {
22
26
  buildId;
23
- constructor(buildId) {
27
+ modules;
28
+ constructor(buildId, modules) {
24
29
  super(`Build ${JSON.stringify(buildId)} is deprecated.`);
25
30
  this.buildId = buildId;
31
+ this.modules = modules;
26
32
  }
27
33
  }
28
34
  /** Where an app keeps its registered builds, one file each: `builds/`. */
@@ -67,7 +73,7 @@ export function createBuilds({ projectRoot }) {
67
73
  modulesOf(buildId) {
68
74
  const build = buildId === null ? undefined : registered.get(buildId);
69
75
  if (build?.deprecated)
70
- throw new DeprecatedBuild(buildId);
76
+ throw new DeprecatedBuild(buildId, build.modules);
71
77
  if (build !== undefined)
72
78
  return build.modules;
73
79
  const current = platforms
@@ -1 +1 @@
1
- {"version":3,"file":"builds.js","sourceRoot":"","sources":["../src/builds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builds.js","sourceRoot":"","sources":["../src/builds.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,10 @@ export declare const platforms: readonly ["ios", "android", "web"];
3
3
  export type Platform = (typeof platforms)[number];
4
4
  /**
5
5
  * The specifiers a module map offers, read from its source without running
6
- * it: `export const moduleMap = { … }`, each entry `() => require("…")`, and
7
- * nothing else but type imports. Anything more, as a check of the platform,
8
- * would make what a build offers something only the device knows, so it
9
- * throws, naming the line.
6
+ * it: imports, and `export const moduleMap = { … }`, each entry
7
+ * `"specifier": Name` with `Name` bound by an import. Anything more, as a
8
+ * check of the platform, would make what a build offers something only the
9
+ * device knows, so it throws, naming the line.
10
10
  */
11
11
  export declare function readModuleMap(file: string): string[];
12
12
  /**
package/dist/moduleMap.js CHANGED
@@ -8,10 +8,10 @@ export const platforms = ["ios", "android", "web"];
8
8
  const require = createRequire(import.meta.url);
9
9
  /**
10
10
  * The specifiers a module map offers, read from its source without running
11
- * it: `export const moduleMap = { … }`, each entry `() => require("…")`, and
12
- * nothing else but type imports. Anything more, as a check of the platform,
13
- * would make what a build offers something only the device knows, so it
14
- * throws, naming the line.
11
+ * it: imports, and `export const moduleMap = { … }`, each entry
12
+ * `"specifier": Name` with `Name` bound by an import. Anything more, as a
13
+ * check of the platform, would make what a build offers something only the
14
+ * device knows, so it throws, naming the line.
15
15
  */
16
16
  export function readModuleMap(file) {
17
17
  const ts = require("typescript");
@@ -20,10 +20,25 @@ export function readModuleMap(file) {
20
20
  const { line } = source.getLineAndCharacterOfPosition(node.getStart(source));
21
21
  return new Error(`${file}:${line + 1}: ${what}`);
22
22
  };
23
+ const imported = new Set();
23
24
  let map;
24
25
  for (const statement of source.statements) {
25
- if (ts.isImportDeclaration(statement) &&
26
- statement.importClause?.isTypeOnly) {
26
+ if (ts.isImportDeclaration(statement)) {
27
+ const clause = statement.importClause;
28
+ if (clause !== undefined && !clause.isTypeOnly) {
29
+ if (clause.name !== undefined)
30
+ imported.add(clause.name.text);
31
+ const bindings = clause.namedBindings;
32
+ if (bindings !== undefined && ts.isNamespaceImport(bindings)) {
33
+ imported.add(bindings.name.text);
34
+ }
35
+ else if (bindings !== undefined) {
36
+ for (const element of bindings.elements) {
37
+ if (!element.isTypeOnly)
38
+ imported.add(element.name.text);
39
+ }
40
+ }
41
+ }
27
42
  continue;
28
43
  }
29
44
  const declaration = ts.isVariableStatement(statement)
@@ -40,24 +55,20 @@ export function readModuleMap(file) {
40
55
  map = value;
41
56
  continue;
42
57
  }
43
- throw wrong(statement, "a module map holds `export const moduleMap = { … }` and type imports only");
58
+ throw wrong(statement, "a module map holds imports and `export const moduleMap = { … }` only");
44
59
  }
45
60
  if (map === undefined) {
46
- throw new Error(`${file}: no \`export const moduleMap = { … }\``);
61
+ throw new Error(file + ": no `export const moduleMap = { … }`");
47
62
  }
48
63
  return map.properties.map((property) => {
49
64
  const entry = ts.isPropertyAssignment(property) &&
50
65
  (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&
51
- ts.isArrowFunction(property.initializer) &&
52
- property.initializer.parameters.length === 0 &&
53
- ts.isCallExpression(property.initializer.body) &&
54
- property.initializer.body.expression.getText(source) === "require" &&
55
- property.initializer.body.arguments.length === 1 &&
56
- ts.isStringLiteral(property.initializer.body.arguments[0])
66
+ ts.isIdentifier(property.initializer) &&
67
+ imported.has(property.initializer.text)
57
68
  ? property.name
58
69
  : undefined;
59
70
  if (entry === undefined) {
60
- throw wrong(property, 'each entry is `"specifier": () => require("…")`');
71
+ throw wrong(property, 'each entry is `"specifier": Name`, with `Name` imported above');
61
72
  }
62
73
  return entry.text;
63
74
  });
@@ -1 +1 @@
1
- {"version":3,"file":"moduleMap.js","sourceRoot":"","sources":["../src/moduleMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"moduleMap.js","sourceRoot":"","sources":["../src/moduleMap.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backtickjs/builds",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "Keeps a Backtick server drawing for every build of its app in users' hands: build ids, a registry of what each build carries, and a check for EAS builds",
5
5
  "keywords": [
6
6
  "backtick",
@@ -40,7 +40,7 @@
40
40
  "access": "public"
41
41
  },
42
42
  "dependencies": {
43
- "@backtickjs/bundler": "^0.1.9",
43
+ "@backtickjs/bundler": "^0.1.10",
44
44
  "typescript": "^6.0.3"
45
45
  },
46
46
  "devDependencies": {
package/src/builds.ts CHANGED
@@ -35,9 +35,16 @@ export class UnknownBuild extends Error {
35
35
  }
36
36
  }
37
37
 
38
- /** A build its server no longer draws for, on purpose: its users are asked to update. */
38
+ /**
39
+ * A build its server no longer draws its screens for, on purpose. It carries
40
+ * the build's modules, so the server can still draw it one screen, built for
41
+ * what the build has: one asking its users to update.
42
+ */
39
43
  export class DeprecatedBuild extends Error {
40
- constructor(readonly buildId: string) {
44
+ constructor(
45
+ readonly buildId: string,
46
+ readonly modules: Modules,
47
+ ) {
41
48
  super(`Build ${JSON.stringify(buildId)} is deprecated.`);
42
49
  }
43
50
  }
@@ -107,7 +114,7 @@ export function createBuilds({ projectRoot }: { projectRoot: string }): Builds {
107
114
  return {
108
115
  modulesOf(buildId) {
109
116
  const build = buildId === null ? undefined : registered.get(buildId);
110
- if (build?.deprecated) throw new DeprecatedBuild(buildId!);
117
+ if (build?.deprecated) throw new DeprecatedBuild(buildId!, build.modules);
111
118
  if (build !== undefined) return build.modules;
112
119
  const current = platforms
113
120
  .map(installedOn)
package/src/moduleMap.ts CHANGED
@@ -12,10 +12,10 @@ const require = createRequire(import.meta.url);
12
12
 
13
13
  /**
14
14
  * The specifiers a module map offers, read from its source without running
15
- * it: `export const moduleMap = { … }`, each entry `() => require("…")`, and
16
- * nothing else but type imports. Anything more, as a check of the platform,
17
- * would make what a build offers something only the device knows, so it
18
- * throws, naming the line.
15
+ * it: imports, and `export const moduleMap = { … }`, each entry
16
+ * `"specifier": Name` with `Name` bound by an import. Anything more, as a
17
+ * check of the platform, would make what a build offers something only the
18
+ * device knows, so it throws, naming the line.
19
19
  */
20
20
  export function readModuleMap(file: string): string[] {
21
21
  const ts = require("typescript") as typeof import("typescript");
@@ -30,12 +30,22 @@ export function readModuleMap(file: string): string[] {
30
30
  );
31
31
  return new Error(`${file}:${line + 1}: ${what}`);
32
32
  };
33
+ const imported = new Set<string>();
33
34
  let map: import("typescript").ObjectLiteralExpression | undefined;
34
35
  for (const statement of source.statements) {
35
- if (
36
- ts.isImportDeclaration(statement) &&
37
- statement.importClause?.isTypeOnly
38
- ) {
36
+ if (ts.isImportDeclaration(statement)) {
37
+ const clause = statement.importClause;
38
+ if (clause !== undefined && !clause.isTypeOnly) {
39
+ if (clause.name !== undefined) imported.add(clause.name.text);
40
+ const bindings = clause.namedBindings;
41
+ if (bindings !== undefined && ts.isNamespaceImport(bindings)) {
42
+ imported.add(bindings.name.text);
43
+ } else if (bindings !== undefined) {
44
+ for (const element of bindings.elements) {
45
+ if (!element.isTypeOnly) imported.add(element.name.text);
46
+ }
47
+ }
48
+ }
39
49
  continue;
40
50
  }
41
51
  const declaration = ts.isVariableStatement(statement)
@@ -56,26 +66,25 @@ export function readModuleMap(file: string): string[] {
56
66
  }
57
67
  throw wrong(
58
68
  statement,
59
- "a module map holds `export const moduleMap = { … }` and type imports only",
69
+ "a module map holds imports and `export const moduleMap = { … }` only",
60
70
  );
61
71
  }
62
72
  if (map === undefined) {
63
- throw new Error(`${file}: no \`export const moduleMap = { … }\``);
73
+ throw new Error(file + ": no `export const moduleMap = { … }`");
64
74
  }
65
75
  return map.properties.map((property) => {
66
76
  const entry =
67
77
  ts.isPropertyAssignment(property) &&
68
78
  (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&
69
- ts.isArrowFunction(property.initializer) &&
70
- property.initializer.parameters.length === 0 &&
71
- ts.isCallExpression(property.initializer.body) &&
72
- property.initializer.body.expression.getText(source) === "require" &&
73
- property.initializer.body.arguments.length === 1 &&
74
- ts.isStringLiteral(property.initializer.body.arguments[0]!)
79
+ ts.isIdentifier(property.initializer) &&
80
+ imported.has(property.initializer.text)
75
81
  ? property.name
76
82
  : undefined;
77
83
  if (entry === undefined) {
78
- throw wrong(property, 'each entry is `"specifier": () => require("…")`');
84
+ throw wrong(
85
+ property,
86
+ 'each entry is `"specifier": Name`, with `Name` imported above',
87
+ );
79
88
  }
80
89
  return entry.text;
81
90
  });