babel-plugin-mapples-sid 0.2.0-beta.9 → 0.2.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.
package/README.md CHANGED
@@ -1,7 +1,14 @@
1
1
  # babel-plugin-mapples-sid
2
2
 
3
- Strips the Mapples tooling JSX props (`$sid`, `$fallback`) from **production** bundles and keeps
4
- them in development (enables tap-element → select-in-Creator).
3
+ Two jobs for a Mapples-synced Expo app:
4
+
5
+ - **Runs Creator behaviour.** An element carrying Creator sidecars (`$data` bindings, `$actions`,
6
+ `$refs`) is rendered through `MapplesElement` from `@mapples/app`
7
+ (`<Button $actions={…} />` → `<MapplesElement $as={Button} $actions={…} />`), which resolves them
8
+ the way the Creator canvas does — variables, API responses, navigation, set-variable and request
9
+ actions. The source file keeps the attributes the two-way sync reads.
10
+ - **Strips tooling props.** `$sid` and `$fallback` are removed from **production** bundles and kept
11
+ in development (enables tap-element → select-in-Creator).
5
12
 
6
13
  ```js
7
14
  // babel.config.js
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { PluginObj } from '@babel/core';
1
+ import type { PluginObj, types as BabelTypes } from '@babel/core';
2
2
  export interface MapplesSidPluginOptions {
3
3
  /**
4
4
  * Force strip/keep regardless of NODE_ENV. When absent, the plugin strips
@@ -6,13 +6,22 @@ export interface MapplesSidPluginOptions {
6
6
  */
7
7
  strip?: boolean;
8
8
  }
9
+ type T = typeof BabelTypes;
9
10
  /**
10
11
  * babel-plugin-mapples-sid
11
12
  *
12
- * Removes the Mapples tooling JSX attributes from production bundles. In
13
- * development they are kept so runtime tooling (tap element -> select in
14
- * Creator) can resolve elements back to canvas nodes.
13
+ * 1. Rewrites every element that carries Creator behaviour —
14
+ * `<Button $actions={…} label="Go" />` — into
15
+ * `<MapplesElement $as={Button} $actions={…} label="Go" />`, so the
16
+ * bindings, actions and asset references a synced file declares run in
17
+ * the app. The source file keeps the attributes the two-way sync reads.
18
+ * 2. Removes the tooling attributes (`$sid`, `$fallback`) from production
19
+ * bundles. In development they are kept so runtime tooling (tap element
20
+ * -> select in Creator) can resolve elements back to canvas nodes.
15
21
  */
16
- export default function mapplesSidPlugin(): PluginObj<{
22
+ export default function mapplesSidPlugin({ types: t }: {
23
+ types: T;
24
+ }): PluginObj<{
17
25
  opts: MapplesSidPluginOptions;
18
26
  }>;
27
+ export {};
package/dist/index.js CHANGED
@@ -2,21 +2,75 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = mapplesSidPlugin;
4
4
  /**
5
- * The Mapples tooling props: `$sid` (canvas node id), `$fallback` (Custom node
6
- * size) and the canvas sidecars `$refs` / `$data` / `$actions`.
5
+ * The Mapples tooling props: `$sid` (canvas node id) and `$fallback` (Custom
6
+ * node size). Tooling only — stripped from production bundles.
7
7
  */
8
- const TOOLING_PROPS = new Set(['$sid', '$fallback', '$refs', '$data', '$actions']);
8
+ const TOOLING_PROPS = new Set(['$sid', '$fallback']);
9
+ /**
10
+ * The Creator behaviour sidecars — data bindings, actions, asset references.
11
+ * They are the app's behaviour, never stripped: an element carrying one is
12
+ * rendered through `MapplesElement` (@mapples/app), which resolves them the
13
+ * way the canvas does.
14
+ */
15
+ const BEHAVIOUR_PROPS = new Set(['$data', '$actions', '$refs']);
16
+ /** Where the element wrapper comes from — every exported app depends on it. */
17
+ const RUNTIME_MODULE = '@mapples/app';
18
+ const RUNTIME_EXPORT = 'MapplesElement';
19
+ function tagExpression(t, name) {
20
+ if (t.isJSXIdentifier(name))
21
+ return t.identifier(name.name);
22
+ if (t.isJSXMemberExpression(name)) {
23
+ return t.memberExpression(tagExpression(t, name.object), t.identifier(name.property.name));
24
+ }
25
+ throw new Error(`babel-plugin-mapples-sid: cannot wrap <${name.namespace.name}:${name.name.name}>`);
26
+ }
27
+ function hasBehaviour(t, element) {
28
+ return element.attributes.some((attr) => t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && BEHAVIOUR_PROPS.has(attr.name.name));
29
+ }
9
30
  /**
10
31
  * babel-plugin-mapples-sid
11
32
  *
12
- * Removes the Mapples tooling JSX attributes from production bundles. In
13
- * development they are kept so runtime tooling (tap element -> select in
14
- * Creator) can resolve elements back to canvas nodes.
33
+ * 1. Rewrites every element that carries Creator behaviour —
34
+ * `<Button $actions={…} label="Go" />` — into
35
+ * `<MapplesElement $as={Button} $actions={…} label="Go" />`, so the
36
+ * bindings, actions and asset references a synced file declares run in
37
+ * the app. The source file keeps the attributes the two-way sync reads.
38
+ * 2. Removes the tooling attributes (`$sid`, `$fallback`) from production
39
+ * bundles. In development they are kept so runtime tooling (tap element
40
+ * -> select in Creator) can resolve elements back to canvas nodes.
15
41
  */
16
- function mapplesSidPlugin() {
42
+ function mapplesSidPlugin({ types: t }) {
17
43
  return {
18
44
  name: 'mapples-sid',
19
45
  visitor: {
46
+ Program: {
47
+ // Rewritten on entry, before any other plugin (the JSX transform,
48
+ // the module transform) sees the file, so the added import is an
49
+ // ordinary one to them.
50
+ enter(program) {
51
+ let local = null;
52
+ program.traverse({
53
+ JSXElement(path) {
54
+ const opening = path.node.openingElement;
55
+ if (!hasBehaviour(t, opening))
56
+ return;
57
+ // Intrinsic (lowercase) tags have no component to hand over.
58
+ if (t.isJSXIdentifier(opening.name) && /^[a-z]/.test(opening.name.name))
59
+ return;
60
+ local ??= program.scope.generateUidIdentifier(RUNTIME_EXPORT);
61
+ const as = t.jsxAttribute(t.jsxIdentifier('$as'), t.jsxExpressionContainer(tagExpression(t, opening.name)));
62
+ opening.name = t.jsxIdentifier(local.name);
63
+ opening.attributes.unshift(as);
64
+ if (path.node.closingElement) {
65
+ path.node.closingElement.name = t.jsxIdentifier(local.name);
66
+ }
67
+ },
68
+ });
69
+ if (!local)
70
+ return;
71
+ program.unshiftContainer('body', t.importDeclaration([t.importSpecifier(local, t.identifier(RUNTIME_EXPORT))], t.stringLiteral(RUNTIME_MODULE)));
72
+ },
73
+ },
20
74
  JSXAttribute(path, state) {
21
75
  const shouldStrip = state.opts.strip ?? process.env.NODE_ENV === 'production';
22
76
  if (!shouldStrip)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAuBA,mCAgBC;AA7BD;;;GAGG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAEnF;;;;;;GAMG;AACH,SAAwB,gBAAgB;IAGtC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE;YACP,YAAY,CAAC,IAAI,EAAE,KAAK;gBACtB,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;gBAC9E,IAAI,CAAC,WAAW;oBAAE,OAAO;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClE,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "babel-plugin-mapples-sid",
3
- "version": "0.2.0-beta.9",
3
+ "version": "0.2.0",
4
4
  "description": "Strips $sid props from production bundles; keeps them in dev for tap-to-select.",
5
5
  "license": "MIT",
6
6
  "author": "Oleksandr Soloviov <oleksolv@gmail.com>",