@codepress/codepress-engine 0.5.0 → 0.6.0-dev.hmr.20251119065124

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/dist/cli.js CHANGED
File without changes
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CodePress esbuild plugin - Injects tracking attributes and provider wrappers into JSX
3
+ * Replaces the Rust SWC plugin with a pure JavaScript implementation
4
+ */
5
+ import type { Plugin } from 'esbuild';
6
+ interface CodePressPluginOptions {
7
+ repo_name?: string;
8
+ branch_name?: string;
9
+ repo_root?: string;
10
+ }
11
+ export declare function createCodePressPlugin(options?: CodePressPluginOptions): Plugin;
12
+ export default createCodePressPlugin;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * CodePress esbuild plugin - Injects tracking attributes and provider wrappers into JSX
4
+ * Replaces the Rust SWC plugin with a pure JavaScript implementation
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.createCodePressPlugin = createCodePressPlugin;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const SECRET = Buffer.from('codepress-file-obfuscation');
44
+ function xorEncodePath(input) {
45
+ if (!input)
46
+ return '';
47
+ const normalized = input.replace(/\\/g, '/');
48
+ const buf = Buffer.from(normalized, 'utf8');
49
+ const out = Buffer.allocUnsafe(buf.length);
50
+ for (let i = 0; i < buf.length; i++) {
51
+ out[i] = buf[i] ^ SECRET[i % SECRET.length];
52
+ }
53
+ return out
54
+ .toString('base64')
55
+ .replace(/\+/g, '-')
56
+ .replace(/\//g, '_')
57
+ .replace(/=+$/g, '');
58
+ }
59
+ /**
60
+ * Inject codepress-data-fp attributes into JSX opening tags
61
+ */
62
+ function injectJSXAttributes(source, encoded, repoName, branchName) {
63
+ const lines = source.split('\n');
64
+ const output = [];
65
+ let lineNum = 0;
66
+ for (const line of lines) {
67
+ lineNum++;
68
+ // Skip lines that are likely TypeScript type definitions/generics
69
+ // These patterns indicate type syntax, not JSX
70
+ if (/^\s*(interface|type|class|extends|implements)\b/.test(line) ||
71
+ /\bextends\s+[\w.]+</.test(line) ||
72
+ /<[\w.]+>(?!\s*[{(</])/.test(line) // Generics not followed by JSX-like syntax
73
+ ) {
74
+ output.push(line);
75
+ continue;
76
+ }
77
+ // Match JSX opening tags with context awareness
78
+ // Only match when < appears in typical JSX contexts (after whitespace, braces, parens, return, etc.)
79
+ const modifiedLine = line.replace(/(^|\s+|[\s{(>]|return\s+|=\s*|:\s*|\?\s*)<([A-Z][\w.]*|[a-z]+)([\s\/>])/g, (match, before, tagName, after) => {
80
+ // Build attributes
81
+ const attrs = [];
82
+ attrs.push(`codepress-data-fp="${encoded}:${lineNum}-${lineNum}"`);
83
+ // Add repo/branch info to container elements (divs, sections, etc.)
84
+ if (/^[a-z]/.test(tagName)) {
85
+ if (repoName) {
86
+ attrs.push(`codepress-github-repo-name="${repoName}"`);
87
+ }
88
+ if (branchName) {
89
+ attrs.push(`codepress-github-branch="${branchName}"`);
90
+ }
91
+ }
92
+ return `${before}<${tagName} ${attrs.join(' ')}${after}`;
93
+ });
94
+ output.push(modifiedLine);
95
+ }
96
+ return output.join('\n');
97
+ }
98
+ /**
99
+ * Wrap exported components with __CPProvider
100
+ */
101
+ function wrapWithProvider(source) {
102
+ var _a;
103
+ // Find default export component
104
+ const defaultExportMatch = source.match(/export\s+default\s+function\s+(\w+)/);
105
+ if (!defaultExportMatch) {
106
+ // Try: export default ComponentName;
107
+ const namedMatch = source.match(/export\s+default\s+(\w+);/);
108
+ if (!namedMatch)
109
+ return source;
110
+ }
111
+ const componentName = (defaultExportMatch === null || defaultExportMatch === void 0 ? void 0 : defaultExportMatch[1]) || ((_a = source.match(/export\s+default\s+(\w+);/)) === null || _a === void 0 ? void 0 : _a[1]);
112
+ if (!componentName)
113
+ return source;
114
+ // Inject provider wrapper code at the top
115
+ const providerCode = `
116
+ import { useSyncExternalStore } from 'react';
117
+
118
+ // Module-level version counter for HMR
119
+ let __cpvVersion = 0;
120
+
121
+ // Provider component that wraps the default export
122
+ function __CPProvider({ value, children }: { value?: any; children: React.ReactNode }) {
123
+ const __cpv = useSyncExternalStore(
124
+ (cb) => {
125
+ const h = () => {
126
+ __cpvVersion = __cpvVersion + 1;
127
+ cb();
128
+ };
129
+ if (typeof window !== 'undefined') {
130
+ window.addEventListener("CP_PREVIEW_REFRESH", h);
131
+ return () => { window.removeEventListener("CP_PREVIEW_REFRESH", h); };
132
+ }
133
+ return () => {};
134
+ },
135
+ () => __cpvVersion,
136
+ () => 0
137
+ );
138
+
139
+ return <CPX.Provider value={value} key={__cpv}>{children}</CPX.Provider>;
140
+ }
141
+
142
+ // Context for passing data through provider
143
+ const CPX = { Provider: ({ value, children }: any) => children };
144
+ `;
145
+ // Wrap the default export
146
+ const wrappedSource = source.replace(new RegExp(`export\\s+default\\s+${componentName}`), `const __Original${componentName} = ${componentName};
147
+ export default function ${componentName}(props: any) {
148
+ return <__CPProvider><__Original${componentName} {...props} /></__CPProvider>;
149
+ }`);
150
+ return providerCode + '\n' + wrappedSource;
151
+ }
152
+ function createCodePressPlugin(options = {}) {
153
+ const { repo_name = '', branch_name = '', repo_root = process.cwd(), } = options;
154
+ return {
155
+ name: 'codepress-jsx-transform',
156
+ setup(build) {
157
+ // Transform TSX/JSX files
158
+ build.onLoad({ filter: /\.[tj]sx$/ }, async (args) => {
159
+ try {
160
+ // Skip node_modules
161
+ if (args.path.includes('node_modules')) {
162
+ return null;
163
+ }
164
+ const source = await fs.promises.readFile(args.path, 'utf8');
165
+ const relPath = path.relative(repo_root, args.path);
166
+ const encoded = xorEncodePath(relPath);
167
+ if (!encoded) {
168
+ return { contents: source, loader: 'tsx' };
169
+ }
170
+ // Step 1: Inject JSX attributes
171
+ let transformed = injectJSXAttributes(source, encoded, repo_name, branch_name);
172
+ // Step 2: Wrap with provider (for default exports)
173
+ if (transformed.includes('export default')) {
174
+ transformed = wrapWithProvider(transformed);
175
+ }
176
+ return {
177
+ contents: transformed,
178
+ loader: 'tsx',
179
+ };
180
+ }
181
+ catch (err) {
182
+ console.error('[CodePress Plugin] Error transforming', args.path, err);
183
+ return null;
184
+ }
185
+ });
186
+ },
187
+ };
188
+ }
189
+ exports.default = createCodePressPlugin;
190
+ //# sourceMappingURL=esbuild-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esbuild-plugin.js","sourceRoot":"","sources":["../src/esbuild-plugin.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2IH,sDA6CC;AAtLD,uCAAyB;AACzB,2CAA6B;AAS7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AAEzD,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG;SACP,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAc,EAAE,OAAe,EAAE,QAAiB,EAAE,UAAmB;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;QAEV,kEAAkE;QAClE,+CAA+C;QAC/C,IACE,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5D,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,2CAA2C;UAC9E,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,gDAAgD;QAChD,qGAAqG;QACrG,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAC/B,0EAA0E,EAC1E,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAChC,mBAAmB;YACnB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,CAAC;YAEnE,oEAAoE;YACpE,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,+BAA+B,QAAQ,GAAG,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,GAAG,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,OAAO,GAAG,MAAM,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAc;;IACtC,gCAAgC;IAChC,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC/E,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU;YAAE,OAAO,MAAM,CAAC;IACjC,CAAC;IAED,MAAM,aAAa,GAAG,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAG,CAAC,CAAC,MAAI,MAAA,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,0CAAG,CAAC,CAAC,CAAA,CAAC;IAChG,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IAElC,0CAA0C;IAC1C,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BtB,CAAC;IAEA,0BAA0B;IAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAClC,IAAI,MAAM,CAAC,wBAAwB,aAAa,EAAE,CAAC,EACnD,mBAAmB,aAAa,MAAM,aAAa;0BAC7B,aAAa;oCACH,aAAa;EAC/C,CACC,CAAC;IAEF,OAAO,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAC7C,CAAC;AAED,SAAgB,qBAAqB,CAAC,UAAkC,EAAE;IACxE,MAAM,EACJ,SAAS,GAAG,EAAE,EACd,WAAW,GAAG,EAAE,EAChB,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,GAC1B,GAAG,OAAO,CAAC;IAEZ,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,KAAK,CAAC,KAAK;YACT,0BAA0B;YAC1B,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACnD,IAAI,CAAC;oBACH,oBAAoB;oBACpB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;wBACvC,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;oBAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;oBAC7C,CAAC;oBAED,gCAAgC;oBAChC,IAAI,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;oBAE/E,mDAAmD;oBACnD,IAAI,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC3C,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;oBAC9C,CAAC;oBAED,OAAO;wBACL,QAAQ,EAAE,WAAW;wBACrB,MAAM,EAAE,KAAK;qBACd,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACvE,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@codepress/codepress-engine",
3
- "version": "0.5.0",
3
+ "version": "0.6.0-dev.hmr.20251119065124",
4
+ "packageManager": "pnpm@10.22.0",
4
5
  "description": "CodePress engine - Babel and SWC plug-ins",
5
6
  "main": "./dist/index.js",
6
7
  "types": "./dist/index.d.ts",
@@ -30,6 +31,11 @@
30
31
  "require": "./dist/swc/index.js",
31
32
  "default": "./dist/swc/index.js"
32
33
  },
34
+ "./esbuild": {
35
+ "types": "./dist/esbuild-plugin.d.ts",
36
+ "require": "./dist/esbuild-plugin.js",
37
+ "default": "./dist/esbuild-plugin.js"
38
+ },
33
39
  "./swc/wasm": "./swc/codepress_engine.v42.wasm",
34
40
  "./swc/wasm-v42": "./swc/codepress_engine.v42.wasm",
35
41
  "./swc/wasm-v26": "./swc/codepress_engine.v26.wasm",
@@ -44,6 +50,23 @@
44
50
  "README.md",
45
51
  "LICENSE"
46
52
  ],
53
+ "scripts": {
54
+ "build": "tsc --project tsconfig.json",
55
+ "build:rust": "node ./scripts/build-swc.mjs",
56
+ "prepack": "npm run build && npm run build:rust",
57
+ "test": "npm run build && jest",
58
+ "test:watch": "npm run build && jest --watch",
59
+ "test:parity": "npm run build && jest test/plugin-parity.test.js test/fixtures.test.js",
60
+ "test:babel": "npm run build && jest test/plugin-parity.test.js",
61
+ "test:fixtures": "npm run build && jest test/fixtures.test.js",
62
+ "lint": "eslint . --ext .ts,.tsx,.js",
63
+ "lint:fix": "eslint . --ext .ts,.tsx,.js --fix",
64
+ "dev:link": "npm run build && npm run build:rust && npm link",
65
+ "prepublishOnly": "npm run build && npm run build:rust",
66
+ "version:patch": "npm version patch",
67
+ "version:minor": "npm version minor",
68
+ "version:major": "npm version major"
69
+ },
47
70
  "keywords": [
48
71
  "babel",
49
72
  "babel-plugin",
@@ -78,6 +101,7 @@
78
101
  "@types/jest": "^30.0.0",
79
102
  "@types/node": "^22.9.0",
80
103
  "@types/node-fetch": "^2.6.11",
104
+ "esbuild": "^0.24.0",
81
105
  "babel-jest": "^30.2.0",
82
106
  "eslint": "^9.37.0",
83
107
  "eslint-config-prettier": "^10.1.8",
@@ -100,19 +124,9 @@
100
124
  "prettier": "^3.1.0",
101
125
  "ws": "^8.18.0"
102
126
  },
103
- "scripts": {
104
- "build": "tsc --project tsconfig.json",
105
- "build:rust": "node ./scripts/build-swc.mjs",
106
- "test": "npm run build && jest",
107
- "test:watch": "npm run build && jest --watch",
108
- "test:parity": "npm run build && jest test/plugin-parity.test.js test/fixtures.test.js",
109
- "test:babel": "npm run build && jest test/plugin-parity.test.js",
110
- "test:fixtures": "npm run build && jest test/fixtures.test.js",
111
- "lint": "eslint . --ext .ts,.tsx,.js",
112
- "lint:fix": "eslint . --ext .ts,.tsx,.js --fix",
113
- "dev:link": "npm run build && npm run build:rust && npm link",
114
- "version:patch": "npm version patch",
115
- "version:minor": "npm version minor",
116
- "version:major": "npm version major"
127
+ "pnpm": {
128
+ "onlyBuiltDependencies": [
129
+ "unrs-resolver"
130
+ ]
117
131
  }
118
- }
132
+ }
Binary file
Binary file
Binary file