@makefully/adaptfully 3.16.0 → 4.0.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/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## 4.0.0 — 2026-09-03
6
+
7
+ ### Removed
8
+
9
+ - **Cordova / PhoneGap** — Dropped `CordovaPackager`, `packager: "cordova"`, and the `cordova` package keyword. Android/iOS prebuild and Wrapfully family resolution are Capacitor-only.
10
+ - **`CordovaPackager` export** — No longer exported from `@makefully/adaptfully`.
11
+
12
+ ### Changed
13
+
14
+ - **`resolveFamily(..., 'cordova')`** — Throws an explicit error directing clients to Capacitor.
15
+ - **Major version** — Breaking for projects still configured with Cordova.
16
+
17
+ ## 3.16.1 — 2026-09-03
18
+
19
+ ### Fixed
20
+
21
+ - **`adaptfully build` signing credentials** — Capacitor/Cordova zip builds now package `assets/meta/deployments/<canonical>/` (e.g. `ios-dev` → `ios`) so Wrapfully can sign device IPAs. Previously only `release` shipped deployment folders, so `ios:dev-build` arrived on the Mac without `apple/development.*`.
22
+
5
23
  ## 3.16.0 — 2026-09-02
6
24
 
7
25
  ### Added
package/README.md CHANGED
@@ -159,16 +159,15 @@ Standard plugin keys load bundled Adaptfully runtime scripts and emit an inline
159
159
 
160
160
  Wrapfully builders (`steam`, `win`, `mac`, `android`, etc.) map to platform keys via defaults (`win` → `steam`) or an explicit `builders` array on the platform config.
161
161
 
162
- Each platform entry may set a **`packager`** (`web`, `electron`, `cordova`, or `capacitor`). Defaults to **`web`** — copy deploy and inject HTML only. Packagers are implemented as classes (`WebPackager`, `ElectronPackager`, `CordovaPackager`, `CapacitorPackager`) that handle prebuild output for their target platforms.
162
+ Each platform entry may set a **`packager`** (`web`, `electron`, or `capacitor`). Defaults to **`web`** — copy deploy and inject HTML only. Packagers are implemented as classes (`WebPackager`, `ElectronPackager`, `CapacitorPackager`) that handle prebuild output for their target platforms.
163
163
 
164
164
  | Packager | Prebuild adds |
165
165
  |----------|---------------|
166
166
  | `web` | `game-config.js` for **`uwp`** platform prebuilds |
167
167
  | `electron` | `main.js` (Electron shell); `preload.js` when **`steam-auth`** is registered |
168
- | `cordova` | `cordova.js` stub, `game-config.js`, CSP/viewport HTML extras |
169
168
  | `capacitor` | `game-config.js`, Capacitor CSP/viewport; `social-login-config.js` when **`social-auth`** is registered |
170
169
 
171
- Android/iOS Wrapfully builds default to the **`capacitor`** builder family. Set `packager: "cordova"` on a platform to use Cordova for that target.
170
+ Android/iOS Wrapfully builds use the **`capacitor`** builder family. Cordova/PhoneGap is no longer supported.
172
171
 
173
172
  **`steam-auth` requires `packager: "electron"`** and `platforms.<name>.steamId` (Steamworks app ID for the client preload). Steam **upload** app IDs live separately in each Steam deployment’s `manifest.json` — see Wrapfully docs.
174
173
 
@@ -461,10 +460,6 @@ Standard npm fields (`name`, `version`, `description`) are used directly. Add a
461
460
  }
462
461
  }
463
462
  },
464
- "properties": [
465
- { "tag": "plugin", "name": "cordova-plugin-inappbrowser" },
466
- { "tag": "allow-navigation", "href": "*" }
467
- ]
468
463
  }
469
464
  }
470
465
  ```
@@ -472,13 +467,13 @@ Standard npm fields (`name`, `version`, `description`) are used directly. Add a
472
467
  | Field | Used by | Description |
473
468
  |-------|---------|-------------|
474
469
  | `title` | All | Display name shown in stores and app shells |
475
- | `packageName` | Cordova, Capacitor, Electron, UWP, Play upload | Reverse-DNS identifier (`com.company.game`) |
476
- | `publisherDisplayName` | Cordova, Electron, web | Short publisher name |
470
+ | `packageName` | Capacitor, Electron, UWP, Play upload | Reverse-DNS identifier (`com.company.game`) |
471
+ | `publisherDisplayName` | Electron, web | Short publisher name |
477
472
  | `publisherFullName` | Electron | Legal entity name for copyright |
478
- | `publisherWebsite` | Cordova, web | Company URL |
479
- | `publisherEmailAddress` | Cordova | Contact email |
473
+ | `publisherWebsite` | Web | Company URL |
474
+ | `publisherEmailAddress` | Optional | Contact email |
480
475
  | `scope` | Web/PWA | Base URL scope for the web app |
481
- | `themeColor` | Cordova, Capacitor, Electron, UWP, web | Loading screen / theme color |
476
+ | `themeColor` | Capacitor, Electron, UWP, web | Loading screen / theme color |
482
477
  | `twitterId` | Web | Twitter handle for meta tags |
483
478
  | `deployFolder` | Client | Neutral deploy directory staged before prebuild (default: `deploy`) |
484
479
  | `htmlInjections` | Prebuild | Deploy-relative HTML paths to inject (default: `["index.html"]`) |
@@ -486,11 +481,10 @@ Standard npm fields (`name`, `version`, `description`) are used directly. Add a
486
481
  | `platforms` | Prebuild | Per-platform registration maps (see [Adaptfully runtime](#adaptfully-runtime)) |
487
482
  | `platforms.<name>.builder` | Build/deploy | Override Wrapfully builder for a platform (default: `web` → `webapp`, others match platform key) |
488
483
  | `platforms.<name>.builders` | wrapfully-deploy | Map additional Wrapfully builder names to a platform |
489
- | `platforms.<name>.packager` | Prebuild | `web` (default), `electron`, `cordova`, or `capacitor` — selects the packager class that adds platform-specific files during prebuild |
484
+ | `platforms.<name>.packager` | Prebuild | `web` (default), `electron`, or `capacitor` — selects the packager class that adds platform-specific files during prebuild |
490
485
  | `platforms.<name>.steamId` | Electron + steam-auth | Steamworks app ID baked into `preload.js` (client). Upload app IDs belong in the Steam deployment `manifest.json` |
491
486
  | `platforms.<name>.socialLogin` | Capacitor + social-auth | Capgo provider config (`providers`, `google.webClientId`, `apple.clientId`, optional `defaultProvider`) |
492
487
  | `platforms.<name>.<configField>` | Build/deploy | Overrides the matching top-level `config.*` default for that platform only (e.g. `platforms.android.packageName`, `platforms.ios.title`). Does not apply to control fields: `packager`, `registrations`, `builder`, `builders`, `deployments`, `steamId`, `socialLogin`, `steamworks` |
493
- | `properties` | Cordova | Cordova config.xml entries (plugins, allow-navigation, etc.) |
494
488
 
495
489
  Top-level `config.*` values are **defaults**. Any non-control field on `config.platforms.<name>` overrides the default when that platform is built or deployed. Example:
496
490
 
@@ -608,7 +602,7 @@ The file looks like:
608
602
 
609
603
  #### Apple (`ios`, `ios-dev`, `ios-sim`, `mac`)
610
604
 
611
- **Capacitor iOS** signing is file-based under the deployment folder (not the Cordova-style `build.json` `ios.*` identity fields):
605
+ **Capacitor iOS** signing is file-based under the deployment folder:
612
606
 
613
607
  ```
614
608
  assets/meta/deployments/<deployment>/
@@ -617,11 +611,10 @@ assets/meta/deployments/<deployment>/
617
611
  apple/app-store.mobileprovision # release
618
612
  apple/development.p12 # ios-dev device
619
613
  apple/development.mobileprovision # ios-dev device
614
+ build.json # optional: { "apple": { "p12Password": "..." } }
620
615
  ```
621
616
 
622
- The `.p12` passphrase must match `MAC_KEYCHAIN_PASSWORD` on the Mac Wrapfully host. Team ID and profile UUID are read from the `.mobileprovision`. Enable **Sign in with Apple** on the App ID when using Capgo Apple auth.
623
-
624
- Optional `build.json` may still be present for tooling compatibility; Capacitor does not require its `ios.*` code-sign fields.
617
+ `adaptfully build` (zip-only) still packages this deployment folder for Capacitor so device debug builds can sign. Optional `build.json` may set `apple.p12Password` for the `.p12` passphrase (Wrapfully uses an ephemeral keychain per build). Team ID and profile UUID are read from the `.mobileprovision`. Enable **Sign in with Apple** on the App ID when using Capgo Apple auth.
625
618
 
626
619
  To deploy to the App Store, include `assets/meta/deployments/<deployment>/apple.json`. The easiest path is:
627
620
 
@@ -642,9 +635,6 @@ The file looks like:
642
635
  ```
643
636
 
644
637
  iOS IPA upload uses `username` + `password` via `xcrun altool --upload-app`. `category` / `identity` matter more for macOS Electron signing/notarization.
645
- #### Cordova
646
-
647
- Set `packager: "cordova"` on an `android` or `ios` platform to use Cordova instead of Capacitor. Requires the Android and Apple package requirements above.
648
638
 
649
639
  #### Steam (`steam`, `steam-dev`)
650
640
 
@@ -144,7 +144,8 @@ function createZipStream(deployFolder, contents, options = {}) {
144
144
  }
145
145
 
146
146
  /**
147
- * Game source zip for /build and /release (no credentials unless release).
147
+ * Game source zip for /build (and legacy callers). Include `deploymentDirs` when
148
+ * the builder needs signing credentials (e.g. Capacitor ios-dev).
148
149
  *
149
150
  * @param {string} deployFolder
150
151
  * @param {string} contents
@@ -71,7 +71,11 @@ export async function send(gameId, contents, server, stage, family, deployFolder
71
71
  } else if (stage === 'release') {
72
72
  archiveStream = createReleaseArchive(deployFolder, contents, options.deploymentDirs ?? [], { log });
73
73
  } else {
74
- archiveStream = createSourceArchive(deployFolder, contents, { log });
74
+ archiveStream = createSourceArchive(deployFolder, contents, {
75
+ log,
76
+ publishDir: options.publishDir,
77
+ deploymentDirs: options.deploymentDirs,
78
+ });
75
79
  }
76
80
 
77
81
  const url = resolveWrapfullyUrl(server, stage, family, gameId, platformKey, options.deploymentKey);
package/lib/node/index.js CHANGED
@@ -23,7 +23,6 @@ export { prebuildPlatform, prebuildOutputDir, resolveHtmlInjections } from './pr
23
23
  export { getPackageRoot, getRuntimeDir, resolveRuntimeScript } from './paths.js';
24
24
  export {
25
25
  CapacitorPackager,
26
- CordovaPackager,
27
26
  ElectronPackager,
28
27
  Packager,
29
28
  VALID_PACKAGERS,
@@ -52,6 +51,7 @@ export {
52
51
  resolveFamilyFromTarget,
53
52
  resolvePlatformKey,
54
53
  resolvePlatformRegistrationsByKey,
54
+ resolveBuildCredentialDirs,
55
55
  resolvePublishDir,
56
56
  resolveRegistrationAssets,
57
57
  } from './registrations.js';
@@ -4,10 +4,10 @@ import { STANDARD_PLUGINS } from '../registrations.js';
4
4
  import { resolvePlatformConfig } from '../platform-config.js';
5
5
 
6
6
  /** @typedef {import('../registrations.js').RegistrationMap} RegistrationMap */
7
- /** @typedef {'web' | 'electron' | 'cordova' | 'capacitor'} PackagerName */
7
+ /** @typedef {'web' | 'electron' | 'capacitor'} PackagerName */
8
8
 
9
9
  /** @type {PackagerName[]} */
10
- export const VALID_PACKAGERS = ['web', 'electron', 'cordova', 'capacitor'];
10
+ export const VALID_PACKAGERS = ['web', 'electron', 'capacitor'];
11
11
 
12
12
  const PACKAGER_MARKER = '<!-- adaptfully-packager -->';
13
13
  const PACKAGER_END_MARKER = '<!-- /adaptfully-packager -->';
@@ -16,7 +16,7 @@ const HEAD_PACKAGER_END_MARKER = '<!-- /adaptfully-packager-head -->';
16
16
 
17
17
  /**
18
18
  * @typedef {Object} PackagerOptions
19
- * @property {string[]} [platforms] Platform keys this packager targets (e.g. ios + android for Cordova)
19
+ * @property {string[]} [platforms] Platform keys this packager targets
20
20
  * @property {string} [platformKey] Active platform for a single prebuild run
21
21
  * @property {(message: string) => void} [log]
22
22
  */
@@ -1,5 +1,4 @@
1
1
  import { CapacitorPackager } from './capacitor.js';
2
- import { CordovaPackager } from './cordova.js';
3
2
  import { ElectronPackager } from './electron.js';
4
3
  import { Packager, VALID_PACKAGERS } from './base.js';
5
4
  import { WebPackager } from './web.js';
@@ -10,7 +9,6 @@ export {
10
9
  resolvePlatformSocialLogin,
11
10
  validateSocialLoginConfig,
12
11
  } from './capacitor.js';
13
- export { CordovaPackager } from './cordova.js';
14
12
  export {
15
13
  ElectronPackager,
16
14
  buildElectronMain,
@@ -26,7 +24,6 @@ export { WebPackager } from './web.js';
26
24
  const PACKAGER_REGISTRY = {
27
25
  web: WebPackager,
28
26
  electron: ElectronPackager,
29
- cordova: CordovaPackager,
30
27
  capacitor: CapacitorPackager,
31
28
  };
32
29
 
@@ -4,6 +4,7 @@ import { send } from './deploy.js';
4
4
  import { resolveBuildArtifactDir } from './artifacts.js';
5
5
  import { prebuildPlatform } from './prebuild.js';
6
6
  import {
7
+ resolveBuildCredentialDirs,
7
8
  resolveBuildSpec,
8
9
  resolveDeploymentsForPlatform,
9
10
  resolvePublishDir,
@@ -130,6 +131,9 @@ export async function runAdaptfullyStage(stage, platformKey, options) {
130
131
  for (const deploymentKey of deployments) {
131
132
  const publishDir = deploymentKey === 'zip' ? undefined : resolvePublishDir(deploymentKey);
132
133
  const wrapStage = stage === 'deploy' ? 'deploy' : 'build';
134
+ const deploymentDirs = wrapStage === 'build'
135
+ ? resolveBuildCredentialDirs(platformKey, pkg)
136
+ : [];
133
137
 
134
138
  log(
135
139
  `adaptfully: ${stage} ${platformKey} → `
@@ -137,6 +141,14 @@ export async function runAdaptfullyStage(stage, platformKey, options) {
137
141
  + `via Wrapfully /${wrapfullyRoute}/${wrapStage} (${buildSpec.family})`,
138
142
  );
139
143
 
144
+ if (deploymentDirs.length) {
145
+ log(
146
+ `adaptfully: build signing credentials → ${
147
+ deploymentDirs.map((dir) => path.resolve(dir)).join(', ')
148
+ }`,
149
+ );
150
+ }
151
+
140
152
  await send(
141
153
  gameId,
142
154
  contents,
@@ -149,6 +161,7 @@ export async function runAdaptfullyStage(stage, platformKey, options) {
149
161
  {
150
162
  log,
151
163
  publishDir,
164
+ deploymentDirs,
152
165
  platformKey,
153
166
  deploymentKey: wrapStage === 'deploy' ? deploymentKey : undefined,
154
167
  artifactPath,
@@ -345,6 +345,30 @@ export function resolvePublishDir(deploymentKey, metaDir = 'assets/meta') {
345
345
  return path.join(metaDir, 'deployments', deploymentKey);
346
346
  }
347
347
 
348
+ const BUILD_SIGNING_PACKAGERS = new Set(['capacitor']);
349
+
350
+ /**
351
+ * Credential folders to ship with `adaptfully build` (zip artifact) when the
352
+ * Wrapfully builder needs signing material — e.g. ios-dev → deployments/ios.
353
+ * Upload-only targets (SFTP, Play, ASC) are not included.
354
+ *
355
+ * @param {string} platformKey
356
+ * @param {object} pkg
357
+ * @param {string} [metaDir='assets/meta']
358
+ * @returns {string[]} Absolute paths to existing deployment dirs
359
+ */
360
+ export function resolveBuildCredentialDirs(platformKey, pkg, metaDir = 'assets/meta') {
361
+ const platform = pkg?.config?.platforms?.[platformKey];
362
+ const packager = platform?.packager;
363
+ if (!BUILD_SIGNING_PACKAGERS.has(packager)) {
364
+ return [];
365
+ }
366
+
367
+ const credentialKey = DEFAULT_BUILDER_PLATFORMS[platformKey] ?? platformKey;
368
+ const dir = path.resolve(resolvePublishDir(credentialKey, metaDir));
369
+ return fs.existsSync(dir) ? [dir] : [];
370
+ }
371
+
348
372
  const ELECTRON_TARGETS = new Set([
349
373
  'win', 'win-dev', 'mac', 'mac-dev', 'linux', 'linux-dev',
350
374
  ]);
@@ -388,7 +412,10 @@ export function resolveFamily(targets, packager) {
388
412
  return 'electron';
389
413
  }
390
414
  if (packager === 'cordova') {
391
- return 'cordova';
415
+ throw new Error(
416
+ 'Cordova/PhoneGap is no longer supported. Remove packager: "cordova" '
417
+ + '(or set packager: "capacitor") and use Capacitor for android/ios builds.',
418
+ );
392
419
  }
393
420
  if (packager === 'capacitor') {
394
421
  return 'capacitor';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makefully/adaptfully",
3
- "version": "3.16.0",
3
+ "version": "4.0.0",
4
4
  "description": "Platform abstraction and Wrapfully deploy client for Makefully games",
5
5
  "type": "module",
6
6
  "main": "./lib/node/index.js",
@@ -40,7 +40,7 @@
40
40
  "platform",
41
41
  "deploy",
42
42
  "build",
43
- "cordova",
43
+ "capacitor",
44
44
  "electron"
45
45
  ],
46
46
  "contributors": [
@@ -1,44 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { Packager } from './base.js';
4
-
5
- const CORDOVA_CSP = '<meta http-equiv="Content-Security-Policy" content="default-src * \'self\' data: gap: \'unsafe-inline\' \'unsafe-eval\'; style-src * \'self\' \'unsafe-inline\' \'unsafe-eval\' gap:; script-src * \'self\' \'unsafe-inline\' \'unsafe-eval\' gap:; frame-src *;" />';
6
-
7
- const CORDOVA_VIEWPORT = '<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />';
8
-
9
- const CORDOVA_STUB = `/**
10
- * Stub for non-Cordova environments. Cordova replaces this at runtime on device builds.
11
- */
12
- window.cordova = null;
13
- `;
14
-
15
- export class CordovaPackager extends Packager {
16
- /** @type {'cordova'} */
17
- static id = 'cordova';
18
-
19
- /** @type {string[]} */
20
- static defaultPlatforms = ['ios', 'android'];
21
-
22
- needsGameConfig() {
23
- return true;
24
- }
25
-
26
- /** @param {string} dest */
27
- applyTemplates(dest) {
28
- fs.writeFileSync(path.join(dest, 'cordova.js'), CORDOVA_STUB);
29
- this.log('adaptfully: write cordova.js');
30
-
31
- super.applyTemplates(dest);
32
- }
33
-
34
- buildHtmlInjection() {
35
- const headExtras = [CORDOVA_CSP, CORDOVA_VIEWPORT];
36
- const bodyScripts = ['<script src="cordova.js"></script>'];
37
-
38
- if (this.needsGameConfig()) {
39
- bodyScripts.push('<script src="game-config.js"></script>');
40
- }
41
-
42
- return this.formatHtmlInjection(headExtras, bodyScripts);
43
- }
44
- }