Giter VIP home page Giter VIP logo

types-for-adobe's Introduction

TypeScript types for Adobe Products

Repository for typedef files for various Adobe Creative Cloud products.

gif


Prerequisites


Your first script for eg. Adobe Illustrator

# create new folder
mkdir my-script
cd my-script

# install types-for-adobe
npm init -y
npm i types-for-adobe

# create tsconfig.json
printf '{"compilerOptions":{"module":"none","noLib":true}}' > tsconfig.json

# create index.ts and change reference types to Adobe product you're targeting
printf '/// <reference types="types-for-adobe/Illustrator/2015.3"/>\nalert(String(app));\n' > index.ts

# compile typescript files
tsc

# open Adobe Illustrator -> File -> Scripts -> Other Script -> and open index.js

FAQ

Where do these typedefs come from?

Everything in this project was generated through one of the following methods:

  1. Using this extendscript-xml-to-typescript converter tool to convert scripting dictionaries to typedef format
    • note that this only works for a few select apps, and has been found to generate incorrect data in some cases
  2. By hand, through referencing Adobe's official release announcements & developer exploration through the API.

Why are there different versions of docs per version of each host app?

This repo aims to maintain a history of typedefs for each given version of each hostapp.

This way, if you're developing a tool aimed at, say, Adobe After Effects v18.0, you can have your tool specifically use those typedefs, and know that you're not using features that were introduced in a later version.

Why does this matter?

For public, commercial tools: with some hostapps, it's generally accepted that the app's user base will be spread out among multiple versions of the software. Targeting a slightly older version ensures wider adoption than focusing solely on the latest version.

For internal, proprietary tools: some companies mandate that all artists use a specific (older) version; having separate definitions for that version allows for this specific targeting.

Which should I use?

This really depends on your needs; if you're hoping to release a commercial tool and assume that all users are using a specific version or newer, use that! If you need to leverage a feature added at a specific point, use those typedefs instead & let your users know this is the minimum supported version.

Why are some release versions missing?

Two possible answers! Either

  1. There haven't been any API changes for that given version, or
  2. Nobody's taken the time to add typedefs for that version; feel free to open a PR!

Contributors

Thanks to all of our contributors for helping make this project succeed!

Have something to add? Please open a PR!


More typings

types-for-adobe's People

Contributors

bbb999 avatar bryab avatar danixeee avatar galaddirie avatar gvnnz avatar ieiekk avatar imotoyohoen avatar jinzhan avatar johhnry avatar justintaylor-dev avatar lm913 avatar mikeoverbeck avatar monsieuroeuf avatar myselfhimself avatar perludum avatar pravdomil avatar rafikhan avatar timhaywood avatar ushio avatar vespakoen avatar yossoon avatar zaphodbeeblebroxx avatar zlovatt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

types-for-adobe's Issues

types for illustrator 2019 ?

thanks for this repo, I was wondering why there's have types for illustrator 2022 and 2015.3, what about other versions ? which one should i use then ?

Project setup including all supported standard Javascript classes

Hi,

I have setup my project according to the Readme file and video instructions for an Indesign script.

As I understand, Adobe Creative Cloud apps support a subset of the standard Javascript classes e.g. JSON. Inside my script I have to read a JSON file.

How do I have to update the generated Typescript project (package.json, tsconfig.json), so that I can use the support classes like JSON.

Thanks
Patrick

Latest XMLs for Adobe products

In some of the issues, I've seen that you'd love if people send you fresh definitions of XML files for various Adobe products. First I wanted to present theses as processed ts definitions, but then after I realized that there might be some manual changes required for each of the fields, I decided to just send you the XML files and see if that helps.

screen shot 2018-11-07 at 3 38 02 pm

`typename` fields are missing (at least for Illustrator)

The JS API doc of Illustrator (2017) contains typename fields for almost (if not all) classes.
Theses are missing from the .d.ts. I guess they're missing from the .xml definitions too? Should I open a PR for this?

I'm trying to figure out the best way to switch based on the subclass. I noticed instance.prototype returns undefined so I figured typename would be the second best. I guess I could do a big if ... else if .... using a bunch of instanceofs, but this doesn't seem very clean nor efficient.

Release new NPM package

The last version release was over a year ago and is pretty outdated now; can you tag a new release?

Issue with markerProperty in latest AE update

Has anyone noticed an issue using composition.markerProperty.setValueAtTime(...)? This was working until one of the latest updates (22.1). The call is failing with After Effects error: CSelectronASSERT fail: CSelectron: layer is null. Wanted to see if this was just an issue on my end, or a potential bug in the latest release?

How can I import other scripts into mine?

I'm working on an Illustrator script

I usually use #import 'json2.js' at the begining of my files, but with typescript, there's a compile error. If I try to just remove the #import at the top, then I get a compile error stating "Cannot find name 'JSON'"

How can I import and get rid or these errors?

Triple-slash directive doesn't work: cannot find type definition file

OS: Debian 11
TypeScript: Version 4.7.3

The Readme file suggests to use the triple-slash directive for including type definitions. For example

/// <reference types="types-for-adobe/Premiere/14.0""/>

This doesn't work for me: I get "Cannot find type definition file for 'types-for-adobe/Premiere/14.0"'.

The only way to specify type definitions is via the tsconfig.json file, like so:

{
    [...]
    "compilerOptions": {
        [...]
        "types": [
            "types-for-adobe/Premiere/14.0"
        ]
    }
}

illustrator arrow heads types missing

Is there a reason for arrow heads types missing for illustrator where as they are available for indesign types

would be great if someone can help us with this. meanwhile, is there a solution for finding a property even though a type is missing

Publish to npm

That way people don't necessarily have to install git

Multiply array of numbers by scalar

Extendscript allows you to multiply an array of numbers by a scalar. Typescript doesn't allow this.

var v = [0,.5,1] * 255;
v == [0,127.5, 255];

Is there any official API doc for AE Scripts?

Hi, I am new to adobe AE script developing. The reason i raise this issue is that it's hard for me to find any official API doc for AE scripting, and thats why this repo is so useful for me.
I found some knowledge in https://helpx.adobe.com/after-effects/using/expression-language.html but most of them are deprecated.
I am sorry that probably it is not a good place to raise this question, but i am really curious how you guys find the AE API. Is there any useful suggestions for developing / debugging AE scripts?

Linting error due to missing numItems and length in ComponentPropertiesCollection for Premiere/15.0

I noticed a error where the numItems and length properties are undefined in ComponentPropertiesCollection.
For example the followng code functions as expected during runtime, but the lack of type definitions for these properties causes linting warnings.
Property 'numItems' does not exist on type 'ComponentParamCollection'.ts(2339)

const seq = app.project.activeSequence;
  const tracks = seq.getSelection();
  for (let track of tracks) {
      let components: ComponentCollection = track.components;
      for (let i = 0; i < components.numItems; i++) {
          const comp = components[i];
          comp.properties[0]
          for (let j = 0; j < comp.properties.numItems; j++) { // !THE ISSUE
              // numItems and length is not defined in ComponentPropertiesCollection, but this exists

AE Property shorthand

Sorry I keep making all these issues. I'm trying to convert a ton of old scripts to Typescript and finding all kinds of fun things.

One is that in the AE api, there is a kindof shorthand when dealing with Properties.

For example, you can create a "Checkbox Control" property:

var p = layer.effect.addProperty("Checkbox Control");

And you can manipulate its sub-property "checkbox" like this (which doesn't work with current typings):

p.checkbox

or, you can do it like this:

p.getProperty("checkbox")

To get this to work in Typescript, you'd need all of AE's effects in your typings, which is a heavy order considering that none of this is documented.

Fix undefined Photoshop Types

https://github.com/pravdomil/types-for-adobe/tree/master/Photoshop/2015.5

SaveOptionsType is undefined
ColorProfileType is undefined
PaletteType is undefined
Case is undefined
Documents is undefined
Layers is undefined
LayerSets is undefined
ArtLayers is undefined
Channels is undefined
Guides is undefined
HistoryStates is undefined
LayerComps is undefined
TextFonts is undefined
PathItems is undefined
SubPathItems is undefined
PathPoints is undefined
Notifiers is undefined
CountItems is undefined
ColorSamplers is undefined
OpenOptions is undefined
GenericPDFOpenOptions is undefined
GenericEPSOpenOptions is undefined
ExportOptions is undefined
DocumentConversionOptions is undefined
Color is undefined
Application is undefined
Document is undefined
DocumentInfo is undefined
Preferences is undefined
DocumentPrintSettings is undefined
Selection is undefined
LayerSet is undefined
ArtLayer is undefined
Layer is undefined
Channel is undefined
Guide is undefined
HistoryState is undefined
TextFont is undefined
TextItem is undefined
LayerComp is undefined
PathItem is undefined
SubPathItem is undefined
PathPoint is undefined
MeasurementLog is undefined
MeasurementScale is undefined
Notifier is undefined
CountItem is undefined
ColorSampler is undefined
XMPMetadata is undefined
Point is undefined
Rectangle is undefined

const objects = ["OpenDocumentType", "SaveDocumentType", "SaveOptionsType", "DialogModes", "DocPositionStyle", "PrintColorHandling", "DocumentMode", "ChangeMode", "ColorProfileType", "DocumentFill", "Urgency", "Orientation", "Intent", "Direction", "PurgeTarget", "AnchorPosition", "ResampleMethod", "OperatingSystem", "ForcedColors", "PaletteType", "Dither", "Preview", "SaveEncoding", "FormatOptions", "PDFEncoding", "PDFStandard", "PDFCompatibility", "PDFResample", "PICTCompression", "Extension", "TIFFEncoding", "LayerCompression", "ByteOrder", "DCSType", "TrimType", "ColorPicker", "ResetTarget", "SaveBehavior", "PaintingCursors", "OtherPaintingCursors", "GridSize", "Units", "TypeUnits", "PointType", "GridLineStyle", "GuideLineStyle", "BlendMode", "ColorBlendMode", "RasterizeType", "Justification", "AntiAlias", "Case", "Language", "TextType", "WarpStyle", "TextComposer", "AutoKernType", "StrikeThruType", "UnderlineType", "SelectionType", "ExportType", "IllustratorPathType", "ChannelType", "RadialBlurMethod", "RadialBlurQuality", "SmartBlurQuality", "SmartBlurMode", "TextureType", "PolarConversionType", "RippleSize", "UndefinedAreas", "OffsetUndefinedAreas", "SpherizeMode", "DisplacementMapType", "WaveType", "ZigZagType", "NoiseDistribution", "LensType", "EliminateFields", "CreateFields", "PhotoCDSize", "BitsPerChannelType", "PICTBitsPerPixels", "TargaBitsPerPixels", "DescValueType", "ReferenceFormType", "BMPDepthType", "CopyrightedType", "BitmapConversionType", "BitmapHalfToneType", "MatteType", "AdjustmentReference", "OpenDocumentMode", "NewDocumentMode", "PhotoCDColorSpace", "StrokeLocation", "ColorModel", "JavaScriptExecutionMode", "SourceSpaceType", "LayerKind", "TransitionType", "GalleryFontType", "GalleryConstrainType", "GalleryThumbSizeType", "GallerySecurityType", "PicturePackageTextType", "GallerySecurityTextColorType", "GallerySecurityTextPositionType", "GallerySecurityTextRotateType", "QueryStateType", "SaveLogItemsType", "EditLogItemsType", "PathKind", "ShapeOperation", "PointKind", "ToolType", "BatchDestinationType", "FileNamingType", "DepthMapSource", "Geometry", "ColorReductionType", "CameraRAWSettingsType", "WhiteBalanceType", "ColorSpaceType", "CameraRAWSize", "MagnificationType", "CropToType", "FontPreviewType", "FontSize", "MeasurementSource", "MeasurementRange", "Documents", "Layers", "LayerSets", "ArtLayers", "Channels", "Guides", "HistoryStates", "LayerComps", "TextFonts", "PathItems", "SubPathItems", "PathPoints", "Notifiers", "CountItems", "ColorSamplers", "OpenOptions", "PhotoCDOpenOptions", "RawFormatOpenOptions", "GenericPDFOpenOptions", "GenericEPSOpenOptions", "DICOMOpenOptions", "CameraRAWOpenOptions", "SaveOptions", "PhotoshopSaveOptions", "BMPSaveOptions", "GIFSaveOptions", "EPSSaveOptions", "JPEGSaveOptions", "PDFSaveOptions", "PICTFileSaveOptions", "PICTResourceSaveOptions", "PixarSaveOptions", "PNGSaveOptions", "RawSaveOptions", "SGIRGBSaveOptions", "TargaSaveOptions", "TiffSaveOptions", "DCS1_SaveOptions", "DCS2_SaveOptions", "ExportOptions", "ExportOptionsIllustrator", "ExportOptionsSaveForWeb", "DocumentConversionOptions", "BitmapConversionOptions", "IndexedConversionOptions", "Color", "SolidColor", "GrayColor", "RGBColor", "CMYKColor", "LabColor", "HSBColor", "NoColor", "PresentationOptions", "GalleryOptions", "GalleryBannerOptions", "GalleryImagesOptions", "GalleryThumbnailOptions", "GalleryCustomColorOptions", "GallerySecurityOptions", "ContactSheetOptions", "PicturePackageOptions", "BatchOptions", "SubPathInfo", "PathPointInfo", "ActionDescriptor", "ActionList", "ActionReference", "Application", "Document", "DocumentInfo", "Preferences", "DocumentPrintSettings", "Selection", "LayerSet", "ArtLayer", "Layer", "Channel", "Guide", "HistoryState", "TextFont", "TextItem", "LayerComp", "PathItem", "SubPathItem", "PathPoint", "MeasurementLog", "MeasurementScale", "Notifier", "CountItem", "ColorSampler", "XMPMetadata", "Point", "Rectangle", "ElementPlacement"];

main();

function main() {
    let mutableOut = "";
    
    for (const object of objects) {
        const result = check(object);
        mutableOut += (result === true ? "" : result + "\n");
    }
    
    alert("Result\n" + mutableOut);
}

function check(object: string) {
    try {
        eval(object);
        
        return true;
        
    } catch (e) {
        return e;
    }
}

Are definitions manually fixed?

When I found this repository, I thought that you can generate the same but up-to-date TS definitions with this script: https://github.com/pravdomil/ExtendScript-XML-to-TypeScript

However, by doing so and comparing results, I noticed that resulting files differ. For example, the general/JavaScript.d.ts definition contains interfaces for all standard stuff, whereas if you generate the same file with the abovementioned script, you'll get standard stuff declared as classes.

Apparently, the generator script is either outdated or some files, such as javascript.xml, are supposed to be manually fixed to be compatible with other definitions in this repository.

Could you please clarify this? Is there a newer version of the generator script?

Use Angular and Types for adobe in same namespace

Hello!
Great package! But in my angular application, I get lots of 'Duplicate' errors. Example:

In my angular service, I do
import 'types-for-adobe/Illustrator/2015.3/index.d';

Then I can use 'app.activeDocument', but the Document members (like 'name') are not accessible.

Additionally, I get duplicate errors on transpile:

node_modules/typescript/lib/lib.dom.d.ts (3470,13): Duplicate identifier 'Document'.
node_modules/types-for-adobe/Illustrator/2015.3/index.d.ts (8453,15): Duplicate identifier 'Document'.

What am I doing wrong?
Thanks
Stefa

Adobe Acrobat Pro DC ExtendScript Type Definition

Is Acrobat Pro DC going to have the same scripting ability(Type Def.)?

I use it to create individual lesson plans for my students. Currently, file changes are done manually. The ability to call insert, replace and delete API routines would greatly help the process. It would also give me information on the current student documents so I can automate this task. Less time scripting; more time teaching!

I'm learning Java Script for this!

TypeScript: can't find built-in utility types if "noLib": true

Hi,

Thanks for making those type definitions, this is really helpful to be able to use TypeScript for Adobe products!

This is a sample config for tsconfig.json and package.json:

// tsconfig.json
{
  "compilerOptions": {
    "module": "none",
    "noLib": true,
    "types": ["types-for-adobe/Photoshop/2015.5"],
    "strict": true,
    "target": "ES3",
    "downlevelIteration": true
  },
  "include": ["src/**/*"]
}
// package.json
{
  // ...
  "dependencies": {
    "types-for-adobe": "^7.0.12",
    "typescript": "^4.9.5"
  }
}

I found that this minimal example compiles but raise a TypeScript error during compilation:

// error TS2318: Cannot find global type 'Extract'.
function fn<T>(object: T) {
  for (const key in object) {}
}

// Note that this works:
function fn(object: any) {
  for (const key in object) {}
}

I don't know the internals of how the for ... in gets compiled using generics but it made me realize that I can't use any of the utility types when using "noLib": true in tsconfig.json:

// error TS2304: Cannot find name 'Extract'.
type T0 = Extract<"a" | "b" | "c", "a" | "f">;

This is because utility types are located in lib.es5.d.ts therefore not included with noLib.

I can still copy the Extract type definition in my project but maybe we can include them in the repository?

// Compiles fine
type Extract<T, U> = T extends U ? T : never;

function fn<T>(object: T) {
  for (const key in object) {}
}

Thanks!

Inaccessible static objects

In all SaveOptions the static objects are not accessible when instantiating a SaveOptions object

Example:

let saveOpts = new TiffSaveOptions();
saveOpts.alphaChannels = false;  // ts error: Property 'alphaChannels' does not exist on type 'TiffSaveOptions'.

Should update to:

declare class TiffSaveOptions {
	/**
	 * If true, the alpha channels are saved.
	 */
	static alphaChannels: boolean;
        alphaChannels: boolean;

	/**
	 * If true, the annotations are saved.
	 */
	static annotations: boolean;
	annotations: boolean;

        ...

[AfterEffects] Argument to setValue() for tuple properties results in error

Using the library types for an After Effects script, TypeScript will produce an error for array arguments to Property.setValue().
For example:

layer.position.setValue([100, 100]);

results in the error for each element in the array:

Type 'number' is not assignable to type 'never'.ts(2322)

This occurs when attempting to pass both [number, number] as well as [number, number, number]. Erroneously passing a string to setValue() in these cases actually gives a more insightful error:

Argument of type 'string' is not assignable to parameter of type 'never'.
  The intersection 'TwoDPoint & ThreeDPoint' was reduced to 'never' because property 'length' has conflicting types in some constituents.ts(2345)

Thus, somewhere the union type TwoDProperty | ThreeDProperty results in an intersection with conflicting values for the property value type tuple length and cannot be satisfied.

This probably could be resolved with generics or type narrowing, if we were writing in TypeScript rather than ExtendScript.

Environment

[email protected]
Types: types-for-adobe/AfterEffects/18.0
TypeScript: 4.7.3

Workaround

Add /* @ts-ignore */ before any line calling setValue() on a tuple Property. Ignoring type checking defeats the purpose of using types. Note: // @ts-ignore does not work, because the AfterEffects script engine will complain.

Question / Creative Cloud 2017 / CSInterface.js

Hi @pravdomil!

I just discovered this repo on Adobe Dev's Slack, this is really cool 👍

  1. We can now use TypeScript for .jsx if I understand it right?
  2. Do you know if someone did the declaration file for "CSInterface.js" for HTML5 panels?
  3. How much work do you think is needed approximately to support CC2017?

File object

Thanks for this library, it is making me not as sad to get back into writing some scripts for AE.

Do you know a way to get Typescript to understand the Extendscript File object -- essentially overriding the default Javascript File object?

For now I am just adding @ts-ignore before all references to the File object...

PageItem uuid property and related document property missing

Since AI 24.0 a UUID property has been added to the PageItem object, and a related getPageItemFromUuid() method has been added to the document object.

Document.getPageItemFromUuid (uuid: string) : PageItem
--
  | Adobe Illustrator 24 Type Library
  | Retrieves the pageitem using Uuid.
  | uuid: Data Type: string
  | Uuid of pageitem.
PageItem.uuid  (Read Only)
--
  | Data Type: string
  | Adobe Illustrator 24 Type Library
  | The item's unique identifier.

I've tested this in AU 24.1.3 and works as described, see https://community.adobe.com/t5/illustrator/what-s-new-in-illustrator-scripting-cc2020/td-p/10772375?page=1

Group.alignChildren can take a string or [string, string] argument

Tested with Group.alignChildren for InDesign CC 2018. I assume this issue affects the _Control alignment definition as well as other alignChildren definitions.

http://jongware.mit.edu/idcs6js/pc_Group%20(SUI).html according to this(as well as testing in InDesign CC 2018) alignment can take an argument of the form [horizontal: string, vertical: string]. By extension(and testing) alignChildren can as well.

The doc comment in ScriptUI.d.ts for alignment mentions that but alignChildren does not.

Change classes to interfaces

So we can extend them?

Something like:

interface PropertyGroup {
    // ...
}

declare var PropertyGroup: {
    prototype: PropertyGroup;
}

I am making a package with helpers for AE that patch some prototypes, like:

PropertyGroup.prototype.forEach = function (cb) {
  for (var i = this.numProperties; i > 0; i -= 1) {
    cb(this.property(i), i - 1, this)
  }
}

PropertyGroup.prototype.map = function (cb) {
  const result = []
  for (var i = this.numProperties; i > 0; i -= 1) {
    result.push(cb(this.property(i), i - 1, this))
  }
  return result
}

To add types for this, I would need the PropertyGroup to be an interface so I can "re-open" it and add my new methods to it.

The type definitions for Books.everyItem() are wrong(and probably other everyItem() methods)

Version used

InDesign 2018 index.d.ts with InDesign Creative Cloud 2018.

I'm using my fork of the repo. All I've really changed is made InDesign 2018 request ScriptUI automatically and deleted various conflicts from InDesign2018/index.d.ts.

I don't think that has anything to do with the bug.

TLDR

app.books.everyItem() claims to return Book[] actually returns Book.

The madness

app.books returns a Books object. app.books.everyItem() claims(at http://jongware.mit.edu/idcs6js/pc_Books.html and in the type defs in index.d.ts) that it returns Book[]. In fact, it returns Book. But a weird Book that sort of proxies messages to the underlying Book objects. This link explains what they are actually doing: http://www.indiscripts.com/post/2010/06/on-everyitem-part-1.

So, for instance, app.books.everyItem() instanceof Book === true. Mad.

Potential fix(es)

Getting an array of Books

If you actually want an array of Books you need to call app.books.everyItem().getElements(). You can't call app.books.getElements(). getElements() will return an array when called on a normal single book as well as the object reference book returned by everyItem(). An extremely wat moment if I ever saw one.

Fixing the type signatures

The method signature for everyItem should be Book. Plus maybe some sort of documentation warning explaining that crazy things are going on when you call that. Maybe even mention needing to chain with getElements to get an array.

edit. Thank you very much for this project, by the way. I'm just getting started with ID scripting and it would be a lot more hellish without it.

`Point` & friends should be declared as class

Right now ScriptUI.d.ts contains declarations such as:

declare type Point = _Point | [number, number]
declare class _Point { ...

https://github.com/pravdomil/Types-for-Adobe/blob/master/shared/ScriptUI.d.ts#L2030

The problem with this is that it prevents one from writing:

const p = new Point(1, 2);

The compiler will yell when you do this:

error TS2693: 'Point' only refers to a type, but is being used as a value here.

Point is actually a class, so I think it should be declared as one.

Does it make sense to change it to:

declare type _Point = Point | [number, number]
declare class Point { ...

cc @vespakoen

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.