From ff1c93635a74fc26e57319123118eaf3ce6d9958 Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Wed, 7 Dec 2022 11:34:42 -0500 Subject: [PATCH 01/57] feat(): remove ionic-angular project type BREAKING CHANGE: Integration with V3 (aka ionic-angular) project has been removed. Please update to modern Ionic projects. --- .../project/ionic-angular/__tests__/build.ts | 38 --- .../project/ionic-angular/__tests__/index.ts | 34 --- .../project/ionic-angular/__tests__/serve.ts | 71 ----- .../src/lib/project/ionic-angular/ailments.ts | 272 ------------------ .../lib/project/ionic-angular/app-scripts.ts | 63 ---- .../src/lib/project/ionic-angular/build.ts | 130 --------- .../src/lib/project/ionic-angular/generate.ts | 175 ----------- .../src/lib/project/ionic-angular/index.ts | 89 ------ .../src/lib/project/ionic-angular/serve.ts | 212 -------------- 9 files changed, 1084 deletions(-) delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/build.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/index.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/serve.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/ailments.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/app-scripts.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/build.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/generate.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/index.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic-angular/serve.ts diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/build.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/build.ts deleted file mode 100644 index e254a7b6ad..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/build.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { IonicAngularBuildCLI } from '../build'; - -describe('@ionic/cli', () => { - - describe('lib/ionic-angular', () => { - - describe('IonicAngularBuildCLI', () => { - - describe('buildOptionsToAppScriptsArgs', () => { - - const options = { - '--': ['--generateSourceMap', 'false'], - prod: true, - aot: true, - minifyjs: true, - minifycss: true, - optimizejs: true, - }; - - it('should transform defaults', async () => { - const appscripts = new IonicAngularBuildCLI({} as any); - const result = await (appscripts as any).buildOptionsToAppScriptsArgs({ _: [], '--': [] }); - expect(result).toEqual([]); - }); - - it('should transform options', async () => { - const appscripts = new IonicAngularBuildCLI({} as any); - const result = await (appscripts as any).buildOptionsToAppScriptsArgs(options); - expect(result).toEqual(['--prod', '--aot', '--minifyjs', '--minifycss', '--optimizejs', '--generateSourceMap', 'false']); - }); - - }); - - }); - - }); - -}); diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/index.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/index.ts deleted file mode 100644 index b44e7c9ba6..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as path from 'path' -import { IonicAngularProject } from '../'; - -describe('@ionic/cli', () => { - - describe('lib/project/ionic-angular', () => { - - describe('IonicAngularProject', () => { - - let p: IonicAngularProject; - - beforeEach(() => { - p = new IonicAngularProject({ context: 'app', configPath: '/path/to/proj/file' } as any, {} as any); - jest.spyOn(p, 'config', 'get').mockImplementation(() => ({ get: () => undefined } as any)); - }); - - it('should set directory attribute', async () => { - expect(p.directory).toEqual(path.resolve('/path/to/proj')); - }); - - describe('getSourceDir', () => { - - it('should default to src', async () => { - const result = await p.getSourceDir(); - expect(result).toEqual(path.resolve('/path/to/proj/src')); - }); - - }); - - }); - - }); - -}); diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/serve.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/serve.ts deleted file mode 100644 index d8baa3727d..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/__tests__/serve.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { IonicAngularServeRunner } from '../serve'; - -describe('@ionic/cli', () => { - - describe('lib/project/ionic-angular/serve', () => { - - describe('IonicAngularServeRunner', () => { - - describe('createOptionsFromCommandLine', () => { - - const defaults = { - '--': [], - publicHost: undefined, - host: 'localhost', - browser: undefined, - browserOption: undefined, - consolelogs: false, - engine: 'browser', - env: undefined, - externalAddressRequired: false, - lab: false, - labHost: 'localhost', - labPort: 8200, - livereload: true, - livereloadPort: 35729, - notificationPort: 53703, - open: false, - port: 8100, - proxy: true, - serverlogs: false, - project: undefined, - verbose: false, - }; - - it('should provide defaults with no options', () => { - const runner = new IonicAngularServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [] }); - expect(result).toEqual(defaults); - }); - - it('should provide options from negations of cli flag defaults', () => { - const runner = new IonicAngularServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); - expect(result).toEqual({ ...defaults, livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); - }); - - it('should allow overrides of default values', () => { - const runner = new IonicAngularServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], host: '0.0.0.0', port: '1111', 'livereload-port': '2222', 'dev-logger-port': '3333', env: 'prod' }); - expect(result).toEqual({ ...defaults, host: '0.0.0.0', port: 1111, livereloadPort: 2222, notificationPort: 3333, env: 'prod' }); - }); - - it('should respect --external flag', () => { - const runner = new IonicAngularServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], host: 'localhost', external: true }); - expect(result).toEqual({ ...defaults, host: '0.0.0.0' }); - }); - - it('should pass on separated args', () => { - const runner = new IonicAngularServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], '--': ['foo', '--bar'] }); - expect(result).toEqual({ ...defaults, '--': ['foo', '--bar'] }); - }); - - }); - - }); - - }); - -}); diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/ailments.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/ailments.ts deleted file mode 100644 index 99b8ac81fa..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/ailments.ts +++ /dev/null @@ -1,272 +0,0 @@ -import * as semver from 'semver'; - -import { ProjectType, TreatableAilment } from '../../../definitions'; -import { BUILD_SCRIPT } from '../../build'; -import { ancillary, input, strong } from '../../color'; -import { Ailment, AilmentDeps } from '../../doctor'; -import { SERVE_SCRIPT } from '../../serve'; -import { pkgFromRegistry, pkgManagerArgs } from '../../utils/npm'; - -import { IonicAngularProject } from './'; -import { DEFAULT_BUILD_SCRIPT_VALUE } from './build'; -import { DEFAULT_SERVE_SCRIPT_VALUE } from './serve'; - -export interface IonicAngularAilmentDeps extends AilmentDeps { - readonly project: IonicAngularProject; -} - -export abstract class IonicAngularAilment extends Ailment { - readonly projects: ProjectType[] = ['ionic-angular']; - protected readonly project: IonicAngularProject; - - constructor(deps: IonicAngularAilmentDeps) { - super(deps); - this.project = deps.project; - } -} - -export class IonicAngularUpdateAvailable extends IonicAngularAilment { - readonly id = 'ionic-angular-update-available'; - currentVersion?: string; - latestVersion?: string; - - async getVersionPair(): Promise<[string, string]> { - if (!this.currentVersion || !this.latestVersion) { - const [ currentPkg ] = await this.project.getPackageJson('ionic-angular'); - const latestPkg = await pkgFromRegistry(this.config.get('npmClient'), { pkg: 'ionic-angular' }); - this.currentVersion = currentPkg ? currentPkg.version : undefined; - this.latestVersion = latestPkg ? latestPkg.version : undefined; - } - - if (!this.currentVersion || !this.latestVersion) { - return ['0.0.0', '0.0.0']; - } - - return [ this.currentVersion, this.latestVersion ]; - } - - async getMessage() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - - return ( - `Update available for Ionic Framework.\n` + - `An update is available for ${strong('ionic-angular')} (${ancillary(currentVersion)} => ${ancillary(latestVersion)}).\n` - ).trim(); - } - - async detected() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - const diff = semver.diff(currentVersion, latestVersion); - - return diff === 'minor' || diff === 'patch'; - } - - async getTreatmentSteps() { - const [ , latestVersion ] = await this.getVersionPair(); - const args = await pkgManagerArgs(this.config.get('npmClient'), { command: 'install', pkg: `ionic-angular@${latestVersion ? latestVersion : 'latest'}` }); - - return [ - { message: `Visit ${strong('https://github.com/ionic-team/ionic/releases')} for each upgrade's instructions` }, - { message: `If no instructions, run: ${input(args.join(' '))}` }, - { message: `Watch for npm warnings about peer dependencies--they may need manual updating` }, - ]; - } -} - -export class IonicAngularMajorUpdateAvailable extends IonicAngularAilment { - readonly id = 'ionic-angular-major-update-available'; - currentVersion?: string; - latestVersion?: string; - - async getVersionPair(): Promise<[string, string]> { - if (!this.currentVersion || !this.latestVersion) { - const [ currentPkg ] = await this.project.getPackageJson('ionic-angular'); - const latestPkg = await pkgFromRegistry(this.config.get('npmClient'), { pkg: 'ionic-angular' }); - this.currentVersion = currentPkg ? currentPkg.version : undefined; - this.latestVersion = latestPkg ? latestPkg.version : undefined; - } - - if (!this.currentVersion || !this.latestVersion) { - return ['0.0.0', '0.0.0']; - } - - return [ this.currentVersion, this.latestVersion ]; - } - - async getMessage() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - - return ( - `Major update available for Ionic Framework.\n` + - `A major update is available for ${strong('ionic-angular')} (${ancillary(currentVersion)} => ${ancillary(latestVersion)}).\n` - ).trim(); - } - - async detected() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - const diff = semver.diff(currentVersion, latestVersion); - - return diff === 'major'; - } - - async getTreatmentSteps() { - return [ - { message: `Visit ${strong('https://ionicframework.com/blog')} and ${strong('https://github.com/ionic-team/ionic/releases')} for upgrade instructions` }, - ]; - } -} - -export class AppScriptsUpdateAvailable extends IonicAngularAilment implements TreatableAilment { - readonly id = 'app-scripts-update-available'; - readonly treatable = true; - currentVersion?: string; - latestVersion?: string; - - async getVersionPair(): Promise<[string, string]> { - if (!this.currentVersion || !this.latestVersion) { - const [ currentPkg ] = await this.project.getPackageJson('@ionic/app-scripts'); - const latestPkg = await pkgFromRegistry(this.config.get('npmClient'), { pkg: '@ionic/app-scripts' }); - this.currentVersion = currentPkg ? currentPkg.version : undefined; - this.latestVersion = latestPkg ? latestPkg.version : undefined; - } - - if (!this.currentVersion || !this.latestVersion) { - return ['0.0.0', '0.0.0']; - } - - return [ this.currentVersion, this.latestVersion ]; - } - - async getMessage() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - - return ( - `Update available for ${strong('@ionic/app-scripts')}.\n` + - `An update is available for ${strong('@ionic/app-scripts')} (${ancillary(currentVersion)} => ${ancillary(latestVersion)}).\n` - ).trim(); - } - - async detected() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - const diff = semver.diff(currentVersion, latestVersion); - - return diff === 'minor' || diff === 'patch'; - } - - async getTreatmentSteps() { - const [ , latestVersion ] = await this.getVersionPair(); - const [ manager, ...managerArgs ] = await pkgManagerArgs(this.config.get('npmClient'), { command: 'install', pkg: `@ionic/app-scripts@${latestVersion ? latestVersion : 'latest'}`, saveDev: true }); - - return [ - { - message: `Run: ${input(manager + ' ' + managerArgs.join(' '))}`, - treat: async () => { - await this.shell.run(manager, managerArgs, {}); - }, - }, - ]; - } -} - -export class AppScriptsMajorUpdateAvailable extends IonicAngularAilment { - readonly id = 'app-scripts-major-update-available'; - currentVersion?: string; - latestVersion?: string; - - async getVersionPair(): Promise<[string, string]> { - if (!this.currentVersion || !this.latestVersion) { - const [ currentPkg ] = await this.project.getPackageJson('@ionic/app-scripts'); - const latestPkg = await pkgFromRegistry(this.config.get('npmClient'), { pkg: '@ionic/app-scripts' }); - this.currentVersion = currentPkg ? currentPkg.version : undefined; - this.latestVersion = latestPkg ? latestPkg.version : undefined; - } - - if (!this.currentVersion || !this.latestVersion) { - return ['0.0.0', '0.0.0']; - } - - return [ this.currentVersion, this.latestVersion ]; - } - - async getMessage() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - - return ( - `Major update available for ${strong('@ionic/app-scripts')}.\n` + - `A major update is available for ${strong('@ionic/app-scripts')} (${ancillary(currentVersion)} => ${ancillary(latestVersion)}).\n` - ).trim(); - } - - async detected() { - const [ currentVersion, latestVersion ] = await this.getVersionPair(); - const diff = semver.diff(currentVersion, latestVersion); - - return diff === 'major'; - } - - async getTreatmentSteps() { - return [ - { message: `Visit ${strong('https://github.com/ionic-team/ionic-app-scripts/releases')} for upgrade instructions` }, - ]; - } -} - -export class IonicAngularPackageJsonHasDefaultIonicBuildCommand extends IonicAngularAilment { - readonly id = 'ionic-angular-package-json-has-default-ionic-build-command'; - currentVersion?: string; - latestVersion?: string; - - async getMessage() { - return ( - `The ${strong(BUILD_SCRIPT)} npm script is unchanged.\n` + - `The Ionic CLI now looks for the ${strong(BUILD_SCRIPT)} npm script in ${strong('package.json')} for a custom build script to run instead of the default (${input(DEFAULT_BUILD_SCRIPT_VALUE)}). If you don't use it, it's considered quicker and cleaner to just remove it.` - ).trim(); - } - - async detected() { - const pkg = await this.project.requirePackageJson(); - - if (pkg.scripts && pkg.scripts[BUILD_SCRIPT] === DEFAULT_BUILD_SCRIPT_VALUE) { - return true; - } - - return false; - } - - async getTreatmentSteps() { - return [ - { message: `Remove the ${strong(BUILD_SCRIPT)} npm script from ${strong('package.json')}` }, - { message: `Continue using ${input('ionic build')} normally` }, - ]; - } -} - -export class IonicAngularPackageJsonHasDefaultIonicServeCommand extends IonicAngularAilment { - readonly id = 'ionic-angular-package-json-has-default-ionic-serve-command'; - currentVersion?: string; - latestVersion?: string; - - async getMessage() { - return ( - `The ${strong(SERVE_SCRIPT)} npm script is unchanged.\n` + - `The Ionic CLI now looks for the ${strong(SERVE_SCRIPT)} npm script in ${strong('package.json')} for a custom serve script to run instead of the default (${input(DEFAULT_SERVE_SCRIPT_VALUE)}). If you don't use it, it's considered quicker and cleaner to just remove it.` - ).trim(); - } - - async detected() { - const pkg = await this.project.requirePackageJson(); - - if (pkg.scripts && pkg.scripts[SERVE_SCRIPT] === DEFAULT_SERVE_SCRIPT_VALUE) { - return true; - } - - return false; - } - - async getTreatmentSteps() { - return [ - { message: `Remove the ${strong(SERVE_SCRIPT)} npm script from ${strong('package.json')}` }, - { message: `Continue using ${input('ionic serve')} normally` }, - ]; - } -} diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/app-scripts.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/app-scripts.ts deleted file mode 100644 index 793be39ee4..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/app-scripts.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { MetadataGroup } from '@ionic/cli-framework'; -import { compileNodeModulesPaths } from '@ionic/cli-framework/utils/node'; -import * as Debug from 'debug'; - -import { CommandMetadataOption } from '../../../definitions'; -import { weak } from '../../color'; - -const debug = Debug('ionic:lib:project:ionic-angular:app-scripts'); - -export async function importAppScripts(projectDir: string): Promise { - const pkg = '@ionic/app-scripts'; - - debug('Importing %s', pkg); - const p = require.resolve(pkg, { paths: compileNodeModulesPaths(projectDir) }); - const m = require(p); - debug('fin'); - - return m; -} - -export const APP_SCRIPTS_OPTIONS: CommandMetadataOption[] = [ - { - name: 'prod', - summary: 'Build the application for production', - type: Boolean, - groups: ['app-scripts', 'cordova'], - hint: weak('[app-scripts]'), - }, - { - name: 'aot', - summary: 'Perform ahead-of-time compilation for this build', - type: Boolean, - groups: [MetadataGroup.ADVANCED, 'app-scripts', 'cordova'], - hint: weak('[app-scripts]'), - }, - { - name: 'minifyjs', - summary: 'Minify JS for this build', - type: Boolean, - groups: [MetadataGroup.ADVANCED, 'app-scripts', 'cordova'], - hint: weak('[app-scripts]'), - }, - { - name: 'minifycss', - summary: 'Minify CSS for this build', - type: Boolean, - groups: [MetadataGroup.ADVANCED, 'app-scripts', 'cordova'], - hint: weak('[app-scripts]'), - }, - { - name: 'optimizejs', - summary: 'Perform JS optimizations for this build', - type: Boolean, - groups: [MetadataGroup.ADVANCED, 'app-scripts', 'cordova'], - hint: weak('[app-scripts]'), - }, - { - name: 'env', - summary: '', - groups: [MetadataGroup.HIDDEN, MetadataGroup.ADVANCED, 'app-scripts', 'cordova'], - hint: weak('[app-scripts]'), - }, -]; diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/build.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/build.ts deleted file mode 100644 index 8d4b7da8d9..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/build.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { MetadataGroup, unparseArgs } from '@ionic/cli-framework'; -import * as Debug from 'debug'; - -import { CommandLineInputs, CommandLineOptions, CommandMetadata, IonicAngularBuildOptions } from '../../../definitions'; -import { BUILD_SCRIPT, BuildCLI, BuildRunner, BuildRunnerDeps } from '../../build'; -import { ancillary, input, strong, weak } from '../../color'; - -import { IonicAngularProject } from './'; -import { APP_SCRIPTS_OPTIONS } from './app-scripts'; - -const debug = Debug('ionic:lib:project:ionic-angular:build'); - -export const DEFAULT_PROGRAM = 'ionic-app-scripts'; -export const DEFAULT_BUILD_SCRIPT_VALUE = `${DEFAULT_PROGRAM} build`; - -export interface IonicAngularBuildRunnerDeps extends BuildRunnerDeps { - readonly project: IonicAngularProject; -} - -export class IonicAngularBuildRunner extends BuildRunner { - constructor(protected readonly e: IonicAngularBuildRunnerDeps) { - super(); - } - - async getCommandMetadata(): Promise> { - return { - description: ` -${input('ionic build')} uses ${strong('@ionic/app-scripts')}. See the project's ${strong('README.md')}[^app-scripts-readme] for documentation. Options not listed below are considered advanced and can be passed to the ${input('ionic-app-scripts')} CLI using the ${input('--')} separator after the Ionic CLI arguments. See the examples. - `, - footnotes: [ - { - id: 'app-scripts-readme', - url: 'https://github.com/ionic-team/ionic-app-scripts/blob/master/README.md', - }, - ], - options: [ - { - name: 'source-map', - summary: 'Output sourcemaps', - type: Boolean, - groups: [MetadataGroup.ADVANCED, 'cordova'], - hint: weak('[app-scripts]'), - }, - ...APP_SCRIPTS_OPTIONS, - ], - exampleCommands: [ - '--prod', - ], - }; - } - - createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): IonicAngularBuildOptions { - const baseOptions = super.createBaseOptionsFromCommandLine(inputs, options); - const sourcemaps = typeof options['source-map'] === 'boolean' ? Boolean(options['source-map']) : undefined; - - return { - ...baseOptions, - type: 'ionic-angular', - prod: options['prod'] ? true : false, - sourcemaps, - aot: options['aot'] ? true : false, - minifyjs: options['minifyjs'] ? true : false, - minifycss: options['minifycss'] ? true : false, - optimizejs: options['optimizejs'] ? true : false, - env: options['env'] ? String(options['env']) : undefined, - }; - } - - async buildProject(options: IonicAngularBuildOptions): Promise { - const appscripts = new IonicAngularBuildCLI(this.e); - await appscripts.build(options); - } -} - -export class IonicAngularBuildCLI extends BuildCLI { - readonly name = 'Ionic App Scripts'; - readonly pkg = '@ionic/app-scripts'; - readonly program = DEFAULT_PROGRAM; - readonly prefix = 'app-scripts'; - readonly script?: string = BUILD_SCRIPT; - - protected buildOptionsToAppScriptsArgs(options: IonicAngularBuildOptions): string[] { - const minimistArgs = { - _: [], - prod: options.prod ? true : false, - aot: options.aot ? true : false, - minifyjs: options.minifyjs ? true : false, - minifycss: options.minifycss ? true : false, - optimizejs: options.optimizejs ? true : false, - generateSourceMap: typeof options.sourcemaps !== 'undefined' ? options.sourcemaps ? 'true' : 'false' : undefined, - target: options.engine === 'cordova' ? 'cordova' : undefined, - platform: options.platform, - env: options.env, - }; - - return [...unparseArgs(minimistArgs, { allowCamelCase: true, useEquals: false }), ...options['--']]; - } - - protected async buildArgs(options: IonicAngularBuildOptions): Promise { - const { pkgManagerArgs } = await import('../../utils/npm'); - - const args = this.buildOptionsToAppScriptsArgs(options); - - if (this.resolvedProgram === this.program) { - return ['build', ...args]; - } else { - const [ , ...pkgArgs ] = await pkgManagerArgs(this.e.config.get('npmClient'), { command: 'run', script: this.script, scriptArgs: [...args] }); - return pkgArgs; - } - } - - protected async resolveProgram(): Promise { - if (typeof this.script !== 'undefined') { - debug(`Looking for ${ancillary(this.script)} npm script.`); - - const pkg = await this.e.project.requirePackageJson(); - - if (pkg.scripts && pkg.scripts[this.script]) { - if (pkg.scripts[this.script] === DEFAULT_BUILD_SCRIPT_VALUE) { - debug(`Found ${ancillary(this.script)}, but it is the default. Not running.`); - } else { - debug(`Using ${ancillary(this.script)} npm script.`); - return this.e.config.get('npmClient'); - } - } - } - - return this.program; - } -} diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/generate.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/generate.ts deleted file mode 100644 index ddc7fbfa8f..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/generate.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { contains, unparseArgs, validators } from '@ionic/cli-framework'; - -import { CommandLineInputs, CommandLineOptions, CommandMetadata, IonicAngularGenerateOptions } from '../../../definitions'; -import { input, strong, weak } from '../../color'; -import { GenerateRunner, GenerateRunnerDeps } from '../../generate'; - -import { IonicAngularProject } from './'; -import { importAppScripts } from './app-scripts'; - -const GENERATOR_TYPES = ['component', 'directive', 'page', 'pipe', 'provider', 'tabs']; - -export interface IonicAngularGenerateRunnerDeps extends GenerateRunnerDeps { - readonly project: IonicAngularProject; -} - -export class IonicAngularGenerateRunner extends GenerateRunner { - constructor(protected readonly e: IonicAngularGenerateRunnerDeps) { - super(); - } - - async getCommandMetadata(): Promise> { - return { - groups: [], - summary: `Generate pipes, components, pages, directives, providers, and tabs`, - description: ` -Automatically create components for your Ionic app. - -The given ${input('name')} is normalized into an appropriate naming convention. For example, ${input('ionic generate page neat')} creates a page by the name of ${input('NeatPage')} in ${input('src/pages/neat/')}. - `, - exampleCommands: [ - '', - ...GENERATOR_TYPES, - 'component foo', - 'page Login', - 'page Detail --no-module', - 'page About --constants', - 'pipe MyFilterPipe', - ], - inputs: [ - { - name: 'type', - summary: `The type of generator (e.g. ${GENERATOR_TYPES.map(t => input(t)).join(', ')})`, - validators: [validators.required, contains(GENERATOR_TYPES, {})], - }, - { - name: 'name', - summary: 'The name of the component being generated', - validators: [validators.required], - }, - ], - options: [ - { - name: 'module', - summary: 'Do not generate an NgModule for the page', - hint: weak('[page]'), - type: Boolean, - default: true, - }, - { - name: 'constants', - summary: 'Generate a page constant file for lazy-loaded pages', - hint: weak('[page]'), - type: Boolean, - default: false, - }, - ], - }; - } - - async ensureCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): Promise { - if (!inputs[0]) { - const generatorType = await this.e.prompt({ - type: 'list', - name: 'generatorType', - message: 'What would you like to generate:', - choices: GENERATOR_TYPES, - }); - - inputs[0] = generatorType; - } - - if (!inputs[1]) { - const generatorName = await this.e.prompt({ - type: 'input', - name: 'generatorName', - message: 'What should the name be?', - validate: v => validators.required(v), - }); - - inputs[1] = generatorName; - } - } - - createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): IonicAngularGenerateOptions { - const baseOptions = super.createOptionsFromCommandLine(inputs, options); - - return { - ...baseOptions, - module: options['module'] ? true : false, - constants: options['constants'] ? true : false, - }; - } - - async run(options: IonicAngularGenerateOptions) { - const AppScripts = await importAppScripts(this.e.project.directory); - - const appScriptsArgs = unparseArgs({ _: [], module: options.module, constants: options.constants }, { useEquals: false, ignoreFalse: true, allowCamelCase: true }); - AppScripts.setProcessArgs(['node', 'appscripts'].concat(appScriptsArgs)); - AppScripts.setCwd(this.e.project.directory); - - const context = AppScripts.generateContext(); - - switch (options.type) { - case 'page': - await AppScripts.processPageRequest(context, options.name, options); - break; - case 'component': - const componentData = await this.getModules(context, 'component'); - await AppScripts.processComponentRequest(context, options.name, componentData); - break; - case 'directive': - const directiveData = await this.getModules(context, 'directive'); - await AppScripts.processDirectiveRequest(context, options.name, directiveData); - break; - case 'pipe': - const pipeData = await this.getModules(context, 'pipe'); - await AppScripts.processPipeRequest(context, options.name, pipeData); - break; - case 'provider': - const providerData = context.appNgModulePath; - await AppScripts.processProviderRequest(context, options.name, providerData); - break; - case 'tabs': - const tabsData = await this.tabsPrompt(); - await AppScripts.processTabsRequest(context, options.name, tabsData, options); - break; - } - - this.e.log.ok(`Generated a ${strong(options.type)}${options.type === 'tabs' ? ' page' : ''} named ${strong(options.name)}!`); - } - - async tabsPrompt() { - const tabNames = []; - - const howMany = await this.e.prompt({ - type: 'input', - name: 'howMany', - message: 'How many tabs?', - validate: v => validators.numeric(v), - }); - - for (let i = 0; i < parseInt(howMany, 10); i++) { - const tabName = await this.e.prompt({ - type: 'input', - name: 'tabName', - message: 'Name of this tab:', - }); - - tabNames.push(tabName); - } - - return tabNames; - } - - async getModules(context: any, kind: string) { - switch (kind) { - case 'component': - return context.componentsNgModulePath ? context.componentsNgModulePath : context.appNgModulePath; - case 'pipe': - return context.pipesNgModulePath ? context.pipesNgModulePath : context.appNgModulePath; - case 'directive': - return context.directivesNgModulePath ? context.directivesNgModulePath : context.appNgModulePath; - } - } -} diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/index.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/index.ts deleted file mode 100644 index 1e93ef8b5f..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/index.ts +++ /dev/null @@ -1,89 +0,0 @@ -import * as Debug from 'debug'; -import * as lodash from 'lodash'; - -import { Project } from '../'; -import { IAilmentRegistry, InfoItem } from '../../../definitions'; -import { strong } from '../../color'; - -const debug = Debug('ionic:lib:project:ionic-angular'); - -export class IonicAngularProject extends Project { - readonly type: 'ionic-angular' = 'ionic-angular'; - - async getInfo(): Promise { - const [ - [ ionicAngularPkg ], - [ appScriptsPkg ], - ] = await Promise.all([ - this.getPackageJson('ionic-angular'), - this.getPackageJson('@ionic/app-scripts'), - ]); - - return [ - ...(await super.getInfo()), - { - group: 'ionic', - name: 'Ionic Framework', - key: 'framework', - value: ionicAngularPkg ? `ionic-angular ${ionicAngularPkg.version}` : 'not installed', - }, - { - group: 'ionic', - name: '@ionic/app-scripts', - key: 'app_scripts_version', - value: appScriptsPkg ? appScriptsPkg.version : 'not installed', - }, - ]; - } - - async getDocsUrl(): Promise { - return 'https://ion.link/v3-docs'; - } - - async registerAilments(registry: IAilmentRegistry): Promise { - await super.registerAilments(registry); - const ailments = await import('./ailments'); - const deps = { ...this.e, project: this }; - - registry.register(new ailments.IonicAngularUpdateAvailable(deps)); - registry.register(new ailments.IonicAngularMajorUpdateAvailable(deps)); - registry.register(new ailments.AppScriptsUpdateAvailable(deps)); - registry.register(new ailments.AppScriptsMajorUpdateAvailable(deps)); - registry.register(new ailments.IonicAngularPackageJsonHasDefaultIonicBuildCommand(deps)); - registry.register(new ailments.IonicAngularPackageJsonHasDefaultIonicServeCommand(deps)); - } - - async detected() { - try { - const pkg = await this.requirePackageJson(); - const deps = lodash.assign({}, pkg.dependencies, pkg.devDependencies); - - if (typeof deps['ionic-angular'] === 'string') { - debug(`${strong('ionic-angular')} detected in ${strong('package.json')}`); - return true; - } - } catch (e) { - // ignore - } - - return false; - } - - async requireBuildRunner(): Promise { - const { IonicAngularBuildRunner } = await import('./build'); - const deps = { ...this.e, project: this }; - return new IonicAngularBuildRunner(deps); - } - - async requireServeRunner(): Promise { - const { IonicAngularServeRunner } = await import('./serve'); - const deps = { ...this.e, project: this }; - return new IonicAngularServeRunner(deps); - } - - async requireGenerateRunner(): Promise { - const { IonicAngularGenerateRunner } = await import('./generate'); - const deps = { ...this.e, project: this }; - return new IonicAngularGenerateRunner(deps); - } -} diff --git a/packages/@ionic/cli/src/lib/project/ionic-angular/serve.ts b/packages/@ionic/cli/src/lib/project/ionic-angular/serve.ts deleted file mode 100644 index 045947e716..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic-angular/serve.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { MetadataGroup, ParsedArgs, unparseArgs } from '@ionic/cli-framework'; -import { str2num } from '@ionic/cli-framework/utils/string'; -import * as Debug from 'debug'; - -import { CommandLineInputs, CommandLineOptions, CommandMetadata, IonicAngularServeOptions, ServeDetails } from '../../../definitions'; -import { ancillary, weak } from '../../color'; -import { BIND_ALL_ADDRESS, DEFAULT_DEV_LOGGER_PORT, DEFAULT_LIVERELOAD_PORT, LOCAL_ADDRESSES, SERVE_SCRIPT, ServeCLI, ServeRunner, ServeRunnerDeps } from '../../serve'; -import { findOpenIonicPorts } from '../common'; - -import { IonicAngularProject } from './'; -import { APP_SCRIPTS_OPTIONS } from './app-scripts'; - -const debug = Debug('ionic:lib:project:ionic-angular:serve'); - -const DEFAULT_PROGRAM = 'ionic-app-scripts'; -export const DEFAULT_SERVE_SCRIPT_VALUE = `${DEFAULT_PROGRAM} serve`; - -export interface IonicAngularServeRunnerDeps extends ServeRunnerDeps { - readonly project: IonicAngularProject; -} - -export class IonicAngularServeRunner extends ServeRunner { - constructor(protected readonly e: IonicAngularServeRunnerDeps) { - super(); - } - - async getCommandMetadata(): Promise> { - return { - options: [ - { - name: 'consolelogs', - summary: 'Print app console logs to Ionic CLI', - type: Boolean, - groups: ['cordova'], - aliases: ['c'], - hint: weak('[app-scripts]'), - }, - { - name: 'serverlogs', - summary: 'Print dev server logs to Ionic CLI', - type: Boolean, - aliases: ['s'], - groups: [MetadataGroup.HIDDEN, 'cordova'], - hint: weak('[app-scripts]'), - }, - { - name: 'livereload-port', - summary: 'Use specific port for live-reload', - default: DEFAULT_LIVERELOAD_PORT.toString(), - aliases: ['r'], - groups: [MetadataGroup.ADVANCED, 'cordova'], - hint: weak('[app-scripts]'), - spec: { value: 'port' }, - }, - { - name: 'dev-logger-port', - summary: 'Use specific port for dev server', - default: DEFAULT_DEV_LOGGER_PORT.toString(), - groups: [MetadataGroup.ADVANCED, 'cordova'], - hint: weak('[app-scripts]'), - spec: { value: 'port' }, - }, - { - name: 'proxy', - summary: 'Do not add proxies', - type: Boolean, - default: true, - groups: [MetadataGroup.ADVANCED, 'cordova'], - hint: weak('[app-scripts]'), - // TODO: Adding 'x' to aliases here has some weird behavior with minimist. - }, - { - name: 'source-map', - summary: 'Output sourcemaps', - type: Boolean, - groups: [MetadataGroup.ADVANCED, 'cordova'], - hint: weak('[app-scripts]'), - }, - ...APP_SCRIPTS_OPTIONS, - ], - exampleCommands: [ - '-c', '-- --enableLint false', - ], - }; - } - - createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): IonicAngularServeOptions { - const baseOptions = super.createOptionsFromCommandLine(inputs, options); - const sourcemaps = typeof options['source-map'] === 'boolean' ? Boolean(options['source-map']) : undefined; - const livereloadPort = str2num(options['livereload-port'], DEFAULT_LIVERELOAD_PORT); - const notificationPort = str2num(options['dev-logger-port'], DEFAULT_DEV_LOGGER_PORT); - - return { - ...baseOptions, - sourcemaps, - consolelogs: options['consolelogs'] ? true : false, - serverlogs: options['serverlogs'] ? true : false, - livereloadPort, - notificationPort, - env: options['env'] ? String(options['env']) : undefined, - }; - } - - modifyOpenUrl(url: string, options: IonicAngularServeOptions): string { - return `${url}${options.browserOption ? options.browserOption : ''}${options.platform ? `?ionicplatform=${options.platform}` : ''}`; - } - - async serveProject(options: IonicAngularServeOptions): Promise { - const [ externalIP, availableInterfaces ] = await this.selectExternalIP(options); - const { port, livereloadPort, notificationPort } = await findOpenIonicPorts(options.host, options); - - options.port = port; - options.livereloadPort = livereloadPort; - options.notificationPort = notificationPort; - - const appscripts = new IonicAngularServeCLI(this.e); - await appscripts.serve(options); - - return { - custom: appscripts.resolvedProgram !== appscripts.program, - protocol: 'http', - localAddress: 'localhost', - externalAddress: externalIP, - externalNetworkInterfaces: availableInterfaces, - port, - externallyAccessible: ![BIND_ALL_ADDRESS, ...LOCAL_ADDRESSES].includes(externalIP), - }; - } - - getUsedPorts(options: IonicAngularServeOptions, details: ServeDetails): number[] { - return [ - ...super.getUsedPorts(options, details), - ...options.livereloadPort ? [options.livereloadPort] : [], - ...options.notificationPort ? [options.notificationPort] : [], - ]; - } -} - -class IonicAngularServeCLI extends ServeCLI { - readonly name = 'Ionic App Scripts'; - readonly pkg = '@ionic/app-scripts'; - readonly program = DEFAULT_PROGRAM; - readonly prefix = 'app-scripts'; - readonly script?: string = SERVE_SCRIPT; - - protected stdoutFilter(line: string): boolean { - if (this.resolvedProgram !== this.program) { - return super.stdoutFilter(line); - } - - if (line.includes('server running')) { - this.emit('ready'); - return false; - } - - return true; - } - - protected async buildArgs(options: IonicAngularServeOptions): Promise { - const { pkgManagerArgs } = await import('../../utils/npm'); - - const args = this.serveOptionsToAppScriptsArgs(options); - - if (this.resolvedProgram === this.program) { - return ['serve', ...args]; - } else { - const [ , ...pkgArgs ] = await pkgManagerArgs(this.e.config.get('npmClient'), { command: 'run', script: this.script, scriptArgs: [...args] }); - return pkgArgs; - } - } - - protected serveOptionsToAppScriptsArgs(options: IonicAngularServeOptions): string[] { - const args: ParsedArgs = { - _: [], - address: options.host, - port: String(options.port), - 'livereload-port': String(options.livereloadPort), - 'dev-logger-port': String(options.notificationPort), - consolelogs: options.consolelogs, - serverlogs: options.serverlogs, - nobrowser: true, - nolivereload: !options.livereload, - noproxy: !options.proxy, - iscordovaserve: options.engine === 'cordova', - generateSourceMap: typeof options.sourcemaps !== 'undefined' ? options.sourcemaps ? 'true' : 'false' : undefined, - platform: options.platform, - target: options.engine === 'cordova' ? 'cordova' : undefined, - env: options.env, - }; - - return [...unparseArgs(args, { allowCamelCase: true, useEquals: false }), ...options['--']]; - } - - protected async resolveProgram(): Promise { - if (typeof this.script !== 'undefined') { - debug(`Looking for ${ancillary(this.script)} npm script.`); - - const pkg = await this.e.project.requirePackageJson(); - - if (pkg.scripts && pkg.scripts[this.script]) { - if (pkg.scripts[this.script] === DEFAULT_SERVE_SCRIPT_VALUE) { - debug(`Found ${ancillary(this.script)}, but it is the default. Not running.`); - } else { - debug(`Using ${ancillary(this.script)} npm script.`); - return this.e.config.get('npmClient'); - } - } - } - - return this.program; - } -} From 6ea2d48da10d2b964ab95961cc9600874279c59d Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Wed, 7 Dec 2022 12:43:34 -0500 Subject: [PATCH 02/57] feat(): remove ionicv1 project type BREAKING CHANGE: This commit removes the Ionic V1 project type from the available project integrations. Please migrate to a modern Ionic project. --- .../src/lib/project/ionic1/__tests__/index.ts | 25 --- .../src/lib/project/ionic1/__tests__/serve.ts | 70 -------- .../cli/src/lib/project/ionic1/build.ts | 51 ------ .../cli/src/lib/project/ionic1/index.ts | 154 ----------------- .../cli/src/lib/project/ionic1/serve.ts | 161 ------------------ 5 files changed, 461 deletions(-) delete mode 100644 packages/@ionic/cli/src/lib/project/ionic1/__tests__/index.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic1/__tests__/serve.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic1/build.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic1/index.ts delete mode 100644 packages/@ionic/cli/src/lib/project/ionic1/serve.ts diff --git a/packages/@ionic/cli/src/lib/project/ionic1/__tests__/index.ts b/packages/@ionic/cli/src/lib/project/ionic1/__tests__/index.ts deleted file mode 100644 index 1e330ef2f0..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic1/__tests__/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as path from 'path' -import { Ionic1Project } from '../'; - -describe('@ionic/cli', () => { - - describe('lib/project/ionic1', () => { - - describe('Ionic1Project', () => { - - let p: Ionic1Project; - - beforeEach(() => { - p = new Ionic1Project({ context: 'app', configPath: '/path/to/proj/file' } as any, {} as any); - jest.spyOn(p, 'config', 'get').mockImplementation(() => ({ get: () => undefined } as any)); - }); - - it('should set directory attribute', async () => { - expect(p.directory).toEqual(path.resolve('/path/to/proj')); - }); - - }); - - }); - -}); diff --git a/packages/@ionic/cli/src/lib/project/ionic1/__tests__/serve.ts b/packages/@ionic/cli/src/lib/project/ionic1/__tests__/serve.ts deleted file mode 100644 index 50e1888d6d..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic1/__tests__/serve.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Ionic1ServeRunner } from '../serve'; - -describe('@ionic/cli', () => { - - describe('lib/project/ionic1/serve', () => { - - describe('Ionic1ServeRunner', () => { - - describe('createOptionsFromCommandLine', () => { - - const defaults = { - '--': [], - publicHost: undefined, - host: 'localhost', - browser: undefined, - browserOption: undefined, - consolelogs: false, - engine: 'browser', - externalAddressRequired: false, - lab: false, - labHost: 'localhost', - labPort: 8200, - livereload: true, - livereloadPort: 35729, - notificationPort: 53703, - open: false, - port: 8100, - proxy: true, - serverlogs: false, - project: undefined, - verbose: false, - }; - - it('should provide defaults with no options', () => { - const runner = new Ionic1ServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [] }); - expect(result).toEqual(defaults); - }); - - it('should provide options from negations of cli flag defaults', () => { - const runner = new Ionic1ServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); - expect(result).toEqual({ ...defaults, livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); - }); - - it('should allow overrides of default values', () => { - const runner = new Ionic1ServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], host: '0.0.0.0', port: '1111', 'livereload-port': '2222', 'dev-logger-port': '3333' }); - expect(result).toEqual({ ...defaults, host: '0.0.0.0', port: 1111, livereloadPort: 2222, notificationPort: 3333 }); - }); - - it('should respect --external flag', () => { - const runner = new Ionic1ServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], host: 'localhost', external: true }); - expect(result).toEqual({ ...defaults, host: '0.0.0.0' }); - }); - - it('should pass on separated args', () => { - const runner = new Ionic1ServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], '--': ['foo', '--bar'] }); - expect(result).toEqual({ ...defaults, '--': ['foo', '--bar'] }); - }); - - }); - - }); - - }); - -}); diff --git a/packages/@ionic/cli/src/lib/project/ionic1/build.ts b/packages/@ionic/cli/src/lib/project/ionic1/build.ts deleted file mode 100644 index ed8e7a1963..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic1/build.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { CommandLineInputs, CommandLineOptions, CommandMetadata, Ionic1BuildOptions } from '../../../definitions'; -import { BUILD_SCRIPT, BuildCLI, BuildRunner, BuildRunnerDeps } from '../../build'; - -import { Ionic1Project } from './'; - -export interface Ionic1BuildRunnerDeps extends BuildRunnerDeps { - readonly project: Ionic1Project; -} - -export class Ionic1BuildRunner extends BuildRunner { - constructor(protected readonly e: Ionic1BuildRunnerDeps) { - super(); - } - - async getCommandMetadata(): Promise> { - return {}; - } - - createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): Ionic1BuildOptions { - const baseOptions = super.createBaseOptionsFromCommandLine(inputs, options); - - return { - ...baseOptions, - type: 'ionic1', - }; - } - - async buildProject(options: Ionic1BuildOptions): Promise { - const v1 = new Ionic1BuildCLI(this.e); - await v1.build(options); - } -} - -class Ionic1BuildCLI extends BuildCLI { - readonly name = 'Ionic 1 Toolkit'; - readonly pkg = '@ionic/v1-toolkit'; - readonly program = 'ionic-v1'; - readonly prefix = 'v1'; - readonly script = BUILD_SCRIPT; - - protected async buildArgs(options: Ionic1BuildOptions): Promise { - const { pkgManagerArgs } = await import('../../utils/npm'); - - if (this.resolvedProgram === this.program) { - return ['build']; - } else { - const [ , ...pkgArgs ] = await pkgManagerArgs(this.e.config.get('npmClient'), { command: 'run', script: this.script }); - return pkgArgs; - } - } -} diff --git a/packages/@ionic/cli/src/lib/project/ionic1/index.ts b/packages/@ionic/cli/src/lib/project/ionic1/index.ts deleted file mode 100644 index 5d2bb181ad..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic1/index.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { PackageJson } from '@ionic/cli-framework'; -import { readJson } from '@ionic/utils-fs'; -import { prettyPath } from '@ionic/utils-terminal'; -import * as Debug from 'debug'; -import * as lodash from 'lodash'; -import * as path from 'path'; - -import { Project } from '../'; -import { InfoItem } from '../../../definitions'; -import { strong } from '../../color'; -import { FatalException, RunnerNotFoundException } from '../../errors'; - -const debug = Debug('ionic:lib:project:angular'); - -export const ERROR_INVALID_BOWER_JSON = 'INVALID_BOWER_JSON'; - -export interface BowerJson { - name: string; - dependencies?: { [key: string]: string | undefined; }; - devDependencies?: { [key: string]: string | undefined; }; -} - -function isBowerJson(obj: any): obj is BowerJson { - return obj && typeof obj.name === 'string'; -} - -async function readBowerJsonFile(p: string): Promise { - const bowerJson = await readJson(p); - - if (!isBowerJson(bowerJson)) { - throw ERROR_INVALID_BOWER_JSON; - } - - return bowerJson; -} - -export class Ionic1Project extends Project { - readonly type: 'ionic1' = 'ionic1'; - protected bowerJsonFile?: BowerJson; - - async getInfo(): Promise { - const [ - ionic1Version, - [ v1ToolkitPkg ], - ] = await (Promise.all([ - this.getFrameworkVersion(), - this.getPackageJson('@ionic/v1-toolkit'), - ])); - - return [ - ...(await super.getInfo()), - { - group: 'ionic', - name: 'Ionic Framework', - key: 'framework', - value: ionic1Version ? `ionic1 ${ionic1Version}` : 'unknown', - }, - { - group: 'ionic', - name: '@ionic/v1-toolkit', - value: v1ToolkitPkg ? v1ToolkitPkg.version : 'not installed', - }, - ]; - } - - async detected() { - try { - const bwr = await readBowerJsonFile(path.resolve(this.directory, 'bower.json')); - const deps = lodash.assign({}, bwr.dependencies, bwr.devDependencies); - - if (typeof deps['ionic'] === 'string') { - debug(`${strong('ionic')} detected in ${strong('bower.json')}`); - return true; - } - } catch (e) { - // ignore - } - - return false; - } - - async getSourceDir(): Promise { - return this.getDistDir(); // ionic1's source directory is the dist directory - } - - async getDocsUrl(): Promise { - return 'https://ion.link/v1-docs'; - } - - // this method search not only package.json - async getFrameworkVersion(): Promise { - const ionicVersionFilePath = path.resolve(await this.getDistDir(), 'lib', 'ionic', 'version.json'); // TODO - const bowerJsonPath = path.resolve(this.directory, 'bower.json'); - - try { - try { - const ionicVersionJson = await readJson(ionicVersionFilePath); - return ionicVersionJson['version']; - } catch (e) { - const bwr = await this.loadBowerJson(); - const deps = lodash.assign({}, bwr.dependencies, bwr.devDependencies); - - const ionicEntry = deps['ionic']; - - if (!ionicEntry) { - return; - } - - const m = ionicEntry.match(/.+#(.+)/); - - if (m && m[1]) { - return m[1]; - } - } - } catch (e) { - this.e.log.error(`Error with ${strong(prettyPath(bowerJsonPath))} file: ${e}`); - } - } - - async loadBowerJson(): Promise { - if (!this.bowerJsonFile) { - const bowerJsonPath = path.resolve(this.directory, 'bower.json'); - try { - this.bowerJsonFile = await readBowerJsonFile(bowerJsonPath); - } catch (e) { - if (e instanceof SyntaxError) { - throw new FatalException(`Could not parse ${strong('bower.json')}. Is it a valid JSON file?`); - } else if (e === ERROR_INVALID_BOWER_JSON) { - throw new FatalException(`The ${strong('bower.json')} file seems malformed.`); - } - - throw e; // Probably file not found - } - } - - return this.bowerJsonFile; - } - - async requireBuildRunner(): Promise { - const { Ionic1BuildRunner } = await import('./build'); - const deps = { ...this.e, project: this }; - return new Ionic1BuildRunner(deps); - } - - async requireServeRunner(): Promise { - const { Ionic1ServeRunner } = await import('./serve'); - const deps = { ...this.e, project: this }; - return new Ionic1ServeRunner(deps); - } - - async requireGenerateRunner(): Promise { - throw new RunnerNotFoundException('Generators are not supported in Ionic 1 projects.'); - } -} diff --git a/packages/@ionic/cli/src/lib/project/ionic1/serve.ts b/packages/@ionic/cli/src/lib/project/ionic1/serve.ts deleted file mode 100644 index 8a26d68cd9..0000000000 --- a/packages/@ionic/cli/src/lib/project/ionic1/serve.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { MetadataGroup } from '@ionic/cli-framework'; -import { str2num } from '@ionic/cli-framework/utils/string'; - -import { CommandLineInputs, CommandLineOptions, CommandMetadata, Ionic1ServeOptions, ServeDetails } from '../../../definitions'; -import { BIND_ALL_ADDRESS, DEFAULT_DEV_LOGGER_PORT, DEFAULT_LIVERELOAD_PORT, LOCAL_ADDRESSES, SERVE_SCRIPT, ServeCLI, ServeRunner, ServeRunnerDeps } from '../../serve'; -import { findOpenIonicPorts } from '../common'; - -import { Ionic1Project } from './'; - -export interface Ionic1ServeRunnerDeps extends ServeRunnerDeps { - readonly project: Ionic1Project; -} - -export class Ionic1ServeRunner extends ServeRunner { - constructor(protected readonly e: Ionic1ServeRunnerDeps) { - super(); - } - - async getCommandMetadata(): Promise> { - return { - options: [ - { - name: 'consolelogs', - summary: 'Print app console logs to Ionic CLI', - type: Boolean, - groups: ['cordova'], - aliases: ['c'], - }, - { - name: 'serverlogs', - summary: 'Print dev server logs to Ionic CLI', - type: Boolean, - aliases: ['s'], - groups: [MetadataGroup.HIDDEN, 'cordova'], - }, - { - name: 'livereload-port', - summary: 'Use specific port for live-reload', - default: DEFAULT_LIVERELOAD_PORT.toString(), - aliases: ['r'], - groups: [MetadataGroup.ADVANCED, 'cordova'], - spec: { value: 'port' }, - }, - { - name: 'dev-logger-port', - summary: 'Use specific port for dev server communication', - default: DEFAULT_DEV_LOGGER_PORT.toString(), - groups: [MetadataGroup.ADVANCED, 'cordova'], - spec: { value: 'port' }, - }, - { - name: 'proxy', - summary: 'Do not add proxies', - type: Boolean, - default: true, - groups: [MetadataGroup.ADVANCED, 'cordova'], - // TODO: Adding 'x' to aliases here has some weird behavior with minimist. - }, - ], - exampleCommands: [ - '-c', - ], - }; - } - - createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): Ionic1ServeOptions { - const baseOptions = super.createOptionsFromCommandLine(inputs, options); - const livereloadPort = str2num(options['livereload-port'], DEFAULT_LIVERELOAD_PORT); - const notificationPort = str2num(options['dev-logger-port'], DEFAULT_DEV_LOGGER_PORT); - - return { - ...baseOptions, - consolelogs: options['consolelogs'] ? true : false, - serverlogs: options['serverlogs'] ? true : false, - livereloadPort, - notificationPort, - }; - } - - modifyOpenUrl(url: string, options: Ionic1ServeOptions): string { - return `${url}${options.browserOption ? options.browserOption : ''}${options.platform ? `?ionicplatform=${options.platform}` : ''}`; - } - - async serveProject(options: Ionic1ServeOptions): Promise { - const [ externalIP, availableInterfaces ] = await this.selectExternalIP(options); - const { port, livereloadPort, notificationPort } = await findOpenIonicPorts(options.host, options); - - options.port = port; - options.livereloadPort = livereloadPort; - options.notificationPort = notificationPort; - - const v1 = new Ionic1ServeCLI(this.e); - await v1.serve(options); - - return { - custom: v1.resolvedProgram !== v1.program, - protocol: 'http', - localAddress: 'localhost', - externalAddress: externalIP, - externalNetworkInterfaces: availableInterfaces, - port, - externallyAccessible: ![BIND_ALL_ADDRESS, ...LOCAL_ADDRESSES].includes(externalIP), - }; - } - - getUsedPorts(options: Ionic1ServeOptions, details: ServeDetails): number[] { - return [ - ...super.getUsedPorts(options, details), - ...options.livereloadPort ? [options.livereloadPort] : [], - ...options.notificationPort ? [options.notificationPort] : [], - ]; - } -} - -class Ionic1ServeCLI extends ServeCLI { - readonly name = 'Ionic 1 Toolkit'; - readonly pkg = '@ionic/v1-toolkit'; - readonly program = 'ionic-v1'; - readonly prefix = 'v1'; - readonly script = SERVE_SCRIPT; - - protected stdoutFilter(line: string): boolean { - if (this.resolvedProgram !== this.program) { - return super.stdoutFilter(line); - } - - if (line.includes('server running')) { - this.emit('ready'); - return false; - } - - return true; - } - - protected async buildArgs(options: Ionic1ServeOptions): Promise { - const { pkgManagerArgs } = await import('../../utils/npm'); - - const args = [ - `--host=${options.host}`, - `--port=${String(options.port)}`, - `--livereload-port=${String(options.livereloadPort)}`, - `--dev-port=${String(options.notificationPort)}`, - `--engine=${options.engine}`, - ]; - - if (options.platform) { - args.push(`--platform=${options.platform}`); - } - - if (options.consolelogs) { - args.push('-c'); - } - - if (this.resolvedProgram === this.program) { - return ['serve', ...args]; - } else { - const [ , ...pkgArgs ] = await pkgManagerArgs(this.e.config.get('npmClient'), { command: 'run', script: this.script, scriptArgs: [...args] }); - return pkgArgs; - } - } -} From d40da3d07da909f82807fe7182c035c69d20a65c Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Wed, 7 Dec 2022 12:56:34 -0500 Subject: [PATCH 03/57] feat(): remove v3 and v1 integrations BREAKING CHANGE: This commit removes integrations with V1 and V3 Ionic project types --- packages/@ionic/cli/src/lib/project/index.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/@ionic/cli/src/lib/project/index.ts b/packages/@ionic/cli/src/lib/project/index.ts index 349123f31e..4d69ceee82 100644 --- a/packages/@ionic/cli/src/lib/project/index.ts +++ b/packages/@ionic/cli/src/lib/project/index.ts @@ -307,12 +307,6 @@ export async function createProjectFromDetails(details: ProjectDetailsResult, de case 'vue': const { VueProject } = await import('./vue'); return new VueProject(details, deps); - case 'ionic-angular': - const { IonicAngularProject } = await import('./ionic-angular'); - return new IonicAngularProject(details, deps); - case 'ionic1': - const { Ionic1Project } = await import('./ionic1'); - return new Ionic1Project(details, deps); case 'custom': const { CustomProject } = await import('./custom'); return new CustomProject(details, deps); From 40fd6842fb0b338885b2d1eeb83dd705a94a6e57 Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Wed, 7 Dec 2022 12:58:37 -0500 Subject: [PATCH 04/57] refactor(angular): rework angular generators command Rework commands so that most angular generate options do not conflict with internal ionic cli options. --- packages/@ionic/cli/src/definitions.ts | 3 +- packages/@ionic/cli/src/lib/generate.ts | 4 +-- .../cli/src/lib/project/angular/generate.ts | 35 ++++++++++--------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/@ionic/cli/src/definitions.ts b/packages/@ionic/cli/src/definitions.ts index 7b49e6216b..bdc31ca4f3 100644 --- a/packages/@ionic/cli/src/definitions.ts +++ b/packages/@ionic/cli/src/definitions.ts @@ -691,15 +691,16 @@ export interface Ionic1BuildOptions extends BuildOptions<'ionic1'> {} export interface CustomBuildOptions extends BuildOptions<'custom'> {} export interface GenerateOptions { - type: string; name: string; } export interface AngularGenerateOptions extends GenerateOptions { [key: string]: any; // TODO + schematic: string; } export interface IonicAngularGenerateOptions extends GenerateOptions { + type: string; module: boolean; constants: boolean; } diff --git a/packages/@ionic/cli/src/lib/generate.ts b/packages/@ionic/cli/src/lib/generate.ts index 2299845f78..f453ff44e1 100644 --- a/packages/@ionic/cli/src/lib/generate.ts +++ b/packages/@ionic/cli/src/lib/generate.ts @@ -15,8 +15,8 @@ export abstract class GenerateRunner implements Runne protected abstract readonly e: GenerateRunnerDeps; createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): GenerateOptions { - const [ type, name ] = inputs; - return { type, name }; + const [ name ] = inputs; + return { name }; } async ensureCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): Promise { /* overwritten in subclasses */ } diff --git a/packages/@ionic/cli/src/lib/project/angular/generate.ts b/packages/@ionic/cli/src/lib/project/angular/generate.ts index b05866ed3b..468eb4251f 100644 --- a/packages/@ionic/cli/src/lib/project/angular/generate.ts +++ b/packages/@ionic/cli/src/lib/project/angular/generate.ts @@ -58,7 +58,7 @@ To test a generator before file modifications are made, use the ${input('--dry-r ], inputs: [ { - name: 'type', + name: 'schematic', summary: `The type of feature (e.g. ${['page', 'component', 'directive', 'service'].map(c => input(c)).join(', ')})`, validators: [validators.required], }, @@ -75,22 +75,22 @@ To test a generator before file modifications are made, use the ${input('--dry-r if (inputs[0]) { this.validateFeatureType(inputs[0]); } else { - const type = await this.e.prompt({ + const schematic = await this.e.prompt({ type: 'list', - name: 'type', + name: 'schematic', message: 'What would you like to generate?', choices: SCHEMATICS, }); - inputs[0] = type; + inputs[0] = schematic; } if (!inputs[1]) { - const type = SCHEMATIC_ALIAS.get(inputs[0]) || inputs[0]; + const schematic = SCHEMATIC_ALIAS.get(inputs[0]) || inputs[0]; const name = await this.e.prompt({ type: 'input', name: 'name', - message: `Name/path of ${input(type)}:`, + message: `Name/path of ${input(schematic)}:`, validate: v => validators.required(v), }); @@ -99,7 +99,8 @@ To test a generator before file modifications are made, use the ${input('--dry-r } createOptionsFromCommandLine(inputs: CommandLineInputs, options: CommandLineOptions): AngularGenerateOptions { - const baseOptions = super.createOptionsFromCommandLine(inputs, options); + const [schematic, name] = inputs; + const baseOptions = {name, schematic} const project = options['project'] ? String(options['project']) : 'app'; // TODO: this is a little gross, is there a better way to pass in all the @@ -113,22 +114,22 @@ To test a generator before file modifications are made, use the ${input('--dry-r async run(options: AngularGenerateOptions) { const { name } = options; - const type = SCHEMATIC_ALIAS.get(options.type) || options.type; + const schematic = SCHEMATIC_ALIAS.get(options.schematic) || options.schematic; try { - await this.generateComponent(type, name, lodash.omit(options, 'type', 'name')); + await this.generateComponent(schematic, name, lodash.omit(options, 'schematic', 'name')); } catch (e) { debug(e); - throw new FatalException(`Could not generate ${input(type)}.`); + throw new FatalException(`Could not generate ${input(schematic)}.`); } if (!options['dry-run']) { - this.e.log.ok(`Generated ${input(type)}!`); + this.e.log.ok(`Generated ${input(schematic)}!`); } } - private validateFeatureType(type: string) { - if (type === 'provider') { + private validateFeatureType(schematic: string) { + if (schematic === 'provider') { throw new FatalException( `Please use ${input('ionic generate service')} for generating service providers.\n` + `For more information, please see the Angular documentation${ancillary('[1]')} on services.\n\n` + @@ -136,17 +137,17 @@ To test a generator before file modifications are made, use the ${input('--dry-r ); } - if (!SCHEMATICS.includes(type) && !SCHEMATIC_ALIAS.get(type)) { + if (!SCHEMATICS.includes(schematic) && !SCHEMATIC_ALIAS.get(schematic)) { throw new FatalException( - `${input(type)} is not a known feature.\n` + + `${input(schematic)} is not a known feature.\n` + `Use ${input('npx ng g --help')} to list available types of features.` ); } } - private async generateComponent(type: string, name: string, options: { [key: string]: string | boolean; }) { + private async generateComponent(schematic: string, name: string, options: { [key: string]: string | boolean; }) { const args = { - _: ['generate', type, name], + _: ['generate', schematic, name], // convert `--no-` style options to `--=false` ...lodash.mapValues(options, v => v === false ? 'false' : v), }; From a2eb4b2cf46e0f2004c1850acfdeada46fb211b5 Mon Sep 17 00:00:00 2001 From: smzelek <11831150+smzelek@users.noreply.github.com> Date: Mon, 13 Mar 2023 18:52:12 -0400 Subject: [PATCH 05/57] fix(cli): native solution preview should no longer be hidden (#4962) --- packages/@ionic/cli/assets/oauth/success/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@ionic/cli/assets/oauth/success/index.html b/packages/@ionic/cli/assets/oauth/success/index.html index 99c5732207..a945060dd4 100644 --- a/packages/@ionic/cli/assets/oauth/success/index.html +++ b/packages/@ionic/cli/assets/oauth/success/index.html @@ -87,13 +87,13 @@ font-weight: 400; } - .ad-box{ + .native-solutions{ display:block; text-align:center; padding-top:30px; } - .ad-box>ion-card{ + .native-solutions>ion-card{ width:300px; display:inline-block; } @@ -125,7 +125,7 @@

Your app is now building in your t

There was an error logging in. Please return to the terminal.

-
+
From 5c23518b1a7bda4f020a82ced5557e157ccdbbc7 Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Thu, 16 Mar 2023 09:50:32 -0400 Subject: [PATCH 06/57] fix(): update test to reflect new output (#4967) --- .../@ionic/cli/src/lib/project/angular/__tests__/generate.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@ionic/cli/src/lib/project/angular/__tests__/generate.ts b/packages/@ionic/cli/src/lib/project/angular/__tests__/generate.ts index aa8aa8ae5d..62cc285182 100644 --- a/packages/@ionic/cli/src/lib/project/angular/__tests__/generate.ts +++ b/packages/@ionic/cli/src/lib/project/angular/__tests__/generate.ts @@ -12,7 +12,7 @@ describe('@ionic/cli', () => { const defaults = { name: undefined, project: 'app', - type: undefined, + schematic: undefined, }; it('should provide defaults with no inputs or options', () => { @@ -24,7 +24,7 @@ describe('@ionic/cli', () => { it('should provide options from inputs', () => { const runner = new AngularGenerateRunner({} as any); const result = runner.createOptionsFromCommandLine(['service', 'FancyBar'], { _: [] }); - expect(result).toEqual({ ...defaults, name: 'FancyBar', type: 'service' }); + expect(result).toEqual({ ...defaults, name: 'FancyBar', schematic: 'service' }); }); it('should respect --project', () => { From 5d7f4a74e7ed902209086addd744bb1990ae444f Mon Sep 17 00:00:00 2001 From: Ionitron Date: Fri, 17 Mar 2023 11:25:00 +0000 Subject: [PATCH 07/57] chore(release): publish [skip ci] - @ionic/cli@6.20.9 - cli-scripts@2.1.63 --- packages/@ionic/cli/CHANGELOG.md | 11 +++++++++++ packages/@ionic/cli/package.json | 2 +- packages/cli-scripts/CHANGELOG.md | 8 ++++++++ packages/cli-scripts/package.json | 4 ++-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/@ionic/cli/CHANGELOG.md b/packages/@ionic/cli/CHANGELOG.md index e5c0461956..8b6de7e04b 100644 --- a/packages/@ionic/cli/CHANGELOG.md +++ b/packages/@ionic/cli/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.20.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/cli@6.20.8...@ionic/cli@6.20.9) (2023-03-17) + + +### Bug Fixes + +* **cli:** native solution preview should no longer be hidden ([#4962](https://github.com/ionic-team/ionic-cli/issues/4962)) ([a2eb4b2](https://github.com/ionic-team/ionic-cli/commit/a2eb4b2cf46e0f2004c1850acfdeada46fb211b5)) + + + + + ## [6.20.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/cli@6.20.7...@ionic/cli@6.20.8) (2023-01-13) **Note:** Version bump only for package @ionic/cli diff --git a/packages/@ionic/cli/package.json b/packages/@ionic/cli/package.json index 935a21687e..043b5015bb 100644 --- a/packages/@ionic/cli/package.json +++ b/packages/@ionic/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/cli", - "version": "6.20.8", + "version": "6.20.9", "description": "A tool for creating and developing Ionic Framework mobile apps.", "homepage": "https://ionicframework.com", "author": "Ionic Team (https://ionicframework.com) ", diff --git a/packages/cli-scripts/CHANGELOG.md b/packages/cli-scripts/CHANGELOG.md index ae947d7310..524980a314 100644 --- a/packages/cli-scripts/CHANGELOG.md +++ b/packages/cli-scripts/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.1.63](https://github.com/ionic-team/ionic-cli/compare/cli-scripts@2.1.62...cli-scripts@2.1.63) (2023-03-17) + +**Note:** Version bump only for package cli-scripts + + + + + ## [2.1.62](https://github.com/ionic-team/ionic-cli/compare/cli-scripts@2.1.61...cli-scripts@2.1.62) (2023-01-13) **Note:** Version bump only for package cli-scripts diff --git a/packages/cli-scripts/package.json b/packages/cli-scripts/package.json index 38caec608d..4ce1ef6f3a 100644 --- a/packages/cli-scripts/package.json +++ b/packages/cli-scripts/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "cli-scripts", - "version": "2.1.62", + "version": "2.1.63", "bin": { "ionic-cli-scripts": "./bin/ionic-cli-scripts" }, @@ -16,7 +16,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@ionic/cli": "6.20.8", + "@ionic/cli": "6.20.9", "@ionic/cli-framework": "5.1.3", "@ionic/utils-fs": "3.1.6", "ansi-styles": "^4.0.0", From 49a90e6ea1ca37efb9efb621cb5241301c9f1dac Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 17 Mar 2023 13:08:51 +0100 Subject: [PATCH 08/57] chore: restore unpublished version --- packages/@ionic/cli/package.json | 2 +- packages/cli-scripts/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@ionic/cli/package.json b/packages/@ionic/cli/package.json index 043b5015bb..935a21687e 100644 --- a/packages/@ionic/cli/package.json +++ b/packages/@ionic/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/cli", - "version": "6.20.9", + "version": "6.20.8", "description": "A tool for creating and developing Ionic Framework mobile apps.", "homepage": "https://ionicframework.com", "author": "Ionic Team (https://ionicframework.com) ", diff --git a/packages/cli-scripts/package.json b/packages/cli-scripts/package.json index 4ce1ef6f3a..1d5beac885 100644 --- a/packages/cli-scripts/package.json +++ b/packages/cli-scripts/package.json @@ -16,7 +16,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@ionic/cli": "6.20.9", + "@ionic/cli": "6.20.8", "@ionic/cli-framework": "5.1.3", "@ionic/utils-fs": "3.1.6", "ansi-styles": "^4.0.0", From 133ad560e62acac8e2c75a0aa4a237ed44eb5834 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 17 Mar 2023 13:10:10 +0100 Subject: [PATCH 09/57] chore(release): publish [skip ci] - @ionic/cli@6.20.9 - cli-scripts@2.1.64 --- packages/@ionic/cli/CHANGELOG.md | 11 +++++++++++ packages/@ionic/cli/package.json | 2 +- packages/cli-scripts/CHANGELOG.md | 8 ++++++++ packages/cli-scripts/package.json | 4 ++-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/@ionic/cli/CHANGELOG.md b/packages/@ionic/cli/CHANGELOG.md index 8b6de7e04b..73dde20771 100644 --- a/packages/@ionic/cli/CHANGELOG.md +++ b/packages/@ionic/cli/CHANGELOG.md @@ -14,6 +14,17 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline +## [6.20.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/cli@6.20.8...@ionic/cli@6.20.9) (2023-03-17) + + +### Bug Fixes + +* **cli:** native solution preview should no longer be hidden ([#4962](https://github.com/ionic-team/ionic-cli/issues/4962)) ([a2eb4b2](https://github.com/ionic-team/ionic-cli/commit/a2eb4b2cf46e0f2004c1850acfdeada46fb211b5)) + + + + + ## [6.20.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/cli@6.20.7...@ionic/cli@6.20.8) (2023-01-13) **Note:** Version bump only for package @ionic/cli diff --git a/packages/@ionic/cli/package.json b/packages/@ionic/cli/package.json index 935a21687e..043b5015bb 100644 --- a/packages/@ionic/cli/package.json +++ b/packages/@ionic/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/cli", - "version": "6.20.8", + "version": "6.20.9", "description": "A tool for creating and developing Ionic Framework mobile apps.", "homepage": "https://ionicframework.com", "author": "Ionic Team (https://ionicframework.com) ", diff --git a/packages/cli-scripts/CHANGELOG.md b/packages/cli-scripts/CHANGELOG.md index 524980a314..87da7ad5df 100644 --- a/packages/cli-scripts/CHANGELOG.md +++ b/packages/cli-scripts/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.1.64](https://github.com/ionic-team/ionic-cli/compare/cli-scripts@2.1.63...cli-scripts@2.1.64) (2023-03-17) + +**Note:** Version bump only for package cli-scripts + + + + + ## [2.1.63](https://github.com/ionic-team/ionic-cli/compare/cli-scripts@2.1.62...cli-scripts@2.1.63) (2023-03-17) **Note:** Version bump only for package cli-scripts diff --git a/packages/cli-scripts/package.json b/packages/cli-scripts/package.json index 1d5beac885..5edf659039 100644 --- a/packages/cli-scripts/package.json +++ b/packages/cli-scripts/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "cli-scripts", - "version": "2.1.63", + "version": "2.1.64", "bin": { "ionic-cli-scripts": "./bin/ionic-cli-scripts" }, @@ -16,7 +16,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "dependencies": { - "@ionic/cli": "6.20.8", + "@ionic/cli": "6.20.9", "@ionic/cli-framework": "5.1.3", "@ionic/utils-fs": "3.1.6", "ansi-styles": "^4.0.0", From 4d0b731f8792fd1886bfadf24be054cbadbdc707 Mon Sep 17 00:00:00 2001 From: Lars Mikkelsen Date: Fri, 17 Mar 2023 11:39:17 -0400 Subject: [PATCH 10/57] fix(ci): fix publish with granular access token --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index edeb2ca4f7..2be1c8aabe 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "docs": "node packages/cli-scripts/bin/ionic-cli-scripts docs", "docs:watch": "chokidar 'packages/cli-scripts/dist/docs/**/*.js' -c 'npm run docs'", "publish:testing": "lerna publish prerelease --preid=testing --exact --no-git-tag-version --no-push --dist-tag=testing", - "publish:ci": "lerna publish -m 'chore(release): publish [skip ci]' --exact --conventional-commits" + "publish:ci": "lerna publish -m 'chore(release): publish [skip ci]' --exact --conventional-commits --no-verify-access" }, "devDependencies": { "chokidar-cli": "^2.0.0", From 3d3c4daffae5385327f46e191c16ed6cf80fec1a Mon Sep 17 00:00:00 2001 From: Lars Mikkelsen Date: Fri, 17 Mar 2023 11:43:57 -0400 Subject: [PATCH 11/57] fix(ci): fix Docker image push --- .github/workflows/cd.yml | 4 +--- .github/workflows/docker-image.yml | 7 ++----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index f1d69f9b83..3af5a40920 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -35,9 +35,7 @@ jobs: - name: Sleep while npm takes its time run: sleep 20 - name: GitHub Container Registry Login - run: echo ${GH_TOKEN} | docker login ghcr.io -u ionitron --password-stdin - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} + run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Build Container run: | docker build \ diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 3ee0d8533c..e2b5c2ad6d 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -14,10 +14,7 @@ jobs: with: fetch-depth: 0 - name: GitHub Container Registry Login - run: echo ${GH_TOKEN} | docker login ghcr.io -u ionitron --password-stdin - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - + run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Build Container run: | docker build \ @@ -28,4 +25,4 @@ jobs: - name: Push Container as latest run: docker push ghcr.io/${{ github.repository }}:latest - name: Push Container as version - run: docker push ghcr.io/${{ github.repository }}:$(npm info @ionic/cli dist-tags.latest) \ No newline at end of file + run: docker push ghcr.io/${{ github.repository }}:$(npm info @ionic/cli dist-tags.latest) From d6512a5139943dbe2084f99e63075db6e6b15b4d Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Mon, 20 Mar 2023 10:56:20 -0400 Subject: [PATCH 12/57] refactor(lab): remove ionic serve --lab option (#4960) BREAKING CHANGE: The `--lab` option has been removed from `ionic serve`. See https://ionicframework.com/docs/developing/previewing for alternatives. --- packages/@ionic/cli/src/commands/index.ts | 1 - packages/@ionic/cli/src/commands/serve.ts | 59 +- packages/@ionic/cli/src/definitions.ts | 3 - .../@ionic/cli/src/lib/__tests__/serve.ts | 7 +- .../lib/project/angular/__tests__/serve.ts | 7 +- packages/@ionic/cli/src/lib/serve.ts | 61 +- packages/@ionic/lab/.gitignore | 3 - packages/@ionic/lab/.npmrc | 1 - packages/@ionic/lab/CHANGELOG.md | 625 ------------------ packages/@ionic/lab/LICENSE | 21 - packages/@ionic/lab/README.md | 10 - packages/@ionic/lab/bin/ionic-lab | 24 - packages/@ionic/lab/jest.config.js | 1 - packages/@ionic/lab/lint-staged.config.js | 1 - packages/@ionic/lab/package.json | 60 -- packages/@ionic/lab/src/index.ts | 135 ---- packages/@ionic/lab/src/stencil/.gitignore | 1 - .../stencil/assets/android-device-skin.png | Bin 12184 -> 0 bytes .../src/stencil/assets/android-statusbar.png | Bin 2608 -> 0 bytes .../@ionic/lab/src/stencil/assets/app.css | 131 ---- .../@ionic/lab/src/stencil/assets/favicon.png | Bin 4256 -> 0 bytes .../@ionic/lab/src/stencil/assets/fonts.css | 132 ---- .../lab/src/stencil/assets/ios-statusbar.png | Bin 3145 -> 0 bytes .../src/stencil/assets/iphone-device-skin.png | Bin 12974 -> 0 bytes .../lab/src/stencil/assets/lab-logo.png | Bin 1900 -> 0 bytes .../@ionic/lab/src/stencil/assets/reboot.css | 281 -------- .../lab/src/stencil/assets/variables.css | 41 -- .../lab/src/stencil/assets/wp-statusbar.png | Bin 1321 -> 0 bytes .../@ionic/lab/src/stencil/components.d.ts | 131 ---- .../components/ionlab-app/ionlab-app.tsx | 123 ---- .../ionlab-device-frame.css | 146 ---- .../ionlab-device-frame.tsx | 55 -- .../ionlab-platform-dropdown.css | 49 -- .../ionlab-platform-dropdown.tsx | 46 -- .../ionlab-preview/ionlab-preview.css | 32 - .../ionlab-preview/ionlab-preview.tsx | 47 -- .../ionlab-sidebar/ionlab-sidebar.css | 35 - .../ionlab-sidebar/ionlab-sidebar.tsx | 37 -- .../sk-fading-circle/sk-fading-circle.css | 157 ----- .../sk-fading-circle/sk-fading-circle.tsx | 24 - .../@ionic/lab/src/stencil/declarations.d.ts | 9 - packages/@ionic/lab/src/stencil/index.html | 34 - .../@ionic/lab/src/stencil/utils/index.ts | 35 - packages/@ionic/lab/stencil.config.js | 20 - packages/@ionic/lab/tsconfig.json | 17 - 45 files changed, 11 insertions(+), 2591 deletions(-) delete mode 100644 packages/@ionic/lab/.gitignore delete mode 100644 packages/@ionic/lab/.npmrc delete mode 100644 packages/@ionic/lab/CHANGELOG.md delete mode 100644 packages/@ionic/lab/LICENSE delete mode 100644 packages/@ionic/lab/README.md delete mode 100755 packages/@ionic/lab/bin/ionic-lab delete mode 100644 packages/@ionic/lab/jest.config.js delete mode 100644 packages/@ionic/lab/lint-staged.config.js delete mode 100644 packages/@ionic/lab/package.json delete mode 100644 packages/@ionic/lab/src/index.ts delete mode 100644 packages/@ionic/lab/src/stencil/.gitignore delete mode 100644 packages/@ionic/lab/src/stencil/assets/android-device-skin.png delete mode 100644 packages/@ionic/lab/src/stencil/assets/android-statusbar.png delete mode 100644 packages/@ionic/lab/src/stencil/assets/app.css delete mode 100644 packages/@ionic/lab/src/stencil/assets/favicon.png delete mode 100644 packages/@ionic/lab/src/stencil/assets/fonts.css delete mode 100644 packages/@ionic/lab/src/stencil/assets/ios-statusbar.png delete mode 100644 packages/@ionic/lab/src/stencil/assets/iphone-device-skin.png delete mode 100644 packages/@ionic/lab/src/stencil/assets/lab-logo.png delete mode 100644 packages/@ionic/lab/src/stencil/assets/reboot.css delete mode 100644 packages/@ionic/lab/src/stencil/assets/variables.css delete mode 100644 packages/@ionic/lab/src/stencil/assets/wp-statusbar.png delete mode 100644 packages/@ionic/lab/src/stencil/components.d.ts delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-app/ionlab-app.tsx delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.css delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.tsx delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-platform-dropdown/ionlab-platform-dropdown.css delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-platform-dropdown/ionlab-platform-dropdown.tsx delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-preview/ionlab-preview.css delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-preview/ionlab-preview.tsx delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-sidebar/ionlab-sidebar.css delete mode 100644 packages/@ionic/lab/src/stencil/components/ionlab-sidebar/ionlab-sidebar.tsx delete mode 100644 packages/@ionic/lab/src/stencil/components/sk-fading-circle/sk-fading-circle.css delete mode 100644 packages/@ionic/lab/src/stencil/components/sk-fading-circle/sk-fading-circle.tsx delete mode 100644 packages/@ionic/lab/src/stencil/declarations.d.ts delete mode 100644 packages/@ionic/lab/src/stencil/index.html delete mode 100644 packages/@ionic/lab/src/stencil/utils/index.ts delete mode 100644 packages/@ionic/lab/stencil.config.js delete mode 100644 packages/@ionic/lab/tsconfig.json diff --git a/packages/@ionic/cli/src/commands/index.ts b/packages/@ionic/cli/src/commands/index.ts index 427a73aabf..b77b78d93f 100644 --- a/packages/@ionic/cli/src/commands/index.ts +++ b/packages/@ionic/cli/src/commands/index.ts @@ -81,7 +81,6 @@ export class IonicNamespace extends Namespace { ['state', async () => { const { StateCommand } = await import('./state'); return new StateCommand(this); }], ['telemetry', async () => { const { TelemetryCommand } = await import('./telemetry'); return new TelemetryCommand(this); }], ['version', async () => { const { VersionCommand } = await import('./version'); return new VersionCommand(this); }], - ['lab', async () => { const { LabCommand } = await import('./serve'); return new LabCommand(this); }], ['g', 'generate'], ['s', 'serve'], ]); diff --git a/packages/@ionic/cli/src/commands/serve.ts b/packages/@ionic/cli/src/commands/serve.ts index 284cf494cd..6b21d317e0 100644 --- a/packages/@ionic/cli/src/commands/serve.ts +++ b/packages/@ionic/cli/src/commands/serve.ts @@ -3,11 +3,10 @@ import { sleepForever } from '@ionic/utils-process'; import * as lodash from 'lodash'; import { CommandInstanceInfo, CommandLineInputs, CommandLineOptions, CommandMetadata, CommandMetadataOption, CommandPreRun } from '../definitions'; -import { input, strong, weak } from '../lib/color'; +import { input } from '../lib/color'; import { Command } from '../lib/command'; import { FatalException, RunnerException } from '../lib/errors'; -import { getFullCommandParts } from '../lib/executor'; -import { BROWSERS, COMMON_SERVE_COMMAND_OPTIONS, DEFAULT_LAB_PORT } from '../lib/serve'; +import { BROWSERS, COMMON_SERVE_COMMAND_OPTIONS } from '../lib/serve'; export class ServeCommand extends Command implements CommandPreRun { async getMetadata(): Promise { @@ -15,22 +14,6 @@ export class ServeCommand extends Command implements CommandPreRun { let options: CommandMetadataOption[] = [ ...COMMON_SERVE_COMMAND_OPTIONS, - { - name: 'lab-host', - summary: 'Use specific host for Ionic Lab server', - default: 'localhost', - groups: [MetadataGroup.ADVANCED], - spec: { value: 'host' }, - hint: weak('(--lab)'), - }, - { - name: 'lab-port', - summary: 'Use specific port for Ionic Lab server', - default: DEFAULT_LAB_PORT.toString(), - groups: [MetadataGroup.ADVANCED], - spec: { value: 'port' }, - hint: weak('(--lab)'), - }, { name: 'open', summary: 'Do not open a browser window', @@ -51,23 +34,15 @@ export class ServeCommand extends Command implements CommandPreRun { groups: [MetadataGroup.ADVANCED], spec: { value: 'path' }, }, - { - name: 'lab', - summary: 'Test your apps on multiple platform types in the browser', - type: Boolean, - aliases: ['l'], - }, ]; - const exampleCommands = ['', '--external', '--lab']; + const exampleCommands = ['', '--external']; const footnotes: Footnote[] = []; let description = ` Easily spin up a development server which launches in your browser. It watches for changes in your source files and automatically reloads with the updated build. -By default, ${input('ionic serve')} boots up a development server on ${input('localhost')}. To serve to your LAN, specify the ${input('--external')} option, which will use all network interfaces and print the external address(es) on which your app is being served. - -Try the ${input('--lab')} option to see multiple platforms at once.`; +By default, ${input('ionic serve')} boots up a development server on ${input('localhost')}. To serve to your LAN, specify the ${input('--external')} option, which will use all network interfaces and print the external address(es) on which your app is being served.`; const runner = this.project && await this.project.getServeRunner(); @@ -93,13 +68,6 @@ Try the ${input('--lab')} option to see multiple platforms at once.`; } async preRun(inputs: CommandLineInputs, options: CommandLineOptions, { location }: CommandInstanceInfo): Promise { - const parts = getFullCommandParts(location); - const alias = lodash.last(parts); - - if (alias === 'lab') { - options['lab'] = true; - } - if (options['nolivereload']) { this.env.log.warn(`The ${input('--nolivereload')} option has been deprecated. Please use ${input('--no-livereload')}.`); options['livereload'] = false; @@ -145,22 +113,3 @@ Try the ${input('--lab')} option to see multiple platforms at once.`; await sleepForever(); } } - -export class LabCommand extends ServeCommand { - async getMetadata(): Promise { - const metadata = await super.getMetadata(); - const groups = [...metadata.groups || [], MetadataGroup.HIDDEN]; - const exampleCommands = [...metadata.exampleCommands || []].filter(c => !c.includes('--lab')); - - return { - ...metadata, - summary: 'Start Ionic Lab for multi-platform dev/testing', - description: ` -Start an instance of ${strong('Ionic Lab')}, a tool for developing Ionic apps for multiple platforms at once side-by-side. - -${input('ionic lab')} is just a convenient shortcut for ${input('ionic serve --lab')}.`, - groups, - exampleCommands, - }; - } -} diff --git a/packages/@ionic/cli/src/definitions.ts b/packages/@ionic/cli/src/definitions.ts index bdc31ca4f3..7bd0922d71 100644 --- a/packages/@ionic/cli/src/definitions.ts +++ b/packages/@ionic/cli/src/definitions.ts @@ -712,9 +712,6 @@ export interface ServeOptions { publicHost?: string; livereload: boolean; proxy: boolean; - lab: boolean; - labHost: string; - labPort: number; open: boolean; browser?: string; browserOption?: string; diff --git a/packages/@ionic/cli/src/lib/__tests__/serve.ts b/packages/@ionic/cli/src/lib/__tests__/serve.ts index e9da53993f..48c25bb61c 100644 --- a/packages/@ionic/cli/src/lib/__tests__/serve.ts +++ b/packages/@ionic/cli/src/lib/__tests__/serve.ts @@ -26,9 +26,6 @@ describe('@ionic/cli', () => { browserOption: undefined, engine: 'browser', externalAddressRequired: false, - lab: false, - labHost: 'localhost', - labPort: 8200, livereload: true, open: false, port: 8100, @@ -45,8 +42,8 @@ describe('@ionic/cli', () => { it('should provide options from negations of cli flag defaults', () => { const runner = new MyServeRunner({}); - const result = runner.createOptionsFromCommandLine([], { _: [], livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); - expect(result).toEqual({ ...defaults, livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); + const result = runner.createOptionsFromCommandLine([], { _: [], livereload: false, proxy: false, open: true, externalAddressRequired: true }); + expect(result).toEqual({ ...defaults, livereload: false, proxy: false, open: true, externalAddressRequired: true }); }); it('should allow overrides of default values', () => { diff --git a/packages/@ionic/cli/src/lib/project/angular/__tests__/serve.ts b/packages/@ionic/cli/src/lib/project/angular/__tests__/serve.ts index 3c369e4a72..dbfe0e850c 100644 --- a/packages/@ionic/cli/src/lib/project/angular/__tests__/serve.ts +++ b/packages/@ionic/cli/src/lib/project/angular/__tests__/serve.ts @@ -17,9 +17,6 @@ describe('@ionic/cli', () => { browserOption: undefined, engine: 'browser', externalAddressRequired: false, - lab: false, - labHost: 'localhost', - labPort: 8200, livereload: true, open: false, port: 8100, @@ -38,8 +35,8 @@ describe('@ionic/cli', () => { it('should provide options from negations of cli flag defaults', () => { const runner = new AngularServeRunner({} as any); - const result = runner.createOptionsFromCommandLine([], { _: [], livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); - expect(result).toEqual({ ...defaults, livereload: false, proxy: false, lab: true, open: true, externalAddressRequired: true }); + const result = runner.createOptionsFromCommandLine([], { _: [], livereload: false, proxy: false, open: true, externalAddressRequired: true }); + expect(result).toEqual({ ...defaults, livereload: false, proxy: false, open: true, externalAddressRequired: true }); }); it('should allow overrides of default values', () => { diff --git a/packages/@ionic/cli/src/lib/serve.ts b/packages/@ionic/cli/src/lib/serve.ts index 0027a043cc..8f63bcfb4a 100644 --- a/packages/@ionic/cli/src/lib/serve.ts +++ b/packages/@ionic/cli/src/lib/serve.ts @@ -2,7 +2,7 @@ import { BaseError, MetadataGroup, ParsedArgs, unparseArgs } from '@ionic/cli-fr import { LOGGER_LEVELS, createPrefixedFormatter } from '@ionic/cli-framework-output'; import { PromptModule } from '@ionic/cli-framework-prompts'; import { str2num } from '@ionic/cli-framework/utils/string'; -import { NetworkInterface, findClosestOpenPort, getExternalIPv4Interfaces, isHostConnectable } from '@ionic/utils-network'; +import { NetworkInterface, getExternalIPv4Interfaces, isHostConnectable } from '@ionic/utils-network'; import { createProcessEnv, killProcessTree, onBeforeExit, processExit } from '@ionic/utils-process'; import * as chalk from 'chalk'; import * as Debug from 'debug'; @@ -11,7 +11,7 @@ import * as lodash from 'lodash'; import * as split2 from 'split2'; import * as stream from 'stream'; -import { CommandLineInputs, CommandLineOptions, CommandMetadata, CommandMetadataOption, IConfig, ILogger, IProject, IShell, IonicEnvironmentFlags, LabServeDetails, NpmClient, Runner, ServeDetails, ServeOptions } from '../definitions'; +import { CommandLineInputs, CommandLineOptions, CommandMetadata, CommandMetadataOption, IConfig, ILogger, IProject, IShell, IonicEnvironmentFlags, NpmClient, Runner, ServeDetails, ServeOptions } from '../definitions'; import { ancillary, input, strong, weak } from './color'; import { FatalException, ServeCLIProgramNotFoundException } from './errors'; @@ -25,7 +25,6 @@ const debug = Debug('ionic:lib:serve'); export const DEFAULT_DEV_LOGGER_PORT = 53703; export const DEFAULT_LIVERELOAD_PORT = 35729; export const DEFAULT_SERVER_PORT = 8100; -export const DEFAULT_LAB_PORT = 8200; export const DEFAULT_DEVAPP_COMM_PORT = 53233; export const DEFAULT_ADDRESS = 'localhost'; @@ -138,7 +137,6 @@ export abstract class ServeRunner implements Runner implements Runner implements Runner `${details.protocol}://${host}:${details.port}`; - const labHost = labDetails ? `http://${labDetails.host}:${labDetails.port}` : undefined; this.e.log.nl(); this.e.log.info( `Development server running!` + - (labHost ? `\nLab: ${strong(labHost)}` : '') + `\nLocal: ${strong(localAddress)}` + (details.externalNetworkInterfaces.length > 0 ? `\nExternal: ${details.externalNetworkInterfaces.map(v => strong(fmtExternalAddress(v.address))).join(', ')}` : '') + `\n\n${chalk.yellow('Use Ctrl+C to quit this process')}` @@ -212,7 +204,7 @@ export abstract class ServeRunner implements Runner implements Runner { - const labDetails: LabServeDetails = { - projectType: this.e.project.type, - host: options.labHost, - port: await findClosestOpenPort(options.labPort), - }; - - const lab = new IonicLabServeCLI(this.e); - await lab.serve({ serveDetails, ...labDetails }); - - return labDetails; - } - async selectExternalIP(options: T): Promise<[string, NetworkInterface[]]> { let availableInterfaces: NetworkInterface[] = []; let chosenIP = options.host; @@ -647,37 +626,3 @@ export class YarnServeCLI extends PkgManagerServeCLI { readonly program = 'yarn'; readonly prefix = 'yarn'; } - -interface IonicLabServeCLIOptions extends Readonly { - readonly serveDetails: Readonly; -} - -class IonicLabServeCLI extends ServeCLI { - readonly name = 'Ionic Lab'; - readonly pkg = '@ionic/lab'; - readonly program = 'ionic-lab'; - readonly prefix = 'lab'; - readonly script = undefined; - - protected stdoutFilter(line: string): boolean { - if (line.includes('running')) { - this.emit('ready'); - } - - return false; // no stdout - } - - protected async buildArgs(options: IonicLabServeCLIOptions): Promise { - const { serveDetails, ...labDetails } = options; - - const pkg = await this.e.project.requirePackageJson(); - - const url = `${serveDetails.protocol}://localhost:${serveDetails.port}`; - const appName = this.e.project.config.get('name'); - const labArgs = [url, '--host', labDetails.host, '--port', String(labDetails.port), '--project-type', labDetails.projectType]; - const nameArgs = appName ? ['--app-name', appName] : []; - const versionArgs = pkg.version ? ['--app-version', pkg.version] : []; - - return [...labArgs, ...nameArgs, ...versionArgs]; - } -} diff --git a/packages/@ionic/lab/.gitignore b/packages/@ionic/lab/.gitignore deleted file mode 100644 index 796a78ed1b..0000000000 --- a/packages/@ionic/lab/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.stencil -www -bin/ionic-lab.* diff --git a/packages/@ionic/lab/.npmrc b/packages/@ionic/lab/.npmrc deleted file mode 100644 index 43c97e719a..0000000000 --- a/packages/@ionic/lab/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/packages/@ionic/lab/CHANGELOG.md b/packages/@ionic/lab/CHANGELOG.md deleted file mode 100644 index e4f55793ea..0000000000 --- a/packages/@ionic/lab/CHANGELOG.md +++ /dev/null @@ -1,625 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [3.2.15](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.14...@ionic/lab@3.2.15) (2022-10-06) - - -### Bug Fixes - -* **cli:** capacitor commands not working ([#4918](https://github.com/ionic-team/ionic-cli/issues/4918)) ([27b958b](https://github.com/ionic-team/ionic-cli/commit/27b958bdf22c37f962d705a1b8ba1fee78b59c42)) - - - - - -## [3.2.14](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.13...@ionic/lab@3.2.14) (2022-09-29) - - -### Bug Fixes - -* **cli:** capacitor config not being read from multi-project directories ([#4909](https://github.com/ionic-team/ionic-cli/issues/4909)) ([0ab4881](https://github.com/ionic-team/ionic-cli/commit/0ab4881736f0d3b967d12802cb9cd01ba24d2088)) - - - - - -## [3.2.13](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.12...@ionic/lab@3.2.13) (2022-06-16) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.12](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.11...@ionic/lab@3.2.12) (2022-05-09) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.11](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.10...@ionic/lab@3.2.11) (2022-03-04) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.10](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.9...@ionic/lab@3.2.10) (2020-12-10) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.8...@ionic/lab@3.2.9) (2020-09-29) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.7...@ionic/lab@3.2.8) (2020-09-24) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.6...@ionic/lab@3.2.7) (2020-09-02) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.5...@ionic/lab@3.2.6) (2020-08-29) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.4...@ionic/lab@3.2.5) (2020-08-28) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.3...@ionic/lab@3.2.4) (2020-08-27) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.2...@ionic/lab@3.2.3) (2020-08-27) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.1...@ionic/lab@3.2.2) (2020-08-26) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.2.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.2.0...@ionic/lab@3.2.1) (2020-08-25) - -**Note:** Version bump only for package @ionic/lab - - - - - -# [3.2.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.7...@ionic/lab@3.2.0) (2020-08-12) - - -### Features - -* **lab:** improvements to the lab design ([#4511](https://github.com/ionic-team/ionic-cli/issues/4511)) ([625fe7b](https://github.com/ionic-team/ionic-cli/commit/625fe7b894a47837c33dfe2b8363a491f57ecbda)) - - - - - -## [3.1.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.6...@ionic/lab@3.1.7) (2020-06-02) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.1.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.5...@ionic/lab@3.1.6) (2020-05-12) - - -### Bug Fixes - -* pin tslib to avoid "Cannot set property pathExists" error ([689e1f0](https://github.com/ionic-team/ionic-cli/commit/689e1f038b907356ef855a067a76d4822e7072a8)) - - - - - -## [3.1.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.4...@ionic/lab@3.1.5) (2020-05-06) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.1.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.3...@ionic/lab@3.1.4) (2020-04-29) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.1.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.2...@ionic/lab@3.1.3) (2020-03-30) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.1.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.1...@ionic/lab@3.1.2) (2020-03-09) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.1.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.1.0...@ionic/lab@3.1.1) (2020-03-03) - -**Note:** Version bump only for package @ionic/lab - - - - - -# 3.1.0 (2020-02-11) - - -### Features - -* **start:** add new list starter option ([#4315](https://github.com/ionic-team/ionic-cli/issues/4315)) ([1df44c1](https://github.com/ionic-team/ionic-cli/commit/1df44c1591f37b89f2b672857740edd6cb2aea67)) - - - - - -## [3.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.0.1...@ionic/lab@3.0.2) (2020-02-10) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [3.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@3.0.0...@ionic/lab@3.0.1) (2020-02-03) - -**Note:** Version bump only for package @ionic/lab - - - - - -# [3.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.19...@ionic/lab@3.0.0) (2020-01-25) - - -### chore - -* require Node 10 ([5a47874](https://github.com/ionic-team/ionic-cli/commit/5a478746c074207b6dc96aa8771f04a606deb1ef)) - - -### BREAKING CHANGES - -* A minimum of Node.js 10.3.0 is required. - - - - - -## [2.0.19](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.18...@ionic/lab@2.0.19) (2020-01-13) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.18](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.17...@ionic/lab@2.0.18) (2019-12-10) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.17](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.16...@ionic/lab@2.0.17) (2019-12-05) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.16](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.15...@ionic/lab@2.0.16) (2019-11-25) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.15](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.14...@ionic/lab@2.0.15) (2019-11-24) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.14](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.13...@ionic/lab@2.0.14) (2019-11-21) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.13](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.12...@ionic/lab@2.0.13) (2019-10-14) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.12](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.11...@ionic/lab@2.0.12) (2019-10-14) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.11](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.10...@ionic/lab@2.0.11) (2019-09-18) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.10](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.9...@ionic/lab@2.0.10) (2019-08-28) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.8...@ionic/lab@2.0.9) (2019-08-23) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.7...@ionic/lab@2.0.8) (2019-08-14) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.6...@ionic/lab@2.0.7) (2019-08-07) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.5...@ionic/lab@2.0.6) (2019-07-09) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.4...@ionic/lab@2.0.5) (2019-06-28) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.3...@ionic/lab@2.0.4) (2019-06-21) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.2...@ionic/lab@2.0.3) (2019-06-18) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.1...@ionic/lab@2.0.2) (2019-06-10) - -**Note:** Version bump only for package @ionic/lab - - - - - -## [2.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@2.0.0...@ionic/lab@2.0.1) (2019-06-05) - -**Note:** Version bump only for package @ionic/lab - - - - - -# [2.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.24...@ionic/lab@2.0.0) (2019-05-29) - - -### chore - -* require Node 8 ([5670e68](https://github.com/ionic-team/ionic-cli/commit/5670e68)) - - -### BREAKING CHANGES - -* A minimum of Node.js 8.9.4 is required. - - - - - - -## [1.0.24](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.23...@ionic/lab@1.0.24) (2019-03-12) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.23](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.22...@ionic/lab@1.0.23) (2019-03-06) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.22](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.21...@ionic/lab@1.0.22) (2019-02-27) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.21](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.20...@ionic/lab@1.0.21) (2019-02-15) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.20](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.19...@ionic/lab@1.0.20) (2019-01-29) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.19](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.18...@ionic/lab@1.0.19) (2019-01-23) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.18](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.17...@ionic/lab@1.0.18) (2019-01-08) - - -### Bug Fixes - -* **lab:** iframe now needs allow policy ([487b82a](https://github.com/ionic-team/ionic-cli/commit/487b82a)) - - - - - -## [1.0.17](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.16...@ionic/lab@1.0.17) (2019-01-07) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.16](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.15...@ionic/lab@1.0.16) (2018-12-19) - - -### Bug Fixes - -* **lab:** correct statusbar position ([#3766](https://github.com/ionic-team/ionic-cli/issues/3766)) ([b37fa03](https://github.com/ionic-team/ionic-cli/commit/b37fa03)) -* **lab:** default cursor for platform titles ([b215beb](https://github.com/ionic-team/ionic-cli/commit/b215beb)) -* **lab:** improve dev experience on smaller screens ([45a6c58](https://github.com/ionic-team/ionic-cli/commit/45a6c58)) -* **lab:** statusbar padding for all versions ([4fa13a3](https://github.com/ionic-team/ionic-cli/commit/4fa13a3)) - - - - - -## [1.0.15](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.14...@ionic/lab@1.0.15) (2018-11-27) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.14](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.13...@ionic/lab@1.0.14) (2018-11-20) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.13](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.12...@ionic/lab@1.0.13) (2018-11-04) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.12](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.11...@ionic/lab@1.0.12) (2018-10-31) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.11](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.10...@ionic/lab@1.0.11) (2018-10-05) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.10](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.9...@ionic/lab@1.0.10) (2018-10-03) - - -### Bug Fixes - -* **lab:** proper statusbar padding ([63b0eef](https://github.com/ionic-team/ionic-cli/commit/63b0eef)) -* **lab:** use correct query params for project type ([4801680](https://github.com/ionic-team/ionic-cli/commit/4801680)) -* **serve:** persist config for livereload ([27193e8](https://github.com/ionic-team/ionic-cli/commit/27193e8)) - - - - - -## [1.0.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.8...@ionic/lab@1.0.9) (2018-09-05) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.7...@ionic/lab@1.0.8) (2018-08-20) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.6...@ionic/lab@1.0.7) (2018-08-15) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.5...@ionic/lab@1.0.6) (2018-08-09) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.4...@ionic/lab@1.0.5) (2018-08-07) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.3...@ionic/lab@1.0.4) (2018-08-07) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.2...@ionic/lab@1.0.3) (2018-08-06) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.1...@ionic/lab@1.0.2) (2018-08-02) - - - - -**Note:** Version bump only for package @ionic/lab - - -## [1.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.0...@ionic/lab@1.0.1) (2018-07-30) - - - - -**Note:** Version bump only for package @ionic/lab - - -# [1.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/lab@1.0.0-rc.13...@ionic/lab@1.0.0) (2018-07-25) - - - - -**Note:** Version bump only for package @ionic/lab diff --git a/packages/@ionic/lab/LICENSE b/packages/@ionic/lab/LICENSE deleted file mode 100644 index 7c5808ced6..0000000000 --- a/packages/@ionic/lab/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Drifty Co - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/@ionic/lab/README.md b/packages/@ionic/lab/README.md deleted file mode 100644 index d4f290bc38..0000000000 --- a/packages/@ionic/lab/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Ionic Lab - -Stand-alone Ionic Lab package, a utility used by `ionic serve --lab`. - -Once installed, invoke serve on your framework CLI of choice. Then, copy the -URL of that server and invoke the Ionic Lab CLI. For example: - -```bash -$ ionic-lab http://localhost:4200 -``` diff --git a/packages/@ionic/lab/bin/ionic-lab b/packages/@ionic/lab/bin/ionic-lab deleted file mode 100755 index 7548c3d0b0..0000000000 --- a/packages/@ionic/lab/bin/ionic-lab +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -process.title = 'ionic-lab'; -process.on('unhandledRejection', function(r) { console.error(r); }); - -var semver = require('semver'); -var version = semver.parse(process.version); -var minversion = 'v10.3.0'; - -if (semver.lt(version, minversion)) { - var details = version.major === 6 - ? ' Node.js 6 reached end-of-life on 2019-04-30 and is no longer supported.' - : version.major === 8 - ? ' Node.js 8 reached end-of-life on 2019-12-31 and is no longer supported.' - : ''; - - process.stderr.write('ERR: Your Node.js version is ' + version.raw + '.' + details + ' Please update to the latest Node LTS version.\n'); - process.exit(1); -} - -var cli = require('../'); -cli.run(process.argv.slice(2), process.env); diff --git a/packages/@ionic/lab/jest.config.js b/packages/@ionic/lab/jest.config.js deleted file mode 100644 index eace8d6d9d..0000000000 --- a/packages/@ionic/lab/jest.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../../../jest.config.base'); diff --git a/packages/@ionic/lab/lint-staged.config.js b/packages/@ionic/lab/lint-staged.config.js deleted file mode 100644 index 5815a72f0d..0000000000 --- a/packages/@ionic/lab/lint-staged.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../../../lint-staged.config.base'); diff --git a/packages/@ionic/lab/package.json b/packages/@ionic/lab/package.json deleted file mode 100644 index 52830fc72b..0000000000 --- a/packages/@ionic/lab/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@ionic/lab", - "version": "3.2.15", - "description": "Ionic Lab utility for developing Ionic apps, used by Ionic CLI", - "bin": { - "ionic-lab": "./bin/ionic-lab" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "homepage": "https://ionicframework.com/", - "author": "Ionic Team (https://ionic.io)", - "license": "MIT", - "engines": { - "node": ">=10.3.0" - }, - "files": [ - "bin/", - "dist/", - "www/", - "LICENSE", - "README.md" - ], - "repository": { - "type": "git", - "url": "https://github.com/ionic-team/ionic-cli.git" - }, - "bugs": { - "url": "https://github.com/ionic-team/ionic-cli/issues" - }, - "scripts": { - "clean": "npm run clean.tsc", - "clean.tsc": "rimraf dist", - "clean.stencil": "rimraf www", - "lint": "true", - "build": "npm run build.tsc && npm run build.stencil", - "build.stencil": "npm run clean.stencil && stencil build", - "build.tsc": "npm run clean.tsc && tsc", - "watch": "npm run watch.tsc", - "watch.stencil": "npm run clean.stencil && stencil build --dev --watch --serve --address localhost --port 8900 --no-open", - "watch.tsc": "tsc -w --preserveWatchOutput", - "prepublishOnly": "npm run build" - }, - "dependencies": { - "@ionic/cli-framework": "5.1.3", - "@ionic/utils-fs": "3.1.6", - "chalk": "^4.0.0", - "express": "^4.16.2", - "tslib": "^2.0.1" - }, - "devDependencies": { - "@ionic-internal/ionic-ds": "^2.1.0", - "@stencil/core": "~1.8.5", - "@types/express": "4.17.13", - "@types/express-serve-static-core": "4.17.28", - "@types/node": "~10.17.13", - "lint-staged": "^10.0.2", - "rimraf": "^3.0.0", - "typescript": "~4.0.2" - } -} diff --git a/packages/@ionic/lab/src/index.ts b/packages/@ionic/lab/src/index.ts deleted file mode 100644 index 3bfa7686ba..0000000000 --- a/packages/@ionic/lab/src/index.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { Command, CommandLineInputs, CommandLineOptions, CommandMap, CommandMapDefault, Namespace, execute, validators } from '@ionic/cli-framework'; -import { readFile } from '@ionic/utils-fs'; -import * as chalk from 'chalk'; -import * as express from 'express'; -import * as http from 'http'; -import * as https from 'https'; -import * as path from 'path'; -import * as tls from 'tls'; - -const WWW_DIRECTORY = path.join(__dirname, '..', 'www'); - -class DefaultCommand extends Command { - async getMetadata() { - return { - name: 'default', - summary: '', - inputs: [ - { - name: 'url', - summary: 'The URL of the livereload server to use with lab', - validators: [validators.required, validators.url], - }, - ], - options: [ - { - name: 'host', - summary: 'HTTP host of Ionic Lab', - default: 'localhost', - }, - { - name: 'port', - summary: 'HTTP port of Ionic Lab', - default: '8200', - }, - { - name: 'project-type', - summary: 'Ionic project type', - }, - { - name: 'ssl', - summary: 'Host Ionic Lab with HTTPS', - type: Boolean, - }, - { - name: 'ssl-key', - summary: 'Path to SSL key', - }, - { - name: 'ssl-cert', - summary: 'Path to SSL certificate', - }, - { - name: 'app-name', - summary: 'App name to show in bottom left corner', - }, - { - name: 'app-version', - summary: 'App version to show in bottom left corner', - }, - ], - }; - } - - async run(inputs: CommandLineInputs, options: CommandLineOptions) { - const [ url ] = inputs; - const { host, port, ssl } = options; - - const protocol = ssl ? 'https' : 'http'; - const projectType = options['project-type']; - const name = options['app-name']; - const version = options['app-version']; - - const app = express(); - - app.use('/', express.static(WWW_DIRECTORY)); - - app.get('/api/app', (req, res) => { - res.json({ url, name, version, projectType }); - }); - - const server = ssl ? https.createServer(await this.collectSecureContextOptions(options), app) : http.createServer(app); - server.listen({ port, host }); - - const labUrl = `${protocol}://${host}:${port}`; - - server.on('listening', () => { - process.stdout.write( - 'Ionic Lab running!\n' + - `Lab: ${chalk.bold(labUrl)}\n` + - `App: ${chalk.bold(url)}\n` - ); - }); - } - - async collectSecureContextOptions(options: CommandLineOptions): Promise { - const sslKeyPath = options['ssl-key'] ? String(options['ssl-key']) : undefined; - const sslCertPath = options['ssl-cert'] ? String(options['ssl-cert']) : undefined; - - if (!sslKeyPath || !sslCertPath) { - throw new Error('SSL key and cert required for serving SSL'); - } - - const [ key, cert ] = await Promise.all([this.readPem(sslKeyPath), this.readPem(sslCertPath)]); - - return { key, cert }; - } - - async readPem(p: string): Promise { - try { - return await readFile(p, { encoding: 'utf8' }); - } catch (e) { - process.stderr.write(String(e.stack ? e.stack : e) + '\n'); - throw new Error(`Error encountered with ${p}`); - } - } -} - -class LabNamespace extends Namespace { - async getMetadata() { - return { - name: 'ionic-lab', - summary: '', - }; - } - - async getCommands(): Promise { - return new CommandMap([[CommandMapDefault, async () => new DefaultCommand(this)]]); - } -} - -const namespace = new LabNamespace(); - -export async function run(argv: string[], env: NodeJS.ProcessEnv) { - await execute({ namespace, argv, env }); -} diff --git a/packages/@ionic/lab/src/stencil/.gitignore b/packages/@ionic/lab/src/stencil/.gitignore deleted file mode 100644 index dd449725e1..0000000000 --- a/packages/@ionic/lab/src/stencil/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.md diff --git a/packages/@ionic/lab/src/stencil/assets/android-device-skin.png b/packages/@ionic/lab/src/stencil/assets/android-device-skin.png deleted file mode 100644 index d31f1cc511cfdcb0f9033be19169bf1c5a3e26ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12184 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 diff --git a/packages/@ionic/lab/src/stencil/assets/app.css b/packages/@ionic/lab/src/stencil/assets/app.css deleted file mode 100644 index 620a151685..0000000000 --- a/packages/@ionic/lab/src/stencil/assets/app.css +++ /dev/null @@ -1,131 +0,0 @@ -html, -body { - height: 100%; -} - -body { - -webkit-font-smoothing: antialiased; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: normal; -} - -a { - color: var(--font-color); -} - -a:hover { - text-decoration: none; - color: var(--font-color); -} - -ionlab-app { - display: flex; - flex-direction: column; - height: 100%; -} - -header { - background: var(--section-bg); - height: 50px; - line-height: 50px; - font-size: var(--font-size-sm); - font-weight: bold; - color: var(--icon-color); -} - -header .icon { - display: inline-block; - vertical-align: middle; - margin-top: -3px; - font-size: 22px; - color: var(--icon-color); - cursor: pointer; -} - -#logo { - display: inline-block; - vertical-align: middle; - background: url('lab-logo.png'); - background-size: 100%; - background-repeat: no-repeat; - margin-top: -2px; - width: 64px; - height: 28px; - margin-left: 15px; -} - -#header-left { - float: left; -} - -#header-left .menu-icon { - margin-left: 13px; -} - -#header-right { - float: right; -} - -#header-right button { - display: inline-block; - height: 100%; - background: none; - border: none; - outline: none; - margin: 0; - padding: 0 10px; - cursor: pointer; - color: var(--icon-color); - font-weight: bold; -} - -#header-right .fullscreen-icon { - margin-left: 5px; -} - -main { - color: var(--font-color); - display: flex; - flex: 1; - overflow: hidden; -} - -footer { - width: 100%; - border-top: 1px solid rgba(0, 0, 0, 0.06); - background: var(--section-bg); - font-size: var(--font-size-sm); - color: var(--font-color); -} - -#footer-left { - float: left; - padding: 14px 0 14px 15px; -} - -#footer-right { - float: right; - padding: 14px 15px 14px 5px; -} - -#footer-right a { - font-family: var(--font-family-medium); - margin-left: 10px; -} - -#error-box { - width: 500px; - align-self: center; - justify-content: center; - text-align: center; - background: var(--section-bg); - padding: 25px; - margin: 100px 0; -} diff --git a/packages/@ionic/lab/src/stencil/assets/favicon.png b/packages/@ionic/lab/src/stencil/assets/favicon.png deleted file mode 100644 index 7469634d5a7f4a3b1be7a2bd7e5a765944a6ea14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4256 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 V$dsK=Amt2z^Jm;nlTM-T{6AG4+rt0= diff --git a/packages/@ionic/lab/src/stencil/assets/lab-logo.png b/packages/@ionic/lab/src/stencil/assets/lab-logo.png deleted file mode 100644 index 7e7b5ad49b84941dcb9ff75b9ffe64c71e1e119a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 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 diff --git a/packages/@ionic/lab/src/stencil/components.d.ts b/packages/@ionic/lab/src/stencil/components.d.ts deleted file mode 100644 index de4ee29cc3..0000000000 --- a/packages/@ionic/lab/src/stencil/components.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ -/** - * This is an autogenerated file created by the Stencil compiler. - * It contains typing information for all components that exist in this project. - */ - - -import { HTMLStencilElement, JSXBase } from '@stencil/core/internal'; - - -export namespace Components { - interface IonlabApp {} - interface IonlabDeviceFrame { - 'icon': string; - 'platform': string; - 'platformName': string; - 'url': string; - } - interface IonlabPlatformDropdown { - 'activePlatforms': string[]; - } - interface IonlabPreview { - 'activeDevices': string[]; - 'projectType'?: string; - 'url'?: string; - } - interface IonlabSidebar { - 'visible': boolean; - } - interface SkFadingCircle {} -} - -declare global { - - - interface HTMLIonlabAppElement extends Components.IonlabApp, HTMLStencilElement {} - var HTMLIonlabAppElement: { - prototype: HTMLIonlabAppElement; - new (): HTMLIonlabAppElement; - }; - - interface HTMLIonlabDeviceFrameElement extends Components.IonlabDeviceFrame, HTMLStencilElement {} - var HTMLIonlabDeviceFrameElement: { - prototype: HTMLIonlabDeviceFrameElement; - new (): HTMLIonlabDeviceFrameElement; - }; - - interface HTMLIonlabPlatformDropdownElement extends Components.IonlabPlatformDropdown, HTMLStencilElement {} - var HTMLIonlabPlatformDropdownElement: { - prototype: HTMLIonlabPlatformDropdownElement; - new (): HTMLIonlabPlatformDropdownElement; - }; - - interface HTMLIonlabPreviewElement extends Components.IonlabPreview, HTMLStencilElement {} - var HTMLIonlabPreviewElement: { - prototype: HTMLIonlabPreviewElement; - new (): HTMLIonlabPreviewElement; - }; - - interface HTMLIonlabSidebarElement extends Components.IonlabSidebar, HTMLStencilElement {} - var HTMLIonlabSidebarElement: { - prototype: HTMLIonlabSidebarElement; - new (): HTMLIonlabSidebarElement; - }; - - interface HTMLSkFadingCircleElement extends Components.SkFadingCircle, HTMLStencilElement {} - var HTMLSkFadingCircleElement: { - prototype: HTMLSkFadingCircleElement; - new (): HTMLSkFadingCircleElement; - }; - interface HTMLElementTagNameMap { - 'ionlab-app': HTMLIonlabAppElement; - 'ionlab-device-frame': HTMLIonlabDeviceFrameElement; - 'ionlab-platform-dropdown': HTMLIonlabPlatformDropdownElement; - 'ionlab-preview': HTMLIonlabPreviewElement; - 'ionlab-sidebar': HTMLIonlabSidebarElement; - 'sk-fading-circle': HTMLSkFadingCircleElement; - } -} - -declare namespace LocalJSX { - interface IonlabApp {} - interface IonlabDeviceFrame { - 'icon'?: string; - 'platform'?: string; - 'platformName'?: string; - 'url'?: string; - } - interface IonlabPlatformDropdown { - 'activePlatforms'?: string[]; - 'onIonlabPlatformToggled'?: (event: CustomEvent) => void; - } - interface IonlabPreview { - 'activeDevices'?: string[]; - 'projectType'?: string; - 'url'?: string; - } - interface IonlabSidebar { - 'onIonlabSidebarCloseClicked'?: (event: CustomEvent) => void; - 'visible'?: boolean; - } - interface SkFadingCircle {} - - interface IntrinsicElements { - 'ionlab-app': IonlabApp; - 'ionlab-device-frame': IonlabDeviceFrame; - 'ionlab-platform-dropdown': IonlabPlatformDropdown; - 'ionlab-preview': IonlabPreview; - 'ionlab-sidebar': IonlabSidebar; - 'sk-fading-circle': SkFadingCircle; - } -} - -export { LocalJSX as JSX }; - - -declare module "@stencil/core" { - export namespace JSX { - interface IntrinsicElements { - 'ionlab-app': LocalJSX.IonlabApp & JSXBase.HTMLAttributes; - 'ionlab-device-frame': LocalJSX.IonlabDeviceFrame & JSXBase.HTMLAttributes; - 'ionlab-platform-dropdown': LocalJSX.IonlabPlatformDropdown & JSXBase.HTMLAttributes; - 'ionlab-preview': LocalJSX.IonlabPreview & JSXBase.HTMLAttributes; - 'ionlab-sidebar': LocalJSX.IonlabSidebar & JSXBase.HTMLAttributes; - 'sk-fading-circle': LocalJSX.SkFadingCircle & JSXBase.HTMLAttributes; - } - } -} - - diff --git a/packages/@ionic/lab/src/stencil/components/ionlab-app/ionlab-app.tsx b/packages/@ionic/lab/src/stencil/components/ionlab-app/ionlab-app.tsx deleted file mode 100644 index 1a338a05ff..0000000000 --- a/packages/@ionic/lab/src/stencil/components/ionlab-app/ionlab-app.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { Component, Listen, State, h } from '@stencil/core'; - -import { PLATFORM_IOS, PLATFORM_ANDROID } from '../../utils'; - -@Component({ - tag: 'ionlab-app', -}) -export class App { - @State() sidebarVisible: boolean = true; - @State() activeDevices: string[] = [PLATFORM_IOS, PLATFORM_ANDROID]; - @State() details: { url?: string; name?: string; version?: string; projectType?: string; } = {}; - session: string; - - componentWillLoad() { - this.loadAppDetails(); - this.loadLocalStorageState(); - } - - componentWillUpdate() { - this.saveLocalStorageState(); - } - - loadAppDetails() { - const self = this; - const req = new XMLHttpRequest(); - - req.addEventListener('load', function() { - try { - self.details = JSON.parse(this.responseText); - } catch (e) { - console.error('Error loading app details from Ionic Lab API!'); - console.error('Response was:', this.responseText); - } - }); - - req.addEventListener('error', (err) => { - console.error('Error loading app details from Ionic Lab API!'); - console.error('Error was:', err); - }); - - req.open('GET', '/api/app'); - req.send(); - } - - loadLocalStorageState() { - const storedPlatforms = localStorage.getItem('ionic-lab-platforms'); - - if (storedPlatforms) { - this.activeDevices = JSON.parse(storedPlatforms); - } - - const storedSidebarOpen = localStorage.getItem('ionic-lab-sidebar-open'); - - if (storedSidebarOpen) { - this.sidebarVisible = JSON.parse(storedSidebarOpen); - } - } - - saveLocalStorageState() { - localStorage.setItem('ionic-lab-platforms', JSON.stringify(this.activeDevices)); - localStorage.setItem('ionic-lab-sidebar-open', JSON.stringify(this.sidebarVisible)); - } - - @Listen('ionlabSidebarCloseClicked') - sidebarCloseClickedHander(event) { - this.sidebarVisible = false; - } - - @Listen('ionlabPlatformToggled') - ionlabPlatformToggledHandler(event) { - this.togglePlatform(event.detail); - } - - togglePlatform(platform: string) { - const idx = this.activeDevices.indexOf(platform); - const devices = [...this.activeDevices]; - - if (idx >= 0) { - devices.splice(idx, 1); - } else { - devices.push(platform); - } - - this.activeDevices = devices; - } - - render() { - return [ -
-
- this.sidebarVisible = !this.sidebarVisible } /> - -
- -
, -
- - -
, - - ]; - } -} diff --git a/packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.css b/packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.css deleted file mode 100644 index ddf171607e..0000000000 --- a/packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.css +++ /dev/null @@ -1,146 +0,0 @@ -ionlab-device-frame { - display: block; - margin: 0 20px; - vertical-align: middle; -} - -ionlab-device-frame h2 { - font-size: var(--font-size-base); - margin: 1em 0; - vertical-align: middle; - text-align: left; - font-weight: var(--font-weight-bold); - vertical-align: top; - color: #727a87; -} - -ionlab-device-frame h2 .icon { - display: inline-block; - margin-right: 7px; - font-size: var(--font-size-lg); -} - -ionlab-device-frame .frame-container { - position: relative; - width: var(--frame-width); - height: var(--frame-height); - border-radius: 3px; - box-shadow: 0 8px 24px rgba(0,0,0,.12), 0 2px 6px rgba(0,0,0,.16); - overflow: hidden; - - margin: 0; - - background-size: contain; - background-repeat: no-repeat; - - z-index: 1; -} - -ionlab-device-frame .frame-container .statusbar { - position: absolute; - top: 0; - width: var(--frame-width); - height: 20px; - background-size: 100%; - background-repeat: no-repeat; - background-position: center; - border-radius: 3px 3px 0 0; -} - -ionlab-device-frame .frame-container sk-fading-circle, -ionlab-device-frame .frame-container .load-error { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} - -ionlab-device-frame .frame-container .load-error { - background: var(--section-bg); - padding: 10px 20px; -} - -ionlab-device-frame .frame-container .load-error p { - margin: 0; -} - -ionlab-device-frame .frame-container iframe { - background: #000; - border: none; - width: 100%; - height: 100%; - - position: absolute; - - top: 0; - left: 0; - - margin: var(--device-frame-width); - - width: calc(100% - var(--device-frame-width) * 2); - height: calc(100% - var(--device-frame-width) * 2); - - border: none; - - overflow: hidden; - - -webkit-mask-image: -webkit-radial-gradient(white, black); - - z-index: 1; -} - -.statusbar-ios, -.statusbar-md { - display: none; -} - -#device-ios .statusbar-ios { - display: block; - fill: #090a0d; - left: 50%; - position: absolute; - top: 12px; - transform: translateX(-50%); - width: 165px; - z-index: 2; -} - -#device-android .statusbar-md { - display: block; - fill: hsla(0,0%,49%,.3); - padding: .5rem 2.2rem; - position: relative; - width: 100%; - z-index: 2; - top: 12px; -} - -#device-ios .frame-container { - background-image: url('/assets/android-device-skin.png'); - border-radius: 44px; -} - -#device-ios .frame-container iframe { - border-radius: 32px; -} - -#device-android .frame-container { - background-image: url('/assets/iphone-device-skin.png'); - border-radius: 54px; -} - -#device-android .frame-container iframe { - border-radius: 38px; -} - -@media only screen and (max-height: 850px) { - ionlab-device-frame h2 { - display: none; - } - - #device-ios .statusbar-ios { - top: 10px; - } -} diff --git a/packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.tsx b/packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.tsx deleted file mode 100644 index 4704ec4232..0000000000 --- a/packages/@ionic/lab/src/stencil/components/ionlab-device-frame/ionlab-device-frame.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, Prop, State, h } from '@stencil/core'; - -@Component({ - tag: 'ionlab-device-frame', - styleUrl: 'ionlab-device-frame.css', -}) -export class DeviceFrame { - @Prop() platform: string; - @Prop() platformName: string; - @Prop() url: string; - @Prop() icon: string; - @State() error: boolean = false; - @State() loaded: boolean = false; - - interval: number; - - componentDidLoad() { - this.interval = window.setInterval(() => { - this.error = this.url ? false : true; - }, 20000); - } - - loadedHandler(event) { - this.loaded = true; - this.error = false; - window.clearInterval(this.interval); - } - - hostData() { - return { - id: `device-${this.platform}`, - }; - } - - render() { - return [ -

{ this.platformName }

, -
-
- - - - - - - - -
- { !this.loaded && !this.error ? : null } - { this.error ?

Load Timeout

Still trying...

: null } -